package io.pcp.parfait.dropwizard.metricadapters;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import java.util.Map;
import com.codahale.metrics.Sampling;
import com.codahale.metrics.Snapshot;
import io.pcp.parfait.Monitorable;
import io.pcp.parfait.ValueSemantics;
import com.google.common.collect.Maps;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
@SuppressWarnings("unchecked")
public class SamplingAdapterTest {
private static final String NAME = "NAME";
private static final String DESCRIPTION = "DESCRIPTION";
private static final String MIN = "min";
private static final String MAX = "max";
private static final String MEAN = "mean";
private static final String MEDIAN = "median";
private static final String STDDEV = "stddev";
private static final String SEVENTY_FIFTH = "seventyfifth";
private static final String NINETY_FIFTH = "ninetyfifth";
private static final String NINETY_EIGHTH = "ninetyeighth";
private static final String NINETY_NINETH = "ninetynineth";
private static final String THREE_NINES = "threenines";
private static final long INITIAL_MAX = 11l;
private static final long INITIAL_MIN = 22l;
private static final Double INITIAL_MEDIAN = 12.34;
private static final Double INITIAL_STDDEV = 56.78;
private static final Double INITIAL_MEAN = 90.12;
private static final Double INITIAL_75th = 75.75;
private static final Double INITIAL_95th = 95.95;
private static final Double INITIAL_98th = 98.98;
private static final Double INITIAL_99th = 99.99;
private static final Double INITIAL_THREE_NINES = 999.999;
private SamplingAdapter adapter;
@Mock
private Sampling samplingMetric;
@Mock
private Snapshot snapshot;
@Before
public void setUp() {
when(samplingMetric.getSnapshot()).thenReturn(snapshot);
when(snapshot.getMax()).thenReturn(INITIAL_MAX);
when(snapshot.getMin()).thenReturn(INITIAL_MIN);
when(snapshot.getMedian()).thenReturn(INITIAL_MEDIAN);
when(snapshot.getStdDev()).thenReturn(INITIAL_STDDEV);
when(snapshot.getMean()).thenReturn(INITIAL_MEAN);
when(snapshot.get75thPercentile()).thenReturn(INITIAL_75th);
when(snapshot.get95thPercentile()).thenReturn(INITIAL_95th);
when(snapshot.get98thPercentile()).thenReturn(INITIAL_98th);
when(snapshot.get99thPercentile()).thenReturn(INITIAL_99th);
when(snapshot.get999thPercentile()).thenReturn(INITIAL_THREE_NINES);
adapter = new SamplingAdapter(samplingMetric, NAME, DESCRIPTION);
}
private Map<String, Monitorable> extractMonitorables(SamplingAdapter adapter) {
Map<String, Monitorable> monitorables = Maps.newHashMap();
for (Monitorable monitorable : adapter.getMonitorables()) {
final String name = monitorable.getName();
monitorables.put(name.substring(name.lastIndexOf('.') + 1), monitorable);
}
return monitorables;
}
@Test
public void shouldPublishMinMetric() {
final Monitorable<Long> minMonitorable = extractMonitorables(adapter).get(MIN);
assertThat(minMonitorable, notNullValue());
assertThat(minMonitorable.getDescription(), is(DESCRIPTION + " - Minimum"));
assertThat(minMonitorable.getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(minMonitorable.get(), is(INITIAL_MIN));
}
@Test
public void shouldPublishMaxMetric() {
final Monitorable<Long> maxMonitorable = extractMonitorables(adapter).get(MAX);
assertThat(maxMonitorable, notNullValue());
assertThat(maxMonitorable.getDescription(), is(DESCRIPTION + " - Maximum"));
assertThat(maxMonitorable.getSemantics(), is(ValueSemantics.MONOTONICALLY_INCREASING));
assertThat(maxMonitorable.get(), is(INITIAL_MAX));
}
@Test
public void shouldPublishMeanMetric() {
final Monitorable<Double> meanMonitorable = extractMonitorables(adapter).get(MEAN);
assertThat(meanMonitorable, notNullValue());
assertThat(meanMonitorable.getDescription(), is(DESCRIPTION + " - Mean"));
assertThat(meanMonitorable.getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(meanMonitorable.get(), is(INITIAL_MEAN));
}
@Test
public void shouldPublishMedianMetric() {
final Monitorable<Double> medianMonitorable = extractMonitorables(adapter).get(MEDIAN);
assertThat(medianMonitorable, notNullValue());
assertThat(medianMonitorable.getDescription(), is(DESCRIPTION + " - Median"));
assertThat(medianMonitorable.getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(medianMonitorable.get(), is(INITIAL_MEDIAN));
}
@Test
public void shouldPublishStdDevMetric() {
final Monitorable<Double> standardDevMetric = extractMonitorables(adapter).get(STDDEV);
assertThat(standardDevMetric, notNullValue());
assertThat(standardDevMetric.getDescription(), is(DESCRIPTION + " - Standard Deviation"));
assertThat(standardDevMetric.getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(standardDevMetric.get(), is(INITIAL_STDDEV));
}
@Test
public void shouldPublish75thPercentileMetric() {
final Monitorable<Double> seventyFifthMetric = extractMonitorables(adapter).get(SEVENTY_FIFTH);
assertThat(seventyFifthMetric, notNullValue());
assertThat(seventyFifthMetric.getDescription(), is(DESCRIPTION + " - 75th Percentile of recent data"));
assertThat(seventyFifthMetric.getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(seventyFifthMetric.get(), is(INITIAL_75th));
}
@Test
public void shouldPublish95thPercentileMetric() {
final Monitorable<Double> ninetyFifthMetric = extractMonitorables(adapter).get(NINETY_FIFTH);
assertThat(ninetyFifthMetric, notNullValue());
assertThat(ninetyFifthMetric.getDescription(), is(DESCRIPTION + " - 95th Percentile of recent data"));
assertThat(ninetyFifthMetric.getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(ninetyFifthMetric.get(), is(INITIAL_95th));
}
@Test
public void shouldPublish98thPercentileMetric() {
final Monitorable<Double> ninetyEigthMetric = extractMonitorables(adapter).get(NINETY_EIGHTH);
assertThat(ninetyEigthMetric, notNullValue());
assertThat(ninetyEigthMetric.getDescription(), is(DESCRIPTION + " - 98th Percentile of recent data"));
assertThat(ninetyEigthMetric.getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(ninetyEigthMetric.get(), is(INITIAL_98th));
}
@Test
public void shouldPublish99thPercentileMetric() {
final Monitorable<Double> ninetyNinthMetric = extractMonitorables(adapter).get(NINETY_NINETH);
assertThat(ninetyNinthMetric, notNullValue());
assertThat(ninetyNinthMetric.getDescription(), is(DESCRIPTION + " - 99th Percentile of recent data"));
assertThat(ninetyNinthMetric.getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(ninetyNinthMetric.get(), is(INITIAL_99th));
}
@Test
public void shouldPublish999thPercentileMetric() {
final Monitorable<Double> threeNinesMetric = extractMonitorables(adapter).get(THREE_NINES);
assertThat(threeNinesMetric, notNullValue());
assertThat(threeNinesMetric.getDescription(), is(DESCRIPTION + " - 99.9th Percentile of recent data"));
assertThat(threeNinesMetric.getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(threeNinesMetric.get(), is(INITIAL_THREE_NINES));
}
@Test
public void shouldUpdateMinMetric() {
long newMin = INITIAL_MIN - 5;
when(snapshot.getMin()).thenReturn(newMin);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(MIN).get(), Matchers.<Object>is(newMin));
}
@Test
public void shouldUpdateMaxMetric() {
long newMax = INITIAL_MAX + 5;
when(snapshot.getMax()).thenReturn(newMax);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(MAX).get(), Matchers.<Object>is(newMax));
}
@Test
public void shouldUpdateMeanMetric() {
double newMean = INITIAL_MEAN + 5;
when(snapshot.getMean()).thenReturn(newMean);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(MEAN).get(), Matchers.<Object>is(newMean));
}
@Test
public void shouldUpdateMedianMetric() {
double newMedian = INITIAL_MEDIAN + 5;
when(snapshot.getMedian()).thenReturn(newMedian);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(MEDIAN).get(), Matchers.<Object>is(newMedian));
}
@Test
public void shouldUpdateStdDevMetric() {
double newStdDev = INITIAL_STDDEV + 5;
when(snapshot.getStdDev()).thenReturn(newStdDev);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(STDDEV).get(), Matchers.<Object>is(newStdDev));
}
@Test
public void shouldUpdate75thMetric() {
double new75thMetric = INITIAL_75th + 5;
when(snapshot.get75thPercentile()).thenReturn(new75thMetric);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(SEVENTY_FIFTH).get(), Matchers.<Object>is(new75thMetric));
}
@Test
public void shouldUpdate95thMetric() {
double new95thMetric = INITIAL_95th + 5;
when(snapshot.get95thPercentile()).thenReturn(new95thMetric);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(NINETY_FIFTH).get(), Matchers.<Object>is(new95thMetric));
}
@Test
public void shouldUpdate98thMetric() {
double new98thMetric = INITIAL_98th + 5;
when(snapshot.get98thPercentile()).thenReturn(new98thMetric);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(NINETY_EIGHTH).get(), Matchers.<Object>is(new98thMetric));
}
@Test
public void shouldUpdate99thMetric() {
double new99thMetric = INITIAL_99th + 5;
when(snapshot.get99thPercentile()).thenReturn(new99thMetric);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(NINETY_NINETH).get(), Matchers.<Object>is(new99thMetric));
}
@Test
public void shouldUpdate999thMetric() {
double new999thMetric = INITIAL_THREE_NINES + 5;
when(snapshot.get999thPercentile()).thenReturn(new999thMetric);
adapter.updateMonitorables();
assertThat(extractMonitorables(adapter).get(THREE_NINES).get(), Matchers.<Object>is(new999thMetric));
}
}