diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 50df553e2e..6ce1a1d389 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -175,7 +175,7 @@ jobs: - name: Run cloud test if: ${{ steps.cloud-test-eligibility.outputs.enabled == 'true' }} - timeout-minutes: 15 + timeout-minutes: 40 env: USER: unittest TEMPORAL_TEST_ENV_CONFIG_SERVER: "true" @@ -184,10 +184,7 @@ jobs: TEMPORAL_CLIENT_CLOUD_NAMESPACE: ${{ steps.create-cloud-namespace.outputs.namespace }} TEMPORAL_CLIENT_CLOUD_API_KEY: ${{ secrets.TEMPORAL_CLIENT_CLOUD_API_KEY }} TEMPORAL_CLIENT_CLOUD_API_VERSION: v0.19.1 - run: | - ./gradlew --no-daemon :temporal-sdk:test \ - --tests '*CloudOperationsClientTest' \ - --tests 'io.temporal.client.functional.SignalTest.signalCompletedWorkflow' + run: ./gradlew --no-daemon :temporal-sdk:testCloud - name: Delete Cloud namespace id: delete-cloud-namespace @@ -207,7 +204,7 @@ jobs: uses: mikepenz/action-junit-report@bccf2e31636835cf0874589931c4116687171386 # v6 if: success() || failure() # always run even if the previous step fails with: - report_paths: "**/build/test-results/test/TEST-*.xml" + report_paths: "**/build/test-results/testCloud/TEST-*.xml" code_format: name: Code format diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1dc11851ae..7a6a591565 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -112,6 +112,21 @@ Values from `TEMPORAL_ADDRESS`, `TEMPORAL_NAMESPACE`, `TEMPORAL_API_KEY`, `TEMPO `TEMPORAL_GRPC_META_*` override the selected profile. Envconfig mode connects to an existing server and namespace; it does not create or register either one. +The `:temporal-sdk:testCloud` task runs tests that are eligible for Temporal Cloud. It uses the same +envconfig variables and excludes tests annotated with a `CloudTestExclusion` JUnit category. Tests +are Cloud-eligible by default; use the narrowest applicable exclusion reason when a test requires a +local server, requires Cloud resources that CI does not provision, or still needs Cloud-specific +adaptation. Run `./gradlew :temporal-sdk:testCloud --test-dry-run` to inventory the selected tests +without executing them. The normal `test` task continues to run Cloud-excluded tests locally. + +JUnit category marker interfaces are the Java equivalent of test-runner traits. Every Cloud +exclusion must pair its reason category with a complete explanatory note: + +```java +@CloudTestExclusionNote("Starts an in-process time-skipping server.") +@Category(RequiresLocalServer.class) +``` + ## Things to Avoid Avoid changes that make review harder without improving the contribution: diff --git a/temporal-sdk/build.gradle b/temporal-sdk/build.gradle index b74f330a68..5dd82cab2e 100644 --- a/temporal-sdk/build.gradle +++ b/temporal-sdk/build.gradle @@ -179,6 +179,34 @@ test { } } +task testCloud(type: Test) { + group = 'verification' + description = 'Runs temporal-sdk tests that are eligible for Temporal Cloud.' + testClassesDirs = sourceSets.test.output.classesDirs + classpath = sourceSets.test.runtimeClasspath + if (project.hasProperty('testJavaVersion')) { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(project.property('testJavaVersion') as int) + } + } + useJUnit { + excludeCategories 'io.temporal.testing.CloudTestExclusion' + excludeCategories 'io.temporal.worker.IndependentResourceBasedTests' + } + testLogging { + events 'passed', 'skipped', 'failed' + exceptionFormat 'full' + showStandardStreams true + } + forkEvery = 1 + maxParallelForks = Math.max(Runtime.runtime.availableProcessors().intdiv(2), 1) ?: 1 + afterTest { TestDescriptor descriptor, TestResult result -> + if (result.resultType == org.gradle.api.tasks.testing.TestResult.ResultType.FAILURE) { + failedTests << ["${descriptor.className}::${descriptor.name}"] + } + } +} + // On Java 17+, prepend java17 classes to all test classpaths so that Class.forName finds // the real Jackson3JsonPayloadConverter instead of the Java 8 stub. This lets us test // the present-java17-but-absent-jackson3 behavior (NoClassDefFoundError) in the same diff --git a/temporal-sdk/src/test/java/io/temporal/activity/ActivityInfoTest.java b/temporal-sdk/src/test/java/io/temporal/activity/ActivityInfoTest.java index 8e8a8ccc3b..ab2f878bcc 100644 --- a/temporal-sdk/src/test/java/io/temporal/activity/ActivityInfoTest.java +++ b/temporal-sdk/src/test/java/io/temporal/activity/ActivityInfoTest.java @@ -73,7 +73,8 @@ public void getActivityInfo() { Assert.assertEquals(ACTIVITY_OPTIONS.getStartToCloseTimeout(), info.startToCloseTimeout); Assert.assertEquals(ACTIVITY_OPTIONS.getHeartbeatTimeout(), info.heartbeatTimeout); Assert.assertEquals(ActivityInfoWorkflow.class.getSimpleName(), info.workflowType); - Assert.assertEquals(SDKTestWorkflowRule.NAMESPACE, info.namespace); + Assert.assertEquals( + testWorkflowRule.getWorkflowClient().getOptions().getNamespace(), info.namespace); Assert.assertEquals(testWorkflowRule.getTaskQueue(), info.activityTaskQueue); Assert.assertFalse(info.isLocal); Assert.assertEquals(0, info.priorityKey); @@ -98,7 +99,8 @@ public void getLocalActivityInfo() { Assert.assertTrue(info.startToCloseTimeout.isZero()); Assert.assertTrue(info.heartbeatTimeout.isZero()); Assert.assertEquals(ActivityInfoWorkflow.class.getSimpleName(), info.workflowType); - Assert.assertEquals(SDKTestWorkflowRule.NAMESPACE, info.namespace); + Assert.assertEquals( + testWorkflowRule.getWorkflowClient().getOptions().getNamespace(), info.namespace); Assert.assertEquals(testWorkflowRule.getTaskQueue(), info.activityTaskQueue); Assert.assertTrue(info.isLocal); Assert.assertEquals(0, info.priorityKey); diff --git a/temporal-sdk/src/test/java/io/temporal/authorization/AuthorizationTokenTest.java b/temporal-sdk/src/test/java/io/temporal/authorization/AuthorizationTokenTest.java index 544732a65f..b69327eae6 100644 --- a/temporal-sdk/src/test/java/io/temporal/authorization/AuthorizationTokenTest.java +++ b/temporal-sdk/src/test/java/io/temporal/authorization/AuthorizationTokenTest.java @@ -6,6 +6,8 @@ import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowOptions; import io.temporal.serviceclient.WorkflowServiceStubsOptions; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; @@ -20,9 +22,12 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.TestWatcher; import org.junit.runner.Description; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class AuthorizationTokenTest { private static Metadata.Key TEMPORAL_NAMESPACE_HEADER_KEY = Metadata.Key.of("temporal-namespace", Metadata.ASCII_STRING_MARSHALLER); diff --git a/temporal-sdk/src/test/java/io/temporal/client/functional/BuildIdVersionSetsTest.java b/temporal-sdk/src/test/java/io/temporal/client/functional/BuildIdVersionSetsTest.java index 156c3f507c..f895ef4fc3 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/functional/BuildIdVersionSetsTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/functional/BuildIdVersionSetsTest.java @@ -6,6 +6,8 @@ import io.temporal.api.enums.v1.TaskReachability; import io.temporal.client.*; import io.temporal.internal.testing.WorkflowTestingTest; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.Worker; import io.temporal.worker.WorkerFactory; @@ -16,8 +18,12 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; @SuppressWarnings({"OptionalGetWithoutIsPresent", "deprecation"}) +@CloudTestExclusionNote( + "Cloud CI namespaces disable the deprecated version-set and rules-based versioning APIs.") +@Category(RequiresCloudProvisioning.class) public class BuildIdVersionSetsTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultAsyncOverServerLongPollWaitTest.java b/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultAsyncOverServerLongPollWaitTest.java index 02add6c2ba..1c735233c0 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultAsyncOverServerLongPollWaitTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultAsyncOverServerLongPollWaitTest.java @@ -54,7 +54,9 @@ public void run() { private ActivityClient newActivityClient() { return ActivityClient.newInstance( testWorkflowRule.getWorkflowClient().getWorkflowServiceStubs(), - ActivityClientOptions.newBuilder().setNamespace(SDKTestWorkflowRule.NAMESPACE).build()); + ActivityClientOptions.newBuilder() + .setNamespace(testWorkflowRule.getWorkflowClient().getOptions().getNamespace()) + .build()); } private StartActivityOptions slowOpts() { diff --git a/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultOverLongPollWaitTest.java b/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultOverLongPollWaitTest.java index 376fbe0255..ee5f32e474 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultOverLongPollWaitTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultOverLongPollWaitTest.java @@ -66,7 +66,9 @@ public void setUp() { activityClient = ActivityClient.newInstance( clientStubs, - ActivityClientOptions.newBuilder().setNamespace(SDKTestWorkflowRule.NAMESPACE).build()); + ActivityClientOptions.newBuilder() + .setNamespace(testWorkflowRule.getWorkflowClient().getOptions().getNamespace()) + .build()); } @After diff --git a/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultSyncOverServerLongPollWaitTest.java b/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultSyncOverServerLongPollWaitTest.java index 858e8a3df7..f2ac623409 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultSyncOverServerLongPollWaitTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/functional/GetActivityResultSyncOverServerLongPollWaitTest.java @@ -53,7 +53,9 @@ public void run() { private ActivityClient newActivityClient() { return ActivityClient.newInstance( testWorkflowRule.getWorkflowClient().getWorkflowServiceStubs(), - ActivityClientOptions.newBuilder().setNamespace(SDKTestWorkflowRule.NAMESPACE).build()); + ActivityClientOptions.newBuilder() + .setNamespace(testWorkflowRule.getWorkflowClient().getOptions().getNamespace()) + .build()); } private StartActivityOptions slowOpts() { diff --git a/temporal-sdk/src/test/java/io/temporal/client/functional/MetricsTest.java b/temporal-sdk/src/test/java/io/temporal/client/functional/MetricsTest.java index a7452fb37d..22e0092592 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/functional/MetricsTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/functional/MetricsTest.java @@ -1,7 +1,6 @@ package io.temporal.client.functional; import static io.temporal.testUtils.Eventually.assertEventually; -import static io.temporal.testing.internal.SDKTestWorkflowRule.NAMESPACE; import static junit.framework.TestCase.*; import static org.junit.Assume.assumeTrue; @@ -54,22 +53,26 @@ public class MetricsTest { private final ActivityClient activityClient = ActivityClient.newInstance( testWorkflowRule.getWorkflowServiceStubs(), - ActivityClientOptions.newBuilder().setNamespace(SDKTestWorkflowRule.NAMESPACE).build()); - - private static final List TAGS_NAMESPACE = - MetricsTag.defaultTags(NAMESPACE).entrySet().stream() - .map( - nameValueEntry -> - new ImmutableTag(nameValueEntry.getKey(), nameValueEntry.getValue())) - .collect(Collectors.toList()); + ActivityClientOptions.newBuilder() + .setNamespace(testWorkflowRule.getWorkflowClient().getOptions().getNamespace()) + .build()); + private List tagsNamespace; private List tagsNamespaceQueue; @Before public void setUp() { registry.clear(); + tagsNamespace = + MetricsTag.defaultTags(testWorkflowRule.getWorkflowClient().getOptions().getNamespace()) + .entrySet() + .stream() + .map( + nameValueEntry -> + new ImmutableTag(nameValueEntry.getKey(), nameValueEntry.getValue())) + .collect(Collectors.toList()); tagsNamespaceQueue = - replaceTags(TAGS_NAMESPACE, MetricsTag.TASK_QUEUE, testWorkflowRule.getTaskQueue()); + replaceTags(tagsNamespace, MetricsTag.TASK_QUEUE, testWorkflowRule.getTaskQueue()); } @After @@ -97,7 +100,7 @@ public void testSynchronousStartAndGetResult() throws InterruptedException { MetricsTag.WORKFLOW_TYPE, "QuicklyCompletingWorkflow"); List longPollRequestTags = - replaceTag(TAGS_NAMESPACE, MetricsTag.OPERATION_NAME, "GetWorkflowExecutionHistory"); + replaceTag(tagsNamespace, MetricsTag.OPERATION_NAME, "GetWorkflowExecutionHistory"); assertEventually( Duration.ofSeconds(2), @@ -130,7 +133,7 @@ public void testAsynchronousStartAndGetResult() throws InterruptedException, Exe MetricsTag.WORKFLOW_TYPE, "QuicklyCompletingWorkflow"); List longPollRequestTags = - replaceTag(TAGS_NAMESPACE, MetricsTag.OPERATION_NAME, "GetWorkflowExecutionHistory"); + replaceTag(tagsNamespace, MetricsTag.OPERATION_NAME, "GetWorkflowExecutionHistory"); assertEventually( Duration.ofSeconds(2), diff --git a/temporal-sdk/src/test/java/io/temporal/client/functional/StandaloneActivityTest.java b/temporal-sdk/src/test/java/io/temporal/client/functional/StandaloneActivityTest.java index 5be3226dcd..d1d1b8bc7d 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/functional/StandaloneActivityTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/functional/StandaloneActivityTest.java @@ -23,6 +23,8 @@ import io.temporal.common.interceptors.ActivityClientInterceptorBase; import io.temporal.failure.ApplicationFailure; import io.temporal.failure.CanceledFailure; +import io.temporal.testing.CloudTestExclusion.NeedsCloudAdaptation; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import java.time.Duration; import java.util.*; @@ -32,6 +34,7 @@ import java.util.stream.Collectors; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; /** * Integration tests for standalone activities started via {@link ActivityClient}. @@ -257,7 +260,9 @@ private StartActivityOptions simpleOpts(String id) { private ActivityClient newActivityClient() { return ActivityClient.newInstance( testWorkflowRule.getWorkflowServiceStubs(), - ActivityClientOptions.newBuilder().setNamespace(SDKTestWorkflowRule.NAMESPACE).build()); + ActivityClientOptions.newBuilder() + .setNamespace(testWorkflowRule.getWorkflowClient().getOptions().getNamespace()) + .build()); } @Test @@ -516,7 +521,7 @@ public void testStartActivityInterceptorsAreCalledProperly() throws InterruptedE ActivityClient.newInstance( testWorkflowRule.getWorkflowServiceStubs(), ActivityClientOptions.newBuilder() - .setNamespace(SDKTestWorkflowRule.NAMESPACE) + .setNamespace(testWorkflowRule.getWorkflowClient().getOptions().getNamespace()) .setInterceptors(Collections.singletonList(interceptor)) .build()); @@ -570,7 +575,7 @@ public void testExecuteActivityWorkerActivityInfoIsAccurate() { assertEquals(activityId, info.activityId); assertEquals("InspectInfo", info.activityType); - assertEquals(SDKTestWorkflowRule.NAMESPACE, info.namespace); + assertEquals(testWorkflowRule.getWorkflowClient().getOptions().getNamespace(), info.namespace); assertEquals(testWorkflowRule.getTaskQueue(), info.taskQueue); assertFalse(info.isLocal); assertFalse(info.isInWorkflow); @@ -831,6 +836,9 @@ public void testDescribeRawInfoMatchesTypedAccessors() { assertEquals(desc.getAttempt(), rawInfo.getAttempt()); } + @CloudTestExclusionNote( + "Cloud describe does not expose the last failure during retry backoff within the test window.") + @Category(NeedsCloudAdaptation.class) @Test public void testDescribeLastFailureIsPopulatedDuringRetryBackoff() { assumeTrue(SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/client/functional/StartTest.java b/temporal-sdk/src/test/java/io/temporal/client/functional/StartTest.java index 2c70b3a94e..8d59951b9a 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/functional/StartTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/functional/StartTest.java @@ -12,6 +12,8 @@ import io.temporal.client.WorkflowTargetOptions; import io.temporal.common.WorkflowExecutionHistory; import io.temporal.internal.common.ProtobufTimeUtils; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.shared.TestMultiArgWorkflowFunctions.*; @@ -21,6 +23,7 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class StartTest { @@ -70,6 +73,9 @@ public void startNoArgFuncWithRejectDuplicate() { "func", stubF.func()); // Check that duplicated start just returns the result. } + @CloudTestExclusionNote( + "This test exercises behavior that is only supported by the local test server.") + @Category(RequiresLocalServer.class) @Test public void startOneArgsFuncWithDefault() { // TODO why it doesn't work with external service? diff --git a/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusAsyncApiTest.java b/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusAsyncApiTest.java index c778091b4c..0470cbef67 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusAsyncApiTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusAsyncApiTest.java @@ -12,6 +12,8 @@ import io.temporal.client.UntypedNexusOperationHandle; import io.temporal.client.UntypedNexusServiceClient; import io.temporal.failure.ApplicationFailure; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.shared.EchoNexusServiceImpl; import io.temporal.workflow.shared.TestNexusServices; @@ -25,6 +27,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; /** * Coverage tests for the {@link CompletableFuture}-returning surface on the standalone Nexus @@ -33,6 +36,9 @@ * UntypedNexusOperationHandle}. Each overload is asserted against the existing sync echo handler so * the Java async API is exercised without depending on server-side async completion. */ +@CloudTestExclusionNote( + "Cloud CI does not provision the standalone Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class NexusAsyncApiTest { @Rule diff --git a/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusClientTest.java b/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusClientTest.java index 0046a321d4..fb49451fb7 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusClientTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusClientTest.java @@ -26,6 +26,8 @@ import io.temporal.client.UntypedNexusOperationHandle; import io.temporal.client.UntypedNexusServiceClient; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.shared.EchoNexusServiceImpl; import io.temporal.workflow.shared.TestNexusServices; @@ -41,7 +43,11 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote( + "Cloud CI does not provision the standalone Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class NexusClientTest { private final AtomicInteger activityInvocationCount = new AtomicInteger(); diff --git a/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusOperationHandleTest.java b/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusOperationHandleTest.java index 11d76f0b1e..862d53fa33 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusOperationHandleTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusOperationHandleTest.java @@ -14,6 +14,8 @@ import io.temporal.client.UntypedNexusOperationHandle; import io.temporal.client.UntypedNexusServiceClient; import io.temporal.failure.ApplicationFailure; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.shared.EchoNexusServiceImpl; import io.temporal.workflow.shared.TestNexusServices; @@ -24,12 +26,16 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; /** * Tests for {@link UntypedNexusOperationHandle} per-execution lifecycle methods returned by {@link * NexusClient#getHandle(String, String)}: {@code describe()}, {@code cancel()}/{@code * cancel(reason)}, and {@code terminate()}/{@code terminate(reason)}. */ +@CloudTestExclusionNote( + "Cloud CI does not provision the standalone Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class NexusOperationHandleTest { @Rule diff --git a/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusServiceClientTest.java b/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusServiceClientTest.java index 395a0be2bf..c880a9bd01 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusServiceClientTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/nexus/NexusServiceClientTest.java @@ -13,6 +13,8 @@ import io.temporal.client.NexusServiceClient; import io.temporal.client.StartNexusOperationOptions; import io.temporal.client.UntypedNexusOperationHandle; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.shared.EchoNexusServiceImpl; import io.temporal.workflow.shared.TestNexusServices; @@ -23,11 +25,15 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; /** * End-to-end tests for {@link NexusServiceClient}: typed start/execute via {@link * io.temporal.workflow.Functions.Func2} method references. */ +@CloudTestExclusionNote( + "Cloud CI does not provision the standalone Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class NexusServiceClientTest { @Rule diff --git a/temporal-sdk/src/test/java/io/temporal/client/nexus/StandaloneNexusBackingWorkflowTest.java b/temporal-sdk/src/test/java/io/temporal/client/nexus/StandaloneNexusBackingWorkflowTest.java index dea4b8b8d8..2638278077 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/nexus/StandaloneNexusBackingWorkflowTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/nexus/StandaloneNexusBackingWorkflowTest.java @@ -24,6 +24,8 @@ import io.temporal.failure.CanceledFailure; import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.Workflow; import io.temporal.workflow.WorkflowInterface; @@ -36,6 +38,7 @@ import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; /** * Behavior tests for standalone Nexus operations whose handler is {@link WorkflowRunOperation}, @@ -43,6 +46,9 @@ * individual tests can exercise cancel propagation, bidirectional link plumbing, and any other * behavior that depends on the SANO ↔ backing-workflow relationship. */ +@CloudTestExclusionNote( + "Cloud CI does not provision the standalone Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class StandaloneNexusBackingWorkflowTest { static final AtomicReference capturedWorkflowId = new AtomicReference<>(); diff --git a/temporal-sdk/src/test/java/io/temporal/client/nexus/StandaloneNexusSignalLinkingTest.java b/temporal-sdk/src/test/java/io/temporal/client/nexus/StandaloneNexusSignalLinkingTest.java index 2864ed2ca7..00587b802e 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/nexus/StandaloneNexusSignalLinkingTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/nexus/StandaloneNexusSignalLinkingTest.java @@ -21,6 +21,8 @@ import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowOptions; import io.temporal.nexus.Nexus; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.SignalMethod; import io.temporal.workflow.Workflow; @@ -33,6 +35,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; /** * Verifies bidirectional link propagation when a Nexus operation handler signal-with-starts a @@ -52,6 +55,9 @@ *

Requires a real server: standalone Nexus operations and {@code EnableCHASMSignalBacklinks} are * not implemented by the in-memory test server. Test skips locally and runs in CI. */ +@CloudTestExclusionNote( + "Cloud CI does not provision the standalone Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class StandaloneNexusSignalLinkingTest { @Rule diff --git a/temporal-sdk/src/test/java/io/temporal/client/schedules/ScheduleTest.java b/temporal-sdk/src/test/java/io/temporal/client/schedules/ScheduleTest.java index f7f5f50daf..c89953b1a9 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/schedules/ScheduleTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/schedules/ScheduleTest.java @@ -10,6 +10,8 @@ import io.temporal.common.converter.EncodedValues; import io.temporal.common.interceptors.ScheduleClientInterceptor; import io.temporal.testUtils.Eventually; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.shared.TestWorkflows; import java.time.Duration; @@ -24,6 +26,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class ScheduleTest { static final SearchAttributeKey CUSTOM_KEYWORD_SA = @@ -394,6 +397,9 @@ public void describeSchedules() { } @Test + @CloudTestExclusionNote( + "Cloud CI does not provision the custom search attribute used by this test.") + @Category(RequiresCloudProvisioning.class) public void updateSchedules() { ScheduleClient client = createScheduleClient(); // Create the schedule @@ -497,6 +503,9 @@ public void updateSchedules() { } @Test + @CloudTestExclusionNote( + "Cloud CI does not provision the custom search attribute used by this test.") + @Category(RequiresCloudProvisioning.class) public void listSchedules() { ScheduleClient client = createScheduleClient(); // Create the schedule diff --git a/temporal-sdk/src/test/java/io/temporal/client/schedules/ScheduleWithTypedSearchAttributesTest.java b/temporal-sdk/src/test/java/io/temporal/client/schedules/ScheduleWithTypedSearchAttributesTest.java index 55b6ccedfd..36dce6b399 100644 --- a/temporal-sdk/src/test/java/io/temporal/client/schedules/ScheduleWithTypedSearchAttributesTest.java +++ b/temporal-sdk/src/test/java/io/temporal/client/schedules/ScheduleWithTypedSearchAttributesTest.java @@ -12,6 +12,8 @@ import io.temporal.common.SearchAttributeKey; import io.temporal.common.SearchAttributes; import io.temporal.common.converter.DefaultDataConverter; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.shared.TestWorkflows; import java.time.Duration; @@ -22,7 +24,11 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote( + "Cloud CI does not provision the custom search attributes used by this schedule suite.") +@Category(RequiresCloudProvisioning.class) public class ScheduleWithTypedSearchAttributesTest { static final SearchAttributeKey CUSTOM_KEYWORD_SA = SearchAttributeKey.forKeyword("CustomKeywordField"); diff --git a/temporal-sdk/src/test/java/io/temporal/common/PluginPropagationTest.java b/temporal-sdk/src/test/java/io/temporal/common/PluginPropagationTest.java index d91922884a..5b3c2a7118 100644 --- a/temporal-sdk/src/test/java/io/temporal/common/PluginPropagationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/common/PluginPropagationTest.java @@ -24,6 +24,8 @@ import io.temporal.client.WorkflowClientOptions; import io.temporal.serviceclient.WorkflowServiceStubsOptions; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.WorkerFactoryOptions; @@ -34,11 +36,14 @@ import java.util.List; import javax.annotation.Nonnull; import org.junit.Test; +import org.junit.experimental.categories.Category; /** * Tests that plugins propagate through the full chain: WorkflowServiceStubsOptions → * WorkflowClientOptions → WorkerFactory */ +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class PluginPropagationTest { /** A plugin that tracks all configuration calls via subclassing. */ diff --git a/temporal-sdk/src/test/java/io/temporal/common/interceptors/ActivityClientCallsInterceptorChainTest.java b/temporal-sdk/src/test/java/io/temporal/common/interceptors/ActivityClientCallsInterceptorChainTest.java index 83747ce8f4..17a5909fe7 100644 --- a/temporal-sdk/src/test/java/io/temporal/common/interceptors/ActivityClientCallsInterceptorChainTest.java +++ b/temporal-sdk/src/test/java/io/temporal/common/interceptors/ActivityClientCallsInterceptorChainTest.java @@ -72,7 +72,7 @@ private ActivityClient newClient(ActivityClientInterceptor... interceptors) { return ActivityClient.newInstance( testRule.getWorkflowServiceStubs(), ActivityClientOptions.newBuilder() - .setNamespace(SDKTestWorkflowRule.NAMESPACE) + .setNamespace(testRule.getWorkflowClient().getOptions().getNamespace()) .setInterceptors(Arrays.asList(interceptors)) .build()); } diff --git a/temporal-sdk/src/test/java/io/temporal/functional/serialization/WorkflowIdSignedPayloadsTest.java b/temporal-sdk/src/test/java/io/temporal/functional/serialization/WorkflowIdSignedPayloadsTest.java index 136c07bea2..c5068d8f87 100644 --- a/temporal-sdk/src/test/java/io/temporal/functional/serialization/WorkflowIdSignedPayloadsTest.java +++ b/temporal-sdk/src/test/java/io/temporal/functional/serialization/WorkflowIdSignedPayloadsTest.java @@ -18,6 +18,8 @@ import io.temporal.payload.context.ActivitySerializationContext; import io.temporal.payload.context.HasWorkflowSerializationContext; import io.temporal.payload.context.SerializationContext; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; @@ -32,6 +34,7 @@ import javax.annotation.Nullable; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.TestName; /** @@ -78,7 +81,7 @@ public void testSimpleWorkflowWithAnActivity() { assertEquals("result", workflowStub.execute("input")); } - @Test + @Test(timeout = 30_000) public void testSimpleWorkflowWithMemo() throws InterruptedException { assumeTrue( "skipping as test server does not support list", SDKTestWorkflowRule.useExternalService); @@ -108,6 +111,8 @@ public void testSimpleWorkflowWithMemo() throws InterruptedException { assertEquals(MEMO_VALUE, executions.get(0).getMemo(MEMO_KEY, String.class)); } + @CloudTestExclusionNote("This cron test depends on local test-server time skipping.") + @Category(RequiresLocalServer.class) @Test public void testSimpleCronWorkflow() { assumeFalse("skipping as test will timeout", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/replay/GetVersionInterleavedUpdateReplayTaskHandlerTest.java b/temporal-sdk/src/test/java/io/temporal/internal/replay/GetVersionInterleavedUpdateReplayTaskHandlerTest.java index 2e90698ff7..8b5084e925 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/replay/GetVersionInterleavedUpdateReplayTaskHandlerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/replay/GetVersionInterleavedUpdateReplayTaskHandlerTest.java @@ -11,6 +11,8 @@ import io.temporal.common.WorkflowExecutionHistory; import io.temporal.internal.worker.QueryReplayHelper; import io.temporal.serviceclient.WorkflowServiceStubs; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; import io.temporal.workflow.versionTests.GetVersionInterleavedUpdateReplayTest; @@ -19,7 +21,10 @@ import java.lang.reflect.Method; import java.util.Arrays; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class GetVersionInterleavedUpdateReplayTaskHandlerTest { private static final String EXPECTED_FIRST_CHANGE_ID = "ChangeId1"; private static final String EXPECTED_SECOND_CHANGE_ID = "ChangeId2"; diff --git a/temporal-sdk/src/test/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandlerCacheTests.java b/temporal-sdk/src/test/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandlerCacheTests.java index 751af5435c..dfb576a5fb 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandlerCacheTests.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandlerCacheTests.java @@ -26,6 +26,8 @@ import io.temporal.internal.worker.WorkflowRunLockManager; import io.temporal.serviceclient.MetricsTag; import io.temporal.testUtils.HistoryUtils; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.MetricsType; import java.util.Map; @@ -34,6 +36,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class ReplayWorkflowRunTaskHandlerCacheTests { @@ -71,6 +74,8 @@ public void whenHistoryIsFullNewWorkflowExecutorIsReturnedAndCached_InitiallyEmp cache.getOrCreate(workflowTask, metricsScope, () -> createFakeExecutor(workflowTask))); } + @CloudTestExclusionNote("This cache test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void whenHistoryIsFullNewWorkflowExecutorIsReturned_InitiallyCached() throws Exception { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); @@ -110,6 +115,8 @@ public void whenHistoryIsFullNewWorkflowExecutorIsReturned_InitiallyCached() thr assertSame(workflowRunTaskHandler2, workflowRunTaskHandler); } + @CloudTestExclusionNote("This cache test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test(timeout = 2000) public void whenHistoryIsPartialCachedEntryIsReturned() throws Exception { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandlerTaskHandlerTests.java b/temporal-sdk/src/test/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandlerTaskHandlerTests.java index ed6446678a..32a4579a4c 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandlerTaskHandlerTests.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/replay/ReplayWorkflowRunTaskHandlerTaskHandlerTests.java @@ -26,6 +26,8 @@ import io.temporal.serviceclient.Version; import io.temporal.serviceclient.WorkflowServiceStubs; import io.temporal.testUtils.HistoryUtils; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import java.time.Duration; import java.util.HashMap; @@ -33,11 +35,14 @@ import java.util.Optional; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class ReplayWorkflowRunTaskHandlerTaskHandlerTests { @Rule public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder().build(); + @CloudTestExclusionNote("This cache test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void ifStickyExecutionAttributesAreNotSetThenWorkflowsAreNotCached() throws Throwable { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); @@ -65,6 +70,8 @@ public void ifStickyExecutionAttributesAreNotSetThenWorkflowsAreNotCached() thro assertFalse(result.getTaskCompleted().hasStickyAttributes()); } + @CloudTestExclusionNote("This replay test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void workflowTaskFailOnIncompleteHistory() throws Throwable { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); @@ -158,6 +165,8 @@ public void localActivityMeteringHelper() { assertEquals(5, laMeteringHelper.getNonfirstAttempts()); } + @CloudTestExclusionNote("This cache test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void ifStickyExecutionAttributesAreSetThenWorkflowsAreCached() throws Throwable { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); @@ -189,6 +198,8 @@ public void ifStickyExecutionAttributesAreSetThenWorkflowsAreCached() throws Thr assertEquals(Durations.fromSeconds(5), attributes.getScheduleToStartTimeout()); } + @CloudTestExclusionNote("This replay test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void setsSdkNameAndVersionIfNotSetInHistory() throws Throwable { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/replay/UnknownHistoryEventReplayerTest.java b/temporal-sdk/src/test/java/io/temporal/internal/replay/UnknownHistoryEventReplayerTest.java index f0985b81f6..0364da06ac 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/replay/UnknownHistoryEventReplayerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/replay/UnknownHistoryEventReplayerTest.java @@ -6,13 +6,18 @@ import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowOptions; import io.temporal.common.WorkflowExecutionHistory; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; import io.temporal.workflow.*; import java.time.Duration; import org.junit.*; +import org.junit.experimental.categories.Category; import org.junit.rules.Timeout; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class UnknownHistoryEventReplayerTest { public static final String TASK_QUEUE = "unknown-history-event"; diff --git a/temporal-sdk/src/test/java/io/temporal/internal/sync/PromiseTest.java b/temporal-sdk/src/test/java/io/temporal/internal/sync/PromiseTest.java index d8a69f6f79..c7af1e5ad0 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/sync/PromiseTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/sync/PromiseTest.java @@ -7,6 +7,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.failure.CanceledFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; import io.temporal.workflow.CompletablePromise; @@ -21,7 +23,10 @@ import java.util.List; import java.util.concurrent.*; import org.junit.*; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class PromiseTest { @Rule public final Tracer trace = new Tracer(); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalDeprecatedQueueTest.java b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalDeprecatedQueueTest.java index 6f8352bca8..dc24790c8d 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalDeprecatedQueueTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalDeprecatedQueueTest.java @@ -4,6 +4,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.failure.CanceledFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; import io.temporal.workflow.*; @@ -16,8 +18,11 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.junit.*; +import org.junit.experimental.categories.Category; @SuppressWarnings("deprecation") +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class WorkflowInternalDeprecatedQueueTest { @Rule public final Tracer trace = new Tracer(); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalLockTest.java b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalLockTest.java index 9d96dd3248..a377cf62cd 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalLockTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalLockTest.java @@ -4,6 +4,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.failure.CanceledFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; import io.temporal.workflow.*; @@ -19,7 +21,10 @@ import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class WorkflowInternalLockTest { @Rule public final Tracer trace = new Tracer(); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalQueueTest.java b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalQueueTest.java index dd63b1a61a..4556def9ba 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalQueueTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalQueueTest.java @@ -4,6 +4,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.failure.CanceledFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; import io.temporal.workflow.QueueConsumer; @@ -20,7 +22,10 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.junit.*; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class WorkflowInternalQueueTest { @Rule public final Tracer trace = new Tracer(); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalSemaphoreTest.java b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalSemaphoreTest.java index 8b7cabac52..f26d10192a 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalSemaphoreTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalSemaphoreTest.java @@ -4,6 +4,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.failure.CanceledFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; import io.temporal.workflow.*; @@ -16,7 +18,10 @@ import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class WorkflowInternalSemaphoreTest { @Rule public final Tracer trace = new Tracer(); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/testing/WorkflowReplayerTest.java b/temporal-sdk/src/test/java/io/temporal/internal/testing/WorkflowReplayerTest.java index 73935a37ec..1460631195 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/testing/WorkflowReplayerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/testing/WorkflowReplayerTest.java @@ -11,6 +11,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.client.WorkflowStub; import io.temporal.common.WorkflowExecutionHistory; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.ReplayResults; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; @@ -28,8 +30,11 @@ import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import org.junit.*; +import org.junit.experimental.categories.Category; import org.junit.rules.Timeout; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class WorkflowReplayerTest { @Rule public Timeout testTimeout = Timeout.seconds(10); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/testing/WorkflowTestingTest.java b/temporal-sdk/src/test/java/io/temporal/internal/testing/WorkflowTestingTest.java index a0479ee3d0..4f6c09c663 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/testing/WorkflowTestingTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/testing/WorkflowTestingTest.java @@ -22,6 +22,8 @@ import io.temporal.failure.ApplicationFailure; import io.temporal.failure.ChildWorkflowFailure; import io.temporal.failure.TimeoutFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; @@ -41,12 +43,15 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.junit.*; +import org.junit.experimental.categories.Category; import org.junit.rules.TestWatcher; import org.junit.rules.Timeout; import org.junit.runner.Description; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class WorkflowTestingTest { private static final Logger log = LoggerFactory.getLogger(WorkflowTestingTest.class); private static final String TASK_QUEUE = "test-workflow"; diff --git a/temporal-sdk/src/test/java/io/temporal/internal/worker/ActivityFailedMetricsTests.java b/temporal-sdk/src/test/java/io/temporal/internal/worker/ActivityFailedMetricsTests.java index 1b0cf17d6b..7d25132249 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/worker/ActivityFailedMetricsTests.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/worker/ActivityFailedMetricsTests.java @@ -134,7 +134,7 @@ private Map getActivityTagsWithWorkerType( String workerType, String workflowType) { Map tags = new HashMap<>(); tags.put("task_queue", testWorkflowRule.getTaskQueue()); - tags.put("namespace", "UnitTest"); + tags.put("namespace", testWorkflowRule.getWorkflowClient().getOptions().getNamespace()); tags.put("activity_type", "Execute"); tags.put("exception", "ApplicationFailure"); tags.put("worker_type", workerType); diff --git a/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowFailedMetricsTests.java b/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowFailedMetricsTests.java index 725a933a59..a012f9a54d 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowFailedMetricsTests.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowFailedMetricsTests.java @@ -125,7 +125,7 @@ private Map getWorkflowTags(String workflowType) { "task_queue", testWorkflowRule.getTaskQueue(), "namespace", - "UnitTest", + testWorkflowRule.getWorkflowClient().getOptions().getNamespace(), "workflow_type", workflowType); } diff --git a/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowSlotGrpcInterceptedTests.java b/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowSlotGrpcInterceptedTests.java index 7cf7047704..826ade0a96 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowSlotGrpcInterceptedTests.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowSlotGrpcInterceptedTests.java @@ -186,7 +186,7 @@ private Map getWorkerTags(String workerType) { "task_queue", testWorkflowRule.getTaskQueue(), "namespace", - "UnitTest"); + testWorkflowRule.getWorkflowClient().getOptions().getNamespace()); } private static class MaybeFailWFTResponseInterceptor implements ClientInterceptor { diff --git a/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowSlotTests.java b/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowSlotTests.java index cf0c79cfce..a5207b4b0e 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowSlotTests.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/worker/WorkflowSlotTests.java @@ -14,6 +14,8 @@ import io.temporal.common.RetryOptions; import io.temporal.common.reporter.TestStatsReporter; import io.temporal.testUtils.CountingSlotSupplier; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.MetricsType; import io.temporal.worker.WorkerOptions; @@ -27,7 +29,11 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote( + "Cloud CI does not provision the standalone Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class WorkflowSlotTests { private final int MAX_CONCURRENT_WORKFLOW_TASK_EXECUTION_SIZE = 100; private final int MAX_CONCURRENT_ACTIVITY_EXECUTION_SIZE = 1000; diff --git a/temporal-sdk/src/test/java/io/temporal/testing/CloudTestExclusion.java b/temporal-sdk/src/test/java/io/temporal/testing/CloudTestExclusion.java new file mode 100644 index 0000000000..cfb542354e --- /dev/null +++ b/temporal-sdk/src/test/java/io/temporal/testing/CloudTestExclusion.java @@ -0,0 +1,17 @@ +package io.temporal.testing; + +/** Category hierarchy for tests excluded from Temporal Cloud execution. */ +public interface CloudTestExclusion { + + /** The test requires one or more local Temporal Server instances. */ + interface RequiresLocalServer extends CloudTestExclusion {} + + /** + * The test requires a Temporal Cloud capability that CI cannot provision or a feature that is + * unavailable in Temporal Cloud. + */ + interface RequiresCloudProvisioning extends CloudTestExclusion {} + + /** The test can run in Cloud after its setup or assertions are adapted. */ + interface NeedsCloudAdaptation extends CloudTestExclusion {} +} diff --git a/temporal-sdk/src/test/java/io/temporal/testing/CloudTestExclusionNote.java b/temporal-sdk/src/test/java/io/temporal/testing/CloudTestExclusionNote.java new file mode 100644 index 0000000000..127d07da78 --- /dev/null +++ b/temporal-sdk/src/test/java/io/temporal/testing/CloudTestExclusionNote.java @@ -0,0 +1,17 @@ +package io.temporal.testing; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** Explains why a test is excluded from Temporal Cloud execution. */ +@Documented +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface CloudTestExclusionNote { + String value(); +} diff --git a/temporal-sdk/src/test/java/io/temporal/testing/CloudTestExclusionTest.java b/temporal-sdk/src/test/java/io/temporal/testing/CloudTestExclusionTest.java new file mode 100644 index 0000000000..aaccd066b1 --- /dev/null +++ b/temporal-sdk/src/test/java/io/temporal/testing/CloudTestExclusionTest.java @@ -0,0 +1,218 @@ +package io.temporal.testing; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +import io.temporal.testing.CloudTestExclusion.NeedsCloudAdaptation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import java.io.File; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.Test; +import org.junit.experimental.categories.Categories.CategoryFilter; +import org.junit.experimental.categories.Category; +import org.junit.runner.Description; + +public class CloudTestExclusionTest { + private static final Set> REASONS = + new HashSet<>( + Arrays.asList( + RequiresLocalServer.class, + RequiresCloudProvisioning.class, + NeedsCloudAdaptation.class)); + + @Test + public void cloudTestExclusionContract() throws Exception { + assertUmbrellaCategoryExcludesEveryReason(); + assertClassLevelMetadataIsInherited(); + assertEveryCloudExclusionHasOneReasonAndNote(); + assertInvalidCloudExclusionMetadataIsRejected(); + } + + private static void assertUmbrellaCategoryExcludesEveryReason() throws Exception { + CategoryFilter filter = CategoryFilter.exclude(CloudTestExclusion.class); + + assertFalse( + filter.shouldRun( + Description.createSuiteDescription( + ClassExcludedFixture.class.getName(), + ClassExcludedFixture.class.getAnnotations()))); + assertFalse(filter.shouldRun(methodDescription("requiresCloudProvisioning"))); + assertFalse(filter.shouldRun(methodDescription("needsCloudAdaptation"))); + assertTrue(filter.shouldRun(methodDescription("cloudEligible"))); + } + + private static void assertEveryCloudExclusionHasOneReasonAndNote() throws Exception { + for (Class testClass : testClasses()) { + validateElement(testClass.getName(), testClass); + for (Method method : testClass.getDeclaredMethods()) { + validateElement(testClass.getName() + "#" + method.getName(), method); + } + } + } + + private static void assertInvalidCloudExclusionMetadataIsRejected() { + assertInvalid(MissingNoteFixture.class); + assertInvalid(OrphanNoteFixture.class); + assertInvalid(MultipleReasonsFixture.class); + assertInvalid(UnknownReasonFixture.class); + assertInvalid(BlankNoteFixture.class); + assertInvalid(PaddedNoteFixture.class); + assertInvalid(UncapitalizedNoteFixture.class); + assertInvalid(NonSentenceNoteFixture.class); + } + + private static List> testClasses() throws Exception { + Path classesRoot = + Paths.get( + CloudTestExclusionTest.class + .getProtectionDomain() + .getCodeSource() + .getLocation() + .toURI()); + Path packageRoot = classesRoot.resolve("io/temporal"); + try (Stream paths = Files.walk(packageRoot)) { + return paths + .filter(path -> path.toString().endsWith(".class")) + .map(classesRoot::relativize) + .map(Path::toString) + .filter(classFile -> !classFile.contains("CloudTestExclusionTest$")) + .sorted() + .map(CloudTestExclusionTest::loadClass) + .collect(Collectors.toList()); + } + } + + private static Class loadClass(String classFile) { + String className = + classFile + .substring(0, classFile.length() - ".class".length()) + .replace(File.separatorChar, '.'); + try { + return Class.forName(className, false, CloudTestExclusionTest.class.getClassLoader()); + } catch (ClassNotFoundException e) { + throw new IllegalStateException("Unable to inspect test class " + className + ".", e); + } + } + + private static void validateElement(String name, AnnotatedElement element) { + Category category = element.getAnnotation(Category.class); + CloudTestExclusionNote note = element.getAnnotation(CloudTestExclusionNote.class); + List> reasons = + category == null + ? java.util.Collections.emptyList() + : Arrays.stream(category.value()) + .filter(CloudTestExclusion.class::isAssignableFrom) + .collect(Collectors.toList()); + if (reasons.isEmpty()) { + assertNull(name + " has a Cloud exclusion note without a reason category.", note); + return; + } + + assertEquals(name + " must have exactly one Cloud exclusion reason.", 1, reasons.size()); + assertTrue(name + " uses an unknown Cloud exclusion reason.", REASONS.contains(reasons.get(0))); + assertNotNull(name + " must explain its Cloud exclusion.", note); + validateNote(name, note.value()); + } + + private static void validateNote(String name, String note) { + assertEquals(name + " must not pad its Cloud exclusion note.", note.trim(), note); + assertFalse(name + " must have a nonblank Cloud exclusion note.", note.isEmpty()); + assertTrue( + name + " must capitalize its Cloud exclusion note.", + Character.isUpperCase(note.codePointAt(0))); + char finalCharacter = note.charAt(note.length() - 1); + assertTrue( + name + " must use a sentence for its Cloud exclusion note.", + finalCharacter == '.' || finalCharacter == '?' || finalCharacter == '!'); + } + + private static Description methodDescription(String name) throws Exception { + Method method = MethodExcludedFixture.class.getDeclaredMethod(name); + return Description.createTestDescription( + MethodExcludedFixture.class, name, method.getAnnotations()); + } + + private static void assertClassLevelMetadataIsInherited() { + Category category = InheritedChildFixture.class.getAnnotation(Category.class); + CloudTestExclusionNote note = + InheritedChildFixture.class.getAnnotation(CloudTestExclusionNote.class); + assertNotNull(category); + assertTrue(Arrays.asList(category.value()).contains(RequiresLocalServer.class)); + assertNotNull(note); + assertEquals("Provides inherited exclusion metadata.", note.value()); + validateElement(InheritedChildFixture.class.getName(), InheritedChildFixture.class); + } + + private static void assertInvalid(Class fixture) { + assertThrows(AssertionError.class, () -> validateElement(fixture.getName(), fixture)); + } + + @CloudTestExclusionNote("Requires a local server for this filtering fixture.") + @Category(RequiresLocalServer.class) + private static class ClassExcludedFixture {} + + @CloudTestExclusionNote("Provides inherited exclusion metadata.") + @Category(RequiresLocalServer.class) + private static class InheritedBaseFixture {} + + private static class InheritedChildFixture extends InheritedBaseFixture {} + + private static class MethodExcludedFixture { + public void cloudEligible() {} + + @CloudTestExclusionNote("Requires Cloud provisioning for this filtering fixture.") + @Category(RequiresCloudProvisioning.class) + public void requiresCloudProvisioning() {} + + @CloudTestExclusionNote("Needs Cloud adaptation for this filtering fixture.") + @Category(NeedsCloudAdaptation.class) + public void needsCloudAdaptation() {} + } + + @Category(RequiresLocalServer.class) + private static class MissingNoteFixture {} + + @CloudTestExclusionNote("Has a note but no reason category.") + private static class OrphanNoteFixture {} + + @CloudTestExclusionNote("Has more than one reason category.") + @Category({RequiresLocalServer.class, NeedsCloudAdaptation.class}) + private static class MultipleReasonsFixture {} + + private interface UnknownReason extends CloudTestExclusion {} + + @CloudTestExclusionNote("Uses a reason outside the supported taxonomy.") + @Category(UnknownReason.class) + private static class UnknownReasonFixture {} + + @CloudTestExclusionNote("") + @Category(RequiresLocalServer.class) + private static class BlankNoteFixture {} + + @CloudTestExclusionNote(" Padded note.") + @Category(RequiresLocalServer.class) + private static class PaddedNoteFixture {} + + @CloudTestExclusionNote("not a capitalized sentence.") + @Category(RequiresLocalServer.class) + private static class UncapitalizedNoteFixture {} + + @CloudTestExclusionNote("Not a sentence") + @Category(RequiresLocalServer.class) + private static class NonSentenceNoteFixture {} +} diff --git a/temporal-sdk/src/test/java/io/temporal/worker/ActiveTaskQueueTypesTest.java b/temporal-sdk/src/test/java/io/temporal/worker/ActiveTaskQueueTypesTest.java index 613306b93b..906c877c7e 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/ActiveTaskQueueTypesTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/ActiveTaskQueueTypesTest.java @@ -8,6 +8,8 @@ import io.temporal.activity.ActivityInterface; import io.temporal.activity.ActivityMethod; import io.temporal.api.enums.v1.TaskQueueType; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.workflow.WorkflowInterface; @@ -15,7 +17,10 @@ import io.temporal.workflow.shared.TestNexusServices; import java.util.List; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class ActiveTaskQueueTypesTest { @WorkflowInterface diff --git a/temporal-sdk/src/test/java/io/temporal/worker/BuildIdVersioningTest.java b/temporal-sdk/src/test/java/io/temporal/worker/BuildIdVersioningTest.java index 01131994be..491d6fb47a 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/BuildIdVersioningTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/BuildIdVersioningTest.java @@ -8,6 +8,8 @@ import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowOptions; import io.temporal.internal.Signal; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; @@ -18,8 +20,11 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; @SuppressWarnings("deprecation") +@CloudTestExclusionNote("Cloud CI namespaces disable deprecated build-ID versioning.") +@Category(RequiresCloudProvisioning.class) public class BuildIdVersioningTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/worker/ResourceBasedTunerTests.java b/temporal-sdk/src/test/java/io/temporal/worker/ResourceBasedTunerTests.java index bfa14d950e..ca47776768 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/ResourceBasedTunerTests.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/ResourceBasedTunerTests.java @@ -1,7 +1,5 @@ package io.temporal.worker; -import static io.temporal.testing.internal.SDKTestWorkflowRule.NAMESPACE; - import com.uber.m3.tally.RootScopeBuilder; import com.uber.m3.util.ImmutableMap; import io.temporal.activity.ActivityInterface; @@ -12,6 +10,8 @@ import io.temporal.common.reporter.TestStatsReporter; import io.temporal.serviceclient.MetricsTag; import io.temporal.testUtils.Eventually; +import io.temporal.testing.CloudTestExclusion.NeedsCloudAdaptation; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.tuning.*; import io.temporal.workflow.*; @@ -27,8 +27,6 @@ public class ResourceBasedTunerTests { private final TestStatsReporter reporter = new TestStatsReporter(); - private static final Map TAGS_NAMESPACE = - new ImmutableMap.Builder().putAll(MetricsTag.defaultTags(NAMESPACE)).build(); @Rule public SDKTestWorkflowRule testWorkflowRule = @@ -55,7 +53,9 @@ public void canRunWithResourceBasedTuner() throws InterruptedException { workflow.execute(5, 5, 1000); Map nsAndTaskQueue = new ImmutableMap.Builder() - .putAll(TAGS_NAMESPACE) + .putAll( + MetricsTag.defaultTags( + testWorkflowRule.getWorkflowClient().getOptions().getNamespace())) .put(MetricsTag.TASK_QUEUE, testWorkflowRule.getTaskQueue()) .build(); reporter.assertGauge(MetricsType.RESOURCE_MEM_USAGE, nsAndTaskQueue, (val) -> val > 0); @@ -76,7 +76,9 @@ public void canRunWithResourceBasedTuner() throws InterruptedException { MetricsType.WORKER_TASK_SLOTS_USED, getWorkerTags("LocalActivityWorker"), 0); } - @Category(IndependentResourceBasedTests.class) + @CloudTestExclusionNote( + "This resource-heavy test still needs a dedicated Cloud execution strategy.") + @Category({IndependentResourceBasedTests.class, NeedsCloudAdaptation.class}) @Test(timeout = 300 * 1000) public void canRunHeavyMemoryWithResourceBasedTuner() { ResourceTunerWorkflow workflow = testWorkflowRule.newWorkflowStub(ResourceTunerWorkflow.class); @@ -190,6 +192,6 @@ private Map getWorkerTags(String workerType) { "task_queue", testWorkflowRule.getTaskQueue(), "namespace", - "UnitTest"); + testWorkflowRule.getWorkflowClient().getOptions().getNamespace()); } } diff --git a/temporal-sdk/src/test/java/io/temporal/worker/StickyWorkerTest.java b/temporal-sdk/src/test/java/io/temporal/worker/StickyWorkerTest.java index 4a900476fd..23d86fa394 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/StickyWorkerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/StickyWorkerTest.java @@ -19,6 +19,8 @@ import io.temporal.common.reporter.TestStatsReporter; import io.temporal.internal.worker.WorkflowExecutorCache; import io.temporal.serviceclient.MetricsTag; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.testing.internal.ExternalServiceTestConfigurator; @@ -46,10 +48,13 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.TestName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class StickyWorkerTest { private static final boolean useExternalService = diff --git a/temporal-sdk/src/test/java/io/temporal/worker/WorkerIsNotGettingStartedTest.java b/temporal-sdk/src/test/java/io/temporal/worker/WorkerIsNotGettingStartedTest.java index 8ed28ff269..6444ca4307 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/WorkerIsNotGettingStartedTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/WorkerIsNotGettingStartedTest.java @@ -5,6 +5,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import java.util.Map; @@ -12,7 +14,10 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class WorkerIsNotGettingStartedTest { private static final int WORKFLOW_POLL_COUNT = 11; private static final int ACTIVITY_POLL_COUNT = 18; diff --git a/temporal-sdk/src/test/java/io/temporal/worker/WorkerPollerThreadCountTest.java b/temporal-sdk/src/test/java/io/temporal/worker/WorkerPollerThreadCountTest.java index 0794a95a9e..589173885a 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/WorkerPollerThreadCountTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/WorkerPollerThreadCountTest.java @@ -7,6 +7,8 @@ import io.nexusrpc.handler.OperationImpl; import io.nexusrpc.handler.ServiceImpl; import io.temporal.activity.ActivityInterface; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.workflow.WorkflowInterface; @@ -17,7 +19,10 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class WorkerPollerThreadCountTest { private static final String ACTIVITY_POLLER_THREAD_NAME_PREFIX = "Activity Poller task"; diff --git a/temporal-sdk/src/test/java/io/temporal/worker/WorkerStressTests.java b/temporal-sdk/src/test/java/io/temporal/worker/WorkerStressTests.java index 30f2252b9b..c6a292252e 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/WorkerStressTests.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/WorkerStressTests.java @@ -11,6 +11,8 @@ import io.temporal.client.WorkflowStub; import io.temporal.serviceclient.WorkflowServiceStubs; import io.temporal.serviceclient.WorkflowServiceStubsOptions; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.testing.internal.ExternalServiceTestConfigurator; @@ -27,6 +29,7 @@ import java.util.concurrent.TimeUnit; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.TestName; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -34,6 +37,8 @@ import org.slf4j.LoggerFactory; @RunWith(Parameterized.class) +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class WorkerStressTests { @Parameterized.Parameter public boolean useExternalService; 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 0713cb9915..5fc0ed4655 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/WorkerVersioningTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/WorkerVersioningTest.java @@ -203,7 +203,7 @@ public void testBasicWorkerVersioning() { Assert.assertEquals("version-v3", res3); } - @Test + @Test(timeout = 30_000) public void testRampWorkerVersioning() { assumeTrue("Test Server doesn't support versioning", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/worker/shutdown/CleanNexusWorkerShutdownTest.java b/temporal-sdk/src/test/java/io/temporal/worker/shutdown/CleanNexusWorkerShutdownTest.java index 073928f354..d9e3383e08 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/shutdown/CleanNexusWorkerShutdownTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/shutdown/CleanNexusWorkerShutdownTest.java @@ -12,6 +12,8 @@ import io.temporal.api.history.v1.HistoryEvent; import io.temporal.client.WorkflowClient; import io.temporal.common.converter.DefaultDataConverter; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; import io.temporal.worker.tuning.PollerBehavior; @@ -30,10 +32,14 @@ import java.util.concurrent.TimeUnit; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @RunWith(Parameterized.class) +@CloudTestExclusionNote( + "Cloud CI does not provision the standalone Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class CleanNexusWorkerShutdownTest { private static final String COMPLETED = "Completed"; diff --git a/temporal-sdk/src/test/java/io/temporal/worker/shutdown/HeartbeatDuringWorkerShutdownTest.java b/temporal-sdk/src/test/java/io/temporal/worker/shutdown/HeartbeatDuringWorkerShutdownTest.java index 0da728c65a..36a9ea17b5 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/shutdown/HeartbeatDuringWorkerShutdownTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/shutdown/HeartbeatDuringWorkerShutdownTest.java @@ -99,7 +99,9 @@ private ActivityHandle startHeartbeatingActivity() { ActivityClient client = ActivityClient.newInstance( testWorkflowRule.getWorkflowServiceStubs(), - ActivityClientOptions.newBuilder().setNamespace(SDKTestWorkflowRule.NAMESPACE).build()); + ActivityClientOptions.newBuilder() + .setNamespace(testWorkflowRule.getWorkflowClient().getOptions().getNamespace()) + .build()); StartActivityOptions options = StartActivityOptions.newBuilder() .setId("heartbeat-during-shutdown-" + UUID.randomUUID()) diff --git a/temporal-sdk/src/test/java/io/temporal/worker/tuning/ResourceBasedSlotSupplierNonRecursiveTest.java b/temporal-sdk/src/test/java/io/temporal/worker/tuning/ResourceBasedSlotSupplierNonRecursiveTest.java index 68fad1c67e..03e29457c3 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/tuning/ResourceBasedSlotSupplierNonRecursiveTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/tuning/ResourceBasedSlotSupplierNonRecursiveTest.java @@ -13,6 +13,7 @@ import io.temporal.internal.worker.TrackingSlotSupplier; import io.temporal.serviceclient.WorkflowServiceStubs; import io.temporal.serviceclient.WorkflowServiceStubsOptions; +import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.internal.ExternalServiceTestConfigurator; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.Worker; @@ -190,14 +191,23 @@ public void testEndToEndWorkerWithResourceStarvationRecovery() throws Exception "=== End-to-End Worker Test with Resource Starvation Recovery (External Service) ==="); // Create connections to real Temporal server - WorkflowServiceStubs service = - WorkflowServiceStubs.newServiceStubs( - WorkflowServiceStubsOptions.newBuilder() - .setTarget(ExternalServiceTestConfigurator.getTemporalServiceAddress()) - .build()); + TestEnvironmentOptions environmentOptions = + ExternalServiceTestConfigurator.configuredTestEnvironmentOptions().build(); + WorkflowServiceStubsOptions configuredOptions = + environmentOptions.getWorkflowServiceStubsOptions(); + WorkflowServiceStubsOptions.Builder serviceOptions = + configuredOptions == null + ? WorkflowServiceStubsOptions.newBuilder() + : WorkflowServiceStubsOptions.newBuilder(configuredOptions); + if (environmentOptions.getTarget() != null) { + serviceOptions.setTarget(environmentOptions.getTarget()); + } + WorkflowServiceStubs service = WorkflowServiceStubs.newServiceStubs(serviceOptions.build()); + WorkflowClientOptions configuredClientOptions = environmentOptions.getWorkflowClientOptions(); WorkflowClient client = - WorkflowClient.newInstance( - service, WorkflowClientOptions.newBuilder().setNamespace("default").build()); + configuredClientOptions == null + ? WorkflowClient.newInstance(service) + : WorkflowClient.newInstance(service, configuredClientOptions); WorkerFactory workerFactory = WorkerFactory.newInstance(client); // Create our own resource controller that we can control diff --git a/temporal-sdk/src/test/java/io/temporal/workerFactory/WorkerFactoryTests.java b/temporal-sdk/src/test/java/io/temporal/workerFactory/WorkerFactoryTests.java index 1fb26f3452..dc40c5fe07 100644 --- a/temporal-sdk/src/test/java/io/temporal/workerFactory/WorkerFactoryTests.java +++ b/temporal-sdk/src/test/java/io/temporal/workerFactory/WorkerFactoryTests.java @@ -11,6 +11,9 @@ import io.temporal.client.WorkflowClientOptions; import io.temporal.serviceclient.WorkflowServiceStubs; import io.temporal.serviceclient.WorkflowServiceStubsOptions; +import io.temporal.testing.CloudTestExclusion.NeedsCloudAdaptation; +import io.temporal.testing.CloudTestExclusionNote; +import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.internal.ExternalServiceTestConfigurator; import io.temporal.worker.WorkerFactory; import java.util.concurrent.TimeUnit; @@ -19,13 +22,12 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.experimental.categories.Category; public class WorkerFactoryTests { private static final boolean useExternalService = ExternalServiceTestConfigurator.isUseExternalService(); - private static final String serviceAddress = - ExternalServiceTestConfigurator.getTemporalServiceAddress(); @BeforeClass public static void beforeClass() { @@ -37,10 +39,10 @@ public static void beforeClass() { @Before public void setUp() { - service = - WorkflowServiceStubs.newServiceStubs( - WorkflowServiceStubsOptions.newBuilder().setTarget(serviceAddress).build()); - WorkflowClient client = WorkflowClient.newInstance(service); + TestEnvironmentOptions environmentOptions = + ExternalServiceTestConfigurator.configuredTestEnvironmentOptions().build(); + service = newServiceStubs(environmentOptions); + WorkflowClient client = newWorkflowClient(service, environmentOptions); factory = WorkerFactory.newInstance(client); } @@ -137,13 +139,16 @@ public void factoryCanBeShutdownMoreThanOnce() { } @Test + @CloudTestExclusionNote("Cloud hides nonexistent namespaces from namespace-scoped credentials.") + @Category(NeedsCloudAdaptation.class) public void startFailsOnNonexistentNamespace() { - WorkflowServiceStubs serviceLocal = - WorkflowServiceStubs.newServiceStubs( - WorkflowServiceStubsOptions.newBuilder().setTarget(serviceAddress).build()); + TestEnvironmentOptions environmentOptions = + ExternalServiceTestConfigurator.configuredTestEnvironmentOptions().build(); + WorkflowServiceStubs serviceLocal = newServiceStubs(environmentOptions); WorkflowClient clientLocal = WorkflowClient.newInstance( - serviceLocal, WorkflowClientOptions.newBuilder().setNamespace("i_dont_exist").build()); + serviceLocal, + newWorkflowClientOptions(environmentOptions).setNamespace("i_dont_exist").build()); WorkerFactory factoryLocal = WorkerFactory.newInstance(clientLocal); factoryLocal.newWorker("task-queue"); @@ -155,4 +160,33 @@ public void startFailsOnNonexistentNamespace() { serviceLocal.shutdownNow(); serviceLocal.awaitTermination(5, TimeUnit.SECONDS); } + + private static WorkflowServiceStubs newServiceStubs(TestEnvironmentOptions environmentOptions) { + WorkflowServiceStubsOptions configuredOptions = + environmentOptions.getWorkflowServiceStubsOptions(); + WorkflowServiceStubsOptions.Builder serviceOptions = + configuredOptions == null + ? WorkflowServiceStubsOptions.newBuilder() + : WorkflowServiceStubsOptions.newBuilder(configuredOptions); + if (environmentOptions.getTarget() != null) { + serviceOptions.setTarget(environmentOptions.getTarget()); + } + return WorkflowServiceStubs.newServiceStubs(serviceOptions.build()); + } + + private static WorkflowClient newWorkflowClient( + WorkflowServiceStubs service, TestEnvironmentOptions environmentOptions) { + WorkflowClientOptions configuredOptions = environmentOptions.getWorkflowClientOptions(); + return configuredOptions == null + ? WorkflowClient.newInstance(service) + : WorkflowClient.newInstance(service, configuredOptions); + } + + private static WorkflowClientOptions.Builder newWorkflowClientOptions( + TestEnvironmentOptions environmentOptions) { + WorkflowClientOptions configuredOptions = environmentOptions.getWorkflowClientOptions(); + return configuredOptions == null + ? WorkflowClientOptions.newBuilder() + : WorkflowClientOptions.newBuilder(configuredOptions); + } } diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/ContextPropagationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/ContextPropagationTest.java index 4de7876bc9..15009a687c 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/ContextPropagationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/ContextPropagationTest.java @@ -11,6 +11,8 @@ import io.temporal.common.context.ContextPropagator; import io.temporal.common.converter.DefaultDataConverter; import io.temporal.internal.testing.WorkflowTestingTest; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; @@ -23,10 +25,13 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.TestWatcher; import org.junit.runner.Description; import org.slf4j.MDC; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class ContextPropagationTest { private static final String TASK_QUEUE = "test-workflow"; private TestWorkflowEnvironment testEnvironment; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/ContinueAsNewTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/ContinueAsNewTest.java index 83bf8838d1..d802c6aa78 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/ContinueAsNewTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/ContinueAsNewTest.java @@ -6,6 +6,8 @@ import io.temporal.common.RetryOptions; import io.temporal.common.SearchAttributeKey; import io.temporal.common.SearchAttributes; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.testing.internal.TracingWorkerInterceptor; @@ -14,7 +16,11 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote( + "Cloud CI does not provision the custom search attribute used by this suite.") +@Category(RequiresCloudProvisioning.class) public class ContinueAsNewTest { static final SearchAttributeKey CUSTOM_KEYWORD_SA = SearchAttributeKey.forKeyword("CustomKeywordField"); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/GetCronScheduleFromWorkflowInfoTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/GetCronScheduleFromWorkflowInfoTest.java index aaa2d9679e..0591978e85 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/GetCronScheduleFromWorkflowInfoTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/GetCronScheduleFromWorkflowInfoTest.java @@ -8,6 +8,8 @@ import io.temporal.client.WorkflowFailedException; import io.temporal.client.WorkflowStub; import io.temporal.failure.CanceledFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import java.time.Duration; import java.util.HashMap; @@ -17,6 +19,7 @@ import org.junit.Assume; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.TestName; public class GetCronScheduleFromWorkflowInfoTest { @@ -29,6 +32,8 @@ public class GetCronScheduleFromWorkflowInfoTest { .setWorkflowTypes(TestGetCronScheduleWorkflowsFuncImpl.class) .build(); + @CloudTestExclusionNote("This cron test depends on local test-server time skipping.") + @Category(RequiresLocalServer.class) @Test public void testGetCronScheduleFromWorkflowInfo() throws InterruptedException { Assume.assumeFalse("skipping for docker tests", testWorkflowRule.isUseExternalService()); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/LoggerTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/LoggerTest.java index 283433a8c4..17179ecb2d 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/LoggerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/LoggerTest.java @@ -10,6 +10,8 @@ import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowOptions; import io.temporal.internal.logging.LoggerTag; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; import java.time.Duration; @@ -21,9 +23,12 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class LoggerTest { private static final ListAppender listAppender = new ListAppender<>(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/MemoTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/MemoTest.java index a36c9a9700..36e23276a8 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/MemoTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/MemoTest.java @@ -66,7 +66,7 @@ public void testMemo() { GetWorkflowExecutionHistoryResponse historyResp = WorkflowClientHelper.getHistoryPage( testWorkflowRule.getWorkflowServiceStubs(), - SDKTestWorkflowRule.NAMESPACE, + testWorkflowRule.getWorkflowClient().getOptions().getNamespace(), executionF, ByteString.EMPTY, new NoopScope()); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/MetricsTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/MetricsTest.java index 17178b1996..0a2198e980 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/MetricsTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/MetricsTest.java @@ -28,6 +28,8 @@ import io.temporal.common.reporter.TestStatsReporter; import io.temporal.serviceclient.MetricsTag; import io.temporal.serviceclient.WorkflowServiceStubs; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.testing.internal.SDKTestWorkflowRule; @@ -50,9 +52,12 @@ import org.junit.After; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.TestWatcher; import org.junit.runner.Description; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class MetricsTest { private static final long REPORTING_FLUSH_TIME = 600; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/NoQueryThreadLeakTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/NoQueryThreadLeakTest.java index 8bcefe657a..87848588c3 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/NoQueryThreadLeakTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/NoQueryThreadLeakTest.java @@ -16,7 +16,7 @@ public class NoQueryThreadLeakTest { public SDKTestWorkflowRule testWorkflowRule = SDKTestWorkflowRule.newBuilder().setWorkflowTypes(TestNoQueryWorkflowImpl.class).build(); - @Test + @Test(timeout = 30_000) public void testNoQueryThreadLeak() throws InterruptedException { QueryableWorkflow client = testWorkflowRule.newWorkflowStubTimeoutOptions(QueryableWorkflow.class); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/SideEffectRaceConditionTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/SideEffectRaceConditionTest.java index 2f5447e379..327e663d1a 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/SideEffectRaceConditionTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/SideEffectRaceConditionTest.java @@ -2,6 +2,8 @@ import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowOptions; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; @@ -14,7 +16,10 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class SideEffectRaceConditionTest { private static final String TASK_QUEUE = "test-workflow"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/TestEnvironmentCloseTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/TestEnvironmentCloseTest.java index ce7ab8e969..7ae514871f 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/TestEnvironmentCloseTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/TestEnvironmentCloseTest.java @@ -2,11 +2,16 @@ import static junit.framework.TestCase.assertTrue; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; import io.temporal.workflow.shared.TestActivities.NoArgsActivity; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class TestEnvironmentCloseTest { @Test diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/WorkflowTaskFailureBackoffTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/WorkflowTaskFailureBackoffTest.java index fb029dfd4f..09e379d08c 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/WorkflowTaskFailureBackoffTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/WorkflowTaskFailureBackoffTest.java @@ -1,7 +1,5 @@ package io.temporal.workflow; -import static io.temporal.testing.internal.SDKTestWorkflowRule.NAMESPACE; - import com.google.common.collect.ImmutableMap; import com.uber.m3.tally.RootScopeBuilder; import io.temporal.api.common.v1.WorkflowExecution; @@ -62,7 +60,9 @@ public void testWorkflowTaskFailureBackoff() { .size()); Map tags = ImmutableMap.builder() - .putAll(MetricsTag.defaultTags(NAMESPACE)) + .putAll( + MetricsTag.defaultTags( + testWorkflowRule.getWorkflowClient().getOptions().getNamespace())) .put(MetricsTag.WORKER_TYPE, WorkerMetricsTag.WorkerType.WORKFLOW_WORKER.getValue()) .put(MetricsTag.TASK_QUEUE, testWorkflowRule.getTaskQueue()) .put(MetricsTag.WORKFLOW_TYPE, "TestWorkflow1") diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/WorkflowWithCronScheduleTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/WorkflowWithCronScheduleTest.java index 0a6ec9fb25..c457ea472b 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/WorkflowWithCronScheduleTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/WorkflowWithCronScheduleTest.java @@ -7,12 +7,15 @@ import io.temporal.client.WorkflowFailedException; import io.temporal.client.WorkflowStub; import io.temporal.failure.CanceledFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.shared.TestWorkflowWithCronScheduleImpl; import java.time.Duration; import java.util.Map; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.TestName; public class WorkflowWithCronScheduleTest { @@ -25,6 +28,8 @@ public class WorkflowWithCronScheduleTest { .setWorkflowTypes(TestWorkflowWithCronScheduleImpl.class) .build(); + @CloudTestExclusionNote("This cron test depends on local test-server time skipping.") + @Category(RequiresLocalServer.class) @Test public void testCronWorkflowWithIncrementSchedule() { // Min interval in cron is 1min. So we will not test it against real service in Jenkins. diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/EagerActivityDispatchingTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/EagerActivityDispatchingTest.java index 8353b40c37..9a4582b906 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/EagerActivityDispatchingTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/EagerActivityDispatchingTest.java @@ -20,6 +20,7 @@ import io.temporal.internal.Config; import io.temporal.serviceclient.WorkflowServiceStubsOptions; import io.temporal.testUtils.CountingSlotSupplier; +import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.testing.internal.ExternalServiceTestConfigurator; import io.temporal.testing.internal.SDKTestWorkflowRule; @@ -56,11 +57,19 @@ public class EagerActivityDispatchingTest { @Before public void setUp() throws Exception { eagerActivityRequestInterceptor.reset(); + TestEnvironmentOptions.Builder environmentOptions = + ExternalServiceTestConfigurator.configuredTestEnvironmentOptions(); + WorkflowServiceStubsOptions configuredServiceOptions = + environmentOptions.build().getWorkflowServiceStubsOptions(); + WorkflowServiceStubsOptions.Builder serviceOptions = + configuredServiceOptions == null + ? WorkflowServiceStubsOptions.newBuilder() + : WorkflowServiceStubsOptions.newBuilder(configuredServiceOptions); this.env = TestWorkflowEnvironment.newInstance( - ExternalServiceTestConfigurator.configuredTestEnvironmentOptions() + environmentOptions .setWorkflowServiceStubsOptions( - WorkflowServiceStubsOptions.newBuilder() + serviceOptions .setGrpcClientInterceptors( Collections.singletonList(eagerActivityRequestInterceptor)) .build()) diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LocalActivityManyWorkflowsTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LocalActivityManyWorkflowsTest.java index 2facb94d89..83e10d6437 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LocalActivityManyWorkflowsTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LocalActivityManyWorkflowsTest.java @@ -4,6 +4,8 @@ import io.temporal.activity.ActivityInterface; import io.temporal.activity.LocalActivityOptions; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.Workflow; import io.temporal.workflow.shared.TestWorkflows.TestWorkflow1; @@ -11,6 +13,7 @@ import org.junit.Assume; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class LocalActivityManyWorkflowsTest { @@ -21,6 +24,8 @@ public class LocalActivityManyWorkflowsTest { .setWorkflowTypes(ActivityWorkflow.class) .build(); + @CloudTestExclusionNote("This stress test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void manyWorkflowsTest() { Assume.assumeFalse("skipping for docker tests", testWorkflowRule.isUseExternalService()); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LongLocalActivityFailsWhileHeartbeatingMeteringTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LongLocalActivityFailsWhileHeartbeatingMeteringTest.java index 5392bcb32e..3bf1faf836 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LongLocalActivityFailsWhileHeartbeatingMeteringTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LongLocalActivityFailsWhileHeartbeatingMeteringTest.java @@ -9,6 +9,8 @@ import io.temporal.client.WorkflowStub; import io.temporal.common.RetryOptions; import io.temporal.failure.ActivityFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.Workflow; import io.temporal.workflow.shared.TestActivities.TestActivitiesImpl; @@ -20,6 +22,7 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class LongLocalActivityFailsWhileHeartbeatingMeteringTest { @@ -39,6 +42,8 @@ public class LongLocalActivityFailsWhileHeartbeatingMeteringTest { * Test that local activity that failed to heartbeat and executed longer than Workflow Task * Timeout will be repeated during replay */ + @CloudTestExclusionNote("This test depends on local test-server metering metadata behavior.") + @Category(RequiresLocalServer.class) @Test public void testLongLocalActivityFailsWhileHeartbeatingMetering() { // Needs server release which propagates metering metadata to event diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/cancellation/WorkflowClosedRunningActivityTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/cancellation/WorkflowClosedRunningActivityTest.java index fcd16f6681..ddbd9beb3d 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/cancellation/WorkflowClosedRunningActivityTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/cancellation/WorkflowClosedRunningActivityTest.java @@ -10,6 +10,8 @@ import io.temporal.client.*; import io.temporal.common.WorkflowExecutionHistory; import io.temporal.internal.Signal; +import io.temporal.testing.CloudTestExclusion.NeedsCloudAdaptation; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestWorkflows.TestWorkflow1; @@ -17,6 +19,7 @@ import java.time.temporal.ChronoUnit; import java.util.concurrent.TimeUnit; import org.junit.*; +import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -54,6 +57,9 @@ public void tearDown() throws Exception { } @Test + @CloudTestExclusionNote( + "Cloud cancellation timing can surface a shutdown exception before activity-not-found.") + @Category(NeedsCloudAdaptation.class) public void activitySeesActivityNotExistException() throws InterruptedException { TestWorkflow1 workflow = eventType == EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/childWorkflowTests/ChildWorkflowRetryTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/childWorkflowTests/ChildWorkflowRetryTest.java index 12994c7496..07cff0c523 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/childWorkflowTests/ChildWorkflowRetryTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/childWorkflowTests/ChildWorkflowRetryTest.java @@ -1,6 +1,5 @@ package io.temporal.workflow.childWorkflowTests; -import static io.temporal.testing.internal.SDKTestWorkflowRule.NAMESPACE; import static org.junit.Assert.*; import io.temporal.api.common.v1.WorkflowExecution; @@ -67,7 +66,6 @@ public WorkflowSignalWithStartOutput signalWithStart( }; } }) - .setNamespace(NAMESPACE) .build()) .build(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/childWorkflowTests/ChildWorkflowWithCronScheduleTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/childWorkflowTests/ChildWorkflowWithCronScheduleTest.java index 4446a045ab..fd25730752 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/childWorkflowTests/ChildWorkflowWithCronScheduleTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/childWorkflowTests/ChildWorkflowWithCronScheduleTest.java @@ -7,6 +7,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.client.WorkflowStub; import io.temporal.failure.CanceledFailure; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.Workflow; import io.temporal.workflow.shared.TestWorkflowWithCronScheduleImpl; @@ -16,6 +18,7 @@ import java.util.Map; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.TestName; public class ChildWorkflowWithCronScheduleTest { @@ -28,6 +31,8 @@ public class ChildWorkflowWithCronScheduleTest { .setWorkflowTypes(TestCronParentWorkflow.class, TestWorkflowWithCronScheduleImpl.class) .build(); + @CloudTestExclusionNote("This test advances time through the local test service.") + @Category(RequiresLocalServer.class) @Test public void testChildWorkflowWithCronSchedule() { // Min interval in cron is 1min. So we will not test it against real service in Jenkins. diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/determinism/NonDeterministicWorkflowPolicyBlockWorkflowTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/determinism/NonDeterministicWorkflowPolicyBlockWorkflowTest.java index bebab3cf41..121846eac3 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/determinism/NonDeterministicWorkflowPolicyBlockWorkflowTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/determinism/NonDeterministicWorkflowPolicyBlockWorkflowTest.java @@ -87,7 +87,7 @@ public void testNonDeterministicWorkflowPolicyBlockWorkflow() { "task_queue", testWorkflowRule.getTaskQueue(), "namespace", - "UnitTest", + testWorkflowRule.getWorkflowClient().getOptions().getNamespace(), "workflow_type", "TestWorkflowStringArg", "worker_type", diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/failure/FailureEncodingTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/failure/FailureEncodingTest.java index 1b8fb0a0be..16af81cecd 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/failure/FailureEncodingTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/failure/FailureEncodingTest.java @@ -22,6 +22,8 @@ import io.temporal.internal.testing.WorkflowTestingTest.FailingWorkflowImpl; import io.temporal.payload.codec.PayloadCodec; import io.temporal.payload.codec.PayloadCodecException; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.Worker; @@ -37,6 +39,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.Timeout; /** @@ -54,6 +57,8 @@ * that Failure carries no sensible data and no stack trace. * */ +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class FailureEncodingTest { private static final String TASK_QUEUE = "test-workflow"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/interceptorsTests/InterceptorExceptionTests.java b/temporal-sdk/src/test/java/io/temporal/workflow/interceptorsTests/InterceptorExceptionTests.java index 6648ddd718..de6f179e31 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/interceptorsTests/InterceptorExceptionTests.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/interceptorsTests/InterceptorExceptionTests.java @@ -8,12 +8,18 @@ import io.temporal.common.interceptors.WorkflowClientCallsInterceptor; import io.temporal.common.interceptors.WorkflowClientCallsInterceptorBase; import io.temporal.common.interceptors.WorkflowClientInterceptorBase; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.shared.TestWorkflows.NoArgsWorkflow; import org.junit.After; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote( + "This suite directly controls the local test service lifecycle during cleanup.") +@Category(RequiresLocalServer.class) public class InterceptorExceptionTests { @Rule diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ActivityHandleFailOnConflictTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ActivityHandleFailOnConflictTest.java index bf6e23912d..49c22d1c65 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ActivityHandleFailOnConflictTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ActivityHandleFailOnConflictTest.java @@ -17,6 +17,8 @@ import io.temporal.failure.ApplicationFailure; import io.temporal.failure.NexusOperationFailure; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.Workflow; import io.temporal.workflow.shared.TestNexusServices; @@ -29,7 +31,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class ActivityHandleFailOnConflictTest { private final CountDownLatch activityStarted = new CountDownLatch(1); private final CountDownLatch releaseActivity = new CountDownLatch(1); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ActivityHandleUseExistingOnConflictTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ActivityHandleUseExistingOnConflictTest.java index c699d997ea..931a0aab79 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ActivityHandleUseExistingOnConflictTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ActivityHandleUseExistingOnConflictTest.java @@ -13,6 +13,8 @@ import io.temporal.client.WorkflowStub; import io.temporal.nexus.TemporalOperationHandler; import io.temporal.testUtils.Eventually; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.NexusOperationExecution; import io.temporal.workflow.NexusOperationHandle; @@ -31,7 +33,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class ActivityHandleUseExistingOnConflictTest { private static final int OPERATION_COUNT = 5; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/AsyncActivityOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/AsyncActivityOperationTest.java index 1a1e5bea49..ed7b7b02b6 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/AsyncActivityOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/AsyncActivityOperationTest.java @@ -12,6 +12,8 @@ import io.temporal.internal.nexus.OperationTokenType; import io.temporal.internal.nexus.OperationTokenUtil; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -20,7 +22,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class AsyncActivityOperationTest { @Rule diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/AsyncWorkflowOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/AsyncWorkflowOperationTest.java index 3259c428ea..e4eee5d720 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/AsyncWorkflowOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/AsyncWorkflowOperationTest.java @@ -10,6 +10,8 @@ import io.temporal.internal.nexus.OperationTokenUtil; import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.WorkflowReplayer; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; @@ -18,7 +20,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class AsyncWorkflowOperationTest extends BaseNexusTest { private static final String WORKFLOW_ID_PREFIX = "test-prefix"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/CancelActivityAsyncOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/CancelActivityAsyncOperationTest.java index 45a2b78794..3b4c619632 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/CancelActivityAsyncOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/CancelActivityAsyncOperationTest.java @@ -18,6 +18,8 @@ import io.temporal.nexus.CancelActivityExecutionInput; import io.temporal.nexus.TemporalOperationCancelContext; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import java.time.Duration; @@ -26,7 +28,10 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class CancelActivityAsyncOperationTest extends BaseNexusTest { static final AtomicBoolean cancelled = new AtomicBoolean(false); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/CancelWorkflowAsyncOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/CancelWorkflowAsyncOperationTest.java index 3c9f1b8719..44e0d897d9 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/CancelWorkflowAsyncOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/CancelWorkflowAsyncOperationTest.java @@ -15,6 +15,8 @@ import io.temporal.internal.Signal; import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.WorkflowReplayer; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; @@ -23,7 +25,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class CancelWorkflowAsyncOperationTest extends BaseNexusTest { private static final Signal opStarted = new Signal(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerCancelTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerCancelTest.java index 4773e6c521..ac8e58535c 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerCancelTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerCancelTest.java @@ -12,13 +12,18 @@ import io.temporal.failure.CanceledFailure; import io.temporal.internal.Signal; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import java.time.Duration; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class GenericHandlerCancelTest extends BaseNexusTest { private static final Signal opStarted = new Signal(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerDoubleStartTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerDoubleStartTest.java index 9d0c4e6c9f..2f538c8b09 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerDoubleStartTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerDoubleStartTest.java @@ -11,6 +11,8 @@ import io.temporal.failure.ApplicationFailure; import io.temporal.failure.NexusOperationFailure; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestWorkflows; @@ -18,7 +20,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class GenericHandlerDoubleStartTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerSyncResultTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerSyncResultTest.java index 01eda16b01..cc30075bc2 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerSyncResultTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerSyncResultTest.java @@ -7,6 +7,8 @@ import io.nexusrpc.handler.ServiceImpl; import io.temporal.nexus.TemporalOperationHandler; import io.temporal.nexus.TemporalOperationResult; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestWorkflows; @@ -14,7 +16,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class GenericHandlerSyncResultTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerTypedProcTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerTypedProcTest.java index ae3d01be32..177ebf5011 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerTypedProcTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerTypedProcTest.java @@ -7,6 +7,8 @@ import io.nexusrpc.handler.ServiceImpl; import io.temporal.client.WorkflowOptions; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestMultiArgWorkflowFunctions; @@ -15,7 +17,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class GenericHandlerTypedProcTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerTypedStartWorkflowTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerTypedStartWorkflowTest.java index 49662cc6af..bcf4761dcf 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerTypedStartWorkflowTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerTypedStartWorkflowTest.java @@ -7,6 +7,8 @@ import io.nexusrpc.handler.ServiceImpl; import io.temporal.client.WorkflowOptions; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestMultiArgWorkflowFunctions; @@ -15,7 +17,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class GenericHandlerTypedStartWorkflowTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerUntypedStartWorkflowTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerUntypedStartWorkflowTest.java index 1f682d4534..7562b6f714 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerUntypedStartWorkflowTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericHandlerUntypedStartWorkflowTest.java @@ -7,6 +7,8 @@ import io.nexusrpc.handler.ServiceImpl; import io.temporal.client.WorkflowOptions; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestMultiArgWorkflowFunctions; @@ -15,7 +17,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class GenericHandlerUntypedStartWorkflowTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericListOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericListOperationTest.java index 517b87bdea..3c16b0c05d 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericListOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/GenericListOperationTest.java @@ -6,6 +6,8 @@ import io.nexusrpc.handler.OperationImpl; import io.nexusrpc.handler.ServiceImpl; import io.temporal.common.converter.EncodedValuesTest; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.NexusServiceOptions; import io.temporal.workflow.Workflow; @@ -15,8 +17,11 @@ import org.junit.Assert; import org.junit.ClassRule; import org.junit.Test; +import org.junit.experimental.categories.Category; // Test an operation that takes and returns a List type with a non-primitive element type +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class GenericListOperationTest { @ClassRule public static SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/HeaderTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/HeaderTest.java index 144b275c8c..ebb8f60ca6 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/HeaderTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/HeaderTest.java @@ -5,14 +5,19 @@ import io.nexusrpc.handler.OperationHandler; import io.nexusrpc.handler.OperationImpl; import io.nexusrpc.handler.ServiceImpl; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import java.util.Map; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; // Test the start operation handler receives the correct headers +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class HeaderTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/NexusOperationInfoTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/NexusOperationInfoTest.java index 6922903497..aeb639c9f1 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/NexusOperationInfoTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/NexusOperationInfoTest.java @@ -5,6 +5,8 @@ import io.nexusrpc.handler.ServiceImpl; import io.temporal.nexus.Nexus; import io.temporal.nexus.NexusOperationInfo; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -12,7 +14,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class NexusOperationInfoTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/NexusOperationMetadataTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/NexusOperationMetadataTest.java index 1ef17fea39..a8108e8c3c 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/NexusOperationMetadataTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/NexusOperationMetadataTest.java @@ -8,6 +8,8 @@ import io.temporal.client.WorkflowStub; import io.temporal.common.WorkflowExecutionHistory; import io.temporal.testUtils.HistoryUtils; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.NexusOperationOptions; import io.temporal.workflow.NexusServiceOptions; @@ -19,7 +21,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class NexusOperationMetadataTest { static final String NEXUS_OPERATION_SUMMARY = "nexus-operation-summary"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/OperationFailMetricTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/OperationFailMetricTest.java index c822036df3..4fd89f0e73 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/OperationFailMetricTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/OperationFailMetricTest.java @@ -19,6 +19,8 @@ import io.temporal.failure.TemporalFailure; import io.temporal.serviceclient.MetricsTag; import io.temporal.testUtils.Eventually; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.MetricsType; import io.temporal.worker.WorkerMetricsTag; @@ -29,7 +31,10 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.junit.*; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class OperationFailMetricTest { private static final Map invocationCount = new ConcurrentHashMap<>(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/OperationFailureConversionTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/OperationFailureConversionTest.java index 1f8d4e550f..0445a595d3 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/OperationFailureConversionTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/OperationFailureConversionTest.java @@ -9,6 +9,8 @@ import io.temporal.client.WorkflowNotFoundException; import io.temporal.failure.ApplicationFailure; import io.temporal.failure.NexusOperationFailure; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -19,7 +21,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class OperationFailureConversionTest { @Rule diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ParallelWorkflowOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ParallelWorkflowOperationTest.java index e50bc84b57..eddb571740 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ParallelWorkflowOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ParallelWorkflowOperationTest.java @@ -6,6 +6,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.WorkflowReplayer; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; @@ -17,7 +19,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class ParallelWorkflowOperationTest extends BaseNexusTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ProtoOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ProtoOperationTest.java index b1af56480a..e28fbbac34 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ProtoOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/ProtoOperationTest.java @@ -9,14 +9,19 @@ import io.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest; import io.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse; import io.temporal.nexus.Nexus; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestWorkflows; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; // Test an operation that takes and returns a protobuf message +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class ProtoOperationTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SignalOperationLinkingTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SignalOperationLinkingTest.java index afb91f72d2..e7ad82d828 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SignalOperationLinkingTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SignalOperationLinkingTest.java @@ -17,6 +17,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.client.WorkflowStub; import io.temporal.nexus.Nexus; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.NexusOperationHandle; import io.temporal.workflow.NexusOperationOptions; @@ -37,6 +39,7 @@ import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; /** * Verifies link propagation in both directions when a Nexus operation handler interacts with a @@ -57,6 +60,8 @@ * in-memory test server does not implement this path so the class is skipped unless a real server * is in use. */ +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class SignalOperationLinkingTest { private static final String MODE_SIGNAL_WITH_START = "signalWithStart"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncClientOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncClientOperationTest.java index 14ad5a632a..b46300890f 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncClientOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncClientOperationTest.java @@ -12,6 +12,8 @@ import io.temporal.failure.ApplicationFailure; import io.temporal.nexus.Nexus; import io.temporal.serviceclient.MetricsTag; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.testing.internal.TracingWorkerInterceptor; import io.temporal.worker.MetricsType; @@ -23,7 +25,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class SyncClientOperationTest { private final TestStatsReporter reporter = new TestStatsReporter(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationCancelledTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationCancelledTest.java index a6bb29daaa..e170a5e3a6 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationCancelledTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationCancelledTest.java @@ -7,6 +7,8 @@ import io.temporal.client.WorkflowFailedException; import io.temporal.failure.CanceledFailure; import io.temporal.failure.NexusOperationFailure; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -15,7 +17,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class SyncOperationCancelledTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationFailTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationFailTest.java index b37114d392..4c67502fb2 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationFailTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationFailTest.java @@ -14,6 +14,8 @@ import io.temporal.failure.NexusOperationFailure; import io.temporal.serviceclient.MetricsTag; import io.temporal.testUtils.Eventually; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.MetricsType; import io.temporal.worker.WorkerMetricsTag; @@ -23,7 +25,10 @@ import java.time.Duration; import java.util.Map; import org.junit.*; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class SyncOperationFailTest { private final TestStatsReporter reporter = new TestStatsReporter(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationStubTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationStubTest.java index 0e1fff61da..bba0c09f88 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationStubTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationStubTest.java @@ -3,6 +3,8 @@ import io.nexusrpc.handler.OperationHandler; import io.nexusrpc.handler.OperationImpl; import io.nexusrpc.handler.ServiceImpl; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -11,7 +13,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class SyncOperationStubTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationTimeoutTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationTimeoutTest.java index ed1e72d493..50bdc5b575 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationTimeoutTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/SyncOperationTimeoutTest.java @@ -6,6 +6,8 @@ import io.temporal.client.WorkflowFailedException; import io.temporal.failure.NexusOperationFailure; import io.temporal.failure.TimeoutFailure; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -14,7 +16,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class SyncOperationTimeoutTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/TerminateWorkflowAsyncOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/TerminateWorkflowAsyncOperationTest.java index fc8767d3d2..792f6e2d60 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/TerminateWorkflowAsyncOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/TerminateWorkflowAsyncOperationTest.java @@ -12,6 +12,8 @@ import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowHandle; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestWorkflows; @@ -19,7 +21,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class TerminateWorkflowAsyncOperationTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/UntypedSyncOperationStubTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/UntypedSyncOperationStubTest.java index bc03b5ff8c..8fedb91418 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/UntypedSyncOperationStubTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/UntypedSyncOperationStubTest.java @@ -3,6 +3,8 @@ import io.nexusrpc.handler.OperationHandler; import io.nexusrpc.handler.OperationImpl; import io.nexusrpc.handler.ServiceImpl; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -11,7 +13,10 @@ import org.junit.Assert; import org.junit.ClassRule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class UntypedSyncOperationStubTest { @ClassRule public static SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/UpdateWorkflowOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/UpdateWorkflowOperationTest.java index b228d02b3d..143a9fd7fe 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/UpdateWorkflowOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/UpdateWorkflowOperationTest.java @@ -18,6 +18,8 @@ import io.temporal.internal.nexus.OperationTokenType; import io.temporal.internal.nexus.OperationTokenUtil; import io.temporal.nexus.TemporalOperationHandler; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestWorkflows; @@ -28,7 +30,10 @@ import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class UpdateWorkflowOperationTest extends BaseNexusTest { private static final String asyncVal = "async"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/VoidOperationTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/VoidOperationTest.java index 108d3c294d..033633dca7 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/VoidOperationTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/VoidOperationTest.java @@ -5,6 +5,8 @@ import io.nexusrpc.handler.OperationHandler; import io.nexusrpc.handler.OperationImpl; import io.nexusrpc.handler.ServiceImpl; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.NexusServiceOptions; import io.temporal.workflow.NexusServiceStub; @@ -13,8 +15,11 @@ import org.junit.Assert; import org.junit.ClassRule; import org.junit.Test; +import org.junit.experimental.categories.Category; // Test an operation that takes and returns a void type +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class VoidOperationTest { @ClassRule public static SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleFailOnConflictTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleFailOnConflictTest.java index 9f47280a38..af7c8d5efc 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleFailOnConflictTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleFailOnConflictTest.java @@ -10,6 +10,8 @@ import io.temporal.failure.NexusOperationFailure; import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -20,7 +22,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class WorkflowHandleFailOnConflictTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleFuncTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleFuncTest.java index 859a1442b0..f7d91b4ea4 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleFuncTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleFuncTest.java @@ -10,6 +10,8 @@ import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowHandle; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestMultiArgWorkflowFunctions; @@ -18,7 +20,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class WorkflowHandleFuncTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleProcTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleProcTest.java index e940161033..1bb437d6e0 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleProcTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleProcTest.java @@ -10,6 +10,8 @@ import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowHandle; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.NexusOperationOptions; import io.temporal.workflow.NexusServiceOptions; @@ -20,7 +22,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class WorkflowHandleProcTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleStubTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleStubTest.java index d2c283ed9a..a2709f6b4f 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleStubTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleStubTest.java @@ -10,6 +10,8 @@ import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowHandle; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.NexusOperationOptions; import io.temporal.workflow.NexusServiceOptions; @@ -20,7 +22,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class WorkflowHandleStubTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleUseExistingOnConflictCancelTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleUseExistingOnConflictCancelTest.java index 4d5052579f..38fe8528df 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleUseExistingOnConflictCancelTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleUseExistingOnConflictCancelTest.java @@ -9,6 +9,8 @@ import io.temporal.failure.NexusOperationFailure; import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -17,7 +19,10 @@ import java.util.List; import java.util.UUID; import org.junit.*; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class WorkflowHandleUseExistingOnConflictCancelTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleUseExistingOnConflictTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleUseExistingOnConflictTest.java index af658aeaa9..a63d922f53 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleUseExistingOnConflictTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowHandleUseExistingOnConflictTest.java @@ -10,6 +10,8 @@ import io.temporal.client.WorkflowStub; import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -19,7 +21,10 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import org.junit.*; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class WorkflowHandleUseExistingOnConflictTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowOperationLinkingTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowOperationLinkingTest.java index 7777c5fff3..563d0c4431 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowOperationLinkingTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/nexus/WorkflowOperationLinkingTest.java @@ -14,6 +14,8 @@ import io.temporal.internal.nexus.OperationTokenUtil; import io.temporal.nexus.Nexus; import io.temporal.nexus.WorkflowRunOperation; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.*; import io.temporal.workflow.shared.TestNexusServices; @@ -22,7 +24,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("Cloud CI does not provision the Nexus endpoint required by this test.") +@Category(RequiresCloudProvisioning.class) public class WorkflowOperationLinkingTest extends BaseNexusTest { @Rule public SDKTestWorkflowRule testWorkflowRule = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/SearchAttributesTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/SearchAttributesTest.java index e9653e4292..33af19a754 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/SearchAttributesTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/SearchAttributesTest.java @@ -23,6 +23,8 @@ import io.temporal.client.WorkflowServiceException; import io.temporal.internal.client.WorkflowClientHelper; import io.temporal.internal.common.SearchAttributesUtil; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.ChildWorkflowOptions; @@ -36,8 +38,12 @@ import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; @SuppressWarnings("deprecation") +@CloudTestExclusionNote( + "Cloud CI does not provision the custom search attributes required by this test.") +@Category(RequiresCloudProvisioning.class) public class SearchAttributesTest { private static final String TEST_KEY_STRING = "CustomStringField"; private static final String TEST_VALUE_STRING = NAMESPACE; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/TypedSearchAttributesTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/TypedSearchAttributesTest.java index 5f74665ee0..d73e88c1a6 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/TypedSearchAttributesTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/TypedSearchAttributesTest.java @@ -18,6 +18,8 @@ import io.temporal.common.SearchAttributeKey; import io.temporal.internal.client.WorkflowClientHelper; import io.temporal.internal.common.SearchAttributesUtil; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.ChildWorkflowOptions; @@ -31,8 +33,12 @@ import java.util.List; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; /** Typed attribute translation of {@link SearchAttributesTest} */ +@CloudTestExclusionNote( + "Cloud CI does not provision the custom search attributes required by this test.") +@Category(RequiresCloudProvisioning.class) public class TypedSearchAttributesTest { private static final SearchAttributeKey> TEST_NEW_KEY = SearchAttributeKey.forKeywordList("NewKeyList"); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/UpsertSearchAttributeTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/UpsertSearchAttributeTest.java index a8d2cd173c..090051e03e 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/UpsertSearchAttributeTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/UpsertSearchAttributeTest.java @@ -8,6 +8,8 @@ import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowOptions; import io.temporal.common.*; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.testing.internal.TracingWorkerInterceptor; @@ -18,8 +20,12 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; @SuppressWarnings("deprecation") +@CloudTestExclusionNote( + "Cloud CI does not provision the custom search attributes used by this suite.") +@Category(RequiresCloudProvisioning.class) public class UpsertSearchAttributeTest { private static final String TEST_VALUE = "test"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/UpsertTypedSearchAttributeTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/UpsertTypedSearchAttributeTest.java index 8f9a5c25f6..a03e6d515e 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/UpsertTypedSearchAttributeTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/searchattributes/UpsertTypedSearchAttributeTest.java @@ -8,6 +8,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.common.SearchAttributeKey; import io.temporal.common.SearchAttributes; +import io.temporal.testing.CloudTestExclusion.RequiresCloudProvisioning; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.testing.internal.TracingWorkerInterceptor; @@ -18,8 +20,12 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; /** Typed attribute translation of {@link UpsertSearchAttributeTest} */ +@CloudTestExclusionNote( + "Cloud CI does not provision the custom search attributes required by this test.") +@Category(RequiresCloudProvisioning.class) public class UpsertTypedSearchAttributeTest { private static final String TEST_VALUE = "test"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/shared/TestActivities.java b/temporal-sdk/src/test/java/io/temporal/workflow/shared/TestActivities.java index 0c71210516..4e108a974b 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/shared/TestActivities.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/shared/TestActivities.java @@ -17,7 +17,6 @@ import io.temporal.common.MethodRetry; import io.temporal.common.converter.RawValue; import io.temporal.failure.ApplicationFailure; -import io.temporal.testing.internal.SDKTestWorkflowRule; import java.io.Closeable; import java.io.IOException; import java.time.Duration; @@ -352,7 +351,7 @@ public String heartbeatAndWait(long waitMs, boolean heartbeatMoreThanOnce) { @Override public void throwIO() { ActivityInfo info = Activity.getExecutionContext().getInfo(); - assertEquals(SDKTestWorkflowRule.NAMESPACE, info.getNamespace()); + assertFalse(info.getNamespace().isEmpty()); assertNotNull(info.getWorkflowId()); assertNotNull(info.getWorkflowRunId()); assertFalse(info.getWorkflowId().isEmpty()); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/signalTests/SignalDuringLastWorkflowTaskTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/signalTests/SignalDuringLastWorkflowTaskTest.java index 5a226a9496..a2c9fa79e0 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/signalTests/SignalDuringLastWorkflowTaskTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/signalTests/SignalDuringLastWorkflowTaskTest.java @@ -6,6 +6,8 @@ import io.temporal.api.common.v1.WorkflowExecution; import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowTargetOptions; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; import io.temporal.workflow.shared.TestWorkflows.TestSignaledWorkflow; @@ -18,6 +20,7 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class SignalDuringLastWorkflowTaskTest { @@ -33,6 +36,8 @@ public class SignalDuringLastWorkflowTaskTest { WorkerOptions.newBuilder().setDefaultDeadlockDetectionTimeout(5000).build()) .build(); + @CloudTestExclusionNote("This signal timing test depends on local test-server time skipping.") + @Category(RequiresLocalServer.class) @Test public void testSignalDuringLastWorkflowTask() throws ExecutionException, InterruptedException { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/signalTests/SignalTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/signalTests/SignalTest.java index a3bde4bf9e..d2f28e2b7d 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/signalTests/SignalTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/signalTests/SignalTest.java @@ -177,8 +177,7 @@ public void testSignalUntyped() { WorkflowClient client = WorkflowClient.newInstance( testWorkflowRule.getWorkflowServiceStubs(), - WorkflowClientOptions.newBuilder() - .setNamespace(SDKTestWorkflowRule.NAMESPACE) + WorkflowClientOptions.newBuilder(testWorkflowRule.getWorkflowClient().getOptions()) .setQueryRejectCondition(QueryRejectCondition.QUERY_REJECT_CONDITION_NOT_OPEN) .build()); WorkflowStub workflowStubNotOptionRejectCondition = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/updateTest/UpdateTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/updateTest/UpdateTest.java index 1489b21280..09a255bd93 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/updateTest/UpdateTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/updateTest/UpdateTest.java @@ -276,7 +276,7 @@ public void testUpdateResets() { .blockingStub() .resetWorkflowExecution( ResetWorkflowExecutionRequest.newBuilder() - .setNamespace(SDKTestWorkflowRule.NAMESPACE) + .setNamespace(workflowClient.getOptions().getNamespace()) .setReason("Integration test") .setWorkflowExecution(execution) .setWorkflowTaskFinishEventId(4) diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/updateTest/UpdateWithStartTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/updateTest/UpdateWithStartTest.java index 5314414de4..5635102bae 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/updateTest/UpdateWithStartTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/updateTest/UpdateWithStartTest.java @@ -107,7 +107,7 @@ private Results assertUpdateWithStart( return new Results(theWorkflowResult, theUpdateResult); } - @Test + @Test(timeout = 30_000) public void startWorkflowAndUpdate() throws ExecutionException, InterruptedException { // no arg Results results = diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java index a5ad4b8262..b8481ca4f2 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAddNewBeforeTest.java @@ -3,6 +3,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assume.assumeFalse; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; import io.temporal.workflow.Workflow; @@ -11,6 +13,7 @@ import java.time.Duration; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +38,8 @@ public GetVersionAddNewBeforeTest(boolean setVersioningFlag, boolean upsertVersi super(setVersioningFlag, upsertVersioningSA); } + @CloudTestExclusionNote("This versioning test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void testGetVersionAddNewBefore() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java index f58e1efa76..722a67b30e 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAndTimerTest.java @@ -4,6 +4,8 @@ import static org.junit.Assume.assumeFalse; import io.temporal.client.WorkflowOptions; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.workflow.Workflow; import io.temporal.workflow.WorkflowInterface; @@ -12,6 +14,7 @@ import java.time.Instant; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class GetVersionAndTimerTest extends BaseVersionTest { @@ -30,12 +33,16 @@ public GetVersionAndTimerTest(boolean setVersioningFlag, boolean upsertVersionin super(setVersioningFlag, upsertVersioningSA); } + @CloudTestExclusionNote("This timer test depends on local test-server time skipping.") + @Category(RequiresLocalServer.class) @Test public void testTimedWorkflowWithoutVersionImpl() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); testTimedWorkflow(testWorkflowRuleWithoutVersion); } + @CloudTestExclusionNote("This timer test depends on local test-server time skipping.") + @Category(RequiresLocalServer.class) @Test public void testTimedWorkflowWithVersionImpl() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAsyncLocalActivityReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAsyncLocalActivityReplayTest.java index 1a36b7c4ab..c460ce4a5b 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAsyncLocalActivityReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionAsyncLocalActivityReplayTest.java @@ -16,6 +16,8 @@ import io.temporal.internal.common.SdkFlag; import io.temporal.internal.history.VersionMarkerUtils; import io.temporal.internal.statemachines.WorkflowStateMachines; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.testing.WorkflowReplayer; import io.temporal.worker.Worker; @@ -34,7 +36,10 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class GetVersionAsyncLocalActivityReplayTest { private static final String TASK_QUEUE = "get-version-async-local-activity-replay"; private static final String CHANGE_ID = "async-local-activity-change"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInterleavedUpdateReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInterleavedUpdateReplayTest.java index 5aa8813e00..8b9414a400 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInterleavedUpdateReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInterleavedUpdateReplayTest.java @@ -30,6 +30,8 @@ import io.temporal.internal.common.SdkFlag; import io.temporal.internal.history.VersionMarkerUtils; import io.temporal.internal.statemachines.WorkflowStateMachines; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestEnvironmentOptions; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.testing.WorkflowHistoryLoader; @@ -51,6 +53,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.slf4j.Logger; /** @@ -58,6 +61,8 @@ * gauravthadani/samples-kotlin and captures histories that exercise interleaved updates around * getVersion. */ +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class GetVersionInterleavedUpdateReplayTest { private static final String HISTORY_RESOURCE = "testGetVersionInterleavedUpdateReplayHistory.json"; diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java index c5de8bfebd..e254a5d78a 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdOnReplayTest.java @@ -7,6 +7,8 @@ import io.temporal.api.common.v1.WorkflowExecution; import io.temporal.api.enums.v1.EventType; import io.temporal.client.WorkflowStub; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; import io.temporal.workflow.Workflow; @@ -15,6 +17,7 @@ import java.time.Duration; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class GetVersionSameIdOnReplayTest extends BaseVersionTest { @@ -36,6 +39,8 @@ public GetVersionSameIdOnReplayTest(boolean setVersioningFlag, boolean upsertVer super(setVersioningFlag, upsertVersioningSA); } + @CloudTestExclusionNote("This replay test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void testGetVersionSameIdOnReplay() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java index 24fb6aea0e..b1d425b5ec 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionSameIdTest.java @@ -4,6 +4,8 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; import io.temporal.workflow.Workflow; @@ -12,6 +14,7 @@ import java.time.Duration; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class GetVersionSameIdTest extends BaseVersionTest { @@ -32,6 +35,8 @@ public GetVersionSameIdTest(boolean setVersioningFlag, boolean upsertVersioningS super(setVersioningFlag, upsertVersioningSA); } + @CloudTestExclusionNote("This versioning test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void testGetVersionSameId() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java index 5389d6f621..d39292303f 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowRemoveTest.java @@ -5,6 +5,8 @@ import static org.junit.Assume.assumeFalse; import io.temporal.client.WorkflowStub; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestOptions; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; @@ -17,6 +19,7 @@ import java.util.List; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; public class GetVersionWorkflowRemoveTest extends BaseVersionTest { @@ -39,6 +42,8 @@ public GetVersionWorkflowRemoveTest(boolean setVersioningFlag, boolean upsertVer super(setVersioningFlag, upsertVersioningSA); } + @CloudTestExclusionNote("This versioning test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void testGetVersionWorkflowRemove() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java index 73071be6df..3bd13afc9b 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceCompletelyTest.java @@ -5,6 +5,8 @@ import static org.junit.Assume.assumeFalse; import io.temporal.client.WorkflowStub; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; import io.temporal.workflow.Workflow; @@ -14,6 +16,7 @@ import java.util.List; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,6 +44,8 @@ public GetVersionWorkflowReplaceCompletelyTest( super(setVersioningFlag, upsertVersioningSA); } + @CloudTestExclusionNote("This versioning test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void testGetVersionWorkflowReplaceCompletely() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java index 44bf65edaa..0ce64edc65 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionWorkflowReplaceGetVersionIdTest.java @@ -5,6 +5,8 @@ import static org.junit.Assume.assumeFalse; import io.temporal.client.WorkflowStub; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.WorkerOptions; import io.temporal.workflow.Workflow; @@ -14,6 +16,7 @@ import java.util.List; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,6 +44,8 @@ public GetVersionWorkflowReplaceGetVersionIdTest( super(setVersioningFlag, upsertVersioningSA); } + @CloudTestExclusionNote("This versioning test depends on local test-server execution behavior.") + @Category(RequiresLocalServer.class) @Test public void testGetVersionWorkflowReplaceGetVersionId() { assumeFalse("skipping for docker tests", SDKTestWorkflowRule.useExternalService); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/PreferredVersionProviderRolloutTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/PreferredVersionProviderRolloutTest.java index cfdb1b9b5f..21af675958 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/PreferredVersionProviderRolloutTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/PreferredVersionProviderRolloutTest.java @@ -7,6 +7,8 @@ import io.temporal.client.WorkflowClientOptions; import io.temporal.client.WorkflowOptions; import io.temporal.client.WorkflowStub; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.worker.PreferredVersionProvider; import io.temporal.worker.VersionPreference; @@ -24,7 +26,10 @@ import java.util.concurrent.atomic.AtomicInteger; import org.junit.Before; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class PreferredVersionProviderRolloutTest { private static final String CHANGE_ID = "preferred-change"; private static final AtomicInteger unactivatedProviderCalls = new AtomicInteger(); diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/PreferredVersionProviderTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/PreferredVersionProviderTest.java index f3da4f7e76..5b280c6c4a 100644 --- a/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/PreferredVersionProviderTest.java +++ b/temporal-sdk/src/test/java/io/temporal/workflow/versionTests/PreferredVersionProviderTest.java @@ -6,6 +6,8 @@ import io.temporal.client.WorkflowOptions; import io.temporal.client.WorkflowStub; import io.temporal.internal.sync.ReadOnlyException; +import io.temporal.testing.CloudTestExclusion.RequiresLocalServer; +import io.temporal.testing.CloudTestExclusionNote; import io.temporal.testing.TestWorkflowEnvironment; import io.temporal.testing.internal.SDKTestWorkflowRule; import io.temporal.worker.PreferredVersionProviderInput; @@ -21,7 +23,10 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; +@CloudTestExclusionNote("This test directly creates and controls a local test service.") +@Category(RequiresLocalServer.class) public class PreferredVersionProviderTest { private static final String CHANGE_ID = "preferred-change"; private static final AtomicInteger providerCalls = new AtomicInteger();