/**
* Copyright 2015, Xiaomi.
* All rights reserved.
* Author: yongxing@xiaomi.com
*/
package com.xiaomi.infra.galaxy.talos.consumer;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import libthrift091.TException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mockito;
import com.xiaomi.infra.galaxy.talos.client.compression.Compression;
import com.xiaomi.infra.galaxy.talos.producer.TalosProducerConfig;
import com.xiaomi.infra.galaxy.talos.thrift.GetMessageRequest;
import com.xiaomi.infra.galaxy.talos.thrift.GetMessageResponse;
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.MessageOffset;
import com.xiaomi.infra.galaxy.talos.thrift.MessageService;
import com.xiaomi.infra.galaxy.talos.thrift.MessageType;
import com.xiaomi.infra.galaxy.talos.thrift.TopicAndPartition;
import com.xiaomi.infra.galaxy.talos.thrift.TopicTalosResourceName;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.when;
public class SimpleConsumerTest {
private static final String topicName = "MyTopic";
private static final String resourceName = "12345#MyTopic#34595fkdiso456i390";
private static final int partitionId = 7;
private static final long startOffset = 0;
private static TopicAndPartition topicAndPartition;
private static TalosProducerConfig producerConfig;
private static TalosConsumerConfig consumerConfig;
private static MessageService.Iface messageClientMock;
private static List<Message> messageList;
private static List<MessageAndOffset> messageAndOffsetList;
private static SimpleConsumer simpleConsumer;
@Before
public void setUp() {
Properties properties = new Properties();
properties.setProperty("galaxy.talos.service.endpoint", "testUrl");
producerConfig = new TalosProducerConfig(properties);
consumerConfig = new TalosConsumerConfig(properties);
topicAndPartition = new TopicAndPartition(topicName,
new TopicTalosResourceName(resourceName), partitionId);
messageClientMock = Mockito.mock(MessageService.Iface.class);
simpleConsumer = new SimpleConsumer(consumerConfig,
topicAndPartition, messageClientMock);
messageList = new ArrayList<Message>();
messageAndOffsetList = new ArrayList<MessageAndOffset>();
}
@After
public void tearDown() {
}
@Test (expected = IllegalArgumentException.class)
public void testClientPrefixIllegal() throws Exception {
SimpleConsumer simpleConsumer1 = new SimpleConsumer(consumerConfig,
topicAndPartition, messageClientMock, "prefix#illegal");
}
@Test
public void testGetTopicTalosResourcename() {
assertEquals(new TopicTalosResourceName(resourceName),
simpleConsumer.getTopicTalosResourceName());
}
@Test
public void testGetPartitionId() {
assertEquals(partitionId, simpleConsumer.getPartitionId());
}
@Test
public void testGetTopicAndPartition() {
assertEquals(topicAndPartition, simpleConsumer.getTopicAndPartition());
}
@Test
public void testCheckStartOffset() throws TException, IOException {
Message message1 = new Message(ByteBuffer.wrap("message1".getBytes()));
Message message2 = new Message(ByteBuffer.wrap("message2".getBytes()));
Message message3 = new Message(ByteBuffer.wrap("message3".getBytes()));
message1.setCreateTimestamp(System.currentTimeMillis());
message2.setCreateTimestamp(System.currentTimeMillis());
message3.setCreateTimestamp(System.currentTimeMillis());
message1.setMessageType(MessageType.BINARY);
message2.setMessageType(MessageType.BINARY);
message3.setMessageType(MessageType.BINARY);
messageList.add(message1);
messageList.add(message2);
messageList.add(message3);
MessageBlock messageBlock = Compression.compress(messageList, producerConfig.getCompressionType());
messageBlock.setStartMessageOffset(startOffset);
List<MessageBlock> messageBlockList = new ArrayList<MessageBlock>(1);
messageBlockList.add(messageBlock);
MessageAndOffset messageAndOffset1 = new MessageAndOffset(message1, startOffset);
MessageAndOffset messageAndOffset2 = new MessageAndOffset(message2, startOffset + 1);
MessageAndOffset messageAndOffset3 = new MessageAndOffset(message3, startOffset + 2);
messageAndOffsetList.add(messageAndOffset1);
messageAndOffsetList.add(messageAndOffset2);
messageAndOffsetList.add(messageAndOffset3);
GetMessageResponse response = new GetMessageResponse(messageBlockList, 3,
"testCheckStartOffset");
when(messageClientMock.getMessage(any(GetMessageRequest.class)))
.thenReturn(response);
simpleConsumer.fetchMessage(MessageOffset.START_OFFSET.getValue(), 100);
simpleConsumer.fetchMessage(MessageOffset.LATEST_OFFSET.getValue(), 100);
simpleConsumer.fetchMessage(0, 100);
simpleConsumer.fetchMessage(2, 100);
simpleConsumer.fetchMessage(-1, 100);
simpleConsumer.fetchMessage(-2, 100);
try {
simpleConsumer.fetchMessage(-3, 100);
assertTrue("test check startOffset validity error", false);
} catch (Exception e) {
assertTrue(e instanceof IllegalArgumentException);
}
}
@Test
public void testFetchMessage() throws Exception {
Message message1 = new Message(ByteBuffer.wrap("message1".getBytes()));
Message message2 = new Message(ByteBuffer.wrap("message2".getBytes()));
Message message3 = new Message(ByteBuffer.wrap("message3".getBytes()));
message1.setCreateTimestamp(System.currentTimeMillis());
message2.setCreateTimestamp(System.currentTimeMillis());
message3.setCreateTimestamp(System.currentTimeMillis());
message1.setMessageType(MessageType.BINARY);
message2.setMessageType(MessageType.BINARY);
message3.setMessageType(MessageType.BINARY);
messageList.add(message1);
messageList.add(message2);
messageList.add(message3);
MessageBlock messageBlock = Compression.compress(messageList, producerConfig.getCompressionType());
messageBlock.setStartMessageOffset(startOffset);
List<MessageBlock> messageBlockList = new ArrayList<MessageBlock>(1);
messageBlockList.add(messageBlock);
MessageAndOffset messageAndOffset1 = new MessageAndOffset(message1, startOffset);
MessageAndOffset messageAndOffset2 = new MessageAndOffset(message2, startOffset + 1);
MessageAndOffset messageAndOffset3 = new MessageAndOffset(message3, startOffset + 2);
messageAndOffsetList.add(messageAndOffset1);
messageAndOffsetList.add(messageAndOffset2);
messageAndOffsetList.add(messageAndOffset3);
long unHandledNumber = 117;
GetMessageResponse response = new GetMessageResponse(messageBlockList, 3,
"testFetchMessageSequenceId").setUnHandledMessageNumber(unHandledNumber);
when(messageClientMock.getMessage(any(GetMessageRequest.class)))
.thenReturn(response);
List<MessageAndOffset> msgList = simpleConsumer.fetchMessage(startOffset);
for (int i = 0; i < msgList.size(); ++i) {
assertEquals(messageAndOffsetList.get(i).getMessage(), msgList.get(i).getMessage());
assertEquals(messageAndOffsetList.get(i).getMessageOffset(), msgList.get(i).getMessageOffset());
assertEquals(msgList.get(i).getUnHandledMessageNumber(), unHandledNumber + msgList.size() - 1 - i);
}
try {
simpleConsumer.fetchMessage(startOffset, 3000);
assertTrue("test fetchMessage illegal maxFetchNumber error", false);
} catch (Exception e) {
assertTrue(e instanceof IllegalArgumentException);
}
InOrder inOrder = inOrder(messageClientMock);
inOrder.verify(messageClientMock).getMessage(any(GetMessageRequest.class));
}
@Test
public void testFetchMessageWithMiddleOffset() throws Exception {
Message message1 = new Message(ByteBuffer.wrap("message1".getBytes()));
Message message2 = new Message(ByteBuffer.wrap("message2".getBytes()));
Message message3 = new Message(ByteBuffer.wrap("message3".getBytes()));
message1.setCreateTimestamp(System.currentTimeMillis());
message2.setCreateTimestamp(System.currentTimeMillis());
message3.setCreateTimestamp(System.currentTimeMillis());
message1.setMessageType(MessageType.BINARY);
message2.setMessageType(MessageType.BINARY);
message3.setMessageType(MessageType.BINARY);
messageList.add(message1);
messageList.add(message2);
messageList.add(message3);
MessageBlock messageBlock = Compression.compress(messageList, producerConfig.getCompressionType());
messageBlock.setStartMessageOffset(startOffset);
List<MessageBlock> messageBlockList = new ArrayList<MessageBlock>(1);
messageBlockList.add(messageBlock);
MessageAndOffset messageAndOffset2 = new MessageAndOffset(message2, startOffset + 1);
MessageAndOffset messageAndOffset3 = new MessageAndOffset(message3, startOffset + 2);
messageAndOffsetList.add(messageAndOffset2);
messageAndOffsetList.add(messageAndOffset3);
long unHandledNumber = 117;
GetMessageResponse response = new GetMessageResponse(messageBlockList, 3,
"testFetchMessageSequenceId").setUnHandledMessageNumber(unHandledNumber);
when(messageClientMock.getMessage(any(GetMessageRequest.class)))
.thenReturn(response);
List<MessageAndOffset> msgList = simpleConsumer.fetchMessage(startOffset + 1);
for (int i = 0; i < msgList.size(); ++i) {
assertEquals(messageAndOffsetList.get(i).getMessage(), msgList.get(i).getMessage());
assertEquals(messageAndOffsetList.get(i).getMessageOffset(), msgList.get(i).getMessageOffset());
assertEquals(msgList.get(i).getUnHandledMessageNumber(), unHandledNumber + msgList.size() - 1 - i);
}
try {
simpleConsumer.fetchMessage(startOffset, 3000);
assertTrue("test fetchMessage illegal maxFetchNumber error", false);
} catch (Exception e) {
assertTrue(e instanceof IllegalArgumentException);
}
InOrder inOrder = inOrder(messageClientMock);
inOrder.verify(messageClientMock).getMessage(any(GetMessageRequest.class));
}
}