Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorSimone Bordet2015-02-09 15:22:21 +0000
committerSimone Bordet2015-02-09 15:22:21 +0000
commitf974c743295d2be4d72eb03a39837e04366c6526 (patch)
treed596013655a3e9c1d7598e17ec2db22a601c0be8 /tests
parent85edb7e573e1eda484fa7e41e7032ecc5665ff6e (diff)
downloadorg.eclipse.jetty.project-f974c743295d2be4d72eb03a39837e04366c6526.tar.gz
org.eclipse.jetty.project-f974c743295d2be4d72eb03a39837e04366c6526.tar.xz
org.eclipse.jetty.project-f974c743295d2be4d72eb03a39837e04366c6526.zip
Implemented HTTP2Client connect timeout.
Diffstat (limited to 'tests')
-rw-r--r--tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AbstractTest.java3
-rw-r--r--tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientConnectTimeoutTest.java169
-rw-r--r--tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java76
3 files changed, 171 insertions, 77 deletions
diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AbstractTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AbstractTest.java
index 41e68b833b..da811dd3b5 100644
--- a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AbstractTest.java
+++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AbstractTest.java
@@ -49,9 +49,10 @@ public abstract class AbstractTest
static
{
+ http2Client = new HTTP2Client();
QueuedThreadPool clientThreads = new QueuedThreadPool();
clientThreads.setName("h2-client");
- http2Client = HTTP2Client.builder().executor(clientThreads).build();
+ http2Client.setExecutor(clientThreads);
}
@Parameterized.Parameters(name = "{index}: mod:{0}")
diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientConnectTimeoutTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientConnectTimeoutTest.java
new file mode 100644
index 0000000000..2d67e9907b
--- /dev/null
+++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientConnectTimeoutTest.java
@@ -0,0 +1,169 @@
+//
+// ========================================================================
+// 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.http.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 java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.jetty.client.HttpClientTransport;
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.client.api.Response;
+import org.eclipse.jetty.client.api.Result;
+import org.eclipse.jetty.server.ConnectionFactory;
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Test;
+
+public class HttpClientConnectTimeoutTest extends AbstractTest
+{
+ public HttpClientConnectTimeoutTest(HttpClientTransport httpClientTransport, ConnectionFactory serverConnectionFactory)
+ {
+ super(httpClientTransport, serverConnectionFactory);
+ }
+
+ @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(null);
+ client.stop();
+ client.setConnectTimeout(connectTimeout);
+ client.start();
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ Request request = client.newRequest(host, port);
+ request.send(new Response.CompleteListener()
+ {
+ @Override
+ public void onComplete(Result result)
+ {
+ if (result.isFailed())
+ latch.countDown();
+ }
+ });
+
+ Assert.assertTrue(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS));
+ Assert.assertNotNull(request.getAbortCause());
+ }
+
+ @Test
+ public void testConnectTimeoutIsCancelledByShorterRequestTimeout() throws Exception
+ {
+ String host = "10.255.255.1";
+ int port = 80;
+ int connectTimeout = 2000;
+ assumeConnectTimeout(host, port, connectTimeout);
+
+ start(null);
+ client.stop();
+ client.setConnectTimeout(connectTimeout);
+ client.start();
+
+ final AtomicInteger completes = new AtomicInteger();
+ final CountDownLatch latch = new CountDownLatch(2);
+ Request request = client.newRequest(host, port);
+ request.timeout(connectTimeout / 2, TimeUnit.MILLISECONDS)
+ .send(new Response.CompleteListener()
+ {
+ @Override
+ public void onComplete(Result result)
+ {
+ completes.incrementAndGet();
+ latch.countDown();
+ }
+ });
+
+ Assert.assertFalse(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS));
+ Assert.assertEquals(1, completes.get());
+ Assert.assertNotNull(request.getAbortCause());
+ }
+
+ @Test
+ public void retryAfterConnectTimeout() throws Exception
+ {
+ final String host = "10.255.255.1";
+ final int port = 80;
+ int connectTimeout = 1000;
+ assumeConnectTimeout(host, port, connectTimeout);
+
+ start(null);
+ client.stop();
+ client.setConnectTimeout(connectTimeout);
+ client.start();
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ Request request = client.newRequest(host, port);
+ request.send(new Response.CompleteListener()
+ {
+ @Override
+ public void onComplete(Result result)
+ {
+ if (result.isFailed())
+ {
+ // Retry
+ client.newRequest(host, port).send(new Response.CompleteListener()
+ {
+ @Override
+ public void onComplete(Result result)
+ {
+ if (result.isFailed())
+ latch.countDown();
+ }
+ });
+ }
+ }
+ });
+
+ Assert.assertTrue(latch.await(3 * connectTimeout, TimeUnit.MILLISECONDS));
+ Assert.assertNotNull(request.getAbortCause());
+ }
+
+ private void assumeConnectTimeout(String host, int port, int connectTimeout) throws IOException
+ {
+ 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);
+ // Abort the test if we can connect.
+ Assume.assumeTrue(false);
+ }
+ catch (SocketTimeoutException x)
+ {
+ // Expected timeout during connect, continue the test.
+ Assume.assumeTrue(true);
+ }
+ catch (Throwable x)
+ {
+ // Abort if any other exception happens.
+ Assume.assumeTrue(false);
+ }
+ }
+}
diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java
index b8a627d282..b5b29a372c 100644
--- a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java
+++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java
@@ -19,7 +19,6 @@
package org.eclipse.jetty.http.client;
import java.io.IOException;
-import java.nio.ByteBuffer;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
@@ -31,7 +30,6 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.client.HttpClientTransport;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.client.util.BytesContentProvider;
-import org.eclipse.jetty.client.util.DeferredContentProvider;
import org.eclipse.jetty.client.util.FutureResponseListener;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
@@ -193,78 +191,4 @@ public class HttpClientTest extends AbstractTest
Assert.assertEquals(200, response.getStatus());
Assert.assertEquals(0, response.getContent().length);
}
-
- @Test
- public void testUploadLargeWithExceptionThrownWhileReadingOnServer() throws Exception
- {
- final byte[] bytes = new byte[1024 * 1024];
- new Random().nextBytes(bytes);
- start(new AbstractHandler()
- {
- @Override
- public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
- {
- baseRequest.setHandled(true);
- ServletInputStream input = request.getInputStream();
- byte[] buffer = new byte[512];
- input.read(buffer);
- throw new IOException();
- }
- });
-
- try
- {
- ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
- .method(HttpMethod.POST)
- .content(new BytesContentProvider(bytes))
- .timeout(5, TimeUnit.SECONDS)
- .send();
-
- Assert.assertEquals(500, response.getStatus());
- }
- catch (Exception e)
- {
- Thread.sleep(1000);
- }
-
- }
-
- @Test
- public void testUploadChunkedWithExceptionThrownWhileReadingOnServer() throws Exception
- {
- final byte[] chunk1 = new byte[512];
- final byte[] chunk2 = new byte[512];
- Random random = new Random();
- random.nextBytes(chunk1);
- random.nextBytes(chunk2);
- start(new AbstractHandler()
- {
- @Override
- public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
- {
- baseRequest.setHandled(true);
- ServletInputStream input = request.getInputStream();
- byte[] buffer = new byte[512];
- input.read(buffer);
- throw new IOException();
- }
- });
-
- org.eclipse.jetty.client.api.Request request = client.newRequest("localhost", connector.getLocalPort());
- DeferredContentProvider content = new DeferredContentProvider();
- FutureResponseListener listener = new FutureResponseListener(request);
- request.method(HttpMethod.POST)
- .content(content)
- .timeout(5, TimeUnit.SECONDS)
- .send(listener);
-
- content.offer(ByteBuffer.wrap(chunk1));
-
- ContentResponse response = listener.get();
-
-// content.offer(ByteBuffer.wrap(chunk2));
-// content.close();
-
- Assert.assertEquals(500, response.getStatus());
- }
}

Back to the top