/**
* Copyright 2015, Xiaomi.
* All rights reserved.
* Author: yongxing@xiaomi.com
*/
package com.xiaomi.infra.galaxy.talos.producer;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicLong;
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.thrift.GalaxyTalosException;
import com.xiaomi.infra.galaxy.talos.thrift.Message;
import com.xiaomi.infra.galaxy.talos.thrift.MessageService;
import com.xiaomi.infra.galaxy.talos.thrift.PutMessageRequest;
import com.xiaomi.infra.galaxy.talos.thrift.PutMessageResponse;
import com.xiaomi.infra.galaxy.talos.thrift.TopicAndPartition;
import com.xiaomi.infra.galaxy.talos.thrift.TopicTalosResourceName;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.times;
public class SimpleProducerTest {
private static final String topicName = "MyTopic";
private static final String resourceName = "12345#MyTopic#dfi34598dfj4";
private static final int partitionId = 7;
private static TalosProducerConfig producerConfig;
private static MessageService.Iface messageClientMock;
private static TopicAndPartition topicAndPartition;
private static List<Message> messageList;
private static SimpleProducer simpleProducer;
@Before
public void setUp() throws IOException {
Properties properties = new Properties();
properties.setProperty("galaxy.talos.service.endpoint", "testUrl");
producerConfig = new TalosProducerConfig(properties);
messageClientMock = Mockito.mock(MessageService.Iface.class);
topicAndPartition = new TopicAndPartition(topicName,
new TopicTalosResourceName(resourceName), partitionId);
Message message = new Message(ByteBuffer.wrap("hello world".getBytes()));
messageList = new ArrayList<Message>();
messageList.add(message);
simpleProducer = new SimpleProducer(producerConfig,
topicAndPartition, messageClientMock, new AtomicLong(1));
}
@After
public void tearDown() {
}
@Test (expected = RuntimeException.class)
public void testConfigWithoutServiceURI() throws Exception {
Properties properties = new Properties();
TalosProducerConfig producerConfig = new TalosProducerConfig(properties);
}
@Test (expected = RuntimeException.class)
public void testConfigWithFileNotFound() throws Exception {
TalosProducerConfig producerConfig = new TalosProducerConfig("test.file");
}
@Test
public void testPutMessage() throws TException {
doReturn(new PutMessageResponse()).when(messageClientMock).putMessage(
any(PutMessageRequest.class));
boolean putSuccess = simpleProducer.putMessage(messageList);
assertTrue(putSuccess);
assertTrue(simpleProducer.putMessage(new ArrayList<Message>()));
assertTrue(simpleProducer.putMessage(null));
InOrder inOrder = inOrder(messageClientMock);
inOrder.verify(messageClientMock, times(1)).putMessage(
any(PutMessageRequest.class));
inOrder.verifyNoMoreInteractions();
}
@Test (expected = IllegalArgumentException.class)
public void testTopicAndPartition() throws Exception {
TopicAndPartition topicAndPartition1 = new TopicAndPartition(
"CL777/" + topicName, new TopicTalosResourceName(resourceName),
partitionId);
SimpleProducer simpleProducer1 = new SimpleProducer(producerConfig,
topicAndPartition1, messageClientMock, new AtomicLong());
}
@Test
public void testPutMessageException() throws TException {
doThrow(new GalaxyTalosException()).doReturn(new PutMessageResponse())
.when(messageClientMock).putMessage(any(PutMessageRequest.class));
boolean putSuccess = simpleProducer.putMessage(messageList);
assertFalse(putSuccess);
while (!putSuccess) {
putSuccess = simpleProducer.putMessage(messageList);
assertTrue(putSuccess);
}
InOrder inOrder = inOrder(messageClientMock);
inOrder.verify(messageClientMock, times(2)).putMessage(
any(PutMessageRequest.class));
inOrder.verifyNoMoreInteractions();
}
}