package io.pcp.parfait.timing;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class SamplingMeasurementSinkTest {
@Test
public void zeroFractionShouldNeverSampleEvents() {
CountingMeasurementSink counter = new CountingMeasurementSink();
StepMeasurementSink sink = new SamplingMeasurementSink(counter, 0.0f);
assertEventSinkCounts(sink, 0, counter, 0, 0, 0, 0, 0);
}
@Test
public void oneFractionShouldSampleAllEventCounts() {
CountingMeasurementSink counter = new CountingMeasurementSink();
StepMeasurementSink sink = new SamplingMeasurementSink(counter, 1.0f);
assertEventSinkCounts(sink, 0, counter, 1, 2, 3, 4, 5);
}
@Test
public void eventsSampledShouldNeverExceedSpecifiedFraction() {
CountingMeasurementSink counter = new CountingMeasurementSink();
StepMeasurementSink sink = new SamplingMeasurementSink(counter, 0.33333f);
assertEventSinkCounts(sink, 0, counter, 1, 1, 1, 2, 2, 2, 3, 3);
}
@Test
public void nestedEventsShouldNotBeDelegated() {
CountingMeasurementSink counter = new CountingMeasurementSink();
StepMeasurementSink sink = new SamplingMeasurementSink(counter, 1.0f);
assertEventSinkCounts(sink, 1, counter, 0, 0, 0);
}
private void assertEventSinkCounts(StepMeasurementSink sink, int eventLevel,
CountingMeasurementSink counter, int... progressiveCounts) {
int seen = 0;
for (int progressiveCount : progressiveCounts) {
sink.handle(null, eventLevel);
seen++;
assertEquals(
String.format("After %s events, %s should be sunk", seen, progressiveCount),
progressiveCount, counter.eventsSunk);
}
}
private static class CountingMeasurementSink implements StepMeasurementSink {
private int eventsSunk = 0;
@Override
public void handle(StepMeasurements measurements, int level) {
eventsSunk++;
}
}
}