|
32 | 32 | import io.servicetalk.grpc.netty.TesterProto.Tester.ClientFactory;
|
33 | 33 | import io.servicetalk.grpc.netty.TesterProto.Tester.TesterClient;
|
34 | 34 | import io.servicetalk.grpc.netty.TesterProto.Tester.TesterService;
|
| 35 | +import io.servicetalk.http.api.HttpServiceContext; |
| 36 | +import io.servicetalk.http.api.StreamingHttpRequest; |
| 37 | +import io.servicetalk.http.api.StreamingHttpResponse; |
| 38 | +import io.servicetalk.http.api.StreamingHttpResponseFactory; |
| 39 | +import io.servicetalk.http.api.StreamingHttpServiceFilter; |
35 | 40 | import io.servicetalk.transport.api.ServerContext;
|
36 | 41 |
|
37 | 42 | import org.junit.jupiter.api.AfterEach;
|
@@ -79,37 +84,48 @@ private enum AsyncVariant {
|
79 | 84 | private final ServerContext serverCtx;
|
80 | 85 |
|
81 | 86 | ConcurrentGrpcRequestTest() throws Exception {
|
82 |
| - serverCtx = GrpcServers.forAddress(localAddress(0)).listenAndAwait(new TesterService() { |
83 |
| - @Override |
84 |
| - public Single<TestResponse> test(GrpcServiceContext ctx, TestRequest request) { |
85 |
| - return testSingle(Publisher.from(request)); |
86 |
| - } |
87 |
| - |
88 |
| - @Override |
89 |
| - public Single<TestResponse> testRequestStream(GrpcServiceContext ctx, Publisher<TestRequest> request) { |
90 |
| - return testSingle(request); |
91 |
| - } |
92 |
| - |
93 |
| - @Override |
94 |
| - public Publisher<TestResponse> testResponseStream(GrpcServiceContext ctx, TestRequest request) { |
95 |
| - return testSingle(Publisher.from(request)).toPublisher(); |
96 |
| - } |
97 |
| - |
98 |
| - @Override |
99 |
| - public Publisher<TestResponse> testBiDiStream(GrpcServiceContext ctx, Publisher<TestRequest> request) { |
100 |
| - return testSingle(request).toPublisher(); |
101 |
| - } |
102 |
| - |
103 |
| - private Single<TestResponse> testSingle(Publisher<TestRequest> request) { |
104 |
| - receivedFirstRequest.countDown(); |
105 |
| - if (receivedRequests.incrementAndGet() == 1) { |
106 |
| - return SourceAdapters.fromSource(responseProcessor) |
107 |
| - .concat(request.ignoreElements()) |
108 |
| - .concat(Single.succeeded(TestResponse.newBuilder().setMessage("first").build())); |
109 |
| - } |
110 |
| - return Single.succeeded(TestResponse.newBuilder().setMessage("other").build()); |
111 |
| - } |
112 |
| - }); |
| 87 | + serverCtx = GrpcServers.forAddress(localAddress(0)) |
| 88 | + .initializeHttp(builder -> builder.appendServiceFilter(s -> new StreamingHttpServiceFilter(s) { |
| 89 | + @Override |
| 90 | + public Single<StreamingHttpResponse> handle(HttpServiceContext ctx, |
| 91 | + StreamingHttpRequest request, |
| 92 | + StreamingHttpResponseFactory responseFactory) { |
| 93 | + receivedFirstRequest.countDown(); |
| 94 | + Single<StreamingHttpResponse> response = delegate().handle(ctx, request, responseFactory); |
| 95 | + if (receivedRequests.incrementAndGet() == 1) { |
| 96 | + return response.concat(SourceAdapters.fromSource(responseProcessor)); |
| 97 | + } |
| 98 | + return response; |
| 99 | + } |
| 100 | + })) |
| 101 | + .listenAndAwait(new TesterService() { |
| 102 | + |
| 103 | + @Override |
| 104 | + public Single<TestResponse> test(GrpcServiceContext ctx, TestRequest request) { |
| 105 | + return newResponse(); |
| 106 | + } |
| 107 | + |
| 108 | + @Override |
| 109 | + public Single<TestResponse> testRequestStream(GrpcServiceContext ctx, |
| 110 | + Publisher<TestRequest> request) { |
| 111 | + return newResponse(); |
| 112 | + } |
| 113 | + |
| 114 | + @Override |
| 115 | + public Publisher<TestResponse> testResponseStream(GrpcServiceContext ctx, TestRequest request) { |
| 116 | + return newResponse().toPublisher(); |
| 117 | + } |
| 118 | + |
| 119 | + @Override |
| 120 | + public Publisher<TestResponse> testBiDiStream(GrpcServiceContext ctx, |
| 121 | + Publisher<TestRequest> request) { |
| 122 | + return newResponse().toPublisher(); |
| 123 | + } |
| 124 | + |
| 125 | + private Single<TestResponse> newResponse() { |
| 126 | + return Single.succeeded(TestResponse.newBuilder().setMessage("msg").build()); |
| 127 | + } |
| 128 | + }); |
113 | 129 | }
|
114 | 130 |
|
115 | 131 | @AfterEach
|
@@ -140,20 +156,19 @@ void test(boolean withMetadata, AsyncVariant variant) throws Exception {
|
140 | 156 | Future<TestResponse> firstConcurrent = firstSingle.toFuture();
|
141 | 157 | Future<TestResponse> secondConcurrent = newSingle(variant, client, metadata).toFuture();
|
142 | 158 |
|
143 |
| - responseProcessor.onComplete(); |
144 |
| - assertThat(first.get().getMessage(), is("first")); |
145 | 159 | assertRejected(firstConcurrent);
|
146 | 160 | if (metadata != null) {
|
147 | 161 | assertRejected(secondConcurrent);
|
148 | 162 | } else {
|
149 | 163 | // Requests are independent when metadata is not shared between them
|
150 |
| - assertThat(secondConcurrent.get().getMessage(), is("other")); |
| 164 | + assertResponse(secondConcurrent); |
151 | 165 | }
|
| 166 | + responseProcessor.onComplete(); |
| 167 | + assertResponse(first); |
152 | 168 |
|
153 |
| - Future<TestResponse> firstSequential = firstSingle.toFuture(); |
154 |
| - assertThat(firstSequential.get().getMessage(), is("other")); |
155 |
| - Future<TestResponse> thirdSequential = newSingle(variant, client, metadata).toFuture(); |
156 |
| - assertThat(thirdSequential.get().getMessage(), is("other")); |
| 169 | + // Sequential requests should be successful: |
| 170 | + assertResponse(firstSingle.toFuture()); |
| 171 | + assertResponse(newSingle(variant, client, metadata).toFuture()); |
157 | 172 | }
|
158 | 173 | assertThat(receivedRequests.get(), is(metadata != null ? 3 : 4));
|
159 | 174 | }
|
@@ -220,4 +235,8 @@ private static void assertRejected(Future<?> future) {
|
220 | 235 | GrpcStatusException gse = (GrpcStatusException) ee.getCause();
|
221 | 236 | assertThat(gse.getCause(), is(instanceOf(RejectedSubscribeException.class)));
|
222 | 237 | }
|
| 238 | + |
| 239 | + private static void assertResponse(Future<TestResponse> future) throws Exception { |
| 240 | + assertThat(future.get().getMessage(), is("msg")); |
| 241 | + } |
223 | 242 | }
|
0 commit comments