Skip to content

Commit

Permalink
Made HttpClientTransportOverHTTP2 a ContainerLifeCycle, so that it
Browse files Browse the repository at this point in the history
can manage the start/stop of HTTP2Client.
  • Loading branch information
sbordet committed Feb 9, 2015
1 parent 53813d9 commit 2738548
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 49 deletions.
Expand Up @@ -32,8 +32,9 @@
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.component.ContainerLifeCycle;

public class HttpClientTransportOverHTTP2 implements HttpClientTransport
public class HttpClientTransportOverHTTP2 extends ContainerLifeCycle implements HttpClientTransport
{
private final HTTP2Client client;
private HttpClient httpClient;
Expand All @@ -43,6 +44,20 @@ public HttpClientTransportOverHTTP2(HTTP2Client client)
this.client = client;
}

@Override
protected void doStart() throws Exception
{
addBean(client);
super.doStart();
}

@Override
protected void doStop() throws Exception
{
super.doStop();
removeBean(client);
}

@Override
public void setHttpClient(HttpClient client)
{
Expand Down
Expand Up @@ -20,6 +20,7 @@

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Executor;

import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.HttpClientTransport;
Expand All @@ -36,83 +37,92 @@
import org.eclipse.jetty.toolchain.test.TestTracker;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

@RunWith(Parameterized.class)
public abstract class AbstractTest
{
private static final HTTP2Client http2Client;

static
{
http2Client = new HTTP2Client();
QueuedThreadPool clientThreads = new QueuedThreadPool();
clientThreads.setName("h2-client");
http2Client.setExecutor(clientThreads);
}

@Parameterized.Parameters(name = "transport: {0}")
public static List<Object[]> parameters() throws Exception
{
HttpConfiguration httpConfiguration = new HttpConfiguration();
return Arrays.asList(
new Object[]{new HttpClientTransportOverHTTP(), new HttpConnectionFactory(httpConfiguration)},
new Object[]{new HttpClientTransportOverHTTP2(http2Client), new HTTP2ServerConnectionFactory(httpConfiguration)}
);
}

@BeforeClass
public static void prepare() throws Exception
{
http2Client.start();
}

@AfterClass
public static void dispose() throws Exception
{
http2Client.stop();
return Arrays.asList(new Object[]{Transport.HTTP}, new Object[]{Transport.HTTP2});
}

@Rule
public final TestTracker tracker = new TestTracker();

private final HttpClientTransport httpClientTransport;
private final ConnectionFactory serverConnectionFactory;
private final Transport transport;
protected Server server;
protected ServerConnector connector;
protected HttpClient client;

public AbstractTest(HttpClientTransport httpClientTransport, ConnectionFactory serverConnectionFactory)
public AbstractTest(Transport transport)
{
this.httpClientTransport = httpClientTransport;
this.serverConnectionFactory = serverConnectionFactory;
this.transport = transport;
}

public void start(Handler handler) throws Exception
{
QueuedThreadPool serverThreads = new QueuedThreadPool();
serverThreads.setName("server");
server = new Server(serverThreads);
connector = new ServerConnector(server, serverConnectionFactory);
connector = new ServerConnector(server, provideServerConnectionFactory(transport));
server.addConnector(connector);
server.setHandler(handler);
server.start();

QueuedThreadPool clientThreads = new QueuedThreadPool();
clientThreads.setName("client");
client = new HttpClient(httpClientTransport, null);
client = new HttpClient(provideClientTransport(transport, clientThreads), null);
client.setExecutor(clientThreads);
client.start();
}

private ConnectionFactory provideServerConnectionFactory(Transport transport)
{
switch (transport)
{
case HTTP:
return new HttpConnectionFactory(new HttpConfiguration());
case HTTP2:
return new HTTP2ServerConnectionFactory(new HttpConfiguration());
default:
throw new IllegalArgumentException();
}
}

private HttpClientTransport provideClientTransport(Transport transport, Executor clientThreads)
{
switch (transport)
{
case HTTP:
{
return new HttpClientTransportOverHTTP(1);
}
case HTTP2:
{
HTTP2Client http2Client = new HTTP2Client();
http2Client.setExecutor(clientThreads);
return new HttpClientTransportOverHTTP2(http2Client);
}
default:
{
throw new IllegalArgumentException();
}
}
}

@After
public void stop() throws Exception
{
client.stop();
server.stop();
}

protected enum Transport
{
HTTP, HTTP2
}
}
Expand Up @@ -26,20 +26,21 @@
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.Ignore;
import org.junit.Test;

// TODO: these tests seems to fail spuriously, figure out why.
@Ignore
public class HttpClientConnectTimeoutTest extends AbstractTest
{
public HttpClientConnectTimeoutTest(HttpClientTransport httpClientTransport, ConnectionFactory serverConnectionFactory)
public HttpClientConnectTimeoutTest(Transport transport)
{
super(httpClientTransport, serverConnectionFactory);
super(transport);
}

@Test
Expand Down
Expand Up @@ -26,10 +26,8 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.client.HttpClientTransport;
import org.eclipse.jetty.client.api.Response;
import org.eclipse.jetty.client.api.Result;
import org.eclipse.jetty.server.ConnectionFactory;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.junit.Assert;
Expand All @@ -39,9 +37,9 @@ public class HttpClientIdleTimeoutTest extends AbstractTest
{
private long idleTimeout = 1000;

public HttpClientIdleTimeoutTest(HttpClientTransport httpClientTransport, ConnectionFactory serverConnectionFactory)
public HttpClientIdleTimeoutTest(Transport transport)
{
super(httpClientTransport, serverConnectionFactory);
super(transport);
}

@Test
Expand Down
Expand Up @@ -27,23 +27,21 @@
import javax.servlet.http.HttpServletRequest;
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.FutureResponseListener;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.ConnectionFactory;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.junit.Assert;
import org.junit.Test;

public class HttpClientTest extends AbstractTest
{
public HttpClientTest(HttpClientTransport httpClientTransport, ConnectionFactory serverConnectionFactory)
public HttpClientTest(Transport transport)
{
super(httpClientTransport, serverConnectionFactory);
super(transport);
}

@Test
Expand Down

0 comments on commit 2738548

Please sign in to comment.