Skip to content

Commit c703ee3

Browse files
committed
modify test infrastructure to detect buffer leaks, and fix one leaky test
Signed-off-by: Ludovic Orban <[email protected]>
1 parent ec279d1 commit c703ee3

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

src/test/java/org/eclipse/jetty/reactive/client/AbstractTest.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
package org.eclipse.jetty.reactive.client;
1717

1818
import java.util.List;
19+
import java.util.concurrent.TimeUnit;
1920
import org.eclipse.jetty.client.HttpClient;
2021
import org.eclipse.jetty.client.HttpClientTransport;
2122
import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP;
2223
import org.eclipse.jetty.http2.client.HTTP2Client;
2324
import org.eclipse.jetty.http2.client.transport.HttpClientTransportOverHTTP2;
2425
import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
26+
import org.eclipse.jetty.io.ArrayByteBufferPool;
2527
import org.eclipse.jetty.io.ClientConnector;
2628
import org.eclipse.jetty.server.ConnectionFactory;
2729
import org.eclipse.jetty.server.Handler;
@@ -31,10 +33,14 @@
3133
import org.eclipse.jetty.server.ServerConnector;
3234
import org.eclipse.jetty.util.component.LifeCycle;
3335
import org.eclipse.jetty.util.thread.QueuedThreadPool;
36+
import org.hamcrest.MatcherAssert;
3437
import org.junit.jupiter.api.AfterEach;
3538
import org.junit.jupiter.api.BeforeEach;
3639
import org.junit.jupiter.api.TestInfo;
3740

41+
import static org.awaitility.Awaitility.await;
42+
import static org.hamcrest.Matchers.is;
43+
3844
public class AbstractTest {
3945
public static void printTestName(TestInfo testInfo) {
4046
System.err.printf("Running %s%n", testInfo.getTestMethod()
@@ -50,6 +56,8 @@ public static List<String> protocols() {
5056
private HttpClient httpClient;
5157
protected Server server;
5258
private ServerConnector connector;
59+
private ArrayByteBufferPool.Tracking serverBufferPool;
60+
private ArrayByteBufferPool.Tracking clientBufferPool;
5361

5462
@BeforeEach
5563
public void before(TestInfo testInfo) {
@@ -59,19 +67,22 @@ public void before(TestInfo testInfo) {
5967
public void prepare(String protocol, Handler handler) throws Exception {
6068
QueuedThreadPool serverThreads = new QueuedThreadPool();
6169
serverThreads.setName("server");
62-
server = new Server(serverThreads);
70+
serverBufferPool = new ArrayByteBufferPool.Tracking();
71+
server = new Server(serverThreads, null, serverBufferPool);
6372
connector = new ServerConnector(server, 1, 1, createServerConnectionFactory(protocol));
6473
server.addConnector(connector);
6574
server.setHandler(handler);
6675
server.start();
6776

6877
QueuedThreadPool clientThreads = new QueuedThreadPool();
6978
clientThreads.setName("client");
79+
clientBufferPool = new ArrayByteBufferPool.Tracking();
7080
ClientConnector clientConnector = new ClientConnector();
7181
clientConnector.setExecutor(clientThreads);
7282
clientConnector.setSelectors(1);
7383
httpClient = new HttpClient(createClientTransport(clientConnector, protocol));
7484
httpClient.setExecutor(clientThreads);
85+
httpClient.setByteBufferPool(clientBufferPool);
7586
httpClient.start();
7687
}
7788

@@ -91,8 +102,16 @@ private HttpClientTransport createClientTransport(ClientConnector clientConnecto
91102

92103
@AfterEach
93104
public void dispose() {
94-
LifeCycle.stop(httpClient);
95-
LifeCycle.stop(server);
105+
try
106+
{
107+
await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> MatcherAssert.assertThat("Client leaks: " + clientBufferPool.dumpLeaks(), clientBufferPool.getLeaks().size(), is(0)));
108+
await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> MatcherAssert.assertThat("Server leaks: " + serverBufferPool.dumpLeaks(), serverBufferPool.getLeaks().size(), is(0)));
109+
}
110+
finally
111+
{
112+
LifeCycle.stop(httpClient);
113+
LifeCycle.stop(server);
114+
}
96115
}
97116

98117
protected HttpClient httpClient() {

src/test/java/org/eclipse/jetty/reactive/client/HTTP2Test.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,20 @@
3232
import org.eclipse.jetty.http2.client.transport.HttpClientTransportOverHTTP2;
3333
import org.eclipse.jetty.http2.frames.HeadersFrame;
3434
import org.eclipse.jetty.http2.server.RawHTTP2ServerConnectionFactory;
35+
import org.eclipse.jetty.io.ArrayByteBufferPool;
3536
import org.eclipse.jetty.io.ClientConnector;
3637
import org.eclipse.jetty.server.Server;
3738
import org.eclipse.jetty.server.ServerConnector;
3839
import org.eclipse.jetty.util.component.LifeCycle;
3940
import org.eclipse.jetty.util.thread.QueuedThreadPool;
41+
import org.hamcrest.MatcherAssert;
4042
import org.junit.jupiter.api.AfterEach;
4143
import org.junit.jupiter.api.Test;
4244
import org.reactivestreams.Publisher;
4345
import org.reactivestreams.Subscriber;
4446
import org.reactivestreams.Subscription;
4547

48+
import static org.hamcrest.Matchers.is;
4649
import static org.junit.jupiter.api.Assertions.assertEquals;
4750
import static org.junit.jupiter.api.Assertions.assertNotNull;
4851
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -51,29 +54,42 @@ public class HTTP2Test {
5154
private Server server;
5255
private ServerConnector connector;
5356
private HttpClient httpClient;
57+
private ArrayByteBufferPool.Tracking serverBufferPool;
58+
private ArrayByteBufferPool.Tracking clientBufferPool;
5459

5560
private void start(ServerSessionListener listener) throws Exception {
5661
QueuedThreadPool serverThreads = new QueuedThreadPool();
5762
serverThreads.setName("server");
58-
server = new Server(serverThreads);
63+
serverBufferPool = new ArrayByteBufferPool.Tracking();
64+
server = new Server(serverThreads, null, serverBufferPool);
5965
RawHTTP2ServerConnectionFactory h2c = new RawHTTP2ServerConnectionFactory(listener);
6066
connector = new ServerConnector(server, 1, 1, h2c);
6167
server.addConnector(connector);
6268
server.start();
6369

6470
QueuedThreadPool clientThreads = new QueuedThreadPool();
6571
clientThreads.setName("client");
72+
clientBufferPool = new ArrayByteBufferPool.Tracking();
6673
ClientConnector clientConnector = new ClientConnector();
6774
clientConnector.setExecutor(clientThreads);
6875
clientConnector.setSelectors(1);
6976
httpClient = new HttpClient(new HttpClientTransportOverHTTP2(new HTTP2Client(clientConnector)));
77+
httpClient.setByteBufferPool(clientBufferPool);
7078
httpClient.start();
7179
}
7280

7381
@AfterEach
7482
public void dispose() {
75-
LifeCycle.stop(httpClient);
76-
LifeCycle.stop(server);
83+
try
84+
{
85+
MatcherAssert.assertThat("Client leaks: " + clientBufferPool.dumpLeaks(), clientBufferPool.getLeaks().size(), is(0));
86+
MatcherAssert.assertThat("Server leaks: " + serverBufferPool.dumpLeaks(), serverBufferPool.getLeaks().size(), is(0));
87+
}
88+
finally
89+
{
90+
LifeCycle.stop(httpClient);
91+
LifeCycle.stop(server);
92+
}
7793
}
7894

7995
@Test

src/test/java/org/eclipse/jetty/reactive/client/RxJavaTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ public void onComplete() {
439439
// There should be 1 chunk only.
440440
await().during(1, TimeUnit.SECONDS).atMost(5, TimeUnit.SECONDS).until(chunks::get, is(1));
441441
Content.Chunk chunk = await().atMost(5, TimeUnit.SECONDS).until(() -> subscriber.chunk, notNullValue());
442+
chunk.release();
442443
subscriber.chunk = null;
443444
assertEquals("hello", UTF_8.decode(chunk.getByteBuffer()).toString());
444445

@@ -448,6 +449,7 @@ public void onComplete() {
448449
// Demand 1 more chunk.
449450
subscriber.subscription.request(1);
450451
chunk = await().atMost(5, TimeUnit.SECONDS).until(() -> subscriber.chunk, notNullValue());
452+
chunk.release();
451453
subscriber.chunk = null;
452454
assertEquals("world", UTF_8.decode(chunk.getByteBuffer()).toString());
453455

0 commit comments

Comments
 (0)