/*
* (C) 2007-2012 Alibaba Group Holding Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* Authors:
* wuhua <wq163@163.com> , boyan <killme2008@gmail.com>
*/
package com.taobao.metamorphosis.client.extension.producer;
import java.util.concurrent.TimeUnit;
import org.easymock.classextension.EasyMock;
import org.easymock.classextension.IMocksControl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.taobao.gecko.core.util.OpaqueGenerator;
import com.taobao.gecko.service.exception.NotifyRemotingException;
import com.taobao.metamorphosis.Message;
import com.taobao.metamorphosis.client.MetaClientConfig;
import com.taobao.metamorphosis.client.MetaMessageSessionFactory;
import com.taobao.metamorphosis.client.RemotingClientWrapper;
import com.taobao.metamorphosis.client.extension.producer.AsyncMessageProducer.IgnoreMessageProcessor;
import com.taobao.metamorphosis.client.producer.PartitionSelector;
import com.taobao.metamorphosis.client.producer.ProducerZooKeeper;
import com.taobao.metamorphosis.client.producer.RoundRobinPartitionSelector;
import com.taobao.metamorphosis.cluster.Partition;
import com.taobao.metamorphosis.exception.MetaClientException;
/**
*
* @author ��
* @since 2011-12-29 ����2:31:03
*/
public class AsyncMetaMessageProducerUnitTest {
private AsyncMetaMessageProducer producer;
private ProducerZooKeeper producerZooKeeper;
private PartitionSelector partitionSelector;
private RemotingClientWrapper remotingClient;
private MetaMessageSessionFactory messageSessionFactory;
private IgnoreMessageProcessor processor;
private IMocksControl mocksControl;
private final String sessionId = "testSession";
@Before
public void setUp() throws Exception {
this.mocksControl = EasyMock.createControl();
this.producerZooKeeper = this.mocksControl.createMock(ProducerZooKeeper.class);
this.partitionSelector = new RoundRobinPartitionSelector();
this.remotingClient = this.mocksControl.createMock(RemotingClientWrapper.class);
this.messageSessionFactory = this.mocksControl.createMock(MetaMessageSessionFactory.class);
this.processor = this.mocksControl.createMock(IgnoreMessageProcessor.class);
this.producer =
new AsyncMetaMessageProducer(messageSessionFactory, this.remotingClient, this.partitionSelector,
this.producerZooKeeper, this.sessionId, 20000, processor);
OpaqueGenerator.resetOpaque();
}
@Test
public void testAsyncMetaMessageProducer() {
AsyncMetaMessageProducer producer =
new AsyncMetaMessageProducer(messageSessionFactory, this.remotingClient, this.partitionSelector,
this.producerZooKeeper, this.sessionId, 20000, processor);
Assert.assertTrue(producer.getIgnoreMessageProcessor() == processor);
EasyMock.expect(messageSessionFactory.getMetaClientConfig()).andReturn(new MetaClientConfig());
mocksControl.replay();
producer =
new AsyncMetaMessageProducer(messageSessionFactory, this.remotingClient, this.partitionSelector,
this.producerZooKeeper, this.sessionId, 20000, null);
Assert.assertTrue(producer.getIgnoreMessageProcessor() instanceof AsyncIgnoreMessageProcessor);
mocksControl.verify();
}
@Test
public void testAsyncSendMessageMessage() throws MetaClientException, NotifyRemotingException {
String topic = "test-topic";
Partition partition = new Partition(0, 0);
String serverUrl = "meta://127.0.0.1:8123";
Message message = new Message(topic, "test".getBytes());
EasyMock.resetToNice(remotingClient);
EasyMock.expect(producerZooKeeper.selectPartition(topic, message, partitionSelector)).andReturn(partition);
EasyMock.expect(producerZooKeeper.selectBroker(topic, partition)).andReturn(serverUrl);
OpaqueGenerator.resetOpaque();
mocksControl.replay();
producer.asyncSendMessage(message, 10000, TimeUnit.MILLISECONDS);
mocksControl.verify();
}
@Test
public void testAsyncSendMessageMessageLongTimeUnit_producerShutdown() throws MetaClientException {
Message message = new Message("test-topic", "test".getBytes());
messageSessionFactory.removeChild(producer);
EasyMock.expectLastCall();
EasyMock.replay();
producer.shutdown();
producer.asyncSendMessage(message, 10000, TimeUnit.MILLISECONDS);
EasyMock.verify();
}
@Test
public void testAsyncSendMessageMessageLongTimeUnit_InvalidMessage() throws MetaClientException {
producer.asyncSendMessage(new Message("", "test".getBytes()), 10000, TimeUnit.MILLISECONDS);
producer.asyncSendMessage(new Message(" ", "test".getBytes()), 10000, TimeUnit.MILLISECONDS);
producer.asyncSendMessage(new Message(null, "test".getBytes()), 10000, TimeUnit.MILLISECONDS);
}
@Test
public void testAsyncSendMessageMessageLongTimeUnit_MetaClientException() throws Exception {
String topic = "test-topic";
Message message = new Message(topic, "test".getBytes());
EasyMock.expect(producerZooKeeper.selectPartition(topic, message, partitionSelector)).andReturn(null);
EasyMock.expect(processor.handle(message)).andReturn(true);
mocksControl.replay();
producer.asyncSendMessage(message, 10000, TimeUnit.MILLISECONDS);
mocksControl.verify();
}
@Test
public void testSetIgnoreMessageProcessor() {
IgnoreMessageProcessor processor = new IgnoreMessageProcessor() {
@Override
public boolean handle(Message message) throws Exception {
return true;
}
};
producer.setIgnoreMessageProcessor(processor);
Assert.assertTrue(processor == producer.getIgnoreMessageProcessor());
}
@Test
public void testHandle() throws Exception {
String topic = "test-topic";
Partition partition = new Partition(0, 0);
String serverUrl = "meta://127.0.0.1:8123";
Message message = new Message(topic, "test".getBytes());
EasyMock.resetToNice(remotingClient);
EasyMock.expect(producerZooKeeper.selectPartition(topic, message, partitionSelector)).andReturn(partition);
EasyMock.expect(producerZooKeeper.selectBroker(topic, partition)).andReturn(serverUrl);
OpaqueGenerator.resetOpaque();
mocksControl.replay();
producer.handle(message);
mocksControl.verify();
}
}