square/workflow-kotlin

Passing the TestScope.coroutineContext to launchForTestingFromState/Start causes a crash

Aberta

#983 aberto em 31 de mar. de 2023

 (0 comentário) (0 reação) (0 responsável)Kotlin (112 forks)github user discovery
good first issue

Métricas do repositório

Stars
 (1.119 estrelas)
Métricas de merge de PR
 (Mesclagem média 55d 8h) (9 fundiu PRs em 30d)

Description

workflow.launchForTestingFromStateWith(..., context = testContext, ...) fails with

Test finished
java.util.concurrent.CancellationException: Test finished
	at com.squareup.workflow1.testing.WorkflowTestRuntimeKt$launchForTestingWith$2$1.invoke(WorkflowTestRuntime.kt:285)
	at com.squareup.workflow1.testing.WorkflowTestRuntimeKt.unwrapCancellationCause(WorkflowTestRuntime.kt:322)
	at com.squareup.workflow1.testing.WorkflowTestRuntimeKt.access$unwrapCancellationCause(WorkflowTestRuntime.kt:1)
	at com.squareup.workflow1.testing.WorkflowTestRuntimeKt$launchForTestingWith$2.invoke(WorkflowTestRuntime.kt:276)
	at com.squareup.workflow1.internal.util.UncaughtExceptionGuard.runRethrowingUncaught(UncaughtExceptionGuard.kt:32)
	at com.squareup.workflow1.testing.WorkflowTestRuntimeKt.launchForTestingWith(WorkflowTestRuntime.kt:275)
	at com.squareup.workflow1.testing.WorkflowTestRuntimeKt.launchForTestingFromStateWith(WorkflowTestRuntime.kt:210)

, but workflow.launchForTestingFromStateWith(..., context = testContext[CoroutineDispatcher.Key]!!, ...) succeed.

It may be connected with the way uncaughtExceptionHandler is set for workflow test runtime:

  val uncaughtExceptionHandler = CoroutineExceptionHandler { _, throwable ->
    exceptionGuard.reportUncaught(throwable)
  }
....
  val workflowScope = CoroutineScope(Unconfined + context + uncaughtExceptionHandler)
  val outputs = Channel<OutputT>(capacity = UNLIMITED)
  workflowScope.coroutineContext[Job]!!.invokeOnCompletion {
    outputs.close(it)
  }

Guia do colaborador