diff --git a/temporal-sdk/src/main/java/io/temporal/worker/WorkerDeploymentOptions.java b/temporal-sdk/src/main/java/io/temporal/worker/WorkerDeploymentOptions.java index 791e01438..b2a0a3bb6 100644 --- a/temporal-sdk/src/main/java/io/temporal/worker/WorkerDeploymentOptions.java +++ b/temporal-sdk/src/main/java/io/temporal/worker/WorkerDeploymentOptions.java @@ -61,6 +61,9 @@ public WorkerDeploymentOptions build() { Preconditions.checkState( !(useVersioning && version == null), "If useVersioning is set, setVersion must be called"); + Preconditions.checkState( + useVersioning || defaultVersioningBehavior == VersioningBehavior.UNSPECIFIED, + "defaultVersioningBehavior must be UNSPECIFIED when useVersioning is false"); return new WorkerDeploymentOptions(useVersioning, version, defaultVersioningBehavior); } } diff --git a/temporal-sdk/src/test/java/io/temporal/worker/WorkerVersioningTest.java b/temporal-sdk/src/test/java/io/temporal/worker/WorkerVersioningTest.java index a51f0fe1b..bb9bd8992 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/WorkerVersioningTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/WorkerVersioningTest.java @@ -387,6 +387,63 @@ public void testAnnotationNotAllowedOnInterface() { e.getMessage()); } + @Test + public void testWorkerWithDeploymentOptionsVersioningOffCanRunWorkflows() { + assumeTrue("Test Server doesn't support versioning", SDKTestWorkflowRule.useExternalService); + + Worker w1 = + testWorkflowRule.newWorker( + (opts) -> + opts.setDeploymentOptions( + WorkerDeploymentOptions.newBuilder() + .setVersion( + new WorkerDeploymentVersion( + testWorkflowRule.getDeploymentName(), "my-custom-build-id-1.0")) + .setUseVersioning(false) + .build())); + w1.registerWorkflowImplementationTypes(TestWorkerVersioningMissingAnnotation.class); + w1.start(); + + TestWorkflows.QueryableWorkflow wf = + testWorkflowRule.newWorkflowStubTimeoutOptions( + TestWorkflows.QueryableWorkflow.class, "versioning-off-build-id"); + WorkflowExecution we = WorkflowClient.start(wf::execute); + wf.mySignal("done"); + String result = + testWorkflowRule + .getWorkflowClient() + .newUntypedWorkflowStub(we.getWorkflowId()) + .getResult(String.class); + Assert.assertEquals("no-annotation", result); + + WorkflowExecutionHistory hist = testWorkflowRule.getExecutionHistory(we.getWorkflowId()); + Assert.assertTrue( + "Expected build ID to appear in workflow history", + hist.getHistory().getEventsList().stream() + .anyMatch( + e -> + e.getEventType() == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED + && e.getWorkflowTaskCompletedEventAttributes() + .getDeploymentVersion() + .getBuildId() + .equals("my-custom-build-id-1.0"))); + } + + @Test + public void testRejectsVersioningBehaviorWhenVersioningOff() { + IllegalStateException e = + Assert.assertThrows( + IllegalStateException.class, + () -> + WorkerDeploymentOptions.newBuilder() + .setVersion( + new WorkerDeploymentVersion(testWorkflowRule.getDeploymentName(), "1.0")) + .setUseVersioning(false) + .setDefaultVersioningBehavior(VersioningBehavior.AUTO_UPGRADE) + .build()); + Assert.assertTrue(e.getMessage().contains("defaultVersioningBehavior must be UNSPECIFIED")); + } + @SuppressWarnings("deprecation") @Test public void testWorkflowsCanUseVersioningOverride() {