package com.openxc.messages.formatters;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import com.openxc.BinaryMessages;
import com.openxc.messages.NamedVehicleMessage;
import com.openxc.messages.SimpleVehicleMessage;
import com.openxc.messages.VehicleMessage;
import com.openxc.messages.UnrecognizedMessageTypeException;
import com.openxc.messages.SerializationException;
@RunWith(RobolectricTestRunner.class)
public class BinaryFormatterTest extends AbstractFormatterTestBase {
BinaryFormatter formatter = new BinaryFormatter();
SimpleVehicleMessage message;
String messageName = "foo";
Double value = Double.valueOf(42);
protected void serializeDeserializeAndCheckEqual(
VehicleMessage originalMessage) {
try {
byte[] serialized = BinaryFormatter.serialize(originalMessage);
assertThat(serialized.length, greaterThan(0));
VehicleMessage deserialized = BinaryFormatter.deserialize(
new ByteArrayInputStream(serialized));
assertEquals(originalMessage, deserialized);
} catch(UnrecognizedMessageTypeException | SerializationException e) {
throw new RuntimeException(e);
}
}
@Test
public void deserializeNoErrors() throws IOException,
UnrecognizedMessageTypeException {
BinaryMessages.VehicleMessage.Builder builder =
BinaryMessages.VehicleMessage.newBuilder();
builder.setType(BinaryMessages.VehicleMessage.Type.SIMPLE);
BinaryMessages.SimpleMessage.Builder messageBuilder =
BinaryMessages.SimpleMessage.newBuilder();
messageBuilder.setName(messageName);
BinaryMessages.DynamicField.Builder fieldBuilder =
BinaryMessages.DynamicField.newBuilder();
fieldBuilder.setType(BinaryMessages.DynamicField.Type.NUM);
fieldBuilder.setNumericValue(42);
messageBuilder.setValue(fieldBuilder);
builder.setSimpleMessage(messageBuilder);
BinaryMessages.VehicleMessage serialized = builder.build();
ByteArrayOutputStream output = new ByteArrayOutputStream();
serialized.writeTo(output);
InputStream input = new ByteArrayInputStream(output.toByteArray());
try {
message = (SimpleVehicleMessage) BinaryFormatter.deserialize(input);
} catch(UnrecognizedMessageTypeException e) {}
assertEquals(message.getName(), messageName);
assertEquals(message.getValue(), value);
}
@Test
public void deserializeInvalidReturnsNull() throws IOException,
UnrecognizedMessageTypeException {
InputStream input = new ByteArrayInputStream(new byte[]{0,1,2,3,4});
assertThat(BinaryFormatter.deserialize(input), nullValue());
}
@Test(expected=UnrecognizedMessageTypeException.class)
public void deserializeWellFormedButConfusedMessage() throws IOException,
UnrecognizedMessageTypeException {
// Build a simple message that's missing a name
BinaryMessages.VehicleMessage.Builder builder =
BinaryMessages.VehicleMessage.newBuilder();
builder.setType(BinaryMessages.VehicleMessage.Type.SIMPLE);
BinaryMessages.SimpleMessage.Builder messageBuilder =
BinaryMessages.SimpleMessage.newBuilder();
BinaryMessages.DynamicField.Builder fieldBuilder =
BinaryMessages.DynamicField.newBuilder();
fieldBuilder.setType(BinaryMessages.DynamicField.Type.NUM);
fieldBuilder.setNumericValue(42);
messageBuilder.setValue(fieldBuilder);
builder.setSimpleMessage(messageBuilder);
BinaryMessages.VehicleMessage serialized = builder.build();
ByteArrayOutputStream output = new ByteArrayOutputStream();
serialized.writeTo(output);
InputStream input = new ByteArrayInputStream(output.toByteArray());
BinaryFormatter.deserialize(input);
}
@Test(expected=SerializationException.class)
public void serializeNamedMessageWithExtras() throws SerializationException {
HashMap<String, Object> extras = new HashMap<>();
extras.put("foo", "bar");
extras.put("baz", 42.0);
VehicleMessage message = new NamedVehicleMessage("foo");
message.setExtras(extras);
BinaryFormatter.serialize(message);
}
@Test(expected=SerializationException.class)
public void serializeWithExtras() throws SerializationException {
HashMap<String, Object> extras = new HashMap<>();
extras.put("foo", "bar");
extras.put("baz", 42.0);
BinaryFormatter.serialize(new VehicleMessage(extras));
}
}