package com.taobao.metamorphosis.client.extension.spring;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.junit.Before;
import org.junit.Test;
import com.taobao.metamorphosis.client.MessageSessionFactory;
import com.taobao.metamorphosis.client.producer.MessageProducer;
import com.taobao.metamorphosis.client.producer.SendMessageCallback;
import com.taobao.metamorphosis.client.producer.SendResult;
import com.taobao.metamorphosis.exception.MetaClientException;
public class MetaqTemplateUnitTest {
private MetaqTemplate tempalte;
private MessageSessionFactory sessionFactory;
private MessageProducer producer;
private IMocksControl control;
private JavaSerializationMessageBodyConverter messageBodyConverter;
@Before
public void setUp() {
this.control = EasyMock.createControl();
this.sessionFactory = this.control.createMock(MessageSessionFactory.class);
this.producer = this.control.createMock(MessageProducer.class);
this.tempalte = new MetaqTemplate();
this.messageBodyConverter = new JavaSerializationMessageBodyConverter();
this.tempalte.setMessageBodyConverter(this.messageBodyConverter);
this.tempalte.setMessageSessionFactory(this.sessionFactory);
}
@Test
public void testSendMsg() throws Exception {
EasyMock.expect(this.sessionFactory.createProducer()).andReturn(this.producer);
this.producer.publish("test");
EasyMock.expectLastCall();
MessageBuilder builder = MessageBuilder.withTopic("test").withBody("hello world");
SendResult rt = new SendResult(true, null, 0, null);
EasyMock.expect(this.producer.sendMessage(builder.build(this.messageBodyConverter))).andReturn(rt);
this.control.replay();
assertSame(rt, this.tempalte.send(builder));
this.control.verify();
}
@Test
public void testSendMsgTwice() throws Exception {
EasyMock.expect(this.sessionFactory.createProducer()).andReturn(this.producer);
this.producer.publish("test");
EasyMock.expectLastCall();
MessageBuilder builder = MessageBuilder.withTopic("test").withBody("hello world");
SendResult rt = new SendResult(true, null, 0, null);
EasyMock.expect(this.producer.sendMessage(builder.build(this.messageBodyConverter))).andReturn(rt).times(2);
this.control.replay();
assertSame(rt, this.tempalte.send(builder));
assertSame(rt, this.tempalte.send(builder));
this.control.verify();
}
@Test
public void testSendMsgThrowException() throws Exception {
EasyMock.expect(this.sessionFactory.createProducer()).andReturn(this.producer);
this.producer.publish("test");
EasyMock.expectLastCall();
MessageBuilder builder = MessageBuilder.withTopic("test").withBody("hello world");
SendResult rt = new SendResult(false, null, -1, "test");
EasyMock.expect(this.producer.sendMessage(builder.build(this.messageBodyConverter))).andThrow(
new MetaClientException("test"));
this.control.replay();
SendResult sent = this.tempalte.send(builder);
assertFalse(sent.isSuccess());
assertNotNull(sent.getErrorMessage());
assertEquals(-1, sent.getOffset());
assertNull(sent.getPartition());
this.control.verify();
}
@Test
public void testSendMsgWithCallback() throws Exception {
EasyMock.expect(this.sessionFactory.createProducer()).andReturn(this.producer);
this.producer.publish("test");
EasyMock.expectLastCall();
MessageBuilder builder = MessageBuilder.withTopic("test").withBody("hello world");
final SendResult rt = new SendResult(true, null, 0, null);
SendMessageCallback cb = new SendMessageCallback() {
@Override
public void onMessageSent(SendResult result) {
assertSame(rt, result);
}
@Override
public void onException(Throwable e) {
fail();
}
};
this.producer.sendMessage(builder.build(this.messageBodyConverter), cb);
EasyMock.expectLastCall();
this.control.replay();
this.tempalte.send(builder, cb);
this.control.verify();
}
@Test
public void testShareProducer() {
this.tempalte.setShareProducer(true);
EasyMock.expect(this.sessionFactory.createProducer()).andReturn(this.producer);
this.producer.publish("test");
EasyMock.expectLastCall().times(2);
this.producer.publish("topic");
EasyMock.expectLastCall().times(3);
this.control.replay();
assertSame(this.producer, this.tempalte.getOrCreateProducer("test"));
assertSame(this.producer, this.tempalte.getOrCreateProducer("test"));
assertSame(this.producer, this.tempalte.getOrCreateProducer("topic"));
assertSame(this.producer, this.tempalte.getOrCreateProducer("topic"));
assertSame(this.producer, this.tempalte.getOrCreateProducer("topic"));
this.control.verify();
}
@Test
public void testDestroy() throws Exception {
EasyMock.expect(this.sessionFactory.createProducer()).andReturn(this.producer);
this.producer.publish("test");
EasyMock.expectLastCall();
this.producer.shutdown();
EasyMock.expectLastCall();
this.control.replay();
assertSame(this.producer, this.tempalte.getOrCreateProducer("test"));
this.tempalte.destroy();
this.control.verify();
}
}