Search in sources :

Example 1 with FakeTCPMetrics

use of io.vertx.test.fakemetrics.FakeTCPMetrics in project vert.x by eclipse.

the class HttpMetricsTestBase method testHttpMetricsLifecycle.

@Test
public void testHttpMetricsLifecycle() throws Exception {
    int numBuffers = 10;
    int chunkSize = 1000;
    int contentLength = numBuffers * chunkSize;
    AtomicReference<HttpServerMetric> serverMetric = new AtomicReference<>();
    server.requestHandler(req -> {
        assertEquals(protocol, req.version());
        FakeHttpServerMetrics serverMetrics = FakeMetricsBase.getMetrics(server);
        assertNotNull(serverMetrics);
        HttpServerMetric metric = serverMetrics.getRequestMetric(req);
        serverMetric.set(metric);
        assertSame(((HttpServerRequestInternal) req).metric(), metric);
        assertNotNull(serverMetric.get());
        assertNotNull(serverMetric.get().socket);
        assertNull(serverMetric.get().response.get());
        assertTrue(serverMetric.get().socket.connected.get());
        assertNull(serverMetric.get().route.get());
        req.routed("/route/:param");
        assertEquals("/route/:param", serverMetric.get().route.get());
        req.bodyHandler(buff -> {
            assertEquals(contentLength, buff.length());
            assertTrue(serverMetric.get().requestEnded.get());
            assertEquals(contentLength, serverMetric.get().bytesRead.get());
            HttpServerResponse resp = req.response().setChunked(true);
            AtomicInteger numBuffer = new AtomicInteger(numBuffers);
            vertx.setPeriodic(1, timerID -> {
                Buffer chunk = TestUtils.randomBuffer(chunkSize);
                if (numBuffer.decrementAndGet() == 0) {
                    resp.end(chunk);
                    assertTrue(serverMetric.get().responseEnded.get());
                    assertEquals(contentLength, serverMetric.get().bytesWritten.get());
                    assertNull(serverMetrics.getRequestMetric(req));
                    vertx.cancelTimer(timerID);
                } else {
                    resp.write(chunk);
                    assertSame(serverMetric.get().response.get(), resp);
                }
            });
        });
    });
    startServer();
    CountDownLatch latch = new CountDownLatch(1);
    AtomicReference<HttpClientMetric> clientMetric = new AtomicReference<>();
    AtomicReference<SocketMetric> clientSocketMetric = new AtomicReference<>();
    FakeHttpClientMetrics metrics = FakeMetricsBase.getMetrics(client);
    NetClient netClient = ((HttpClientImpl) client).netClient();
    FakeTCPMetrics tcpMetrics = FakeMetricsBase.getMetrics(netClient);
    assertSame(metrics, tcpMetrics);
    Context ctx = vertx.getOrCreateContext();
    ctx.runOnContext(v -> {
        assertEquals(Collections.emptySet(), metrics.endpoints());
        client.request(new RequestOptions().setPort(DEFAULT_HTTP_PORT).setHost(DEFAULT_HTTP_HOST).setURI(TestUtils.randomAlphaString(16))).onComplete(onSuccess(req -> {
            req.response(onSuccess(resp -> {
                clientSocketMetric.set(metrics.firstMetric(SocketAddress.inetSocketAddress(8080, "localhost")));
                assertNotNull(clientSocketMetric.get());
                assertEquals(Collections.singleton("localhost:8080"), metrics.endpoints());
                clientMetric.set(metrics.getMetric(resp.request()));
                assertNotNull(clientMetric.get());
                assertEquals(contentLength, clientMetric.get().bytesWritten.get());
                // assertNotNull(clientMetric.get().socket);
                // assertTrue(clientMetric.get().socket.connected.get());
                assertEquals((Integer) 1, metrics.connectionCount("localhost:8080"));
                assertEquals((Integer) 1, metrics.connectionCount(SocketAddress.inetSocketAddress(8080, "localhost")));
                resp.bodyHandler(buff -> {
                    assertEquals(contentLength, clientMetric.get().bytesRead.get());
                    assertNull(metrics.getMetric(resp.request()));
                    assertEquals(contentLength, buff.length());
                    latch.countDown();
                });
            })).exceptionHandler(this::fail).setChunked(true);
            assertNull(metrics.getMetric(req));
            for (int i = 0; i < numBuffers; i++) {
                req.write(TestUtils.randomBuffer(chunkSize));
            }
            req.end();
        }));
    });
    awaitLatch(latch);
    client.close();
    AsyncTestBase.assertWaitUntil(() -> metrics.endpoints().isEmpty());
    assertEquals(null, metrics.connectionCount("localhost:8080"));
    AsyncTestBase.assertWaitUntil(() -> !serverMetric.get().socket.connected.get());
    AsyncTestBase.assertWaitUntil(() -> contentLength == serverMetric.get().socket.bytesRead.get());
    AsyncTestBase.assertWaitUntil(() -> contentLength == serverMetric.get().socket.bytesWritten.get());
    AsyncTestBase.assertWaitUntil(() -> !clientSocketMetric.get().connected.get());
    assertEquals(contentLength, clientSocketMetric.get().bytesRead.get());
    assertEquals(contentLength, clientSocketMetric.get().bytesWritten.get());
    for (Iterator<Long> it : Arrays.asList(clientSocketMetric.get().bytesReadEvents.iterator(), serverMetric.get().socket.bytesWrittenEvents.iterator())) {
        while (it.hasNext()) {
            long val = it.next();
            if (it.hasNext()) {
                assertEquals(4096, val);
            } else {
                assertTrue(val < 4096);
            }
        }
    }
}
Also used : Buffer(io.vertx.core.buffer.Buffer) Context(io.vertx.core.Context) Arrays(java.util.Arrays) HttpClientImpl(io.vertx.core.http.impl.HttpClientImpl) FakeMetricsBase(io.vertx.test.fakemetrics.FakeMetricsBase) HttpServerMetric(io.vertx.test.fakemetrics.HttpServerMetric) CompletableFuture(java.util.concurrent.CompletableFuture) Context(io.vertx.core.Context) AtomicReference(java.util.concurrent.atomic.AtomicReference) FakeHttpServerMetrics(io.vertx.test.fakemetrics.FakeHttpServerMetrics) TestUtils(io.vertx.test.core.TestUtils) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) FakeTCPMetrics(io.vertx.test.fakemetrics.FakeTCPMetrics) HttpClientMetric(io.vertx.test.fakemetrics.HttpClientMetric) NetClient(io.vertx.core.net.NetClient) SocketAddress(io.vertx.core.net.SocketAddress) Iterator(java.util.Iterator) FakeMetricsFactory(io.vertx.test.fakemetrics.FakeMetricsFactory) VertxOptions(io.vertx.core.VertxOptions) Test(org.junit.Test) Future(io.vertx.core.Future) SocketMetric(io.vertx.test.fakemetrics.SocketMetric) HttpServerRequestInternal(io.vertx.core.http.impl.HttpServerRequestInternal) CountDownLatch(java.util.concurrent.CountDownLatch) Buffer(io.vertx.core.buffer.Buffer) MetricsOptions(io.vertx.core.metrics.MetricsOptions) AsyncTestBase(io.vertx.test.core.AsyncTestBase) Collections(java.util.Collections) FakeHttpClientMetrics(io.vertx.test.fakemetrics.FakeHttpClientMetrics) FakeTCPMetrics(io.vertx.test.fakemetrics.FakeTCPMetrics) HttpServerMetric(io.vertx.test.fakemetrics.HttpServerMetric) AtomicReference(java.util.concurrent.atomic.AtomicReference) CountDownLatch(java.util.concurrent.CountDownLatch) NetClient(io.vertx.core.net.NetClient) FakeHttpServerMetrics(io.vertx.test.fakemetrics.FakeHttpServerMetrics) SocketMetric(io.vertx.test.fakemetrics.SocketMetric) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) FakeHttpClientMetrics(io.vertx.test.fakemetrics.FakeHttpClientMetrics) HttpClientImpl(io.vertx.core.http.impl.HttpClientImpl) HttpClientMetric(io.vertx.test.fakemetrics.HttpClientMetric) Test(org.junit.Test)

Aggregations

Context (io.vertx.core.Context)1 Future (io.vertx.core.Future)1 VertxOptions (io.vertx.core.VertxOptions)1 Buffer (io.vertx.core.buffer.Buffer)1 HttpClientImpl (io.vertx.core.http.impl.HttpClientImpl)1 HttpServerRequestInternal (io.vertx.core.http.impl.HttpServerRequestInternal)1 MetricsOptions (io.vertx.core.metrics.MetricsOptions)1 NetClient (io.vertx.core.net.NetClient)1 SocketAddress (io.vertx.core.net.SocketAddress)1 AsyncTestBase (io.vertx.test.core.AsyncTestBase)1 TestUtils (io.vertx.test.core.TestUtils)1 FakeHttpClientMetrics (io.vertx.test.fakemetrics.FakeHttpClientMetrics)1 FakeHttpServerMetrics (io.vertx.test.fakemetrics.FakeHttpServerMetrics)1 FakeMetricsBase (io.vertx.test.fakemetrics.FakeMetricsBase)1 FakeMetricsFactory (io.vertx.test.fakemetrics.FakeMetricsFactory)1 FakeTCPMetrics (io.vertx.test.fakemetrics.FakeTCPMetrics)1 HttpClientMetric (io.vertx.test.fakemetrics.HttpClientMetric)1 HttpServerMetric (io.vertx.test.fakemetrics.HttpServerMetric)1 SocketMetric (io.vertx.test.fakemetrics.SocketMetric)1 Arrays (java.util.Arrays)1