diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java index f4e44716ca..bb84b5b067 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java @@ -145,9 +145,7 @@ public abstract class AbstractInteropTest { List allInterceptors = ImmutableList.builder() .add(TestUtils.recordServerCallInterceptor(serverCallCapture)) .add(TestUtils.recordRequestHeadersInterceptor(requestHeadersCapture)) - .add(TestUtils.echoRequestHeadersInterceptor(Util.METADATA_KEY)) - .add(TestUtils.echoRequestMetadataInHeaders(Util.ECHO_INITIAL_METADATA_KEY)) - .add(TestUtils.echoRequestMetadataInTrailers(Util.ECHO_TRAILING_METADATA_KEY)) + .addAll(TestServiceImpl.interceptors()) .add(interceptors) .build(); diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceImpl.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceImpl.java index 3c51986feb..580f72bf08 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceImpl.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceImpl.java @@ -36,6 +36,11 @@ import com.google.common.collect.Queues; import com.google.protobuf.ByteString; import com.google.protobuf.EmptyProtos; +import io.grpc.ForwardingServerCall.SimpleForwardingServerCall; +import io.grpc.Metadata; +import io.grpc.ServerCall; +import io.grpc.ServerCallHandler; +import io.grpc.ServerInterceptor; import io.grpc.Status; import io.grpc.internal.LogExceptionRunnable; import io.grpc.stub.ServerCallStreamObserver; @@ -51,9 +56,13 @@ import io.grpc.testing.integration.Messages.StreamingOutputCallResponse; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; +import java.util.HashSet; import java.util.LinkedList; +import java.util.List; import java.util.Queue; import java.util.Random; +import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.annotation.concurrent.GuardedBy; @@ -496,4 +505,95 @@ public class TestServiceImpl extends TestServiceGrpc.TestServiceImplBase { } return payload; } + + /** Returns interceptors necessary for full service implementation. */ + public static List interceptors() { + return Arrays.asList( + echoRequestHeadersInterceptor(Util.METADATA_KEY), + echoRequestMetadataInHeaders(Util.ECHO_INITIAL_METADATA_KEY), + echoRequestMetadataInTrailers(Util.ECHO_TRAILING_METADATA_KEY)); + } + + /** + * Echo the request headers from a client into response headers and trailers. Useful for + * testing end-to-end metadata propagation. + */ + private static ServerInterceptor echoRequestHeadersInterceptor(final Metadata.Key... keys) { + final Set> keySet = new HashSet>(Arrays.asList(keys)); + return new ServerInterceptor() { + @Override + public ServerCall.Listener interceptCall( + ServerCall call, + final Metadata requestHeaders, + ServerCallHandler next) { + return next.startCall(new SimpleForwardingServerCall(call) { + @Override + public void sendHeaders(Metadata responseHeaders) { + responseHeaders.merge(requestHeaders, keySet); + super.sendHeaders(responseHeaders); + } + + @Override + public void close(Status status, Metadata trailers) { + trailers.merge(requestHeaders, keySet); + super.close(status, trailers); + } + }, requestHeaders); + } + }; + } + + /** + * Echoes request headers with the specified key(s) from a client into response headers only. + */ + private static ServerInterceptor echoRequestMetadataInHeaders(final Metadata.Key... keys) { + final Set> keySet = new HashSet>(Arrays.asList(keys)); + return new ServerInterceptor() { + @Override + public ServerCall.Listener interceptCall( + ServerCall call, + final Metadata requestHeaders, + ServerCallHandler next) { + return next.startCall(new SimpleForwardingServerCall(call) { + @Override + public void sendHeaders(Metadata responseHeaders) { + responseHeaders.merge(requestHeaders, keySet); + super.sendHeaders(responseHeaders); + } + + @Override + public void close(Status status, Metadata trailers) { + super.close(status, trailers); + } + }, requestHeaders); + } + }; + } + + /** + * Echoes request headers with the specified key(s) from a client into response trailers only. + */ + private static ServerInterceptor echoRequestMetadataInTrailers(final Metadata.Key... keys) { + final Set> keySet = new HashSet>(Arrays.asList(keys)); + return new ServerInterceptor() { + @Override + public ServerCall.Listener interceptCall( + ServerCall call, + final Metadata requestHeaders, + ServerCallHandler next) { + return next.startCall(new SimpleForwardingServerCall(call) { + @Override + public void sendHeaders(Metadata responseHeaders) { + super.sendHeaders(responseHeaders); + } + + @Override + public void close(Status status, Metadata trailers) { + trailers.merge(requestHeaders, keySet); + super.close(status, trailers); + } + }, requestHeaders); + } + }; + } } diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index 5a1d8d7da1..3f0d9480d7 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -146,9 +146,7 @@ public class TestServiceServer { .maxMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE) .addService(ServerInterceptors.intercept( new TestServiceImpl(executor), - TestUtils.echoRequestHeadersInterceptor(Util.METADATA_KEY), - TestUtils.echoRequestMetadataInHeaders(Util.ECHO_INITIAL_METADATA_KEY), - TestUtils.echoRequestMetadataInTrailers(Util.ECHO_TRAILING_METADATA_KEY))) + TestServiceImpl.interceptors())) .build().start(); } diff --git a/testing/src/main/java/io/grpc/testing/TestUtils.java b/testing/src/main/java/io/grpc/testing/TestUtils.java index dadb2b9a30..e4c26c3f31 100644 --- a/testing/src/main/java/io/grpc/testing/TestUtils.java +++ b/testing/src/main/java/io/grpc/testing/TestUtils.java @@ -32,12 +32,10 @@ package io.grpc.testing; import io.grpc.ExperimentalApi; -import io.grpc.ForwardingServerCall.SimpleForwardingServerCall; import io.grpc.Metadata; import io.grpc.ServerCall; import io.grpc.ServerCallHandler; import io.grpc.ServerInterceptor; -import io.grpc.Status; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -57,11 +55,8 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import javax.net.ssl.SSLContext; @@ -77,92 +72,7 @@ public class TestUtils { public static final String TEST_SERVER_HOST = "foo.test.google.fr"; /** - * Echo the request headers from a client into response headers and trailers. Useful for - * testing end-to-end metadata propagation. - */ - public static ServerInterceptor echoRequestHeadersInterceptor(final Metadata.Key... keys) { - final Set> keySet = new HashSet>(Arrays.asList(keys)); - return new ServerInterceptor() { - @Override - public ServerCall.Listener interceptCall( - ServerCall call, - final Metadata requestHeaders, - ServerCallHandler next) { - return next.startCall(new SimpleForwardingServerCall(call) { - @Override - public void sendHeaders(Metadata responseHeaders) { - responseHeaders.merge(requestHeaders, keySet); - super.sendHeaders(responseHeaders); - } - - @Override - public void close(Status status, Metadata trailers) { - trailers.merge(requestHeaders, keySet); - super.close(status, trailers); - } - }, requestHeaders); - } - }; - } - - /** - * Echoes request headers with the specified key(s) from a client into response headers only. - */ - public static ServerInterceptor echoRequestMetadataInHeaders(final Metadata.Key... keys) { - final Set> keySet = new HashSet>(Arrays.asList(keys)); - return new ServerInterceptor() { - @Override - public ServerCall.Listener interceptCall( - ServerCall call, - final Metadata requestHeaders, - ServerCallHandler next) { - return next.startCall(new SimpleForwardingServerCall(call) { - @Override - public void sendHeaders(Metadata responseHeaders) { - responseHeaders.merge(requestHeaders, keySet); - super.sendHeaders(responseHeaders); - } - - @Override - public void close(Status status, Metadata trailers) { - super.close(status, trailers); - } - }, requestHeaders); - } - }; - } - - /** - * Echoes request headers with the specified key(s) from a client into response trailers only. - */ - public static ServerInterceptor echoRequestMetadataInTrailers(final Metadata.Key... keys) { - final Set> keySet = new HashSet>(Arrays.asList(keys)); - return new ServerInterceptor() { - @Override - public ServerCall.Listener interceptCall( - ServerCall call, - final Metadata requestHeaders, - ServerCallHandler next) { - return next.startCall(new SimpleForwardingServerCall(call) { - @Override - public void sendHeaders(Metadata responseHeaders) { - super.sendHeaders(responseHeaders); - } - - @Override - public void close(Status status, Metadata trailers) { - trailers.merge(requestHeaders, keySet); - super.close(status, trailers); - } - }, requestHeaders); - } - }; - } - - /** - * Capture the request headers from a client. Useful for testing metadata propagation without - * requiring that it be symmetric on client and server, as with - * {@link #echoRequestHeadersInterceptor}. + * Capture the request headers from a client. Useful for testing metadata propagation. */ public static ServerInterceptor recordRequestHeadersInterceptor( final AtomicReference headersCapture) {