package com.cyngn.vertx.opentsdb;
import com.cyngn.vertx.opentsdb.client.MetricPublisher;
import com.cyngn.vertx.opentsdb.client.TsMetric;
import com.cyngn.vertx.opentsdb.service.MetricsParser;
import com.cyngn.vertx.opentsdb.service.OpenTsDbService;
import io.vertx.core.Handler;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/**
* @author truelove@cyngn.com (Jeremy Truelove) 10/14/15
*/
@SuppressWarnings("unchecked")
public class MetricPublisherTests {
private EventBus bus;
private MetricPublisher mPublisher;
@Before
public void setUp() {
bus = mock(EventBus.class);
mPublisher = new MetricPublisher(bus, "test.topic");
}
@Test
public void testSimplePublish() {
ArgumentCaptor<JsonObject> metricObj = ArgumentCaptor.forClass(JsonObject.class);
mPublisher.send("test.foo", "34.5");
verify(bus).send(any(String.class), metricObj.capture(), any(Handler.class));
assertEquals("test.foo", metricObj.getValue().getString(MetricsParser.NAME_FIELD));
assertEquals("34.5", metricObj.getValue().getString(MetricsParser.VALUE_FIELD));
assertEquals(OpenTsDbService.ADD_COMMAND, metricObj.getValue().getString(OpenTsDbService.ACTION_FIELD));
assertFalse(metricObj.getValue().containsKey(MetricsParser.TAGS_FIELD));
}
@Test
public void testSimplePublishWithTags() {
ArgumentCaptor<JsonObject> metricObj = ArgumentCaptor.forClass(JsonObject.class);
JsonObject tags = new JsonObject().put("host", "fake.host.com");
mPublisher.send("test.foo", "34.5", tags);
verify(bus).send(any(String.class), metricObj.capture(), any(Handler.class));
assertEquals("test.foo", metricObj.getValue().getString(MetricsParser.NAME_FIELD));
assertEquals("34.5", metricObj.getValue().getString(MetricsParser.VALUE_FIELD));
assertEquals(OpenTsDbService.ADD_COMMAND, metricObj.getValue().getString(OpenTsDbService.ACTION_FIELD));
assertEquals(tags, metricObj.getValue().getJsonObject(MetricsParser.TAGS_FIELD));
}
@Test(expected=IllegalArgumentException.class)
public void testBadArgsSimplePublish() {
mPublisher.send(new JsonObject().put(MetricsParser.NAME_FIELD, "fooy"));
}
@Test
public void testBulkPublish() {
ArgumentCaptor<JsonObject> metricObj = ArgumentCaptor.forClass(JsonObject.class);
List<JsonObject> metrics = Arrays.asList(Util.createRawMetric("foo", "12.5"), Util.createRawMetric("bar", "789"));
mPublisher.sendMetricBatch(metrics);
verify(bus).send(any(String.class), metricObj.capture(), any(Handler.class));
JsonArray arry = metricObj.getValue().getJsonArray(MetricsParser.METRICS_FIELD);
assertEquals(2, arry.size());
assertEquals(OpenTsDbService.ADD_ALL_COMMAND, metricObj.getValue().getString(OpenTsDbService.ACTION_FIELD));
assertEquals("12.5", arry.getJsonObject(0).getString(MetricsParser.VALUE_FIELD));
assertEquals("789", arry.getJsonObject(1).getString(MetricsParser.VALUE_FIELD));
}
@Test(expected = IllegalArgumentException.class)
public void testBulkPublishBadMetrics() {
List<JsonObject> metrics = Collections.singletonList(new JsonObject().put(MetricsParser.NAME_FIELD, "foo"));
mPublisher.sendMetricBatch(metrics);
}
@Test(expected = IllegalArgumentException.class)
public void testBulkPublishBadMetrics2() {
List<JsonObject> metrics = Arrays.asList(new JsonObject().put(MetricsParser.NAME_FIELD, "foo").put(MetricsParser.VALUE_FIELD, "12.4"),
new JsonObject().put(MetricsParser.VALUE_FIELD, "12.5"));
mPublisher.sendMetricBatch(metrics);
}
@Test
public void testTsBulkPublish() {
ArgumentCaptor<JsonObject> metricObj = ArgumentCaptor.forClass(JsonObject.class);
List<TsMetric> metrics = Arrays.asList(new TsMetric("foo", "12.5"), new TsMetric("bar", "789"));
mPublisher.sendTsMetricBatch(metrics);
verify(bus).send(any(String.class), metricObj.capture(), any(Handler.class));
JsonArray arry = metricObj.getValue().getJsonArray(MetricsParser.METRICS_FIELD);
assertEquals(2, arry.size());
assertEquals(OpenTsDbService.ADD_ALL_COMMAND, metricObj.getValue().getString(OpenTsDbService.ACTION_FIELD));
assertEquals("12.5", arry.getJsonObject(0).getString(MetricsParser.VALUE_FIELD));
assertEquals("789", arry.getJsonObject(1).getString(MetricsParser.VALUE_FIELD));
}
@Test(expected = IllegalArgumentException.class)
public void testTsBulkPublishEmpty() {
List<TsMetric> metrics = Collections.emptyList();
mPublisher.sendTsMetricBatch(metrics);
}
@Test(expected = IllegalArgumentException.class)
public void testBulkPublishEmpty() {
List<JsonObject> metrics = Collections.emptyList();
mPublisher.sendMetricBatch(metrics);
}
}