diff options
Diffstat (limited to 'jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ConnectTimeoutTest.java')
-rw-r--r-- | jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ConnectTimeoutTest.java | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ConnectTimeoutTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ConnectTimeoutTest.java new file mode 100644 index 0000000000..eb66174b9f --- /dev/null +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ConnectTimeoutTest.java @@ -0,0 +1,90 @@ +// +// ======================================================================== +// Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.http2.client; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.eclipse.jetty.http2.api.Session; +import org.eclipse.jetty.http2.api.server.ServerSessionListener; +import org.eclipse.jetty.util.Promise; +import org.junit.Assert; +import org.junit.Assume; +import org.junit.Test; + +public class ConnectTimeoutTest extends AbstractTest +{ + @Test + public void testConnectTimeout() throws Exception + { + final String host = "10.255.255.1"; + final int port = 80; + int connectTimeout = 1000; + assumeConnectTimeout(host, port, connectTimeout); + + start(new ServerSessionListener.Adapter()); + client.setConnectTimeout(connectTimeout); + + InetSocketAddress address = new InetSocketAddress(host, port); + final CountDownLatch latch = new CountDownLatch(1); + client.connect(address, new Session.Listener.Adapter(), new Promise.Adapter<Session>() + { + @Override + public void failed(Throwable x) + { + Assert.assertTrue(x instanceof SocketTimeoutException); + latch.countDown(); + } + }); + + Assert.assertTrue(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS)); + } + + private void assumeConnectTimeout(String host, int port, int connectTimeout) throws IOException + { + boolean socketTimeout = false; + + try (Socket socket = new Socket()) + { + // Try to connect to a private address in the 10.x.y.z range. + // These addresses are usually not routed, so an attempt to + // connect to them will hang the connection attempt, which is + // what we want to simulate in this test. + socket.connect(new InetSocketAddress(host, port), connectTimeout); + } + catch (SocketTimeoutException x) + { + // We expect a timeout during connect, allow test to continue. + socketTimeout = true; + } + catch (Throwable x) + { + // Dump stacktrace when there is an unexpected test failure + // Useful when debugging + x.printStackTrace(System.err); + } + + // Abort the test if we can connect. + Assume.assumeTrue("Should have seen connect timeout",socketTimeout); + } +} |