From 3476325b9229dea3be3cdb16d993712b197c4afa Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Wed, 25 Sep 2024 09:59:20 -0700 Subject: [PATCH] Add SystemInfoTimeoutTest --- .../serviceclient/SystemInfoTimeoutTest.java | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 temporal-serviceclient/src/test/java/io/temporal/serviceclient/SystemInfoTimeoutTest.java diff --git a/temporal-serviceclient/src/test/java/io/temporal/serviceclient/SystemInfoTimeoutTest.java b/temporal-serviceclient/src/test/java/io/temporal/serviceclient/SystemInfoTimeoutTest.java new file mode 100644 index 000000000..8c423ad2c --- /dev/null +++ b/temporal-serviceclient/src/test/java/io/temporal/serviceclient/SystemInfoTimeoutTest.java @@ -0,0 +1,155 @@ +package io.temporal.serviceclient; + +import static org.junit.Assert.assertEquals; + +import io.grpc.ClientInterceptor; +import io.grpc.ManagedChannel; +import io.grpc.Status; +import io.grpc.StatusRuntimeException; +import io.grpc.inprocess.InProcessChannelBuilder; +import io.grpc.inprocess.InProcessServerBuilder; +import io.grpc.stub.StreamObserver; +import io.grpc.testing.GrpcCleanupRule; +import io.temporal.api.workflowservice.v1.GetSystemInfoRequest; +import io.temporal.api.workflowservice.v1.GetSystemInfoResponse; +import io.temporal.api.workflowservice.v1.WorkflowServiceGrpc; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.atomic.AtomicInteger; +import org.junit.*; + +public class SystemInfoTimeoutTest { + + private static final GetSystemInfoResponse.Capabilities CAPABILITIES = + GetSystemInfoResponse.Capabilities.newBuilder().setInternalErrorDifferentiation(true).build(); + + private static final GetSystemInfoResponse GET_SYSTEM_INFO_RESPONSE = + GetSystemInfoResponse.newBuilder().setCapabilities(CAPABILITIES).build(); + + private static final RpcRetryOptions RPC_RETRY_OPTIONS = + RpcRetryOptions.newBuilder() + .setInitialInterval(Duration.ofMillis(10)) + .setBackoffCoefficient(1.0) + .setMaximumAttempts(3) + .setExpiration(Duration.ofMillis(100)) + .validateBuildWithDefaults(); + + @Rule public final GrpcCleanupRule grpcCleanupRule = new GrpcCleanupRule(); + private final AtomicInteger getSystemInfoCount = new AtomicInteger(0); + private final AbstractQueue getSystemInfoTimeout = new ArrayBlockingQueue(10); + + private final WorkflowServiceGrpc.WorkflowServiceImplBase workflowImpl = + new WorkflowServiceGrpc.WorkflowServiceImplBase() { + @Override + public void getSystemInfo( + GetSystemInfoRequest request, StreamObserver responseObserver) { + Duration timeout = getSystemInfoTimeout.poll(); + if (timeout != null) { + try { + Thread.sleep(timeout.toMillis()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + getSystemInfoCount.getAndIncrement(); + responseObserver.onNext(GET_SYSTEM_INFO_RESPONSE); + responseObserver.onCompleted(); + } + }; + + private ManagedChannel managedChannel; + + @Before + public void setUp() throws Exception { + getSystemInfoCount.set(0); + String serverName = InProcessServerBuilder.generateName(); + grpcCleanupRule.register( + InProcessServerBuilder.forName(serverName) + .directExecutor() + .addService(workflowImpl) + .build() + .start()); + managedChannel = + grpcCleanupRule.register( + InProcessChannelBuilder.forName(serverName).directExecutor().build()); + } + + @Test + public void testGetServerCapabilitiesTimeoutExceeded() { + WorkflowServiceStubsOptions serviceStubsOptions = + WorkflowServiceStubsOptions.newBuilder() + .setChannel(managedChannel) + .setRpcRetryOptions(RPC_RETRY_OPTIONS) + .setSystemInfoTimeout(Duration.ofSeconds(1)) + .validateAndBuildWithDefaults(); + + ClientInterceptor deadlineInterceptor = + new GrpcDeadlineInterceptor( + serviceStubsOptions.getRpcTimeout(), + serviceStubsOptions.getRpcLongPollTimeout(), + serviceStubsOptions.getRpcQueryTimeout()); + + ChannelManager channelManager = + new ChannelManager(serviceStubsOptions, Collections.singletonList(deadlineInterceptor)); + + getSystemInfoTimeout.add(Duration.ofSeconds(2)); + + StatusRuntimeException sre = + Assert.assertThrows( + StatusRuntimeException.class, () -> channelManager.getServerCapabilities().get()); + assertEquals(Status.Code.DEADLINE_EXCEEDED, sre.getStatus().getCode()); + } + + @Test + public void testGetServerCapabilitiesRetry() { + WorkflowServiceStubsOptions serviceStubsOptions = + WorkflowServiceStubsOptions.newBuilder() + .setChannel(managedChannel) + .setRpcRetryOptions(RPC_RETRY_OPTIONS) + .setRpcTimeout(Duration.ofMillis(500)) + .setSystemInfoTimeout(Duration.ofSeconds(5)) + .validateAndBuildWithDefaults(); + + ClientInterceptor deadlineInterceptor = + new GrpcDeadlineInterceptor( + serviceStubsOptions.getRpcTimeout(), + serviceStubsOptions.getRpcLongPollTimeout(), + serviceStubsOptions.getRpcQueryTimeout()); + + ChannelManager channelManager = + new ChannelManager(serviceStubsOptions, Collections.singletonList(deadlineInterceptor)); + + getSystemInfoTimeout.add(Duration.ofSeconds(1)); + getSystemInfoTimeout.add(Duration.ofSeconds(1)); + + GetSystemInfoResponse.Capabilities capabilities = channelManager.getServerCapabilities().get(); + assertEquals(CAPABILITIES, capabilities); + assertEquals(3, getSystemInfoCount.get()); + } + + @Test + public void testGetServerCapabilitiesTimeout() { + WorkflowServiceStubsOptions serviceStubsOptions = + WorkflowServiceStubsOptions.newBuilder() + .setChannel(managedChannel) + .setRpcRetryOptions(RPC_RETRY_OPTIONS) + .setSystemInfoTimeout(Duration.ofSeconds(10)) + .validateAndBuildWithDefaults(); + + ClientInterceptor deadlineInterceptor = + new GrpcDeadlineInterceptor( + serviceStubsOptions.getRpcTimeout(), + serviceStubsOptions.getRpcLongPollTimeout(), + serviceStubsOptions.getRpcQueryTimeout()); + + ChannelManager channelManager = + new ChannelManager(serviceStubsOptions, Collections.singletonList(deadlineInterceptor)); + + getSystemInfoTimeout.add(Duration.ofSeconds(6)); + + GetSystemInfoResponse.Capabilities capabilities = channelManager.getServerCapabilities().get(); + assertEquals(CAPABILITIES, capabilities); + assertEquals(1, getSystemInfoCount.get()); + } +}