package com.bizo.asperatus.tracker.impl;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import com.bizo.asperatus.model.CompoundDimension;
import com.bizo.asperatus.model.Dimension;
import com.bizo.asperatus.model.Unit;
import com.google.common.collect.Lists;
public final class CWMetricTrackerTest {
private final TestCloudwatch cloudwatch = new TestCloudwatch();
private final CWMetricTracker tracker = new CWMetricTracker(
cloudwatch,
"TestNamespace",
Executors.newScheduledThreadPool(3),
50, TimeUnit.MILLISECONDS);
@Test
public void testSmall() throws Exception {
final List<Dimension> dims = new ArrayList<Dimension>();
dims.add(new Dimension("d1", "a"));
tracker.track("m1", 5, dims);
Thread.sleep(100);
assertTrue(hasAggregation("TestNamespace", aggregation("m1", "d1", "a", 1, 5, 5, 5)));
}
@Test
public void testMultiDimension() throws Exception {
final List<Dimension> dims = new ArrayList<Dimension>();
dims.add(new Dimension("d1", "a"));
dims.add(new Dimension("d2", "a"));
tracker.track("m1", 5, Unit.Count, dims);
Thread.sleep(100);
assertTrue(hasAggregation("TestNamespace", aggregation("m1", "d1", "a", 1, 5, 5, 5)));
assertTrue(hasAggregation("TestNamespace", aggregation("m1", "d2", "a", 1, 5, 5, 5)));
}
@Test
public void testCompoundDimension() throws Exception {
final List<Dimension> dims = new ArrayList<Dimension>();
dims.add(new Dimension("d1", "a"));
dims.add(new Dimension("d2", "a"));
tracker.track("m1", 5, Unit.Count, Collections.singleton(new CompoundDimension(dims)));
Thread.sleep(100);
assertTrue(hasAggregation("TestNamespace", aggregation("m1", dims, 1, 5, 5, 5)));
}
@Test
public void testMany() throws Exception {
final List<Dimension> dims = new ArrayList<Dimension>();
dims.add(new Dimension("d1", "a"));
for (int i = 0; i < 1000; i++) {
tracker.track(String.valueOf(i), 5, dims);
}
Thread.sleep(400);
for (int i = 0; i < 1000; i++) {
assertTrue(hasAggregation("TestNamespace", aggregation(String.valueOf(i), "d1", "a", 1, 5, 5, 5)));
}
}
private boolean hasAggregation(final String namespace, final Aggregation agg) {
final List<Aggregation> aggs = cloudwatch.aggregations.get(namespace);
return (aggs != null && aggs.contains(agg));
}
private static Aggregation aggregation(
final String metric,
final String dimKey,
final String dimVal,
final long samples,
final float sum,
final float min,
final float max) {
return aggregation(metric, Lists.newArrayList(new Dimension(dimKey, dimVal)), samples, sum, min, max);
}
private static Aggregation aggregation(
final String metric,
List<Dimension> dims,
final long samples,
final float sum,
final float min,
final float max) {
return new Aggregation(metric, samples, sum, min, max, Unit.Count, dims);
}
}