/* * Copyright (c) 2014 AsyncHttpClient Project. All rights reserved. * * This program is licensed to you under the Apache License Version 2.0, * and you may not use this file except in compliance with the Apache License Version 2.0. * You may obtain a copy of the Apache License Version 2.0 at * http://www.apache.org/licenses/LICENSE-2.0. * * Unless required by applicable law or agreed to in writing, * software distributed under the Apache License Version 2.0 is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Apache License Version 2.0 for the specific language governing permissions and limitations there under. */ package org.asynchttpclient; import static org.asynchttpclient.Dsl.asyncHttpClient; import static org.asynchttpclient.Dsl.config; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import org.testng.annotations.Test; /** * Created by grenville on 9/25/16. */ public class ClientStatsTest extends AbstractBasicTest { private final static String hostname = "localhost"; @Test(groups = "standalone") public void testClientStatus() throws Throwable { try (final AsyncHttpClient client = asyncHttpClient(config().setKeepAlive(true).setPooledConnectionIdleTimeout(5000))) { final String url = getTargetUrl(); final ClientStats emptyStats = client.getClientStats(); assertEquals(emptyStats.toString(), "There are 0 total connections, 0 are active and 0 are idle."); assertEquals(emptyStats.getTotalActiveConnectionCount(), 0); assertEquals(emptyStats.getTotalIdleConnectionCount(), 0); assertEquals(emptyStats.getTotalConnectionCount(), 0); assertNull(emptyStats.getStatsPerHost().get(hostname)); final List<ListenableFuture<Response>> futures = Stream.generate(() -> client.prepareGet(url).setHeader("LockThread","6").execute()) .limit(5) .collect(Collectors.toList()); Thread.sleep(2000); final ClientStats activeStats = client.getClientStats(); assertEquals(activeStats.toString(), "There are 5 total connections, 5 are active and 0 are idle."); assertEquals(activeStats.getTotalActiveConnectionCount(), 5); assertEquals(activeStats.getTotalIdleConnectionCount(), 0); assertEquals(activeStats.getTotalConnectionCount(), 5); assertEquals(activeStats.getStatsPerHost().get(hostname).getHostConnectionCount(), 5); futures.forEach(future -> future.toCompletableFuture().join()); Thread.sleep(1000); final ClientStats idleStats = client.getClientStats(); assertEquals(idleStats.toString(), "There are 5 total connections, 0 are active and 5 are idle."); assertEquals(idleStats.getTotalActiveConnectionCount(), 0); assertEquals(idleStats.getTotalIdleConnectionCount(), 5); assertEquals(idleStats.getTotalConnectionCount(), 5); assertEquals(idleStats.getStatsPerHost().get(hostname).getHostConnectionCount(), 5); // Let's make sure the active count is correct when reusing cached connections. final List<ListenableFuture<Response>> repeatedFutures = Stream.generate(() -> client.prepareGet(url).setHeader("LockThread","6").execute()) .limit(3) .collect(Collectors.toList()); Thread.sleep(2000); final ClientStats activeCachedStats = client.getClientStats(); assertEquals(activeCachedStats.toString(), "There are 5 total connections, 3 are active and 2 are idle."); assertEquals(activeCachedStats.getTotalActiveConnectionCount(), 3); assertEquals(activeCachedStats.getTotalIdleConnectionCount(), 2); assertEquals(activeCachedStats.getTotalConnectionCount(), 5); assertEquals(activeCachedStats.getStatsPerHost().get(hostname).getHostConnectionCount(), 5); repeatedFutures.forEach(future -> future.toCompletableFuture().join()); Thread.sleep(1000); final ClientStats idleCachedStats = client.getClientStats(); assertEquals(idleCachedStats.toString(), "There are 3 total connections, 0 are active and 3 are idle."); assertEquals(idleCachedStats.getTotalActiveConnectionCount(), 0); assertEquals(idleCachedStats.getTotalIdleConnectionCount(), 3); assertEquals(idleCachedStats.getTotalConnectionCount(), 3); assertEquals(idleCachedStats.getStatsPerHost().get(hostname).getHostConnectionCount(), 3); Thread.sleep(5000); final ClientStats timeoutStats = client.getClientStats(); assertEquals(timeoutStats.toString(), "There are 0 total connections, 0 are active and 0 are idle."); assertEquals(timeoutStats.getTotalActiveConnectionCount(), 0); assertEquals(timeoutStats.getTotalIdleConnectionCount(), 0); assertEquals(timeoutStats.getTotalConnectionCount(), 0); assertNull(timeoutStats.getStatsPerHost().get(hostname)); } } @Test(groups = "standalone") public void testClientStatusNoKeepalive() throws Throwable { try (final AsyncHttpClient client = asyncHttpClient(config().setKeepAlive(false))) { final String url = getTargetUrl(); final ClientStats emptyStats = client.getClientStats(); assertEquals(emptyStats.toString(), "There are 0 total connections, 0 are active and 0 are idle."); assertEquals(emptyStats.getTotalActiveConnectionCount(), 0); assertEquals(emptyStats.getTotalIdleConnectionCount(), 0); assertEquals(emptyStats.getTotalConnectionCount(), 0); assertNull(emptyStats.getStatsPerHost().get(hostname)); final List<ListenableFuture<Response>> futures = Stream.generate(() -> client.prepareGet(url).setHeader("LockThread","6").execute()) .limit(5) .collect(Collectors.toList()); Thread.sleep(2000); final ClientStats activeStats = client.getClientStats(); assertEquals(activeStats.toString(), "There are 5 total connections, 5 are active and 0 are idle."); assertEquals(activeStats.getTotalActiveConnectionCount(), 5); assertEquals(activeStats.getTotalIdleConnectionCount(), 0); assertEquals(activeStats.getTotalConnectionCount(), 5); assertEquals(activeStats.getStatsPerHost().get(hostname).getHostConnectionCount(), 5); futures.forEach(future -> future.toCompletableFuture().join()); Thread.sleep(1000); final ClientStats idleStats = client.getClientStats(); assertEquals(idleStats.toString(), "There are 0 total connections, 0 are active and 0 are idle."); assertEquals(idleStats.getTotalActiveConnectionCount(), 0); assertEquals(idleStats.getTotalIdleConnectionCount(), 0); assertEquals(idleStats.getTotalConnectionCount(), 0); assertNull(idleStats.getStatsPerHost().get(hostname)); // Let's make sure the active count is correct when reusing cached connections. final List<ListenableFuture<Response>> repeatedFutures = Stream.generate(() -> client.prepareGet(url).setHeader("LockThread","6").execute()) .limit(3) .collect(Collectors.toList()); Thread.sleep(2000); final ClientStats activeCachedStats = client.getClientStats(); assertEquals(activeCachedStats.toString(), "There are 3 total connections, 3 are active and 0 are idle."); assertEquals(activeCachedStats.getTotalActiveConnectionCount(), 3); assertEquals(activeCachedStats.getTotalIdleConnectionCount(), 0); assertEquals(activeCachedStats.getTotalConnectionCount(), 3); assertEquals(activeCachedStats.getStatsPerHost().get(hostname).getHostConnectionCount(), 3); repeatedFutures.forEach(future -> future.toCompletableFuture().join()); Thread.sleep(1000); final ClientStats idleCachedStats = client.getClientStats(); assertEquals(idleCachedStats.toString(), "There are 0 total connections, 0 are active and 0 are idle."); assertEquals(idleCachedStats.getTotalActiveConnectionCount(), 0); assertEquals(idleCachedStats.getTotalIdleConnectionCount(), 0); assertEquals(idleCachedStats.getTotalConnectionCount(), 0); assertNull(idleCachedStats.getStatsPerHost().get(hostname)); } } }