From 0a6890780df4708e7280168a603135bd8389d8d8 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Mon, 19 Dec 2022 08:31:58 +0100 Subject: [PATCH] Make test more robust by binding the ServerSocket first (#13061) Motivation: Sometimes we saw failures due port already in use. Let's ensure we can bind to it before bootstrap the DnsServer Modifications: First bind the TCP socket Result: Hopefully less flaky test --- .../resolver/dns/DnsNameResolverTest.java | 28 +++++++++++-------- .../io/netty/resolver/dns/TestDnsServer.java | 5 +++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/resolver-dns/src/test/java/io/netty/resolver/dns/DnsNameResolverTest.java b/resolver-dns/src/test/java/io/netty/resolver/dns/DnsNameResolverTest.java index eea00bb62f23..6aac63c20ace 100644 --- a/resolver-dns/src/test/java/io/netty/resolver/dns/DnsNameResolverTest.java +++ b/resolver-dns/src/test/java/io/netty/resolver/dns/DnsNameResolverTest.java @@ -3079,6 +3079,14 @@ private static DnsMessageModifier modifierFrom(DnsMessage message) { } private static void testTruncated0(boolean tcpFallback, final boolean truncatedBecauseOfMtu) throws IOException { + ServerSocket serverSocket = null; + if (tcpFallback) { + // If we are configured to use TCP as a fallback also bind a TCP socket + serverSocket = new ServerSocket(); + serverSocket.setReuseAddress(true); + serverSocket.bind(new InetSocketAddress(NetUtil.LOCALHOST4, 0)); + } + final String host = "somehost.netty.io"; final String txt = "this is a txt record"; final AtomicReference messageRef = new AtomicReference(); @@ -3110,24 +3118,22 @@ protected DnsMessage filterMessage(DnsMessage message) { return message; } }; - dnsServer2.start(); DnsNameResolver resolver = null; - ServerSocket serverSocket = null; try { - DnsNameResolverBuilder builder = newResolver() - .queryTimeoutMillis(10000) - .resolvedAddressTypes(ResolvedAddressTypes.IPV4_PREFERRED) - .maxQueriesPerResolve(16) - .nameServerProvider(new SingletonDnsServerAddressStreamProvider(dnsServer2.localAddress())); + DnsNameResolverBuilder builder = newResolver(); if (tcpFallback) { - // If we are configured to use TCP as a fallback also bind a TCP socket - serverSocket = new ServerSocket(); - serverSocket.setReuseAddress(true); - serverSocket.bind(new InetSocketAddress(dnsServer2.localAddress().getPort())); + dnsServer2.start(false, (InetSocketAddress) serverSocket.getLocalSocketAddress()); + // If we are configured to use TCP as a fallback also bind a TCP socket builder.socketChannelType(NioSocketChannel.class); + } else { + dnsServer2.start(); } + builder.queryTimeoutMillis(10000) + .resolvedAddressTypes(ResolvedAddressTypes.IPV4_PREFERRED) + .maxQueriesPerResolve(16) + .nameServerProvider(new SingletonDnsServerAddressStreamProvider(dnsServer2.localAddress())); resolver = builder.build(); if (truncatedBecauseOfMtu) { resolver.ch.pipeline().addFirst(new ChannelInboundHandlerAdapter() { diff --git a/resolver-dns/src/test/java/io/netty/resolver/dns/TestDnsServer.java b/resolver-dns/src/test/java/io/netty/resolver/dns/TestDnsServer.java index d7b75e585f03..0db646a2289d 100644 --- a/resolver-dns/src/test/java/io/netty/resolver/dns/TestDnsServer.java +++ b/resolver-dns/src/test/java/io/netty/resolver/dns/TestDnsServer.java @@ -92,7 +92,10 @@ public void start() throws IOException { * Start the {@link TestDnsServer} but drop all {@code AAAA} queries and not send any response to these at all. */ public void start(final boolean dropAAAAQueries) throws IOException { - InetSocketAddress address = new InetSocketAddress(NetUtil.LOCALHOST4, 0); + start(dropAAAAQueries, new InetSocketAddress(NetUtil.LOCALHOST4, 0)); + } + + public void start(final boolean dropAAAAQueries, InetSocketAddress address) throws IOException { UdpTransport transport = new UdpTransport(address.getHostName(), address.getPort()); setTransports(transport);