/**
* Copyright 2016, Xiaomi.
* All rights reserved.
* Author: xiajun@xiaomi.com
*/
package com.xiaomi.infra.galaxy.talos.client.serialization;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.nio.ByteBuffer;
import org.junit.Before;
import org.junit.Test;
import com.xiaomi.infra.galaxy.talos.client.compression.ByteBufferBackedInputStream;
import com.xiaomi.infra.galaxy.talos.client.serialization.MessageSerialization;
import com.xiaomi.infra.galaxy.talos.client.serialization.MessageSerializerV2;
import com.xiaomi.infra.galaxy.talos.thrift.Message;
import com.xiaomi.infra.galaxy.talos.thrift.MessageType;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
public class SerializationV2Test {
private ByteArrayOutputStream byteArrayOutputStream;
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
private Message message1;
private Message message2;
private Message message3;
private Message message4;
private MessageSerializerV2 messageSerializer;
@Before
public void setUp() throws Exception {
byteArrayOutputStream = new ByteArrayOutputStream(1000000);
dataOutputStream = new DataOutputStream(byteArrayOutputStream);
messageSerializer = MessageSerializerV2.get();
message1 = new Message();
message1.setCreateTimestamp(System.currentTimeMillis());
message1.setMessageType(MessageType.BINARY);
message1.setPartitionKey("P1");
message1.setSequenceNumber("S1");
message1.setMessage("M1".getBytes());
message2 = new Message();
message2.setCreateTimestamp(System.currentTimeMillis());
message2.setMessageType(MessageType.BINARY);
message2.setPartitionKey("P2");
message2.setMessage("M2".getBytes());
message3 = new Message();
message3.setCreateTimestamp(System.currentTimeMillis());
message3.setMessageType(MessageType.BINARY);
message3.setSequenceNumber("S3");
message3.setMessage("M3".getBytes());
message4 = new Message();
message4.setCreateTimestamp(System.currentTimeMillis());
message4.setMessageType(MessageType.BINARY);
message4.setMessage("M4".getBytes());
}
@Test
public void testGetMessageSize() throws Exception {
assertEquals(24, messageSerializer.getMessageSize(message1));
assertEquals(22, messageSerializer.getMessageSize(message2));
assertEquals(24, messageSerializer.getMessageSize(message3));
assertEquals(22, messageSerializer.getMessageSize(message4));
}
@Test
public void testSerializerMessage() throws Exception {
messageSerializer.serialize(message1, dataOutputStream);
System.out.print("buffer size:" + byteArrayOutputStream.size());
messageSerializer.serialize(message2, dataOutputStream);
System.out.print("buffer size:" + byteArrayOutputStream.size());
messageSerializer.serialize(message3, dataOutputStream);
System.out.print("buffer size:" + byteArrayOutputStream.size());
messageSerializer.serialize(message4, dataOutputStream);
System.out.print("buffer size:" + byteArrayOutputStream.size());
dataOutputStream.flush();
System.out.print("buffer size:" + byteArrayOutputStream.size());
dataInputStream = new DataInputStream(new ByteBufferBackedInputStream(
ByteBuffer.wrap(byteArrayOutputStream.toByteArray())));
Message verifyMessage1 = MessageSerialization.deserializeMessage(dataInputStream);
assertFalse(verifyMessage1.isSetPartitionKey());
assertEquals(message1.getCreateTimestamp(), verifyMessage1.getCreateTimestamp());
assertEquals(MessageType.BINARY, verifyMessage1.getMessageType());
assertEquals(message1.getSequenceNumber(), verifyMessage1.getSequenceNumber());
assertArrayEquals(message1.getMessage(), verifyMessage1.getMessage());
Message verifyMessage2 = MessageSerialization.deserializeMessage(dataInputStream);
assertFalse(verifyMessage2.isSetPartitionKey());
assertFalse(verifyMessage2.isSetSequenceNumber());
assertEquals(message2.getCreateTimestamp(), verifyMessage2.getCreateTimestamp());
assertEquals(MessageType.BINARY, verifyMessage1.getMessageType());
assertArrayEquals(message2.getMessage(), verifyMessage2.getMessage());
Message verifyMessage3 = MessageSerialization.deserializeMessage(dataInputStream);
assertFalse(verifyMessage3.isSetPartitionKey());
assertEquals(message3.getCreateTimestamp(), verifyMessage3.getCreateTimestamp());
assertEquals(MessageType.BINARY, verifyMessage1.getMessageType());
assertEquals(message3.getSequenceNumber(), verifyMessage3.getSequenceNumber());
assertArrayEquals(message3.getMessage(), verifyMessage3.getMessage());
Message verifyMessage4 = MessageSerialization.deserializeMessage(dataInputStream);
assertFalse(verifyMessage4.isSetPartitionKey());
assertFalse(verifyMessage4.isSetSequenceNumber());
assertEquals(message4.getCreateTimestamp(), verifyMessage4.getCreateTimestamp());
assertEquals(MessageType.BINARY, verifyMessage1.getMessageType());
assertArrayEquals(message4.getMessage(), verifyMessage4.getMessage());
}
}