square/workflow-kotlin

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

Aperta

#983 aperta il 31 mar 2023

 (0 commenti) (0 reazioni) (0 assegnatari)Kotlin (112 fork)github user discovery
good first issue

Metriche repository

Star
 (1120 stelle)
Metriche merge PR
 (Merge medio 55g 8h) (9 PR mergiate in 30 g)

Descrizione

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)
  }

Guida contributor