Skip to content

Commit e630308

Browse files
committed
Fix unnecessary warnings in test code
Signed-off-by: raccoonback <[email protected]>
1 parent 34bc2f2 commit e630308

File tree

1 file changed

+123
-37
lines changed

1 file changed

+123
-37
lines changed

reactor-netty-http/src/test/java/reactor/netty/http/client/Http2ConnectionLivenessHandlerTest.java

Lines changed: 123 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
package reactor.netty.http.client;
1717

1818
import io.netty.channel.Channel;
19+
import io.netty.channel.ChannelFutureListener;
1920
import io.netty.channel.ChannelHandlerContext;
2021
import io.netty.channel.SimpleChannelInboundHandler;
2122
import io.netty.handler.codec.http2.DefaultHttp2PingFrame;
2223
import io.netty.handler.codec.http2.Http2FrameCodec;
2324
import io.netty.handler.codec.http2.Http2FrameCodecBuilder;
2425
import io.netty.handler.codec.http2.Http2PingFrame;
26+
import io.netty.handler.ssl.SslContext;
27+
import io.netty.handler.ssl.SslContextBuilder;
2528
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
2629
import io.netty.handler.ssl.util.SelfSignedCertificate;
2730
import org.junit.jupiter.api.BeforeAll;
@@ -30,11 +33,13 @@
3033
import reactor.netty.BaseHttpTest;
3134
import reactor.netty.DisposableServer;
3235
import reactor.netty.NettyPipeline;
33-
import reactor.netty.http.Http2SslContextSpec;
36+
import reactor.netty.resources.ConnectionProvider;
3437

38+
import javax.net.ssl.SSLException;
3539
import java.security.cert.CertificateException;
3640
import java.time.Duration;
3741
import java.time.LocalDateTime;
42+
import java.time.ZoneId;
3843
import java.util.ArrayList;
3944
import java.util.List;
4045
import java.util.function.BiConsumer;
@@ -52,28 +57,30 @@
5257
class Http2ConnectionLivenessHandlerTest extends BaseHttpTest {
5358

5459
static SelfSignedCertificate ssc;
60+
static SslContext sslServer;
61+
static SslContext sslClient;
5562

5663
@BeforeAll
57-
static void createSelfSignedCertificate() throws CertificateException {
64+
static void createSelfSignedCertificate() throws CertificateException, SSLException {
5865
ssc = new SelfSignedCertificate();
66+
sslServer = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey())
67+
.build();
68+
sslClient = SslContextBuilder.forClient()
69+
.trustManager(InsecureTrustManagerFactory.INSTANCE)
70+
.build();
5971
}
6072

6173
@Test
6274
void successReceiveResponse() {
6375
DisposableServer disposableServer = createServer()
6476
.protocol(H2)
65-
.secure(spec -> spec.sslContext(
66-
Http2SslContextSpec.forServer(ssc.certificate(), ssc.privateKey())
67-
))
77+
.secure(spec -> spec.sslContext(sslServer))
6878
.handle((req, resp) -> resp.sendString(Mono.just("Test")))
6979
.bindNow();
7080

7181
String result = createClient(disposableServer::address)
7282
.protocol(H2)
73-
.secure(spec -> spec.sslContext(
74-
Http2SslContextSpec.forClient()
75-
.configure(builder -> builder.trustManager(InsecureTrustManagerFactory.INSTANCE))
76-
))
83+
.secure(spec -> spec.sslContext(sslClient))
7784
.get()
7885
.uri("/")
7986
.responseSingle((resp, bytes) -> bytes.asString())
@@ -89,9 +96,7 @@ void noPingCheckWhenNotConfigured() {
8996
DisposableServer disposableServer = createServer()
9097
.protocol(H2)
9198
.maxKeepAliveRequests(1)
92-
.secure(spec -> spec.sslContext(
93-
Http2SslContextSpec.forServer(ssc.certificate(), ssc.privateKey())
94-
))
99+
.secure(spec -> spec.sslContext(sslServer))
95100
.doOnChannelInit((connectionObserver, channel, remoteAddress) -> {
96101
Http2FrameCodec http2FrameCodec = Http2FrameCodecBuilder.forServer()
97102
.autoAckPingFrame(false)
@@ -107,10 +112,7 @@ void noPingCheckWhenNotConfigured() {
107112
Channel channel = createClient(disposableServer::address)
108113
.protocol(H2)
109114
.keepAlive(true)
110-
.secure(spec -> spec.sslContext(
111-
Http2SslContextSpec.forClient()
112-
.configure(builder -> builder.trustManager(InsecureTrustManagerFactory.INSTANCE))
113-
))
115+
.secure(spec -> spec.sslContext(sslClient))
114116
.get()
115117
.uri("/")
116118
.responseConnection((conn, receiver) -> Mono.just(receiver.channel()))
@@ -125,19 +127,20 @@ void noPingCheckWhenNotConfigured() {
125127
}
126128

127129
@Test
128-
void closePingFrameIfDelayed() {
130+
void closeConnectionIfPingFrameDelayed() {
129131
Http2PingFrameHandler handler = new Http2PingFrameHandler(
130132
(ctx, frame) -> Mono.delay(Duration.ofMillis(150))
131-
.doOnNext(unUsed -> ctx.writeAndFlush(new DefaultHttp2PingFrame(frame.content(), true)))
133+
.doOnNext(
134+
unUsed -> ctx.writeAndFlush(new DefaultHttp2PingFrame(frame.content(), true))
135+
.addListener(ChannelFutureListener.CLOSE_ON_FAILURE)
136+
)
132137
.subscribe()
133138
);
134139

135140
DisposableServer disposableServer = createServer()
136141
.protocol(H2)
137142
.maxKeepAliveRequests(1)
138-
.secure(spec -> spec.sslContext(
139-
Http2SslContextSpec.forServer(ssc.certificate(), ssc.privateKey())
140-
))
143+
.secure(spec -> spec.sslContext(sslServer))
141144
.doOnChannelInit((connectionObserver, channel, remoteAddress) -> {
142145
Http2FrameCodec http2FrameCodec = Http2FrameCodecBuilder.forServer()
143146
.autoAckPingFrame(false)
@@ -153,10 +156,55 @@ void closePingFrameIfDelayed() {
153156
Channel channel = createClient(disposableServer::address)
154157
.protocol(H2)
155158
.keepAlive(true)
156-
.secure(spec -> spec.sslContext(
157-
Http2SslContextSpec.forClient()
158-
.configure(builder -> builder.trustManager(InsecureTrustManagerFactory.INSTANCE))
159-
))
159+
.secure(spec -> spec.sslContext(sslClient))
160+
.http2Settings(builder -> {
161+
builder.pingInterval(Duration.ofMillis(100));
162+
})
163+
.get()
164+
.uri("/")
165+
.responseConnection((conn, receiver) -> Mono.just(receiver.channel()))
166+
.single()
167+
.block();
168+
169+
Mono.delay(Duration.ofMillis(600))
170+
.block();
171+
172+
assertThat(handler.getReceivedPingTimes()).hasSize(1);
173+
assertThat(channel.parent().isOpen()).isFalse();
174+
}
175+
176+
@Test
177+
void closeConnectionInPoolIfPingFrameDelayed() {
178+
Http2PingFrameHandler handler = new Http2PingFrameHandler(
179+
(ctx, frame) -> Mono.delay(Duration.ofMillis(150))
180+
.doOnNext(
181+
unUsed -> ctx.writeAndFlush(new DefaultHttp2PingFrame(frame.content(), true))
182+
.addListener(ChannelFutureListener.CLOSE_ON_FAILURE)
183+
)
184+
.subscribe()
185+
);
186+
187+
DisposableServer disposableServer = createServer()
188+
.protocol(H2)
189+
.maxKeepAliveRequests(1)
190+
.secure(spec -> spec.sslContext(sslServer))
191+
.doOnChannelInit((connectionObserver, channel, remoteAddress) -> {
192+
Http2FrameCodec http2FrameCodec = Http2FrameCodecBuilder.forServer()
193+
.autoAckPingFrame(false)
194+
.autoAckSettingsFrame(true)
195+
.build();
196+
197+
channel.pipeline().replace(NettyPipeline.HttpCodec, NettyPipeline.HttpCodec, http2FrameCodec);
198+
channel.pipeline().addLast(handler);
199+
})
200+
.handle((req, resp) -> resp.sendString(Mono.just("Test")))
201+
.bindNow();
202+
203+
ConnectionProvider pool = ConnectionProvider.create("closeConnectionInPoolIfPingFrameDelayed", 1);
204+
Channel channel = createClient(pool, disposableServer::address)
205+
.protocol(H2)
206+
.keepAlive(true)
207+
.secure(spec -> spec.sslContext(sslClient))
160208
.http2Settings(builder -> {
161209
builder.pingInterval(Duration.ofMillis(100));
162210
})
@@ -180,9 +228,7 @@ void ackPingFrameWithinInterval() {
180228
DisposableServer disposableServer = createServer()
181229
.protocol(H2)
182230
.maxKeepAliveRequests(1)
183-
.secure(spec -> spec.sslContext(
184-
Http2SslContextSpec.forServer(ssc.certificate(), ssc.privateKey())
185-
))
231+
.secure(spec -> spec.sslContext(sslServer))
186232
.doOnChannelInit((connectionObserver, channel, remoteAddress) -> {
187233
Http2FrameCodec http2FrameCodec = Http2FrameCodecBuilder.forServer()
188234
.autoAckPingFrame(false)
@@ -198,10 +244,48 @@ void ackPingFrameWithinInterval() {
198244
Channel channel = createClient(disposableServer::address)
199245
.protocol(H2)
200246
.keepAlive(true)
201-
.secure(spec -> spec.sslContext(
202-
Http2SslContextSpec.forClient()
203-
.configure(builder -> builder.trustManager(InsecureTrustManagerFactory.INSTANCE))
204-
))
247+
.secure(spec -> spec.sslContext(sslClient))
248+
.http2Settings(builder -> {
249+
builder.pingInterval(Duration.ofMillis(100));
250+
})
251+
.get()
252+
.uri("/")
253+
.responseConnection((conn, receiver) -> Mono.just(receiver.channel()))
254+
.single()
255+
.block();
256+
257+
Mono.delay(Duration.ofSeconds(1))
258+
.block();
259+
260+
assertThat(handler.getReceivedPingTimes()).hasSizeGreaterThanOrEqualTo(2);
261+
assertThat(channel.parent().isOpen()).isTrue();
262+
}
263+
264+
@Test
265+
void connectionRetentionInPoolOnPingFrameAck() {
266+
Http2PingFrameHandler handler = new Http2PingFrameHandler();
267+
268+
DisposableServer disposableServer = createServer()
269+
.protocol(H2)
270+
.maxKeepAliveRequests(1)
271+
.secure(spec -> spec.sslContext(sslServer))
272+
.doOnChannelInit((connectionObserver, channel, remoteAddress) -> {
273+
Http2FrameCodec http2FrameCodec = Http2FrameCodecBuilder.forServer()
274+
.autoAckPingFrame(false)
275+
.autoAckSettingsFrame(true)
276+
.build();
277+
278+
channel.pipeline().replace(NettyPipeline.HttpCodec, NettyPipeline.HttpCodec, http2FrameCodec);
279+
channel.pipeline().addLast(handler);
280+
})
281+
.handle((req, resp) -> resp.sendString(Mono.just("Test")))
282+
.bindNow();
283+
284+
ConnectionProvider pool = ConnectionProvider.create("connectionRetentionInPoolOnPingFrameAck", 1);
285+
Channel channel = createClient(pool, disposableServer::address)
286+
.protocol(H2)
287+
.keepAlive(true)
288+
.secure(spec -> spec.sslContext(sslClient))
205289
.http2Settings(builder -> {
206290
builder.pingInterval(Duration.ofMillis(100));
207291
})
@@ -211,21 +295,23 @@ void ackPingFrameWithinInterval() {
211295
.single()
212296
.block();
213297

214-
Mono.delay(Duration.ofMillis(1000))
298+
Mono.delay(Duration.ofSeconds(1))
215299
.block();
216300

217301
assertThat(handler.getReceivedPingTimes()).hasSizeGreaterThanOrEqualTo(2);
218302
assertThat(channel.parent().isOpen()).isTrue();
219303
}
220304

221-
private static class Http2PingFrameHandler extends SimpleChannelInboundHandler<Http2PingFrame> {
305+
private static final class Http2PingFrameHandler extends SimpleChannelInboundHandler<Http2PingFrame> {
222306

223-
private List<LocalDateTime> receivedPingTimes = new ArrayList<>();
307+
private final List<LocalDateTime> receivedPingTimes = new ArrayList<>();
224308

225309
private final BiConsumer<ChannelHandlerContext, Http2PingFrame> consumer;
226310

227311
private Http2PingFrameHandler() {
228-
this.consumer = (ctx, frame) -> ctx.writeAndFlush(new DefaultHttp2PingFrame(frame.content(), true));
312+
this.consumer = (ctx, frame) ->
313+
ctx.writeAndFlush(new DefaultHttp2PingFrame(frame.content(), true))
314+
.addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
229315
}
230316

231317
private Http2PingFrameHandler(BiConsumer<ChannelHandlerContext, Http2PingFrame> consumer) {
@@ -234,7 +320,7 @@ private Http2PingFrameHandler(BiConsumer<ChannelHandlerContext, Http2PingFrame>
234320

235321
@Override
236322
protected void channelRead0(ChannelHandlerContext ctx, Http2PingFrame frame) throws InterruptedException {
237-
receivedPingTimes.add(LocalDateTime.now());
323+
receivedPingTimes.add(LocalDateTime.now(ZoneId.systemDefault()));
238324
consumer.accept(ctx, frame);
239325
}
240326

0 commit comments

Comments
 (0)