Skip to content

Commit f29e8bd

Browse files
Enhance testing of the server-side control flow (#2377)
Motivation: Cover a few more use-cases to increase confidence in server-side control flow behavior. Modifications: - Add `ServerPipelineControlFlowTest`; - Add utilities for easier setup of debugging options for client/server builder; Result: More tests for the server-side control flow.
1 parent 922993b commit f29e8bd

File tree

4 files changed

+370
-4
lines changed

4 files changed

+370
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
* Copyright © 2022 Apple Inc. and the ServiceTalk project authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.servicetalk.http.netty;
17+
18+
import io.servicetalk.http.api.HttpExecutionStrategy;
19+
import io.servicetalk.http.api.HttpProtocolConfig;
20+
import io.servicetalk.http.api.HttpServerBuilder;
21+
import io.servicetalk.http.api.SingleAddressHttpClientBuilder;
22+
import io.servicetalk.transport.api.ExecutionContext;
23+
import io.servicetalk.transport.api.ExecutionStrategy;
24+
import io.servicetalk.transport.api.HostAndPort;
25+
import io.servicetalk.transport.api.ServerContext;
26+
27+
import java.net.InetSocketAddress;
28+
29+
import static io.servicetalk.http.netty.HttpProtocol.toConfigs;
30+
import static io.servicetalk.http.utils.HttpLifecycleObservers.logging;
31+
import static io.servicetalk.logging.api.LogLevel.TRACE;
32+
import static io.servicetalk.transport.netty.internal.AddressUtils.localAddress;
33+
import static io.servicetalk.transport.netty.internal.AddressUtils.serverHostAndPort;
34+
35+
final class BuilderUtils {
36+
37+
private BuilderUtils() {
38+
// No instances
39+
}
40+
41+
static HttpServerBuilder newLocalServer(ExecutionContext<? extends ExecutionStrategy> ctx,
42+
HttpProtocol... protocols) {
43+
return newLocalServerWithConfigs(ctx, toConfigs(protocols));
44+
}
45+
46+
static HttpServerBuilder newLocalServerWithConfigs(ExecutionContext<? extends ExecutionStrategy> ctx,
47+
HttpProtocolConfig... protocols) {
48+
HttpServerBuilder builder = HttpServers.forAddress(localAddress(0))
49+
.ioExecutor(ctx.ioExecutor())
50+
.executor(ctx.executor())
51+
.bufferAllocator(ctx.bufferAllocator())
52+
.executionStrategy(HttpExecutionStrategy.from(ctx.executionStrategy()))
53+
.enableWireLogging("servicetalk-tests-wire-logger", TRACE, Boolean.TRUE::booleanValue)
54+
.lifecycleObserver(logging("servicetalk-tests-lifecycle-observer-logger", TRACE));
55+
if (protocols.length > 0) {
56+
builder.protocols(protocols);
57+
}
58+
return builder;
59+
}
60+
61+
static SingleAddressHttpClientBuilder<HostAndPort, InetSocketAddress> newClient(
62+
ServerContext serverContext,
63+
ExecutionContext<? extends ExecutionStrategy> ctx,
64+
HttpProtocol... protocols) {
65+
return newClientWithConfigs(serverContext, ctx, toConfigs(protocols));
66+
}
67+
68+
static SingleAddressHttpClientBuilder<HostAndPort, InetSocketAddress> newClientWithConfigs(
69+
ServerContext serverContext,
70+
ExecutionContext<? extends ExecutionStrategy> ctx,
71+
HttpProtocolConfig... protocols) {
72+
73+
SingleAddressHttpClientBuilder<HostAndPort, InetSocketAddress> builder =
74+
HttpClients.forSingleAddress(serverHostAndPort(serverContext))
75+
.ioExecutor(ctx.ioExecutor())
76+
.executor(ctx.executor())
77+
.bufferAllocator(ctx.bufferAllocator())
78+
.executionStrategy(HttpExecutionStrategy.from(ctx.executionStrategy()))
79+
.enableWireLogging("servicetalk-tests-wire-logger", TRACE, Boolean.TRUE::booleanValue)
80+
.appendClientFilter(new HttpLifecycleObserverRequesterFilter(
81+
logging("servicetalk-tests-lifecycle-observer-logger", TRACE)));
82+
if (protocols.length > 0) {
83+
builder.protocols(protocols);
84+
}
85+
return builder;
86+
}
87+
}

servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/GracefulConnectionClosureHandlingTest.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
import static io.servicetalk.utils.internal.PlatformDependent.throwException;
9696
import static java.lang.Integer.parseInt;
9797
import static java.lang.String.valueOf;
98-
import static java.nio.charset.StandardCharsets.UTF_8;
98+
import static java.nio.charset.StandardCharsets.US_ASCII;
9999
import static java.util.Arrays.asList;
100100
import static java.util.Objects.requireNonNull;
101101
import static org.hamcrest.MatcherAssert.assertThat;
@@ -110,7 +110,8 @@ class GracefulConnectionClosureHandlingTest {
110110
private static final Logger LOGGER = LoggerFactory.getLogger(GracefulConnectionClosureHandlingTest.class);
111111
private static final Collection<Boolean> TRUE_FALSE = asList(true, false);
112112

113-
static final HttpStreamingSerializer<String> RAW_STRING_SERIALIZER = stringStreamingSerializer(UTF_8, hdr -> { });
113+
static final HttpStreamingSerializer<String> RAW_STRING_SERIALIZER =
114+
stringStreamingSerializer(US_ASCII, hdr -> { });
114115

115116
@RegisterExtension
116117
static final ExecutionContextExtension SERVER_CTX =

servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/HttpProtocol.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
import io.servicetalk.http.api.HttpProtocolConfig;
1919
import io.servicetalk.http.api.HttpProtocolVersion;
2020

21+
import java.util.Arrays;
2122
import java.util.Collection;
22-
import java.util.stream.Collectors;
2323

2424
import static io.servicetalk.http.api.HttpProtocolVersion.HTTP_1_1;
2525
import static io.servicetalk.http.api.HttpProtocolVersion.HTTP_2_0;
@@ -40,6 +40,10 @@ enum HttpProtocol {
4040
}
4141

4242
static HttpProtocolConfig[] toConfigs(Collection<HttpProtocol> protocols) {
43-
return protocols.stream().map(p -> p.config).collect(Collectors.toList()).toArray(new HttpProtocolConfig[] {});
43+
return protocols.stream().map(p -> p.config).toArray(HttpProtocolConfig[]::new);
44+
}
45+
46+
static HttpProtocolConfig[] toConfigs(HttpProtocol[] protocols) {
47+
return Arrays.stream(protocols).map(p -> p.config).toArray(HttpProtocolConfig[]::new);
4448
}
4549
}

0 commit comments

Comments
 (0)