/*
* @author yubao.fyb@taoboa.com
* @version $id$
*/
package com.alibaba.rocketmq.client.consumer.loadbalance;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.alibaba.rocketmq.client.consumer.AllocateMessageQueueStrategy;
import com.alibaba.rocketmq.client.consumer.rebalance.AllocateMessageQueueAveragely;
import com.alibaba.rocketmq.common.message.MessageQueue;
/**
* @author yubao.fyb@alibaba-inc.com created on 2013-07-03 16:24
*/
public class AllocateMessageQueueAveragelyTest {
private AllocateMessageQueueStrategy allocateMessageQueueAveragely;
private String currentCID;
private String topic;
private List<MessageQueue> messageQueueList;
private List<String> consumerIdList;
public void createMessageQueueList(int size) {
messageQueueList = new ArrayList<MessageQueue>(size);
for (int i = 0; i < size; i++) {
MessageQueue mq = new MessageQueue(topic, "brokerName", i);
messageQueueList.add(mq);
}
}
public void createConsumerIdList(int size) {
consumerIdList = new ArrayList<String>(size);
for (int i = 0; i < size; i++) {
consumerIdList.add(String.valueOf(i));
}
}
@Before
public void init() {
allocateMessageQueueAveragely = new AllocateMessageQueueAveragely();
topic = "topic_test";
}
@Test
public void testConsumer1() { // consumerList大小为1
currentCID = "0";
createConsumerIdList(1);
createMessageQueueList(5);
List<MessageQueue> result =
allocateMessageQueueAveragely.allocate(currentCID, messageQueueList, consumerIdList);
printMessageQueue(result, "testConsumer1");
Assert.assertEquals(result.size(), 5);
Assert.assertEquals(result.containsAll(getMessageQueueList()), true);
}
@Test
public void testConsumer2() { // consumerList大小为2
currentCID = "1";
createConsumerIdList(2);
createMessageQueueList(5);
List<MessageQueue> result =
allocateMessageQueueAveragely.allocate(currentCID, messageQueueList, consumerIdList);
printMessageQueue(result, "testConsumer2");
Assert.assertEquals(result.size(), 3);
Assert.assertEquals(result.containsAll(getMessageQueueList().subList(2, 5)), true);
}
@Test
public void testConsumer3CurrentCID0() { // consumerList大小为3
currentCID = "0";
createConsumerIdList(3);
createMessageQueueList(5);
List<MessageQueue> result =
allocateMessageQueueAveragely.allocate(currentCID, messageQueueList, consumerIdList);
printMessageQueue(result, "testConsumer3CurrentCID0");
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(result.containsAll(getMessageQueueList().subList(0, 1)), true);
}
@Test
public void testConsumer3CurrentCID1() { // consumerList大小为3
currentCID = "1";
createConsumerIdList(3);
createMessageQueueList(5);
List<MessageQueue> result =
allocateMessageQueueAveragely.allocate(currentCID, messageQueueList, consumerIdList);
printMessageQueue(result, "testConsumer3CurrentCID1");
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(result.containsAll(getMessageQueueList().subList(1, 2)), true);
}
@Test
public void testConsumer3CurrentCID2() { // consumerList大小为3
currentCID = "2";
createConsumerIdList(3);
createMessageQueueList(5);
List<MessageQueue> result =
allocateMessageQueueAveragely.allocate(currentCID, messageQueueList, consumerIdList);
printMessageQueue(result, "testConsumer3CurrentCID2");
Assert.assertEquals(result.size(), 3);
Assert.assertEquals(result.containsAll(getMessageQueueList().subList(2, 5)), true);
}
@Test
public void testConsumer4() { // consumerList大小为4
currentCID = "1";
createConsumerIdList(4);
createMessageQueueList(5);
List<MessageQueue> result =
allocateMessageQueueAveragely.allocate(currentCID, messageQueueList, consumerIdList);
printMessageQueue(result, "testConsumer4");
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(result.containsAll(getMessageQueueList().subList(1, 2)), true);
}
@Test
public void testConsumer5() { // consumerList大小为5
currentCID = "1";
createConsumerIdList(5);
createMessageQueueList(5);
List<MessageQueue> result =
allocateMessageQueueAveragely.allocate(currentCID, messageQueueList, consumerIdList);
printMessageQueue(result, "testConsumer5");
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(result.containsAll(getMessageQueueList().subList(1, 2)), true);
}
@Test
public void testConsumer6() { // consumerList大小为6
currentCID = "1";
createConsumerIdList(2);
createMessageQueueList(6);
List<MessageQueue> result =
allocateMessageQueueAveragely.allocate(currentCID, messageQueueList, consumerIdList);
printMessageQueue(result, "testConsumer");
Assert.assertEquals(result.size(), 3);
Assert.assertEquals(result.containsAll(getMessageQueueList().subList(3, 6)), true);
}
@Test
public void testCurrentCIDNotExists() { // CurrentCID不存在
currentCID = String.valueOf(Integer.MAX_VALUE);
createConsumerIdList(2);
createMessageQueueList(6);
List<MessageQueue> result =
allocateMessageQueueAveragely.allocate(currentCID, messageQueueList, consumerIdList);
printMessageQueue(result, "testCurrentCIDNotExists");
Assert.assertEquals(result.size(), 0);
}
@Test(expected = IllegalArgumentException.class)
public void testCurrentCIDIllegalArgument() { // currentCID是空
createConsumerIdList(2);
createMessageQueueList(6);
allocateMessageQueueAveragely.allocate("", getMessageQueueList(), getConsumerIdList());
}
@Test(expected = IllegalArgumentException.class)
public void testMessageQueueIllegalArgument() { // MessageQueue为空
currentCID = "0";
createConsumerIdList(2);
allocateMessageQueueAveragely.allocate(currentCID, null, getConsumerIdList());
}
@Test(expected = IllegalArgumentException.class)
public void testConsumerIdIllegalArgument() { // ConsumerIdList为空
currentCID = "0";
createMessageQueueList(6);
allocateMessageQueueAveragely.allocate(currentCID, getMessageQueueList(), null);
}
public List<MessageQueue> getMessageQueueList() {
return messageQueueList;
}
public void setMessageQueueList(List<MessageQueue> messageQueueList) {
this.messageQueueList = messageQueueList;
}
public List<String> getConsumerIdList() {
return consumerIdList;
}
public void setConsumerIdList(List<String> consumerIdList) {
this.consumerIdList = consumerIdList;
}
public void printMessageQueue(List<MessageQueue> messageQueueList, String name) {
if (messageQueueList == null || messageQueueList.size() < 1)
return;
System.out.println(name + ".......................................start");
for (MessageQueue messageQueue : messageQueueList) {
System.out.println(messageQueue);
}
System.out.println(name + ".......................................end");
}
@Test
public void testAllocate() {
AllocateMessageQueueAveragely allocateMessageQueueAveragely = new AllocateMessageQueueAveragely();
String topic = "topic_test";
String currentCID = "CID";
int queueSize = 19;
int consumerSize = 10;
List<MessageQueue> mqAll = new ArrayList<MessageQueue>();
for (int i = 0; i < queueSize; i++) {
MessageQueue mq = new MessageQueue(topic, "brokerName", i);
mqAll.add(mq);
}
List<String> cidAll = new ArrayList<String>();
for (int j = 0; j < consumerSize; j++) {
cidAll.add("CID" + j);
}
System.out.println(mqAll.toString());
System.out.println(cidAll.toString());
for (int i = 0; i < consumerSize; i++) {
List<MessageQueue> rs = allocateMessageQueueAveragely.allocate(currentCID + i, mqAll, cidAll);
System.out.println("rs[" + currentCID + i + "]:" + rs.toString());
}
}
}