package com.alibaba.rocketmq.namesrv.daemon; import static org.easymock.EasyMock.anyLong; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.eq; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import junit.framework.Assert; import org.apache.commons.io.IOUtils; import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; import com.alibaba.rocketmq.common.MixAll; import com.alibaba.rocketmq.common.TopicConfig; import com.alibaba.rocketmq.common.namesrv.NamesrvConfig; import com.alibaba.rocketmq.common.namesrv.TopicRuntimeData; import com.alibaba.rocketmq.common.protocol.header.namesrv.GetTopicResponseHeader; 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.RemotingClient; import com.alibaba.rocketmq.remoting.netty.NettyClientConfig; import com.alibaba.rocketmq.remoting.protocol.RemotingCommand; import com.alibaba.rocketmq.remoting.protocol.RemotingProtos.ResponseCode; /** * @auther lansheng.zj@taobao.com */ public class NamesrvClientTest { private RemotingClient remotingClient; @Before public void init() { remotingClient = EasyMock.createMock(RemotingClient.class); } @Test public void testGroupCommit() throws Exception { Map<String, TopicConfig> topicConfigTable = create(); String content = encode(topicConfigTable); RemotingCommand response1 = RemotingCommand.createResponseCommand(GetTopicResponseHeader.class); response1.setBody(content.getBytes(MixAll.DEFAULT_CHARSET)); GetTopicResponseHeader getTopicResponseHeader=(GetTopicResponseHeader)response1.getCustomHeader(); getTopicResponseHeader.setVersion("version"); getTopicResponseHeader.setBrokerName("broker-019"); getTopicResponseHeader.setBrokerId(0); getTopicResponseHeader.setCluster("cluster"); response1.setCode(ResponseCode.SUCCESS_VALUE); response1.setRemark(null); RemotingCommand response2 = RemotingCommand.createResponseCommand(GetTopicResponseHeader.class); response2.setBody(content.getBytes(MixAll.DEFAULT_CHARSET)); GetTopicResponseHeader getTopicResponseHeader2=(GetTopicResponseHeader)response2.getCustomHeader(); getTopicResponseHeader2.setVersion("version"); getTopicResponseHeader2.setBrokerName("broker-019"); getTopicResponseHeader2.setBrokerId(0); getTopicResponseHeader2.setCluster("cluster"); response2.setCode(ResponseCode.SUCCESS_VALUE); response2.setRemark(null); EasyMock .expect( remotingClient.invokeSync(eq("12.12.13.4:8123"), anyObject(RemotingCommand.class), anyLong())).andReturn(response1).anyTimes(); EasyMock .expect( remotingClient.invokeSync(eq("12.12.13.89:8123"), anyObject(RemotingCommand.class), anyLong())).andReturn(response2).anyTimes(); EasyMock.replay(remotingClient); NamesrvConfig namesrvConfig = new NamesrvConfig(); namesrvConfig.setNamesrvAddr("120.21.21.12:9876;120.21.21.11:9876;"); List<String> brokerList = new ArrayList<String>(); brokerList.add("12.12.13.4:8123"); brokerList.add("12.12.13.89:8123"); DefaultTopicRuntimeDataManager dataManager = new DefaultTopicRuntimeDataManager(namesrvConfig); TopicRuntimeData topicRuntimeData = DataUtils.getField(dataManager, TopicRuntimeData.class, "topicData"); topicRuntimeData.setBrokerList(brokerList); NettyClientConfig nettyClientConfig = new NettyClientConfig(); NamesrvClient namesrvClient = new NamesrvClient(namesrvConfig, nettyClientConfig, dataManager); DataUtils.hackField(namesrvClient, remotingClient, "remotingClient"); FutureGroup<Boolean> futureGroup = namesrvClient.groupCommit(); Result result = namesrvClient.pullSuccess(futureGroup); Assert.assertTrue(result.isSuccess()); Assert.assertTrue("12.12.13.4:8123".equals(topicRuntimeData.getBrokers().get("broker-019") .getBrokerAddrs().get(0L))); } private Map<String, TopicConfig> create() { Map<String, TopicConfig> topicConfigTable = new HashMap<String, TopicConfig>(1024); topicConfigTable.put("topic-909", new TopicConfig("topic-909", 4, 4, 4)); topicConfigTable.put("topic-910", new TopicConfig("topic-910", 4, 4, 4)); return topicConfigTable; } private String encode(Map<String, TopicConfig> topicConfigTable) { if (!topicConfigTable.isEmpty()) { StringBuilder sb = new StringBuilder(); for (TopicConfig config : topicConfigTable.values()) { sb.append(config.getTopicName() + "=" + config.encode() + IOUtils.LINE_SEPARATOR); } return sb.toString(); } return null; } }