package io.pcp.parfait;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
public class TimeWindowCounterTest {
private static final int RESOLUTION = 1000;
private static final long PERIOD = 3 * RESOLUTION;
private static final TimeWindow WINDOW = TimeWindow.of(RESOLUTION, PERIOD, "3s");
private final ManualTimeSupplier timeSource = new ManualTimeSupplier();
private TimeWindowCounter counter;
@Before
public void setUp() {
timeSource.setTime(0L);
counter = new TimeWindowCounter(WINDOW, timeSource);
}
@Test
public void incrementShouldUpdateValue() {
counter.inc();
assertEquals(1L, counter.get().longValue());
counter.inc(5);
assertEquals(6L, counter.get().longValue());
}
@Test
public void sameBucketShouldIncrementDuringSameResolution() {
counter.inc();
assertEquals("[1, 0, 0]", counter.counterState());
timeSource.tick(RESOLUTION - 1L);
counter.inc();
assertEquals("[2, 0, 0]", counter.counterState());
assertEquals(2L, counter.get().longValue());
}
@Test
public void nextBucketShouldIncrementAfterResolutionElapsed() {
counter.inc();
assertEquals("[1, 0, 0]", counter.counterState());
timeSource.tick(RESOLUTION);
counter.inc();
assertEquals("[1, 1, 0]", counter.counterState());
assertEquals(2L, counter.get().longValue());
}
@Test
public void bucketShouldOverwriteOldValuesAfterPeriod() {
counter.inc(3L);
assertEquals("[3, 0, 0]", counter.counterState());
timeSource.tick(RESOLUTION * 2);
counter.inc(4L);
assertEquals("[3, 0, 4]", counter.counterState());
timeSource.tick(RESOLUTION);
counter.inc();
assertEquals("[1, 0, 4]", counter.counterState());
assertEquals(5L, counter.get().longValue());
timeSource.tick(RESOLUTION * 3);
counter.inc(2L);
assertEquals("[2, 0, 0]", counter.counterState());
assertEquals(2L, counter.get().longValue());
}
@Test
public void getShouldCleanOldValues() {
counter.inc();
timeSource.tick(PERIOD);
assertEquals(0L, counter.get().longValue());
}
@Test
public void toStringShouldReturnExpectedFormat() {
counter.inc();
assertEquals("last 3s=1", counter.toString());
}
}