1616package org .eclipse .jetty .reactive .client ;
1717
1818import java .util .List ;
19+ import java .util .concurrent .TimeUnit ;
1920import org .eclipse .jetty .client .HttpClient ;
2021import org .eclipse .jetty .client .HttpClientTransport ;
2122import org .eclipse .jetty .client .transport .HttpClientTransportOverHTTP ;
2223import org .eclipse .jetty .http2 .client .HTTP2Client ;
2324import org .eclipse .jetty .http2 .client .transport .HttpClientTransportOverHTTP2 ;
2425import org .eclipse .jetty .http2 .server .HTTP2CServerConnectionFactory ;
26+ import org .eclipse .jetty .io .ArrayByteBufferPool ;
2527import org .eclipse .jetty .io .ClientConnector ;
2628import org .eclipse .jetty .server .ConnectionFactory ;
2729import org .eclipse .jetty .server .Handler ;
3133import org .eclipse .jetty .server .ServerConnector ;
3234import org .eclipse .jetty .util .component .LifeCycle ;
3335import org .eclipse .jetty .util .thread .QueuedThreadPool ;
36+ import org .hamcrest .MatcherAssert ;
3437import org .junit .jupiter .api .AfterEach ;
3538import org .junit .jupiter .api .BeforeEach ;
3639import org .junit .jupiter .api .TestInfo ;
3740
41+ import static org .awaitility .Awaitility .await ;
42+ import static org .hamcrest .Matchers .is ;
43+
3844public 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 () {
0 commit comments