package com.openxc.sinks; import org.junit.runner.RunWith; import org.junit.Test; import org.junit.Before; import static org.junit.Assert.*; import org.robolectric.annotation.Config; import org.robolectric.RobolectricTestRunner; import java.io.BufferedWriter; import java.io.IOException; import java.io.StringWriter; import org.json.JSONException; import org.json.JSONObject; import com.openxc.messages.KeyedMessage; import com.openxc.messages.SimpleVehicleMessage; import com.openxc.messages.VehicleMessage; import com.openxc.messages.formatters.JsonFormatter; import com.openxc.util.FileOpener; @RunWith(RobolectricTestRunner.class) public class FileRecorderSinkTest { FileRecorderSink sink; FileOpener opener; StringWriter outputString; String measurementId = "measurement"; String value = "value"; @Before public void setUp() throws IOException, DataSinkException { outputString = new StringWriter(); opener = new MockFileOpener(); sink = new FileRecorderSink(opener); } @Test public void testReceiveValueOnly() throws DataSinkException { assertTrue(outputString.toString().indexOf(measurementId) == -1); sink.receive(new SimpleVehicleMessage(measurementId, value)); sink.flush(); assertTrue(outputString.toString().indexOf(measurementId) != -1); assertTrue(outputString.toString().indexOf(value) != -1); } @Test public void testOutputFormat() throws JSONException, DataSinkException { VehicleMessage measurement = new SimpleVehicleMessage(measurementId, value); sink.receive(measurement); sink.flush(); JSONObject message; message = new JSONObject(outputString.toString()); assertTrue(message.getString("name").equals(measurementId)); assertTrue(message.getString("value").equals(value)); } @Test public void testSerialize() throws DataSinkException { KeyedMessage measurement = new SimpleVehicleMessage(measurementId, value); measurement.asKeyedMessage().getKey(); String serializedMessage = JsonFormatter.serialize(measurement); assertTrue(!serializedMessage.contains("mKey")); } @Test public void testCounts() throws JSONException, DataSinkException { VehicleMessage measurement = new SimpleVehicleMessage("first", true); sink.receive(measurement); measurement = new SimpleVehicleMessage("first", false); sink.receive(measurement); measurement = new SimpleVehicleMessage("second", true); sink.receive(measurement); measurement = new SimpleVehicleMessage("second", true); sink.receive(measurement); sink.flush(); String[] records = outputString.toString().split("\n"); assertEquals(4, records.length); assertTrue(records[0].indexOf("first") != -1); assertTrue(records[1].indexOf("first") != -1); assertTrue(records[2].indexOf("second") != -1); assertTrue(records[3].indexOf("second") != -1); } @Test public void testStop() throws DataSinkException { VehicleMessage measurement = new SimpleVehicleMessage("first", true); sink.receive(measurement); measurement = new SimpleVehicleMessage("second", false); sink.receive(measurement); sink.stop(); measurement = new SimpleVehicleMessage("third", true); try { sink.receive(measurement); fail("Expected a DataSinkException"); } catch(DataSinkException e) { } String[] records = outputString.toString().split("\n"); assertEquals(2, records.length); assertTrue(records[0].indexOf("first") != -1); assertTrue(records[1].indexOf("second") != -1); } private class MockFileOpener implements FileOpener { @Override public BufferedWriter openForWriting(String path) throws IOException { return new BufferedWriter(outputString); } } }