package org.kairosdb.core.aggregator;
import com.google.common.collect.ImmutableSortedMap;
import org.junit.Before;
import org.junit.Test;
import org.kairosdb.core.DataPoint;
import org.kairosdb.core.datapoints.LongDataPoint;
import org.kairosdb.core.datastore.DataPointGroup;
import org.kairosdb.core.datastore.Datastore;
import org.kairosdb.core.exception.DatastoreException;
import org.kairosdb.core.groupby.GroupBy;
import org.kairosdb.core.groupby.TagGroupBy;
import org.kairosdb.testing.ListDataPointGroup;
import java.util.Collections;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/**
Created by bhawkins on 2/9/16.
*/
public class SaveAsAggregatorTest
{
private SaveAsAggregator m_aggregator;
private Datastore m_mockDatastore;
@Before
public void setup()
{
m_mockDatastore = mock(Datastore.class);
m_aggregator = new SaveAsAggregator(m_mockDatastore);
}
@Test
@SuppressWarnings("unchecked")
public void testTtl() throws DatastoreException
{
m_aggregator.setMetricName("testTtl");
m_aggregator.setTtl(42);
ListDataPointGroup group = new ListDataPointGroup("group");
group.addDataPoint(new LongDataPoint(1, 10));
group.addDataPoint(new LongDataPoint(2, 20));
DataPointGroup results = m_aggregator.aggregate(group);
assertThat(results.hasNext(), equalTo(true));
DataPoint dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(1L));
assertThat(dataPoint.getLongValue(), equalTo(10L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), any(ImmutableSortedMap.class), eq(dataPoint), eq(42));
assertThat(results.hasNext(), equalTo(true));
dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(2L));
assertThat(dataPoint.getLongValue(), equalTo(20L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), any(ImmutableSortedMap.class), eq(dataPoint), eq(42));
results.close();
}
@Test
@SuppressWarnings("unchecked")
public void testNoTtl() throws DatastoreException
{
m_aggregator.setMetricName("testTtl");
ListDataPointGroup group = new ListDataPointGroup("group");
group.addDataPoint(new LongDataPoint(1, 10));
group.addDataPoint(new LongDataPoint(2, 20));
DataPointGroup results = m_aggregator.aggregate(group);
assertThat(results.hasNext(), equalTo(true));
DataPoint dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(1L));
assertThat(dataPoint.getLongValue(), equalTo(10L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), any(ImmutableSortedMap.class), eq(dataPoint), eq(0));
assertThat(results.hasNext(), equalTo(true));
dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(2L));
assertThat(dataPoint.getLongValue(), equalTo(20L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), any(ImmutableSortedMap.class), eq(dataPoint), eq(0));
results.close();
}
@Test
public void testNotAddingSavedFrom() throws DatastoreException
{
m_aggregator.setMetricName("testTtl");
m_aggregator.setTags(ImmutableSortedMap.<String, String>of("sweet_tag", "value"));
m_aggregator.setAddSavedFrom(false);
ImmutableSortedMap<String, String> verifyMap = ImmutableSortedMap.<String, String>naturalOrder()
.put("sweet_tag", "value")
.build();
ListDataPointGroup group = new ListDataPointGroup("group");
group.addDataPoint(new LongDataPoint(1, 10));
group.addDataPoint(new LongDataPoint(2, 20));
group.addTag("host", "tag_should_not_be_there");
DataPointGroup results = m_aggregator.aggregate(group);
assertThat(results.hasNext(), equalTo(true));
DataPoint dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(1L));
assertThat(dataPoint.getLongValue(), equalTo(10L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), eq(verifyMap), eq(dataPoint), eq(0));
assertThat(results.hasNext(), equalTo(true));
dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(2L));
assertThat(dataPoint.getLongValue(), equalTo(20L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), eq(verifyMap), eq(dataPoint), eq(0));
results.close();
}
@Test
public void testAddedTags() throws DatastoreException
{
m_aggregator.setMetricName("testTtl");
m_aggregator.setTags(ImmutableSortedMap.<String, String>of("sweet_tag", "value"));
ImmutableSortedMap<String, String> verifyMap = ImmutableSortedMap.<String, String>naturalOrder()
.put("saved_from", "group")
.put("sweet_tag", "value")
.build();
ListDataPointGroup group = new ListDataPointGroup("group");
group.addDataPoint(new LongDataPoint(1, 10));
group.addDataPoint(new LongDataPoint(2, 20));
group.addTag("host", "tag_should_not_be_there");
DataPointGroup results = m_aggregator.aggregate(group);
assertThat(results.hasNext(), equalTo(true));
DataPoint dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(1L));
assertThat(dataPoint.getLongValue(), equalTo(10L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), eq(verifyMap), eq(dataPoint), eq(0));
assertThat(results.hasNext(), equalTo(true));
dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(2L));
assertThat(dataPoint.getLongValue(), equalTo(20L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), eq(verifyMap), eq(dataPoint), eq(0));
results.close();
}
@Test
public void testGroupByTagFilter() throws DatastoreException
{
m_aggregator.setMetricName("testTtl");
m_aggregator.setTtl(42);
GroupBy groupBy = new TagGroupBy("host", "host2");
m_aggregator.setGroupBys(Collections.singletonList(groupBy));
ImmutableSortedMap<String, String> verifyMap = ImmutableSortedMap.<String, String>naturalOrder()
.put("saved_from", "group")
.put("host", "bob")
.build();
ListDataPointGroup group = new ListDataPointGroup("group");
group.addDataPoint(new LongDataPoint(1, 10));
group.addDataPoint(new LongDataPoint(2, 20));
group.addTag("host", "bob");
group.addTag("some_tag", "tag_should_not_be_there");
group.addTag("host2", "host2_tag");
group.addTag("host2", "wont show up because there are two");
DataPointGroup results = m_aggregator.aggregate(group);
assertThat(results.hasNext(), equalTo(true));
DataPoint dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(1L));
assertThat(dataPoint.getLongValue(), equalTo(10L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), eq(verifyMap), eq(dataPoint), eq(42));
assertThat(results.hasNext(), equalTo(true));
dataPoint = results.next();
assertThat(dataPoint.getTimestamp(), equalTo(2L));
assertThat(dataPoint.getLongValue(), equalTo(20L));
verify(m_mockDatastore).putDataPoint(eq("testTtl"), eq(verifyMap), eq(dataPoint), eq(42));
results.close();
}
}