Set<ContextImpl> contexts = new ConcurrentHashSet<>();
AtomicInteger cnt = new AtomicInteger();
AtomicReference<ContextImpl> serverRequestContext = new AtomicReference<>();
// Server connect handler should always be called with same context
server.requestHandler(req -> {
ContextImpl serverContext = ((VertxInternal) vertx).getContext();
if (serverRequestContext.get() != null) {
assertSame(serverRequestContext.get(), serverContext);
} else {
serverRequestContext.set(serverContext);
}
req.response().end();
});
CountDownLatch latch = new CountDownLatch(1);
AtomicReference<ContextImpl> listenContext = new AtomicReference<>();
server.listen(ar -> {
assertTrue(ar.succeeded());
listenContext.set(((VertxInternal) vertx).getContext());
latch.countDown();
});
awaitLatch(latch);
CountDownLatch latch2 = new CountDownLatch(1);
int numReqs = 16;
int numConns = 8;
// There should be a context per *connection*
client.close();
client = vertx.createHttpClient(new HttpClientOptions().setMaxPoolSize(numConns));
for (int i = 0; i < numReqs; i++) {
client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/", resp -> {
assertEquals(200, resp.statusCode());
contexts.add(((VertxInternal) vertx).getContext());
if (cnt.incrementAndGet() == numReqs) {
// Some connections might get closed if response comes back quick enough hence the >=
assertTrue(contexts.size() >= numConns);
latch2.countDown();
}
}).end();
}
awaitLatch(latch2);
// Close should be in own context
server.close(ar -> {
assertTrue(ar.succeeded());
ContextImpl closeContext = ((VertxInternal) vertx).getContext();
assertFalse(contexts.contains(closeContext));
assertNotSame(serverRequestContext.get(), closeContext);
assertFalse(contexts.contains(listenContext.get()));
assertSame(serverRequestContext.get(), listenContext.get());
testComplete();