package com.bizo.asperatus.rates; import static org.junit.Assert.assertEquals; import org.junit.Test; import com.google.common.base.Stopwatch; import com.google.common.base.Ticker; public final class ThreadSafeRateTrackerTest { private static final double TOLERANCE = 0.0000001; private final SetTimeTicker ticker = new SetTimeTicker(); private final ThreadSafeRateTracker rateTracker = new ThreadSafeRateTracker(Stopwatch.createUnstarted(ticker)); @Test public void testOneSecondThenTwoSecondsWithConstantRate() { final int requestCount = 100; for (int i = 0; i < requestCount; i++) { rateTracker.track(); } ticker.tick(); assertEquals(100.0, rateTracker.getRateAndResetPeriod(), TOLERANCE); for (int i = 0; i < 2 * requestCount; i++) { rateTracker.track(); } ticker.tick(); ticker.tick(); assertEquals(100.0, rateTracker.getRateAndResetPeriod(), TOLERANCE); } /** Ticker implementation where the current time is a settable constant. */ private static class SetTimeTicker extends Ticker { public long timeNanos = 0L; @Override public long read() { return timeNanos; } // one second later... public void tick() { timeNanos += 1000000000L; } } }