package com.workshare.msnos.core.serializers;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static com.workshare.msnos.core.CoreHelper.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.UUID;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.workshare.msnos.core.Cloud;
import com.workshare.msnos.core.Gateway;
import com.workshare.msnos.core.LocalAgent;
import com.workshare.msnos.core.Message;
import com.workshare.msnos.core.Message.Payload;
import com.workshare.msnos.core.Iden;
import com.workshare.msnos.core.MessageBuilder;
import com.workshare.msnos.core.RemoteAgent;
import com.workshare.msnos.core.RemoteEntity;
import com.workshare.msnos.core.Version;
import com.workshare.msnos.core.payloads.FltPayload;
import com.workshare.msnos.core.payloads.HealthcheckPayload;
import com.workshare.msnos.core.payloads.Presence;
import com.workshare.msnos.core.payloads.QnePayload;
import com.workshare.msnos.core.payloads.TracePayload;
import com.workshare.msnos.core.protocols.ip.Endpoint;
import com.workshare.msnos.core.protocols.ip.HttpEndpoint;
import com.workshare.msnos.core.protocols.ip.Network;
import com.workshare.msnos.core.protocols.ip.BaseEndpoint;
import com.workshare.msnos.core.protocols.ip.NullGateway;
import com.workshare.msnos.usvc.api.RestApi;
import com.workshare.msnos.usvc.api.RestApi.Type;
public class WireJsonSerializerTest {
private static final UUID AGENT_UUID = UUID.randomUUID();
private static final UUID CLOUD_UUID = UUID.randomUUID();
private static final Iden A_CLOUD_IDEN = new Iden(Iden.Type.CLD, UUID.randomUUID());
private static final Iden A_AGENT_IDEN = new Iden(Iden.Type.CLD, UUID.randomUUID());
private static final Network SAMPLE_NETWORK = new Network(new byte[]{10,10,10,1}, (short)25);
private Cloud cloud;
private LocalAgent localAgent;
private RemoteEntity remoteAgent;
private WireJsonSerializer sz = new WireJsonSerializer();
@BeforeClass
public static void useLocalTimeSource() {
System.setProperty("com.ws.nsnos.time.local", "true");
}
@Before
public void before() throws Exception {
cloud = new Cloud(CLOUD_UUID, "1231", new HashSet<Gateway>(Arrays.asList(new NullGateway())));
localAgent = new LocalAgent(AGENT_UUID);
localAgent.join(cloud);
remoteAgent = new RemoteAgent(UUID.randomUUID(), cloud, null);
}
@Test
public void shouldBeAbleToEncodeAndDecodeMessage() throws Exception {
Message source = new MessageBuilder(Message.Type.PRS, localAgent, remoteAgent).with(new Presence(true, localAgent)).make();
byte[] data = sz.toBytes(source);
Message decoded = sz.fromBytes(data, Message.class);
assertEquals(source, decoded);
}
@Test
public void shouldBeAbleToEncodeAndDecodeQNE() throws Exception {
Message source = new MessageBuilder(Message.Type.QNE, localAgent, remoteAgent).with(new QnePayload("test", new RestApi("/test", 7070))).make();
byte[] data = sz.toBytes(source);
Message decoded = sz.fromBytes(data, Message.class);
assertEquals(source, decoded);
}
@Test
public void shouldSerializeVersionObject() throws Exception {
String expected = "\"1.0\"";
String current = sz.toText(Version.V1_0);
assertEquals(expected, current);
}
@Test
public void shouldSerializeUUIDObject() throws Exception {
UUID uuid = UUID.randomUUID();
String expected = "\"" + toShortString(uuid).replace("-", "") + "\"";
String current = sz.toText(uuid);
assertEquals(expected, current);
}
@Test
public void shouldDeserializeUUIDObject() throws Exception {
UUID expected = UUID.randomUUID();
String text = "\"" + toShortString(expected).replace("-", "") + "\"";
UUID current = sz.fromText(text, UUID.class);
assertEquals(expected, current);
}
@Test
public void shouldBeAbleToEncodeAndDecodeSignedMessage() throws Exception {
final String sig = "this-is-a-signature";
final String rnd = "random";
Message source = new MessageBuilder(Message.Type.QNE, localAgent, cloud).signed(sig, rnd).make();
byte[] data = sz.toBytes(source);
Message decoded = sz.fromBytes(data, Message.class);
assertEquals(sig, decoded.getSig());
assertEquals(rnd, decoded.getRnd());
}
@Test
public void shouldCorrectlyDeserializeFLTMessage() throws Exception {
Message source = new MessageBuilder(Message.Type.FLT, A_CLOUD_IDEN, A_CLOUD_IDEN).with(new FltPayload(localAgent.getIden())).with(UUID.randomUUID()).make();
byte[] data = sz.toBytes(source);
Message decoded = sz.fromBytes(data, Message.class);
assertEquals(source.getData(), decoded.getData());
}
@Test
public void shouldSerializeBooleanCompact() throws Exception {
assertEquals("1", sz.toText(Boolean.TRUE));
assertEquals("0", sz.toText(Boolean.FALSE));
}
@Test
public void shouldDeserializeBooleanCompact() throws Exception {
assertEquals(Boolean.TRUE, sz.fromText("1", Boolean.class));
assertEquals(Boolean.FALSE, sz.fromText("0", Boolean.class));
}
@Test
public void shouldMessageToCloudContainStandardIden() throws Exception {
Message source = new MessageBuilder(Message.Type.PON, localAgent, cloud).make();
String expected = "\"to\":\"CLD:" + toShortString(CLOUD_UUID) + "\"";
String current = sz.toText(source);
assertTrue(current.contains(expected));
}
@Test
public void shouldSerializeBaseEndpoint() throws Exception {
Endpoint expected = new BaseEndpoint(Endpoint.Type.SSH, SAMPLE_NETWORK);
Endpoint current = sz.fromText(sz.toText(expected), Endpoint.class);
assertEquals(expected, current);
}
@Test
public void shouldSerializeHTTPEndpoint() throws Exception {
Endpoint expected = new HttpEndpoint(SAMPLE_NETWORK, "http://www.workshare.com");
Endpoint current = sz.fromText(sz.toText(expected), Endpoint.class);
assertEquals(expected, current);
}
@Test
public void shouldCorrectlyDeserializeHCKMessage() throws Exception {
Payload payload = new HealthcheckPayload(localAgent, true);
Message source = new MessageBuilder(Message.Type.HCK, A_CLOUD_IDEN, A_CLOUD_IDEN).with(payload).with(UUID.randomUUID()).make();
byte[] data = sz.toBytes(source);
Message decoded = sz.fromBytes(data, Message.class);
assertEquals(source.getData(), decoded.getData());
}
@Test
public void shouldCorrectlyDeserializePONMessage() throws Exception {
Message source = new MessageBuilder(Message.Type.PON, A_CLOUD_IDEN, A_CLOUD_IDEN).make();
byte[] data = sz.toBytes(source);
Message decoded = sz.fromBytes(data, Message.class);
assertEquals(source.getData(), decoded.getData());
}
@Test
public void shouldCorrectlyDeserializeTRCMessage() throws Exception {
Payload payload = new TracePayload(A_CLOUD_IDEN).crumbed(randomUUID(), randomUUID(), new NullGateway(), 3);
Message source = new MessageBuilder(Message.Type.TRC, A_CLOUD_IDEN, A_AGENT_IDEN).with(payload).make();
byte[] data = sz.toBytes(source);
Message decoded = sz.fromBytes(data, Message.class);
assertEquals(source.getData(), decoded.getData());
}
@Test
public void shouldCorrectlyDeserializeTracePayloadWhenReturnedInACK() throws Exception {
Payload payload = new TracePayload(A_AGENT_IDEN).crumbed(randomUUID(), randomUUID(), new NullGateway(), 3);
Message source = new MessageBuilder(Message.Type.ACK, A_AGENT_IDEN, A_CLOUD_IDEN).with(payload).make();
byte[] data = sz.toBytes(source);
Message decoded = sz.fromBytes(data, Message.class);
assertEquals(source.getData(), decoded.getData());
}
@Test
public void shouldCorrectlyDeserializeNoPayloadACK() throws Exception {
Message source = new MessageBuilder(Message.Type.ACK, A_AGENT_IDEN, A_CLOUD_IDEN).make();
byte[] data = sz.toBytes(source);
Message decoded = sz.fromBytes(data, Message.class);
assertEquals(source.getData(), decoded.getData());
}
@Test
public void shouldSerializeRestAPI() throws Exception {
RestApi expected = new RestApi("/path", 88, "host", Type.HEALTHCHECK, false, 100);
RestApi current = sz.fromText(sz.toText(expected), RestApi.class);
assertEquals(expected, current);
}
private String toShortString(UUID uuid) {
return uuid.toString().replaceAll("-", "");
}
}