/*
Copyright (c) 2012 LinkedIn Corp.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* $Id: $
*/
package test.r2.transport.http.client;
import com.linkedin.r2.transport.http.client.AsyncPoolLifecycleStats;
import com.linkedin.r2.transport.http.client.AsyncPoolStats;
import com.linkedin.r2.transport.http.client.AsyncPoolStatsTracker;
import com.linkedin.r2.transport.http.client.PoolStats;
import java.util.stream.IntStream;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* @author Sean Sheng
* @version $Revision: $
*/
public class TestAsyncPoolStatsTracker
{
private static final PoolStats.LifecycleStats LIFECYCLE_STATS = new AsyncPoolLifecycleStats(0, 0, 0, 0);
private static final int MAX_SIZE = Integer.MAX_VALUE;
private static final int MIN_SIZE = 0;
private static final int IDLE_SIZE = 100;
private static final int POOL_SIZE = 200;
private static final int CHECKED_OUT = 300;
private static final int DESTROY_ERROR_INCREMENTS = 10;
private static final int DESTROY_INCREMENTS = 20;
private static final int TIMEOUT_INCREMENTS = 30;
private static final int CREATE_ERROR_INCREMENTS = 40;
private static final int BAD_DESTROY_INCREMENTS = 50;
private static final int CREATED_INCREMENTS = 60;
private int _poolSize = POOL_SIZE;
private int _checkedOut = CHECKED_OUT;
@Test
public void testDefaults()
{
AsyncPoolStatsTracker tracker = new AsyncPoolStatsTracker(
() -> LIFECYCLE_STATS,
() -> MAX_SIZE,
() -> MIN_SIZE,
() -> POOL_SIZE,
() -> CHECKED_OUT,
() -> IDLE_SIZE);
AsyncPoolStats stats = tracker.getStats();
Assert.assertSame(stats.getLifecycleStats(), LIFECYCLE_STATS);
Assert.assertEquals(stats.getMaxPoolSize(), MAX_SIZE);
Assert.assertEquals(stats.getMinPoolSize(), MIN_SIZE);
Assert.assertEquals(stats.getIdleCount(), IDLE_SIZE);
Assert.assertEquals(stats.getCheckedOut(), CHECKED_OUT);
Assert.assertEquals(stats.getPoolSize(), POOL_SIZE);
Assert.assertEquals(stats.getTotalDestroyErrors(), 0);
Assert.assertEquals(stats.getTotalDestroyed(), 0);
Assert.assertEquals(stats.getTotalTimedOut(), 0);
Assert.assertEquals(stats.getTotalCreateErrors(), 0);
Assert.assertEquals(stats.getTotalBadDestroyed(), 0);
Assert.assertEquals(stats.getTotalCreated(), 0);
Assert.assertEquals(stats.getWaitTime50Pct(), 0);
Assert.assertEquals(stats.getWaitTime95Pct(), 0);
Assert.assertEquals(stats.getWaitTime99Pct(), 0);
Assert.assertEquals(stats.getWaitTimeAvg(), 0.0);
}
@Test
public void testIncrements()
{
AsyncPoolStatsTracker tracker = new AsyncPoolStatsTracker(
() -> LIFECYCLE_STATS,
() -> MAX_SIZE,
() -> MIN_SIZE,
() -> POOL_SIZE,
() -> CHECKED_OUT,
() -> IDLE_SIZE);
IntStream.range(0, DESTROY_ERROR_INCREMENTS).forEach(i -> tracker.incrementDestroyErrors());
IntStream.range(0, DESTROY_INCREMENTS).forEach(i -> tracker.incrementDestroyed());
IntStream.range(0, TIMEOUT_INCREMENTS).forEach(i -> tracker.incrementTimedOut());
IntStream.range(0, CREATE_ERROR_INCREMENTS).forEach(i -> tracker.incrementCreateErrors());
IntStream.range(0, BAD_DESTROY_INCREMENTS).forEach(i -> tracker.incrementBadDestroyed());
IntStream.range(0, CREATED_INCREMENTS).forEach(i -> tracker.incrementCreated());
AsyncPoolStats stats = tracker.getStats();
Assert.assertEquals(stats.getTotalDestroyErrors(), DESTROY_ERROR_INCREMENTS);
Assert.assertEquals(stats.getTotalDestroyed(), DESTROY_INCREMENTS);
Assert.assertEquals(stats.getTotalTimedOut(), TIMEOUT_INCREMENTS);
Assert.assertEquals(stats.getTotalCreateErrors(), CREATE_ERROR_INCREMENTS);
Assert.assertEquals(stats.getTotalBadDestroyed(), BAD_DESTROY_INCREMENTS);
Assert.assertEquals(stats.getTotalCreated(), CREATED_INCREMENTS);
Assert.assertEquals(stats.getCheckedOut(), CHECKED_OUT);
Assert.assertEquals(stats.getPoolSize(), POOL_SIZE);
}
@Test
public void testSamplers()
{
AsyncPoolStatsTracker tracker = new AsyncPoolStatsTracker(
() -> LIFECYCLE_STATS,
() -> MAX_SIZE,
() -> MIN_SIZE,
() -> _poolSize,
() -> _checkedOut,
() -> IDLE_SIZE);
// Samples the max pool size at POOL_SIZE
tracker.sampleMaxPoolSize();
// Samples the max pool size at POOL_SIZE - 10
_poolSize = POOL_SIZE - 10;
tracker.sampleMaxPoolSize();
Assert.assertEquals(tracker.getStats().getSampleMaxPoolSize(), POOL_SIZE);
// Samples the max pool size at POOL_SIZE + 10
_poolSize = POOL_SIZE + 10;
tracker.sampleMaxPoolSize();
Assert.assertEquals(tracker.getStats().getSampleMaxPoolSize(), POOL_SIZE + 10);
// Samples the max checked out at CHECKED_OUT
tracker.sampleMaxCheckedOut();
_checkedOut = CHECKED_OUT - 10;
tracker.sampleMaxCheckedOut();
Assert.assertEquals(tracker.getStats().getSampleMaxCheckedOut(), CHECKED_OUT);
_checkedOut = CHECKED_OUT + 10;
tracker.sampleMaxCheckedOut();
Assert.assertEquals(tracker.getStats().getSampleMaxCheckedOut(), CHECKED_OUT + 10);
}
@Test
public void testSuppliers()
{
AsyncPoolStatsTracker tracker = new AsyncPoolStatsTracker(
() -> LIFECYCLE_STATS,
() -> MAX_SIZE,
() -> MIN_SIZE,
() -> _poolSize,
() -> _checkedOut,
() -> IDLE_SIZE);
for (int i = 0; i < 10; i++)
{
_poolSize++;
_checkedOut++;
Assert.assertEquals(tracker.getStats().getPoolSize(), _poolSize);
Assert.assertEquals(tracker.getStats().getCheckedOut(), _checkedOut);
}
}
}