package ru.yandex.market.graphouse.data;
import com.google.gson.JsonArray;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.stream.JsonWriter;
import com.mockrunner.mock.jdbc.MockResultSet;
import org.junit.Assert;
import org.junit.Test;
import java.io.StringWriter;
/**
* @author Dmitry Andreev <a href="mailto:AndreevDm@yandex-team.ru"></a>
* @date 03/04/2017
*/
public class MetricDataRowCallbackHandlerTest {
@Test
public void testHandler() throws Exception {
MockResultSet resultSet = new MockResultSet("data");
resultSet.addColumn("metric", new String[]{"name1", "name1", "name2", "name2"});
resultSet.addColumn("ts", new Integer[]{100, 160, 160, 220});
resultSet.addColumn("value", new Double[]{33.33, 42.0, 32.0, 77.7});
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
MetricDataService.MetricDataRowCallbackHandler handler = new MetricDataService.MetricDataRowCallbackHandler(
jsonWriter, 100, 280, 60
);
while (resultSet.next()) {
handler.processRow(resultSet);
}
handler.finish();
jsonWriter.endObject();
JsonObject expected = new JsonObject();
expected.add("name1", createMetric(100, 280, 60, 33.33, 42.0, Double.NaN));
expected.add("name2", createMetric(100, 280, 60, Double.NaN, 32.0, 77.7));
Assert.assertEquals(expected.toString(), stringWriter.toString());
}
@Test
public void testChNan() throws Exception {
MockResultSet resultSet = new MockResultSet("data");
resultSet.addColumn("metric", new String[]{"name1", "name1", "name1"});
resultSet.addColumn("ts", new Integer[]{0, 1, 2});
resultSet.addColumn("value", new Double[]{0.0, Double.NaN, 2.0});
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
MetricDataService.MetricDataRowCallbackHandler handler = new MetricDataService.MetricDataRowCallbackHandler(
jsonWriter, 0, 3, 1
);
while (resultSet.next()) {
handler.processRow(resultSet);
}
handler.finish();
jsonWriter.endObject();
JsonObject expected = new JsonObject();
expected.add("name1", createMetric(0, 3, 1, 0.0, Double.NaN, 2.0));
Assert.assertEquals(expected.toString(), stringWriter.toString());
}
@Test
public void testEmpty() throws Exception {
MockResultSet resultSet = new MockResultSet("data");
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
MetricDataService.MetricDataRowCallbackHandler handler = new MetricDataService.MetricDataRowCallbackHandler(
jsonWriter, 0, 3, 1
);
while (resultSet.next()) {
handler.processRow(resultSet);
}
handler.finish();
jsonWriter.endObject();
Assert.assertEquals("{}", stringWriter.toString());
}
private JsonObject createMetric(int start, int end, int step, double... values) {
JsonObject metric = new JsonObject();
metric.addProperty("start", start);
metric.addProperty("end", end);
metric.addProperty("step", step);
metric.add("points", createPoints(values));
return metric;
}
private JsonArray createPoints(double... values) {
JsonArray points = new JsonArray();
for (double value : values) {
if (Double.isFinite(value)) {
points.add(new JsonPrimitive(value));
} else {
points.add(JsonNull.INSTANCE);
}
}
return points;
}
}