package com.alibaba.rocketmq.namesrv.daemon;
import static com.alibaba.rocketmq.namesrv.DataUtils.createExpect;
import static com.alibaba.rocketmq.namesrv.DataUtils.createSpecific1;
import static com.alibaba.rocketmq.namesrv.DataUtils.createSpecific2;
import static com.alibaba.rocketmq.remoting.protocol.RemotingProtos.ResponseCode.SUCCESS_VALUE;
import static org.easymock.EasyMock.anyLong;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import junit.framework.Assert;
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.namesrv.DataUtils;
import com.alibaba.rocketmq.namesrv.common.Result;
import com.alibaba.rocketmq.namesrv.sync.FutureGroup;
import com.alibaba.rocketmq.namesrv.topic.DefaultTopicRuntimeDataManager;
import com.alibaba.rocketmq.remoting.common.RemotingHelper;
import com.alibaba.rocketmq.remoting.protocol.RemotingCommand;
/**
* @auther lansheng.zj@taobao.com
*/
@RunWith(PowerMockRunner.class)
@PowerMockIgnore("com.taobao.rocketmq.common.MixAll")
@PrepareForTest({ RemotingHelper.class })
public class NamesrvSyncTest {
@Test
public void testGroupCommit() throws Exception {
TopicRuntimeData expected = createSpecific1();
RemotingCommand response = RemotingCommand.createResponseCommand(null);
response.setCode(SUCCESS_VALUE);
response.setBody(expected.encode());
NamesrvConfig namesrvConf = new NamesrvConfig();
namesrvConf.setNamesrvAddr("10.12.12.11:9876;10.12.12.16:9876;");
DefaultTopicRuntimeDataManager topicRuntimeDataManager = new DefaultTopicRuntimeDataManager(namesrvConf);
NamesrvSync namesrvSync = new NamesrvSync(namesrvConf, topicRuntimeDataManager);
PowerMock.mockStatic(RemotingHelper.class);
expect(RemotingHelper.invokeSync((String) anyObject(), (RemotingCommand) anyObject(), anyLong()))
.andReturn(response);
PowerMock.replay(RemotingHelper.class);
FutureGroup<Object> futureGroup = namesrvSync.groupCommit();
Result result = futureGroup.await(namesrvConf.getGroupWaitTimeout());
TopicRuntimeData topicRuntimeData =
DataUtils.getField(topicRuntimeDataManager, TopicRuntimeData.class, "topicData");
Assert.assertTrue(result.isSuccess());
Assert.assertTrue(expected.equals(topicRuntimeData));
}
@Test
public void testGroupCommitMerge() throws Exception {
TopicRuntimeData expected = createExpect();
TopicRuntimeData specific1 = createSpecific1();
TopicRuntimeData specific2 = createSpecific2();
RemotingCommand response1 = RemotingCommand.createResponseCommand(null);
response1.setCode(SUCCESS_VALUE);
response1.setBody(specific1.encode());
RemotingCommand response2 = RemotingCommand.createResponseCommand(null);
response2.setCode(SUCCESS_VALUE);
response2.setBody(specific2.encode());
NamesrvConfig namesrvConf = new NamesrvConfig();
namesrvConf.setNamesrvAddr("addr1;addr2");
namesrvConf.setSyncTimeout(100L);
DefaultTopicRuntimeDataManager topicRuntimeDataManager = new DefaultTopicRuntimeDataManager(namesrvConf);
NamesrvSync namesrvSync = new NamesrvSync(namesrvConf, topicRuntimeDataManager);
PowerMock.mockStatic(RemotingHelper.class);
expect(
RemotingHelper.invokeSync(eq("addr1"), anyObject(RemotingCommand.class),
eq(namesrvConf.getSyncTimeout()))).andReturn(response1).anyTimes();
expect(
RemotingHelper.invokeSync(eq("addr2"), anyObject(RemotingCommand.class),
eq(namesrvConf.getSyncTimeout()))).andReturn(response2).anyTimes();
PowerMock.replay(RemotingHelper.class);
FutureGroup<Object> futureGroup = namesrvSync.groupCommit();
Result result = futureGroup.await(namesrvConf.getGroupWaitTimeout());
TopicRuntimeData topicRuntimeData =
DataUtils.getField(topicRuntimeDataManager, TopicRuntimeData.class, "topicData");
Assert.assertTrue(result.isSuccess());
Assert.assertTrue(expected.equals(topicRuntimeData));
}
}