/**
* Copyright 2015, Xiaomi.
* All rights reserved.
* Author: xiajun@xiaomi.com
*/
package com.xiaomi.infra.galaxy.talos.client.compression;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.xiaomi.infra.galaxy.talos.thrift.Message;
import com.xiaomi.infra.galaxy.talos.thrift.MessageAndOffset;
import com.xiaomi.infra.galaxy.talos.thrift.MessageBlock;
import com.xiaomi.infra.galaxy.talos.thrift.MessageCompressionType;
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;
import static org.junit.Assert.assertTrue;
public class CompressionTest {
private static final Logger LOG = LoggerFactory.getLogger(CompressionTest.class);
private List<Message> messageList;
@Before
public void setUp() throws Exception {
messageList = new ArrayList<Message>(100);
for (int i = 1; i <= 100; ++i) {
Message message = new Message();
message.setCreateTimestamp(System.currentTimeMillis());
message.setPartitionKey(String.valueOf(i));
message.setMessageType(MessageType.BINARY);
// set sequence number;
if (i % 2 == 0) {
message.setSequenceNumber(String.valueOf(i));
} else {
message.setSequenceNumber(String.valueOf(i * 200));
}
// set message data;
byte[] data = new byte[i];
for (int index = 0; index < i; ++index) {
data[index] = (byte)i;
}
message.setMessage(data);
messageList.add(message);
}
}
@After
public void tearDown() throws Exception {
}
@Test
public void testNoCompression() throws Exception {
long unHandledMessageNumber = 117;
MessageBlock messageBlock = Compression.compress(messageList, MessageCompressionType.NONE);
assertEquals(MessageCompressionType.NONE, messageBlock.getCompressionType());
assertEquals(messageList.size(), messageBlock.getMessageNumber());
assertEquals(messageList.size(), messageBlock.getCreateTimestampListSize());
// verify message createTimestamp;
for (int index = 0; index < messageList.size(); ++index) {
assertEquals((Long)messageList.get(index).getCreateTimestamp(), messageBlock.getCreateTimestampList().get(index));
}
long startOffset = 1234;
long appendTimestamp = 1110000;
messageBlock.setStartMessageOffset(startOffset);
messageBlock.setAppendTimestamp(appendTimestamp);
LOG.info("CompressionType: None, message BlockSize: " + messageBlock.getMessageBlock().length);
// verify message;
List<MessageAndOffset> verifyMessageList = Compression.decompress(messageBlock, unHandledMessageNumber);
assertEquals(messageList.size(), verifyMessageList.size());
for (int index = 0; index < messageList.size(); ++index) {
Message message = messageList.get(index);
Message verifyMessage = verifyMessageList.get(index).getMessage();
assertEquals(message.getPartitionKey(), verifyMessage.getPartitionKey());
assertEquals(message.getCreateTimestamp(), verifyMessage.getCreateTimestamp());
assertEquals(appendTimestamp, verifyMessage.getAppendTimestamp());
assertEquals(message.getSequenceNumber(), verifyMessage.getSequenceNumber());
assertArrayEquals(message.getMessage(), verifyMessage.getMessage());
assertEquals(startOffset + index, verifyMessageList.get(index).getMessageOffset());
assertTrue(verifyMessageList.get(index).getUnHandledMessageNumber() ==
(unHandledMessageNumber + messageList.size() - 1 - index));
}
}
@Test
public void testSnappy() throws Exception {
MessageBlock messageBlock = Compression.compress(messageList, MessageCompressionType.SNAPPY);
assertEquals(MessageCompressionType.SNAPPY, messageBlock.getCompressionType());
assertEquals(messageList.size(), messageBlock.getMessageNumber());
assertEquals(messageList.size(), messageBlock.getCreateTimestampListSize());
// verify message createTimestamp;
for (int index = 0; index < messageList.size(); ++index) {
assertEquals((Long)messageList.get(index).getCreateTimestamp(), messageBlock.getCreateTimestampList().get(index));
}
long startOffset = 1234;
long appendTimestamp = 1110000;
long unHandledMessageNumber = 117;
messageBlock.setStartMessageOffset(startOffset);
messageBlock.setAppendTimestamp(appendTimestamp);
LOG.info("CompressionType: Snappy, message BlockSize: " + messageBlock.getMessageBlock().length);
List<MessageAndOffset> verifyMessageList = Compression.decompress(messageBlock, unHandledMessageNumber);
assertEquals(messageList.size(), verifyMessageList.size());
for (int index = 0; index < messageList.size(); ++index) {
Message message = messageList.get(index);
Message verifyMessage = verifyMessageList.get(index).getMessage();
assertEquals(message.getPartitionKey(), verifyMessage.getPartitionKey());
assertEquals(message.getCreateTimestamp(), verifyMessage.getCreateTimestamp());
assertEquals(appendTimestamp, verifyMessage.getAppendTimestamp());
assertEquals(message.getSequenceNumber(), verifyMessage.getSequenceNumber());
assertArrayEquals(message.getMessage(), verifyMessage.getMessage());
assertEquals(startOffset + index, verifyMessageList.get(index).getMessageOffset());
assertTrue(verifyMessageList.get(index).getUnHandledMessageNumber() ==
(unHandledMessageNumber + messageList.size() - 1 - index));
}
}
@Test
public void testGzip() throws Exception {
MessageBlock messageBlock = Compression.compress(messageList, MessageCompressionType.GZIP);
assertEquals(MessageCompressionType.GZIP, messageBlock.getCompressionType());
assertEquals(messageList.size(), messageBlock.getMessageNumber());
assertEquals(messageList.size(), messageBlock.getCreateTimestampListSize());
// verify message createTimestamp;
for (int index = 0; index < messageList.size(); ++index) {
assertEquals((Long)messageList.get(index).getCreateTimestamp(), messageBlock.getCreateTimestampList().get(index));
}
long startOffset = 1234;
long appendTimestamp = 1110000;
long unHandledMessageNumber = 117;
messageBlock.setStartMessageOffset(startOffset);
messageBlock.setAppendTimestamp(appendTimestamp);
LOG.info("CompressionType: Gzip, message BlockSize: " + messageBlock.getMessageBlock().length);
List<MessageAndOffset> verifyMessageList = Compression.decompress(messageBlock, unHandledMessageNumber);
assertEquals(messageList.size(), verifyMessageList.size());
for (int index = 0; index < messageList.size(); ++index) {
Message message = messageList.get(index);
Message verifyMessage = verifyMessageList.get(index).getMessage();
assertEquals(message.getPartitionKey(), verifyMessage.getPartitionKey());
assertEquals(message.getCreateTimestamp(), verifyMessage.getCreateTimestamp());
assertEquals(appendTimestamp, verifyMessage.getAppendTimestamp());
assertEquals(message.getSequenceNumber(), verifyMessage.getSequenceNumber());
assertArrayEquals(message.getMessage(), verifyMessage.getMessage());
assertEquals(startOffset + index, verifyMessageList.get(index).getMessageOffset());
assertTrue(verifyMessageList.get(index).getUnHandledMessageNumber() ==
(unHandledMessageNumber + messageList.size() - 1 - index));
}
}
@Test
public void testList() throws Exception {
MessageBlock messageBlock1 = Compression.compress(messageList, MessageCompressionType.NONE);
MessageBlock messageBlock2 = Compression.compress(messageList, MessageCompressionType.SNAPPY);
MessageBlock messageBlock3 = Compression.compress(messageList, MessageCompressionType.GZIP);
long startOffset = 1234;
long appendTimestamp = 1110000;
messageBlock1.setStartMessageOffset(startOffset);
messageBlock1.setAppendTimestamp(appendTimestamp);
messageBlock2.setStartMessageOffset(messageBlock1.getStartMessageOffset() + messageBlock1.getMessageNumber());
messageBlock2.setAppendTimestamp(appendTimestamp);
messageBlock3.setStartMessageOffset(messageBlock2.getStartMessageOffset() + messageBlock2.getMessageNumber() );
messageBlock3.setAppendTimestamp(appendTimestamp);
List<MessageBlock> messageBlockList = new ArrayList<MessageBlock>(3);
messageBlockList.add(messageBlock1);
messageBlockList.add(messageBlock2);
messageBlockList.add(messageBlock3);
long unHandledMessageNumber = 117;
List<MessageAndOffset> messageAndOffsetList = Compression.decompress(messageBlockList, unHandledMessageNumber);
assertEquals(messageList.size() * 3, messageAndOffsetList.size());
for (int index = 0; index < messageAndOffsetList.size(); ++index) {
Message message = messageList.get(index % messageList.size());
Message verifyMessage = messageAndOffsetList.get(index).getMessage();
assertEquals(message.getPartitionKey(), verifyMessage.getPartitionKey());
assertEquals(message.getCreateTimestamp(), verifyMessage.getCreateTimestamp());
assertEquals(appendTimestamp, verifyMessage.getAppendTimestamp());
assertEquals(message.getSequenceNumber(), verifyMessage.getSequenceNumber());
assertArrayEquals(message.getMessage(), verifyMessage.getMessage());
assertEquals(startOffset + index, messageAndOffsetList.get(index).getMessageOffset());
assertTrue(messageAndOffsetList.get(index).getUnHandledMessageNumber() ==
(unHandledMessageNumber + messageAndOffsetList.size() - 1 - index));
}
}
}