package lbms.plugins.mldht.kad.utils; import static org.junit.Assert.assertEquals; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; import org.junit.Test; import lbms.plugins.mldht.kad.utils.ResponseTimeoutFilter.Snapshot; public class TimeoutFilterStatsTest { @Test public void testStatisticalProperties() { ResponseTimeoutFilter f = new ResponseTimeoutFilter(); // decay otherwise sensible defaults IntStream.range(0, 10).forEach(i -> f.decay()); f.update(300); f.update(7000); IntStream.range(0, 300).forEach(i -> f.update(1500)); IntStream.range(0, 300).forEach(i -> f.update(1600)); IntStream.range(0, 300).forEach(i -> f.update(1700)); IntStream.range(0, 300).forEach(i -> f.update(1800)); IntStream.range(0, 300).forEach(i -> f.update(1900)); IntStream.range(0, 1000).forEach(i -> f.update(3000)); f.newSnapshot(); Snapshot s = f.snapshot; int expectedAvg = (1500*300 + 1600*300 + 1700*300 + 1800 * 300 + 1900 * 300 + 1000 * 3000) / (300 * 5 + 1000); assertEquals(expectedAvg, s.mean, ResponseTimeoutFilter.BIN_SIZE); assertEquals(3000, s.mode, ResponseTimeoutFilter.BIN_SIZE); assertEquals(300, s.getQuantile(0.0001f), ResponseTimeoutFilter.BIN_SIZE); assertEquals(1500, s.getQuantile(0.01f), ResponseTimeoutFilter.BIN_SIZE); assertEquals(1900, s.getQuantile(0.5f), ResponseTimeoutFilter.BIN_SIZE); assertEquals(3000, s.getQuantile(0.9f), ResponseTimeoutFilter.BIN_SIZE); assertEquals(7000, s.getQuantile(0.9999f), ResponseTimeoutFilter.BIN_SIZE); } @Test public void testCorrectnessUnderDecay() { ResponseTimeoutFilter f = new ResponseTimeoutFilter(); IntStream.range(0, 2000).forEach(i -> { f.update((long) (ThreadLocalRandom.current().nextGaussian() * 100 + 5000)); if((i % 10) == 0) f.decay(); }); f.newSnapshot(); Snapshot s = f.snapshot; System.out.println(s); assertEquals(5000, s.mean, ResponseTimeoutFilter.BIN_SIZE); assertEquals(5000, s.getQuantile(0.5f), ResponseTimeoutFilter.BIN_SIZE); assertEquals(5000, s.mode, 2 * ResponseTimeoutFilter.BIN_SIZE); } }