-
Notifications
You must be signed in to change notification settings - Fork 180
Description
Expected Behavior
Integration tests with Temporal should not actually sleep or wait when using TestWorkflowEnvironment.sleep().
The virtual time should advance instantly, regardless of other tests being executed before.
Actual Behavior
In some cases, tests sleep and wait in real time instead of using virtual time.
This happens when a test using TestWorkflowEnvironment.sleep() runs after another test that executed a child workflow.
Steps to Reproduce the Problem
-
Use Temporal library 1.30.1 with io.temporal:temporal-spring-boot-starter.
-
Have a workflow with setStartDelay().
-
Write an integration test that relies on TestWorkflowEnvironment.sleep(Duration.ofDays(1)).
When run in isolation, the test passes instantly (virtual time works).
-
Add another test that uses a child workflow, e.g.:
TestWorkflow transferWorkflow =
Workflow.newChildWorkflowStub(
TestWorkflow.class,
ChildWorkflowOptions.newBuilder()
.setWorkflowId("test-id")
.setTaskQueue("test-task-queues")
.setParentClosePolicy(ParentClosePolicy.PARENT_CLOSE_POLICY_ABANDON)
.setWorkflowIdReusePolicy(WorkflowIdReusePolicy.WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE)
.setRetryOptions(RetryOptions.newBuilder()
.setMaximumAttempts(MAXIMUM_ATTEMPTS)
.build())
.build()
);
Async.procedure(() -> transferWorkflow.test(test.testId()));
Promise<WorkflowExecution> childExecution = Workflow.getWorkflowExecution(transferWorkflow);
childExecution.get();
- Run the whole test suite.
The test with sleep(Duration.ofDays(1)) now sleeps in real time instead of advancing virtual time.
Notes
Behavior is consistent:
✅ Works when the test with sleep is executed alone.
❌ Breaks when a test with a child workflow ran before it.
Looks like something in the child workflow test "switches" the TestWorkflowEnvironment from virtual time to real time.
Specifications
Version: 1.30.1
Platform: Java
Dependency: io.temporal:temporal-spring-boot-starter