package com.alibaba.rocketmq.namesrv.topic;
import static com.alibaba.rocketmq.namesrv.DataUtils.create;
import static com.alibaba.rocketmq.namesrv.DataUtils.createAddr;
import static com.alibaba.rocketmq.namesrv.DataUtils.createExpect;
import static com.alibaba.rocketmq.namesrv.DataUtils.createQueueData;
import static com.alibaba.rocketmq.namesrv.DataUtils.createTopic;
import static com.alibaba.rocketmq.namesrv.common.MergeResult.MERGE_INVALID;
import static com.alibaba.rocketmq.namesrv.common.MergeResult.SYS_ERROR;
import static com.alibaba.rocketmq.remoting.protocol.RemotingProtos.ResponseCode.SUCCESS_VALUE;
import static org.easymock.EasyMock.anyLong;
import static org.easymock.EasyMock.anyObject;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Assert;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.alibaba.rocketmq.common.namesrv.NamesrvConfig;
import com.alibaba.rocketmq.common.namesrv.TopicRuntimeData;
import com.alibaba.rocketmq.common.protocol.route.QueueData;
import com.alibaba.rocketmq.common.protocol.route.TopicRouteData;
import com.alibaba.rocketmq.namesrv.DataUtils;
import com.alibaba.rocketmq.remoting.common.RemotingHelper;
import com.alibaba.rocketmq.remoting.protocol.RemotingCommand;
import com.alibaba.rocketmq.remoting.protocol.RemotingProtos.ResponseCode;
/**
* @auther lansheng.zj@taobao.com
*/
@RunWith(PowerMockRunner.class)
@PowerMockIgnore("com.alibaba.rocketmq.common.MixAll")
@PrepareForTest({ RemotingHelper.class })
public class DefaultTopicRuntimeDataManagerTest {
private DefaultTopicRuntimeDataManager dataManager;
@Before
public void init() {
NamesrvConfig namesrvConfig = new NamesrvConfig();
namesrvConfig.setNamesrvAddr("10.232.133.1:9876;10.232.133.2:9876;");
dataManager = new DefaultTopicRuntimeDataManager(namesrvConfig);
dataManager.init();
}
@Test
public void testMerge() throws Exception {
TopicRuntimeData expected = createExpect();
int code = dataManager.merge(expected);
TopicRuntimeData topicRuntimeData = DataUtils.getField(dataManager, TopicRuntimeData.class, "topicData");
Assert.assertTrue(MERGE_INVALID != code);
Assert.assertTrue(SYS_ERROR != code);
Assert.assertTrue(topicRuntimeData.equals(expected));
}
@Test
public void testInit() throws Exception {
TopicRuntimeData expected = createExpect();
NamesrvConfig namesrvConfig = new NamesrvConfig();
namesrvConfig.setNamesrvAddr("10.232.133.1:9876;10.232.133.2:9876;");
DefaultTopicRuntimeDataManager dataManager = new DefaultTopicRuntimeDataManager(namesrvConfig);
boolean success = dataManager.init();
TopicRuntimeData topicRuntimeData = DataUtils.getField(dataManager, TopicRuntimeData.class, "topicData");
Assert.assertTrue(success);
Assert.assertTrue(topicRuntimeData.equals(expected));
}
@Test
public void testGetRouteInfoByTopic() throws Exception {
String topic = "topic-1";
DataUtils.hackField(dataManager, create(), "topicData");
RemotingCommand response = dataManager.getRouteInfoByTopic(topic);
Assert.assertTrue(response.getCode() == ResponseCode.SUCCESS_VALUE);
TopicRouteData topicRouteData = TopicRouteData.decode(response.getBody());
Assert.assertTrue("topic.num.topic-1=105:4;106:4".equals(topicRouteData.getOrderTopicConf()));
}
@Test
public void testGetTopicRuntimeData() throws Exception {
DataUtils.hackField(dataManager, DataUtils.createExpect(), "topicData");
RemotingCommand response = dataManager.getTopicRuntimeData();
Assert.assertTrue(response.getCode() == SUCCESS_VALUE);
TopicRuntimeData data = TopicRuntimeData.decode(response.getBody());
TopicRuntimeData topicRuntimeData = DataUtils.getField(dataManager, TopicRuntimeData.class, "topicData");
Assert.assertTrue(topicRuntimeData.equals(data));
}
@Test
public void testRegisterBroker() throws Exception {
RemotingCommand mockResponse = RemotingCommand.createResponseCommand(null);
mockResponse.setCode(SUCCESS_VALUE);
PowerMock.mockStatic(RemotingHelper.class);
EasyMock
.expect(
RemotingHelper.invokeSync(anyObject(String.class), anyObject(RemotingCommand.class), anyLong()))
.andReturn(mockResponse).anyTimes();
PowerMock.replay(RemotingHelper.class);
String addr = createAddr();
RemotingCommand response = dataManager.registerBroker(addr);
TopicRuntimeData topicRuntimeData = DataUtils.getField(dataManager, TopicRuntimeData.class, "topicData");
Assert.assertTrue(response.getCode() == SUCCESS_VALUE);
Assert.assertTrue(topicRuntimeData.getBrokerList().contains(addr));
}
@Test
public void testRegisterOrderTopic() throws Exception {
RemotingCommand mockResponse = RemotingCommand.createResponseCommand(null);
mockResponse.setCode(SUCCESS_VALUE);
PowerMock.mockStatic(RemotingHelper.class);
EasyMock
.expect(
RemotingHelper.invokeSync(anyObject(String.class), anyObject(RemotingCommand.class), anyLong()))
.andReturn(mockResponse).anyTimes();
PowerMock.replay(RemotingHelper.class);
RemotingCommand response = dataManager.registerOrderTopic("topic-100", "105:4;106:4");
TopicRuntimeData topicRuntimeData = DataUtils.getField(dataManager, TopicRuntimeData.class, "topicData");
Assert.assertTrue(response.getCode() == SUCCESS_VALUE);
Assert.assertTrue("topic.num.topic-100=105:4;106:4".equals(topicRuntimeData
.getOrderConfByTopic("topic-100")));
}
@Test
public void testMergeQueueData() {
boolean success = dataManager.mergeBrokerData("broker-100", 0L, createAddr());
Assert.assertTrue(success);
}
@Test
public void testMergeBrokerData() throws Exception {
String topic = createTopic();
QueueData queueData = createQueueData();
Map<String, QueueData> map = new HashMap<String, QueueData>();
map.put(topic, queueData);
boolean success = dataManager.mergeQueueData(map);
TopicRuntimeData topicRuntimeData = DataUtils.getField(dataManager, TopicRuntimeData.class, "topicData");
Assert.assertTrue(topicRuntimeData.getTopicBrokers().get(topic).contains(queueData));
Assert.assertTrue(success);
success = dataManager.mergeQueueData(map);
Assert.assertTrue(topicRuntimeData.getTopicBrokers().get(topic).contains(queueData));
Assert.assertTrue(success);
}
@Test
public void testDoUnRegisterBroker() throws Exception {
String brokerName = "broker-1";
TopicRuntimeData data = DataUtils.create();
DataUtils.hackField(dataManager, data, "topicData");
boolean ret = dataManager.doUnRegisterBroker(brokerName);
Assert.assertTrue(ret);
}
@Test
public void testDoUnRegisterBrokerOne() throws Exception {
String brokerName = "broker-1";
TopicRuntimeData data = DataUtils.createOne();
DataUtils.hackField(dataManager, data, "topicData");
boolean ret = dataManager.doUnRegisterBroker(brokerName);
Assert.assertTrue(ret);
}
}