From 9a8c3543017816b5f92f2137fb17b50ef0bffc3b Mon Sep 17 00:00:00 2001 From: zhangjidi2016 <1017543663@qq.com> Date: Mon, 2 Aug 2021 09:43:52 +0800 Subject: [PATCH] [ISSUE #673] Add unit tests for Controller. (#765) --- .../impl/DashboardCollectServiceImpl.java | 6 +- .../service/impl/MessageServiceImpl.java | 14 +- .../service/impl/MessageTraceServiceImpl.java | 4 +- .../service/impl/MonitorServiceImpl.java | 4 +- .../console/service/impl/OpsServiceImpl.java | 12 +- .../service/impl/TopicServiceImpl.java | 69 +++--- .../console/service/impl/UserServiceImpl.java | 2 +- .../controller/BaseControllerTest.java | 15 +- .../controller/ClusterControllerTest.java | 6 - .../controller/ClusterControllerTests.java | 34 --- .../controller/ConsumerControllerTest.java | 6 - .../controller/DashboardControllerTest.java | 201 ++++++++++++++++++ .../controller/LoginControllerTest.java | 116 ++++++++++ .../controller/MessageControllerTest.java | 7 +- .../MessageTraceControllerTest.java | 131 ++++++++++++ .../controller/MonitorControllerTest.java | 141 ++++++++++++ .../controller/NamesvrControllerTest.java | 6 - .../console/controller/OpsControllerTest.java | 12 +- .../controller/ProducerControllerTest.java | 6 - .../controller/TopicControllerTest.java | 6 - .../rocketmq/console/util/MockObjectUtil.java | 55 +++++ 21 files changed, 706 insertions(+), 147 deletions(-) delete mode 100644 src/test/java/org/apache/rocketmq/console/controller/ClusterControllerTests.java create mode 100644 src/test/java/org/apache/rocketmq/console/controller/DashboardControllerTest.java create mode 100644 src/test/java/org/apache/rocketmq/console/controller/LoginControllerTest.java create mode 100644 src/test/java/org/apache/rocketmq/console/controller/MessageTraceControllerTest.java create mode 100644 src/test/java/org/apache/rocketmq/console/controller/MonitorControllerTest.java diff --git a/src/main/java/org/apache/rocketmq/console/service/impl/DashboardCollectServiceImpl.java b/src/main/java/org/apache/rocketmq/console/service/impl/DashboardCollectServiceImpl.java index 2a895dd..8213baa 100644 --- a/src/main/java/org/apache/rocketmq/console/service/impl/DashboardCollectServiceImpl.java +++ b/src/main/java/org/apache/rocketmq/console/service/impl/DashboardCollectServiceImpl.java @@ -45,7 +45,7 @@ import org.springframework.stereotype.Service; public class DashboardCollectServiceImpl implements DashboardCollectService { @Resource - private RMQConfigure rmqConfigure; + private RMQConfigure configure; private final static Logger log = LoggerFactory.getLogger(DashboardCollectServiceImpl.class); @@ -133,7 +133,7 @@ public class DashboardCollectServiceImpl implements DashboardCollectService { @Override public Map> getBrokerCache(String date) { - String dataLocationPath = rmqConfigure.getConsoleCollectData(); + String dataLocationPath = configure.getConsoleCollectData(); File file = new File(dataLocationPath + date + ".json"); if (!file.exists()) { log.info(String.format("No dashboard data for broker cache data: %s", date)); @@ -144,7 +144,7 @@ public class DashboardCollectServiceImpl implements DashboardCollectService { @Override public Map> getTopicCache(String date) { - String dataLocationPath = rmqConfigure.getConsoleCollectData(); + String dataLocationPath = configure.getConsoleCollectData(); File file = new File(dataLocationPath + date + "_topic" + ".json"); if (!file.exists()) { log.info(String.format("No dashboard data for data: %s", date)); diff --git a/src/main/java/org/apache/rocketmq/console/service/impl/MessageServiceImpl.java b/src/main/java/org/apache/rocketmq/console/service/impl/MessageServiceImpl.java index 8e2ac19..00777e7 100644 --- a/src/main/java/org/apache/rocketmq/console/service/impl/MessageServiceImpl.java +++ b/src/main/java/org/apache/rocketmq/console/service/impl/MessageServiceImpl.java @@ -80,7 +80,7 @@ public class MessageServiceImpl implements MessageService { .build(); @Autowired - private RMQConfigure rMQConfigure; + private RMQConfigure configure; /** * @see org.apache.rocketmq.store.config.MessageStoreConfig maxMsgsNumBatch = 64; * @see org.apache.rocketmq.store.index.IndexService maxNum = Math.min(maxNum, this.defaultMessageStore.getMessageStoreConfig().getMaxMsgsNumBatch()); @@ -117,10 +117,10 @@ public class MessageServiceImpl implements MessageService { @Override public List queryMessageByTopic(String topic, final long begin, final long end) { - boolean isEnableAcl = !StringUtils.isEmpty(rMQConfigure.getAccessKey()) && !StringUtils.isEmpty(rMQConfigure.getSecretKey()); + boolean isEnableAcl = !StringUtils.isEmpty(configure.getAccessKey()) && !StringUtils.isEmpty(configure.getSecretKey()); RPCHook rpcHook = null; if (isEnableAcl) { - rpcHook = new AclClientRPCHook(new SessionCredentials(rMQConfigure.getAccessKey(), rMQConfigure.getSecretKey())); + rpcHook = new AclClientRPCHook(new SessionCredentials(configure.getAccessKey(), configure.getSecretKey())); } DefaultMQPullConsumer consumer = buildDefaultMQPullConsumer(rpcHook); List messageViewList = Lists.newArrayList(); @@ -250,10 +250,10 @@ public class MessageServiceImpl implements MessageService { } private MessagePageTask queryFirstMessagePage(MessageQueryByPage query) { - boolean isEnableAcl = !StringUtils.isEmpty(rMQConfigure.getAccessKey()) && !StringUtils.isEmpty(rMQConfigure.getSecretKey()); + boolean isEnableAcl = !StringUtils.isEmpty(configure.getAccessKey()) && !StringUtils.isEmpty(configure.getSecretKey()); RPCHook rpcHook = null; if (isEnableAcl) { - rpcHook = new AclClientRPCHook(new SessionCredentials(rMQConfigure.getAccessKey(), rMQConfigure.getSecretKey())); + rpcHook = new AclClientRPCHook(new SessionCredentials(configure.getAccessKey(), configure.getSecretKey())); } DefaultMQPullConsumer consumer = buildDefaultMQPullConsumer(rpcHook); @@ -391,10 +391,10 @@ public class MessageServiceImpl implements MessageService { } private Page queryMessageByTaskPage(MessageQueryByPage query, List queueOffsetInfos) { - boolean isEnableAcl = !StringUtils.isEmpty(rMQConfigure.getAccessKey()) && !StringUtils.isEmpty(rMQConfigure.getSecretKey()); + boolean isEnableAcl = !StringUtils.isEmpty(configure.getAccessKey()) && !StringUtils.isEmpty(configure.getSecretKey()); RPCHook rpcHook = null; if (isEnableAcl) { - rpcHook = new AclClientRPCHook(new SessionCredentials(rMQConfigure.getAccessKey(), rMQConfigure.getSecretKey())); + rpcHook = new AclClientRPCHook(new SessionCredentials(configure.getAccessKey(), configure.getSecretKey())); } DefaultMQPullConsumer consumer = buildDefaultMQPullConsumer(rpcHook); List messageViews = new ArrayList<>(); diff --git a/src/main/java/org/apache/rocketmq/console/service/impl/MessageTraceServiceImpl.java b/src/main/java/org/apache/rocketmq/console/service/impl/MessageTraceServiceImpl.java index 8d482ae..5e2debd 100644 --- a/src/main/java/org/apache/rocketmq/console/service/impl/MessageTraceServiceImpl.java +++ b/src/main/java/org/apache/rocketmq/console/service/impl/MessageTraceServiceImpl.java @@ -59,11 +59,11 @@ public class MessageTraceServiceImpl implements MessageTraceService { private MQAdminExt mqAdminExt; @Resource - private RMQConfigure rmqConfigure; + private RMQConfigure configure; @Override public List queryMessageTraceKey(String key) { - String queryTopic = rmqConfigure.getMsgTrackTopicName(); + String queryTopic = configure.getMsgTrackTopicName(); if (StringUtils.isEmpty(queryTopic)) { queryTopic = TopicValidator.RMQ_SYS_TRACE_TOPIC; } diff --git a/src/main/java/org/apache/rocketmq/console/service/impl/MonitorServiceImpl.java b/src/main/java/org/apache/rocketmq/console/service/impl/MonitorServiceImpl.java index 310f259..9bc938f 100644 --- a/src/main/java/org/apache/rocketmq/console/service/impl/MonitorServiceImpl.java +++ b/src/main/java/org/apache/rocketmq/console/service/impl/MonitorServiceImpl.java @@ -36,7 +36,7 @@ public class MonitorServiceImpl implements MonitorService { @Resource - private RMQConfigure rmqConfigure; + private RMQConfigure configure; private Map configMap = new ConcurrentHashMap<>(); @@ -66,7 +66,7 @@ public class MonitorServiceImpl implements MonitorService { //rocketmq.console.data.path/monitor/consumerMonitorConfig.json private String getConsumerMonitorConfigDataPath() { - return rmqConfigure.getRocketMqConsoleDataPath() + File.separatorChar + "monitor" + File.separatorChar + "consumerMonitorConfig.json"; + return configure.getRocketMqConsoleDataPath() + File.separatorChar + "monitor" + File.separatorChar + "consumerMonitorConfig.json"; } private String getConsumerMonitorConfigDataPathBackUp() { diff --git a/src/main/java/org/apache/rocketmq/console/service/impl/OpsServiceImpl.java b/src/main/java/org/apache/rocketmq/console/service/impl/OpsServiceImpl.java index 84e6d2f..b31a869 100644 --- a/src/main/java/org/apache/rocketmq/console/service/impl/OpsServiceImpl.java +++ b/src/main/java/org/apache/rocketmq/console/service/impl/OpsServiceImpl.java @@ -32,7 +32,7 @@ import org.springframework.stereotype.Service; public class OpsServiceImpl extends AbstractCommonService implements OpsService { @Resource - private RMQConfigure rMQConfigure; + private RMQConfigure configure; @Resource private List rocketMqCheckerList; @@ -40,19 +40,19 @@ public class OpsServiceImpl extends AbstractCommonService implements OpsService @Override public Map homePageInfo() { Map homePageInfoMap = Maps.newHashMap(); - homePageInfoMap.put("namesvrAddrList", Splitter.on(";").splitToList(rMQConfigure.getNamesrvAddr())); - homePageInfoMap.put("useVIPChannel", Boolean.valueOf(rMQConfigure.getIsVIPChannel())); + homePageInfoMap.put("namesvrAddrList", Splitter.on(";").splitToList(configure.getNamesrvAddr())); + homePageInfoMap.put("useVIPChannel", Boolean.valueOf(configure.getIsVIPChannel())); return homePageInfoMap; } @Override public void updateNameSvrAddrList(String nameSvrAddrList) { - rMQConfigure.setNamesrvAddr(nameSvrAddrList); + configure.setNamesrvAddr(nameSvrAddrList); } @Override public String getNameSvrList() { - return rMQConfigure.getNamesrvAddr(); + return configure.getNamesrvAddr(); } @Override @@ -65,7 +65,7 @@ public class OpsServiceImpl extends AbstractCommonService implements OpsService } @Override public boolean updateIsVIPChannel(String useVIPChannel) { - rMQConfigure.setIsVIPChannel(useVIPChannel); + configure.setIsVIPChannel(useVIPChannel); return true; } } diff --git a/src/main/java/org/apache/rocketmq/console/service/impl/TopicServiceImpl.java b/src/main/java/org/apache/rocketmq/console/service/impl/TopicServiceImpl.java index cb56639..794e8cc 100644 --- a/src/main/java/org/apache/rocketmq/console/service/impl/TopicServiceImpl.java +++ b/src/main/java/org/apache/rocketmq/console/service/impl/TopicServiceImpl.java @@ -54,12 +54,12 @@ import java.util.Set; public class TopicServiceImpl extends AbstractCommonService implements TopicService { @Autowired - private RMQConfigure rMQConfigure; + private RMQConfigure configure; @Override public TopicList fetchAllTopicList(boolean skipSysProcess) { try { - TopicList allTopics = mqAdminExt.fetchAllTopicList(); + TopicList allTopics = mqAdminExt.fetchAllTopicList(); if (skipSysProcess) { return allTopics; } @@ -67,7 +67,7 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ TopicList sysTopics = getSystemTopicList(); Set topics = new HashSet<>(); - for (String topic: allTopics.getTopicList()) { + for (String topic : allTopics.getTopicList()) { if (sysTopics.getTopicList().contains(topic)) { topics.add(String.format("%s%s", "%SYS%", topic)); } else { @@ -77,8 +77,7 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ allTopics.getTopicList().clear(); allTopics.getTopicList().addAll(topics); return allTopics; - } - catch (Exception e) { + } catch (Exception e) { throw Throwables.propagate(e); } } @@ -87,8 +86,7 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ public TopicStatsTable stats(String topic) { try { return mqAdminExt.examineTopicStats(topic); - } - catch (Exception e) { + } catch (Exception e) { throw Throwables.propagate(e); } } @@ -97,8 +95,7 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ public TopicRouteData route(String topic) { try { return mqAdminExt.examineTopicRouteInfo(topic); - } - catch (Exception ex) { + } catch (Exception ex) { throw Throwables.propagate(ex); } } @@ -107,8 +104,7 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ public GroupList queryTopicConsumerInfo(String topic) { try { return mqAdminExt.queryTopicConsumeByWho(topic); - } - catch (Exception e) { + } catch (Exception e) { throw Throwables.propagate(e); } } @@ -123,8 +119,7 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ topicCreateOrUpdateRequest.getClusterNameList(), topicCreateOrUpdateRequest.getBrokerNameList())) { mqAdminExt.createAndUpdateTopicConfig(clusterInfo.getBrokerAddrTable().get(brokerName).selectBrokerAddr(), topicConfig); } - } - catch (Exception err) { + } catch (Exception err) { throw Throwables.propagate(err); } } @@ -134,8 +129,7 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ ClusterInfo clusterInfo = null; try { clusterInfo = mqAdminExt.examineBrokerClusterInfo(); - } - catch (Exception e) { + } catch (Exception e) { throw Throwables.propagate(e); } return mqAdminExt.examineTopicConfig(clusterInfo.getBrokerAddrTable().get(brokerName).selectBrokerAddr(), topic); @@ -164,13 +158,12 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ Set masterSet = CommandUtil.fetchMasterAddrByClusterName(mqAdminExt, clusterName); mqAdminExt.deleteTopicInBroker(masterSet, topic); Set nameServerSet = null; - if (StringUtils.isNotBlank(rMQConfigure.getNamesrvAddr())) { - String[] ns = rMQConfigure.getNamesrvAddr().split(";"); + if (StringUtils.isNotBlank(configure.getNamesrvAddr())) { + String[] ns = configure.getNamesrvAddr().split(";"); nameServerSet = new HashSet(Arrays.asList(ns)); } mqAdminExt.deleteTopicInNameServer(nameServerSet, topic); - } - catch (Exception err) { + } catch (Exception err) { throw Throwables.propagate(err); } return true; @@ -181,8 +174,7 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ ClusterInfo clusterInfo = null; try { clusterInfo = mqAdminExt.examineBrokerClusterInfo(); - } - catch (Exception err) { + } catch (Exception err) { throw Throwables.propagate(err); } for (String clusterName : clusterInfo.getClusterAddrTable().keySet()) { @@ -198,13 +190,11 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ ClusterInfo clusterInfo = null; try { clusterInfo = mqAdminExt.examineBrokerClusterInfo(); - } - catch (Exception e) { + } catch (Exception e) { throw Throwables.propagate(e); } mqAdminExt.deleteTopicInBroker(Sets.newHashSet(clusterInfo.getBrokerAddrTable().get(brokerName).selectBrokerAddr()), topic); - } - catch (Exception e) { + } catch (Exception e) { throw Throwables.propagate(e); } return true; @@ -214,36 +204,33 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ return new DefaultMQProducer(producerGroup, rpcHook); } - private TopicList getSystemTopicList() { + private TopicList getSystemTopicList() { RPCHook rpcHook = null; - boolean isEnableAcl = !StringUtils.isEmpty(rMQConfigure.getAccessKey()) && !StringUtils.isEmpty(rMQConfigure.getSecretKey()); + boolean isEnableAcl = !StringUtils.isEmpty(configure.getAccessKey()) && !StringUtils.isEmpty(configure.getSecretKey()); if (isEnableAcl) { - rpcHook = new AclClientRPCHook(new SessionCredentials(rMQConfigure.getAccessKey(),rMQConfigure.getSecretKey())); + rpcHook = new AclClientRPCHook(new SessionCredentials(configure.getAccessKey(), configure.getSecretKey())); } DefaultMQProducer producer = buildDefaultMQProducer(MixAll.SELF_TEST_PRODUCER_GROUP, rpcHook); producer.setInstanceName(String.valueOf(System.currentTimeMillis())); - producer.setNamesrvAddr(rMQConfigure.getNamesrvAddr()); + producer.setNamesrvAddr(configure.getNamesrvAddr()); try { producer.start(); return producer.getDefaultMQProducerImpl().getmQClientFactory().getMQClientAPIImpl().getSystemTopicList(20000L); - } - catch (Exception e) { + } catch (Exception e) { throw Throwables.propagate(e); - } - finally { + } finally { producer.shutdown(); } } - @Override public SendResult sendTopicMessageRequest(SendTopicMessageRequest sendTopicMessageRequest) { DefaultMQProducer producer = null; - if (rMQConfigure.isACLEnabled()) { + if (configure.isACLEnabled()) { AclClientRPCHook rpcHook = new AclClientRPCHook(new SessionCredentials( - rMQConfigure.getAccessKey(), - rMQConfigure.getSecretKey() + configure.getAccessKey(), + configure.getSecretKey() )); producer = buildDefaultMQProducer(MixAll.SELF_TEST_PRODUCER_GROUP, rpcHook); } else { @@ -251,7 +238,7 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ } producer.setInstanceName(String.valueOf(System.currentTimeMillis())); - producer.setNamesrvAddr(rMQConfigure.getNamesrvAddr()); + producer.setNamesrvAddr(configure.getNamesrvAddr()); try { producer.start(); Message msg = new Message(sendTopicMessageRequest.getTopic(), @@ -260,11 +247,9 @@ public class TopicServiceImpl extends AbstractCommonService implements TopicServ sendTopicMessageRequest.getMessageBody().getBytes() ); return producer.send(msg); - } - catch (Exception e) { + } catch (Exception e) { throw Throwables.propagate(e); - } - finally { + } finally { producer.shutdown(); } } diff --git a/src/main/java/org/apache/rocketmq/console/service/impl/UserServiceImpl.java b/src/main/java/org/apache/rocketmq/console/service/impl/UserServiceImpl.java index 4dd7d32..0c7c086 100644 --- a/src/main/java/org/apache/rocketmq/console/service/impl/UserServiceImpl.java +++ b/src/main/java/org/apache/rocketmq/console/service/impl/UserServiceImpl.java @@ -61,7 +61,7 @@ public class UserServiceImpl implements UserService, InitializingBean { } } - /*packaged*/ static class FileBasedUserInfoStore { + public static class FileBasedUserInfoStore { private final Logger log = LoggerFactory.getLogger(this.getClass()); private static final String FILE_NAME = "users.properties"; diff --git a/src/test/java/org/apache/rocketmq/console/controller/BaseControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/BaseControllerTest.java index e85c6cf..fe66d1f 100644 --- a/src/test/java/org/apache/rocketmq/console/controller/BaseControllerTest.java +++ b/src/test/java/org/apache/rocketmq/console/controller/BaseControllerTest.java @@ -28,6 +28,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import static org.mockito.Mockito.when; @@ -42,7 +43,11 @@ public abstract class BaseControllerTest extends BaseTest { protected MQAdminExt mqAdminExt; @Mock - protected RMQConfigure rMQConfigure; + protected RMQConfigure configure; + + protected MockHttpServletRequestBuilder requestBuilder = null; + + protected ResultActions perform; protected abstract Object getTestController(); @@ -54,10 +59,10 @@ public abstract class BaseControllerTest extends BaseTest { } protected void mockRmqConfigure() { - when(rMQConfigure.getAccessKey()).thenReturn("12345678"); - when(rMQConfigure.getSecretKey()).thenReturn("rocketmq"); - when(rMQConfigure.getNamesrvAddr()).thenReturn("127.0.0.1:9876"); - when(rMQConfigure.isACLEnabled()).thenReturn(true); + when(configure.getAccessKey()).thenReturn("12345678"); + when(configure.getSecretKey()).thenReturn("rocketmq"); + when(configure.getNamesrvAddr()).thenReturn("127.0.0.1:9876"); + when(configure.isACLEnabled()).thenReturn(true); } protected ResultActions performOkExpect(ResultActions perform) throws Exception { diff --git a/src/test/java/org/apache/rocketmq/console/controller/ClusterControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/ClusterControllerTest.java index 9f31dbd..5921998 100644 --- a/src/test/java/org/apache/rocketmq/console/controller/ClusterControllerTest.java +++ b/src/test/java/org/apache/rocketmq/console/controller/ClusterControllerTest.java @@ -25,8 +25,6 @@ import org.apache.rocketmq.console.util.MockObjectUtil; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Spy; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import static org.mockito.ArgumentMatchers.anyString; @@ -39,10 +37,6 @@ public class ClusterControllerTest extends BaseControllerTest { @InjectMocks private ClusterController clusterController; - private MockHttpServletRequestBuilder requestBuilder = null; - - private ResultActions perform; - @Spy private ClusterServiceImpl clusterService; diff --git a/src/test/java/org/apache/rocketmq/console/controller/ClusterControllerTests.java b/src/test/java/org/apache/rocketmq/console/controller/ClusterControllerTests.java deleted file mode 100644 index 85f9b40..0000000 --- a/src/test/java/org/apache/rocketmq/console/controller/ClusterControllerTests.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.rocketmq.console.controller; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@DirtiesContext -public class ClusterControllerTests { - @Test - public void testList() throws Exception { - //todo add. java.lang.Exception: No runnable methods - } -} diff --git a/src/test/java/org/apache/rocketmq/console/controller/ConsumerControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/ConsumerControllerTest.java index ae40897..73e3080 100644 --- a/src/test/java/org/apache/rocketmq/console/controller/ConsumerControllerTest.java +++ b/src/test/java/org/apache/rocketmq/console/controller/ConsumerControllerTest.java @@ -44,8 +44,6 @@ import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Spy; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import static org.hamcrest.Matchers.hasSize; @@ -64,10 +62,6 @@ public class ConsumerControllerTest extends BaseControllerTest { @InjectMocks private ConsumerController consumerController; - private MockHttpServletRequestBuilder requestBuilder = null; - - private ResultActions perform; - @Spy private ConsumerServiceImpl consumerService; diff --git a/src/test/java/org/apache/rocketmq/console/controller/DashboardControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/DashboardControllerTest.java new file mode 100644 index 0000000..f84fe3e --- /dev/null +++ b/src/test/java/org/apache/rocketmq/console/controller/DashboardControllerTest.java @@ -0,0 +1,201 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.rocketmq.console.controller; + +import com.google.common.collect.Maps; +import com.google.common.io.Files; +import java.io.File; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import org.apache.rocketmq.console.service.impl.DashboardCollectServiceImpl; +import org.apache.rocketmq.console.service.impl.DashboardServiceImpl; +import org.apache.rocketmq.console.util.JsonUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import static org.hamcrest.Matchers.hasKey; +import static org.hamcrest.Matchers.hasSize; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class DashboardControllerTest extends BaseControllerTest { + + @InjectMocks + private DashboardController dashboardController; + + @Spy + private DashboardServiceImpl dashboardService; + + @Spy + private DashboardCollectServiceImpl dashboardCollectService; + + private String nowDateStr; + + private String yesterdayDateStr; + + private File topicDataFile; + + private File brokerDataFile; + + @Before + public void init() throws Exception { + super.mockRmqConfigure(); + DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + nowDateStr = format.format(new Date()); + yesterdayDateStr = format.format(new Date((System.currentTimeMillis() - 24 * 60 * 60 * 1000))); + // generate today's brokerData and topicData cache file + brokerDataFile = this.createBrokerTestCollectDataFile(nowDateStr); + topicDataFile = this.createTopicTestCollectDataFile(nowDateStr); + when(configure.getConsoleCollectData()).thenReturn(""); + } + + @After + public void after() { + // delete test file + if (brokerDataFile != null && brokerDataFile.exists()) { + brokerDataFile.delete(); + } + if (topicDataFile != null && topicDataFile.exists()) { + topicDataFile.delete(); + } + } + + @Test + public void testBroker() throws Exception { + final String url = "/dashboard/broker.query"; + + // 1、no broker cache data + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("date", yesterdayDateStr); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").isMap()) + .andExpect(jsonPath("$.data").isEmpty()); + + // 2、the broker's data is cached locally + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("date", nowDateStr); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").isMap()) + .andExpect(jsonPath("$.data").isNotEmpty()) + .andExpect(jsonPath("$.data", hasKey("broker-a:0"))) + .andExpect(jsonPath("$.data.broker-a:0").isArray()) + .andExpect(jsonPath("$.data.broker-a:0", hasSize(100))); + + } + + @Test + public void testTopic() throws Exception { + final String url = "/dashboard/topic.query"; + // 1、topicName is empty + // 1.1、no topic cache data + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("date", yesterdayDateStr); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").isMap()) + .andExpect(jsonPath("$.data").isEmpty()); + + // 1.2、the topic's data is cached locally + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("date", nowDateStr); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").isMap()) + .andExpect(jsonPath("$.data").isNotEmpty()) + .andExpect(jsonPath("$.data", hasKey("topic_test"))) + .andExpect(jsonPath("$.data.topic_test").isArray()) + .andExpect(jsonPath("$.data.topic_test", hasSize(100))); + + // 2、topicName is not empty + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("date", nowDateStr); + requestBuilder.param("topicName", "topic_test"); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").isArray()) + .andExpect(jsonPath("$.data", hasSize(100))); + + // 2、topicName is not empty but the no topic cache data + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("date", nowDateStr); + requestBuilder.param("topicName", "topic_test1"); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()); + + } + + @Test + public void testTopicCurrent() throws Exception { + final String url = "/dashboard/topicCurrent"; + requestBuilder = MockMvcRequestBuilders.get(url); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").value("topic_test,100")); + } + + @Override + protected Object getTestController() { + return dashboardController; + } + + private File createBrokerTestCollectDataFile(String date) throws Exception { + File brokerFile = new File(date + ".json"); + brokerFile.createNewFile(); + Map> resultMap = Maps.newHashMap(); + List brokerData = new ArrayList<>(); + for (int i = 1; i <= 100; i++) { + BigDecimal tps = new BigDecimal(i).divide(BigDecimal.valueOf(10), 3, BigDecimal.ROUND_HALF_UP); + brokerData.add((new Date().getTime() + i * 60 * 1000) + "," + tps.toString()); + } + resultMap.put("broker-a:0", brokerData); + Files.write(JsonUtil.obj2String(resultMap).getBytes(), brokerFile); + return brokerFile; + } + + private File createTopicTestCollectDataFile(String date) throws Exception { + File topicFile = new File(date + "_topic" + ".json"); + topicFile.createNewFile(); + Map> resultMap = Maps.newHashMap(); + List topicData = new ArrayList<>(); + for (int i = 1; i <= 100; i++) { + String inTps = new BigDecimal(i).divide(BigDecimal.valueOf(10), 3, BigDecimal.ROUND_HALF_UP).toString(); + String outTps = inTps; + StringBuilder sb = new StringBuilder(); + sb.append((new Date().getTime() + i * 60 * 1000)) + .append(',').append(inTps) + .append(',').append(i) + .append(',').append(outTps) + .append(',').append(i); + topicData.add(sb.toString()); + } + resultMap.put("topic_test", topicData); + Files.write(JsonUtil.obj2String(resultMap).getBytes(), topicFile); + return topicFile; + } +} diff --git a/src/test/java/org/apache/rocketmq/console/controller/LoginControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/LoginControllerTest.java new file mode 100644 index 0000000..ccd6acf --- /dev/null +++ b/src/test/java/org/apache/rocketmq/console/controller/LoginControllerTest.java @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.rocketmq.console.controller; + +import java.lang.reflect.Field; +import org.apache.rocketmq.console.model.User; +import org.apache.rocketmq.console.service.impl.UserServiceImpl; +import org.apache.rocketmq.console.util.WebUtil; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.util.ReflectionUtils; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class LoginControllerTest extends BaseControllerTest { + + @InjectMocks + private LoginController loginController; + + @Spy + private UserServiceImpl userService; + + private String contextPath = "/rocketmq-console"; + + @Before + public void init() { + super.mockRmqConfigure(); + when(configure.isLoginRequired()).thenReturn(true); + when(configure.getRocketMqConsoleDataPath()).thenReturn(""); + Field contextPathField = ReflectionUtils.findField(LoginController.class, "contextPath"); + ReflectionUtils.makeAccessible(contextPathField); + ReflectionUtils.setField(contextPathField, loginController, contextPath); + } + + @Test + public void testCheck() throws Exception { + final String url = "/login/check.query"; + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.sessionAttr(WebUtil.USER_NAME, "admin"); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data.logined").value(true)) + .andExpect(jsonPath("$.data.loginRequired").value(true)); + + } + + @Test + public void testLogin() throws Exception { + final String url = "/login/login.do"; + final String username = "admin"; + final String rightPwd = "admin"; + final String wrongPwd = "rocketmq"; + { + UserServiceImpl.FileBasedUserInfoStore store + = new UserServiceImpl.FileBasedUserInfoStore(configure); + User user = store.queryByName(username); + Assert.assertNotNull(user); + Assert.assertEquals(user.getPassword(), rightPwd); + ReflectionTestUtils.setField(userService, "fileBasedUserInfoStore", store); + } + + // 1、login fail + requestBuilder = MockMvcRequestBuilders.post(url); + requestBuilder.param("username", username) + .param("password", wrongPwd); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").doesNotExist()) + .andExpect(jsonPath("$.status").value(-1)) + .andExpect(jsonPath("$.errMsg").value("Bad username or password!")); + + // 2、login success + requestBuilder = MockMvcRequestBuilders.post(url); + requestBuilder.param("username", username) + .param("password", rightPwd); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").value(contextPath)); + +} + + @Test + public void testLogout() throws Exception { + final String url = "/login/logout.do"; + requestBuilder = MockMvcRequestBuilders.post(url); + requestBuilder.sessionAttr(WebUtil.USER_NAME, "root"); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").value(contextPath)); + } + + @Override protected Object getTestController() { + return loginController; + } +} diff --git a/src/test/java/org/apache/rocketmq/console/controller/MessageControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/MessageControllerTest.java index ab8cd4d..8d3aefc 100644 --- a/src/test/java/org/apache/rocketmq/console/controller/MessageControllerTest.java +++ b/src/test/java/org/apache/rocketmq/console/controller/MessageControllerTest.java @@ -46,8 +46,6 @@ import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Spy; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import static org.hamcrest.Matchers.hasSize; @@ -65,14 +63,11 @@ public class MessageControllerTest extends BaseControllerTest { @InjectMocks private MessageController messageController; - private MockHttpServletRequestBuilder requestBuilder = null; - - private ResultActions perform; - @Spy private MessageServiceImpl messageService; private Set messageQueues; + private DefaultMQPullConsumer defaultMQPullConsumer; @Before diff --git a/src/test/java/org/apache/rocketmq/console/controller/MessageTraceControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/MessageTraceControllerTest.java new file mode 100644 index 0000000..9e7253a --- /dev/null +++ b/src/test/java/org/apache/rocketmq/console/controller/MessageTraceControllerTest.java @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.rocketmq.console.controller; + +import java.util.ArrayList; +import java.util.List; +import org.apache.rocketmq.client.QueryResult; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.trace.TraceType; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.console.service.impl.MessageServiceImpl; +import org.apache.rocketmq.console.service.impl.MessageTraceServiceImpl; +import org.apache.rocketmq.console.util.MockObjectUtil; +import org.apache.rocketmq.tools.admin.api.MessageTrack; +import org.apache.rocketmq.tools.admin.api.TrackType; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import static org.hamcrest.Matchers.hasSize; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class MessageTraceControllerTest extends BaseControllerTest { + + @InjectMocks + private MessageTraceController messageTraceController; + + @Spy + private MessageServiceImpl messageService; + + @Spy + private MessageTraceServiceImpl messageTraceService; + + @Before + public void init() throws MQClientException, InterruptedException { + super.mockRmqConfigure(); + when(configure.getMsgTrackTopicName()).thenReturn(null); + List messageList = new ArrayList<>(2); + MessageExt messageExt = MockObjectUtil.createMessageExt(); + messageExt.setBody(MockObjectUtil.createTraceData().getBytes()); + messageList.add(messageExt); + QueryResult queryResult = new QueryResult(System.currentTimeMillis(), messageList); + when(mqAdminExt.queryMessage(anyString(), anyString(), anyInt(), anyLong(), anyLong())) + .thenReturn(queryResult); + } + + @Test + public void testViewMessage() throws Exception { + final String url = "/messageTrace/viewMessage.query"; + { + MessageExt messageExt = MockObjectUtil.createMessageExt(); + when(mqAdminExt.viewMessage(anyString(), anyString())) + .thenThrow(new MQClientException(208, "no message")) + .thenReturn(messageExt); + MessageTrack track = new MessageTrack(); + track.setConsumerGroup("group_test"); + track.setTrackType(TrackType.CONSUMED); + List tracks = new ArrayList<>(); + tracks.add(track); + when(mqAdminExt.messageTrackDetail(any())) + .thenReturn(tracks); + } + // no message + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("topic", "topic_test"); + requestBuilder.param("msgId", "0A9A003F00002A9F0000000000000319"); + perform = mockMvc.perform(requestBuilder); + performErrorExpect(perform); + + // query message success + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data.messageView.topic").value("topic_test")) + .andExpect(jsonPath("$.data.messageView.msgId").value("0A9A003F00002A9F0000000000000319")); + } + + @Test + public void testViewMessageTraceDetail() throws Exception { + final String url = "/messageTrace/viewMessageTraceDetail.query"; + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("msgId", "0A9A003F00002A9F0000000000000319"); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data", hasSize(4))) + .andExpect(jsonPath("$.data[0].traceType").value(TraceType.Pub.name())) + .andExpect(jsonPath("$.data[1].traceType").value(TraceType.SubBefore.name())) + .andExpect(jsonPath("$.data[2].traceType").value(TraceType.SubAfter.name())) + .andExpect(jsonPath("$.data[3].traceType").value(TraceType.EndTransaction.name())); + } + + @Test + public void testViewMessageTraceGraph() throws Exception { + final String url = "/messageTrace/viewMessageTraceGraph.query"; + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("msgId", "0A9A003F00002A9F0000000000000319"); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").isMap()) + .andExpect(jsonPath("$.data.producerNode.groupName").value("PID_test")) + .andExpect(jsonPath("$.data.subscriptionNodeList", hasSize(1))) + .andExpect(jsonPath("$.data.subscriptionNodeList[0].subscriptionGroup").value("group_test")) + .andExpect(jsonPath("$.data.messageTraceViews").isArray()) + .andExpect(jsonPath("$.data.messageTraceViews", hasSize(4))); + } + + @Override protected Object getTestController() { + return messageTraceController; + } +} diff --git a/src/test/java/org/apache/rocketmq/console/controller/MonitorControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/MonitorControllerTest.java new file mode 100644 index 0000000..1b418a0 --- /dev/null +++ b/src/test/java/org/apache/rocketmq/console/controller/MonitorControllerTest.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.rocketmq.console.controller; + +import com.fasterxml.jackson.core.type.TypeReference; +import java.io.File; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.console.model.ConsumerMonitorConfig; +import org.apache.rocketmq.console.service.impl.MonitorServiceImpl; +import org.apache.rocketmq.console.util.JsonUtil; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class MonitorControllerTest extends BaseControllerTest { + + @InjectMocks + private MonitorController monitorController; + + @Spy + private MonitorServiceImpl monitorService; + + private String filePath; + + private String consumeGroupName = "group_test"; + + private String consumeGroupName1 = "group_test1"; + + @Before + public void init() { + super.mockRmqConfigure(); + when(configure.getRocketMqConsoleDataPath()).thenReturn(""); + Map configMap = new ConcurrentHashMap<>(); + configMap.put(consumeGroupName, new ConsumerMonitorConfig(0, 100)); + configMap.put(consumeGroupName1, new ConsumerMonitorConfig(10, 200)); + ReflectionTestUtils.setField(monitorService, "configMap", configMap); + filePath = configure.getRocketMqConsoleDataPath() + + File.separatorChar + "monitor" + File.separatorChar + "consumerMonitorConfig.json"; + } + + @Test + public void testCreateOrUpdateConsumerMonitor() throws Exception { + final String url = "/monitor/createOrUpdateConsumerMonitor.do"; + requestBuilder = MockMvcRequestBuilders.post(url); + requestBuilder.param("consumeGroupName", consumeGroupName) + .param("minCount", String.valueOf(0)) + .param("maxDiffTotal", String.valueOf(100)); + perform = mockMvc.perform(requestBuilder); + + Map map = + JsonUtil.string2Obj(MixAll.file2String(filePath), + new TypeReference>() { + }); + Assert.assertEquals(map.size(), 2); + Assert.assertEquals(map.get(consumeGroupName).getMaxDiffTotal(), 100); + + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").value(true)); + } + + @Test + public void testConsumerMonitorConfig() throws Exception { + final String url = "/monitor/consumerMonitorConfig.query"; + requestBuilder = MockMvcRequestBuilders.get(url); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").isMap()) + .andExpect(jsonPath("$.data.group_test.minCount").value(0)) + .andExpect(jsonPath("$.data.group_test.maxDiffTotal").value(100)); + } + + @Test + public void testConsumerMonitorConfigByGroupName() throws Exception { + final String url = "/monitor/consumerMonitorConfigByGroupName.query"; + requestBuilder = MockMvcRequestBuilders.get(url); + requestBuilder.param("consumeGroupName", consumeGroupName); + perform = mockMvc.perform(requestBuilder); + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data.minCount").value(0)) + .andExpect(jsonPath("$.data.maxDiffTotal").value(100)); + } + + @Test + public void testDeleteConsumerMonitor() throws Exception { + final String url = "/monitor/deleteConsumerMonitor.do"; + requestBuilder = MockMvcRequestBuilders.post(url); + requestBuilder.param("consumeGroupName", consumeGroupName); + perform = mockMvc.perform(requestBuilder); + + Map map = + JsonUtil.string2Obj(MixAll.file2String(filePath), + new TypeReference>() { + }); + Assert.assertEquals(map.size(), 1); + Assert.assertEquals(map.get(consumeGroupName1).getMaxDiffTotal(), 200); + + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.data").value(true)); + } + + @After + public void after() { + File file = new File(filePath); + File bakFile = new File(filePath + ".bak"); + if (file != null && file.exists()) { + file.delete(); + } + if (bakFile != null && bakFile.exists()) { + bakFile.delete(); + } + } + + @Override protected Object getTestController() { + return monitorController; + } +} diff --git a/src/test/java/org/apache/rocketmq/console/controller/NamesvrControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/NamesvrControllerTest.java index 63a1ecc..cde2da6 100644 --- a/src/test/java/org/apache/rocketmq/console/controller/NamesvrControllerTest.java +++ b/src/test/java/org/apache/rocketmq/console/controller/NamesvrControllerTest.java @@ -22,8 +22,6 @@ import org.junit.Assert; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Spy; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; public class NamesvrControllerTest extends BaseControllerTest { @@ -31,10 +29,6 @@ public class NamesvrControllerTest extends BaseControllerTest { @InjectMocks private NamesvrController namesvrController; - private MockHttpServletRequestBuilder requestBuilder = null; - - private ResultActions perform; - @Spy private OpsServiceImpl opsService; diff --git a/src/test/java/org/apache/rocketmq/console/controller/OpsControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/OpsControllerTest.java index 2d6fec9..e064b3b 100644 --- a/src/test/java/org/apache/rocketmq/console/controller/OpsControllerTest.java +++ b/src/test/java/org/apache/rocketmq/console/controller/OpsControllerTest.java @@ -29,8 +29,6 @@ import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Spy; import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import static org.hamcrest.Matchers.hasSize; @@ -43,10 +41,6 @@ public class OpsControllerTest extends BaseControllerTest { @InjectMocks private OpsController opsController; - private MockHttpServletRequestBuilder requestBuilder = null; - - private ResultActions perform; - @Spy private OpsServiceImpl opsService; @@ -72,21 +66,21 @@ public class OpsControllerTest extends BaseControllerTest { public void testUpdateNameSvrAddr() throws Exception { final String url = "/ops/updateNameSvrAddr.do"; { - doNothing().when(rMQConfigure).setNamesrvAddr(anyString()); + doNothing().when(configure).setNamesrvAddr(anyString()); } requestBuilder = MockMvcRequestBuilders.post(url); requestBuilder.param("nameSvrAddrList", "127.0.0.1:9876"); perform = mockMvc.perform(requestBuilder); perform.andExpect(status().isOk()) .andExpect(jsonPath("$.data").value(true)); - Assert.assertEquals(rMQConfigure.getNamesrvAddr(), "127.0.0.1:9876"); + Assert.assertEquals(configure.getNamesrvAddr(), "127.0.0.1:9876"); } @Test public void testUpdateIsVIPChannel() throws Exception { final String url = "/ops/updateIsVIPChannel.do"; { - doNothing().when(rMQConfigure).setIsVIPChannel(anyString()); + doNothing().when(configure).setIsVIPChannel(anyString()); } requestBuilder = MockMvcRequestBuilders.post(url); requestBuilder.param("useVIPChannel", "true"); diff --git a/src/test/java/org/apache/rocketmq/console/controller/ProducerControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/ProducerControllerTest.java index 05f2fc9..9e9cc96 100644 --- a/src/test/java/org/apache/rocketmq/console/controller/ProducerControllerTest.java +++ b/src/test/java/org/apache/rocketmq/console/controller/ProducerControllerTest.java @@ -26,8 +26,6 @@ import org.apache.rocketmq.remoting.protocol.LanguageCode; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Spy; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import static org.hamcrest.Matchers.hasSize; @@ -41,10 +39,6 @@ public class ProducerControllerTest extends BaseControllerTest { @InjectMocks private ProducerController producerController; - private MockHttpServletRequestBuilder requestBuilder = null; - - private ResultActions perform; - @Spy private ProducerServiceImpl producerService; diff --git a/src/test/java/org/apache/rocketmq/console/controller/TopicControllerTest.java b/src/test/java/org/apache/rocketmq/console/controller/TopicControllerTest.java index fbab910..2b73201 100644 --- a/src/test/java/org/apache/rocketmq/console/controller/TopicControllerTest.java +++ b/src/test/java/org/apache/rocketmq/console/controller/TopicControllerTest.java @@ -49,8 +49,6 @@ import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Spy; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import static org.hamcrest.Matchers.hasSize; @@ -69,10 +67,6 @@ public class TopicControllerTest extends BaseControllerTest { @InjectMocks private TopicController topicController; - private MockHttpServletRequestBuilder requestBuilder = null; - - private ResultActions perform; - @Spy private TopicServiceImpl topicService; diff --git a/src/test/java/org/apache/rocketmq/console/util/MockObjectUtil.java b/src/test/java/org/apache/rocketmq/console/util/MockObjectUtil.java index cb89355..e58ec5d 100644 --- a/src/test/java/org/apache/rocketmq/console/util/MockObjectUtil.java +++ b/src/test/java/org/apache/rocketmq/console/util/MockObjectUtil.java @@ -27,6 +27,9 @@ import java.util.TreeMap; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.trace.TraceConstants; +import org.apache.rocketmq.client.trace.TraceType; import org.apache.rocketmq.common.DataVersion; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.admin.ConsumeStats; @@ -36,6 +39,7 @@ import org.apache.rocketmq.common.admin.TopicStatsTable; import org.apache.rocketmq.common.consumer.ConsumeFromWhere; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.message.MessageQueue; +import org.apache.rocketmq.common.message.MessageType; import org.apache.rocketmq.common.protocol.body.ClusterInfo; import org.apache.rocketmq.common.protocol.body.Connection; import org.apache.rocketmq.common.protocol.body.ConsumeStatus; @@ -204,4 +208,55 @@ public class MockObjectUtil { messageExt.setReconsumeTimes(0); return messageExt; } + + public static String createTraceData() { + StringBuilder sb = new StringBuilder(100); + // pub trace data + sb.append(TraceType.Pub.name()).append(TraceConstants.CONTENT_SPLITOR) + .append("1627568812564").append(TraceConstants.CONTENT_SPLITOR) + .append("DefaultRegion").append(TraceConstants.CONTENT_SPLITOR) + .append("PID_test").append(TraceConstants.CONTENT_SPLITOR) + .append("topic_test").append(TraceConstants.CONTENT_SPLITOR) + .append("0A9A003F00002A9F0000000000000319").append(TraceConstants.CONTENT_SPLITOR) + .append("TagA").append(TraceConstants.CONTENT_SPLITOR) + .append("KeyA").append(TraceConstants.CONTENT_SPLITOR) + .append("127.0.0.1:10911").append(TraceConstants.CONTENT_SPLITOR) + .append("16").append(TraceConstants.CONTENT_SPLITOR) + .append("1224").append(TraceConstants.CONTENT_SPLITOR) + .append("0").append(TraceConstants.CONTENT_SPLITOR) + .append("0A9A003F00002A9F0000000000000000").append(TraceConstants.CONTENT_SPLITOR) + .append("true").append(TraceConstants.FIELD_SPLITOR); + // subBefore trace data + sb.append(TraceType.SubBefore.name()).append(TraceConstants.CONTENT_SPLITOR) + .append("1627569868519").append(TraceConstants.CONTENT_SPLITOR) + .append("DefaultRegion").append(TraceConstants.CONTENT_SPLITOR) + .append("group_test").append(TraceConstants.CONTENT_SPLITOR) + .append("7F000001752818B4AAC2951341580000").append(TraceConstants.CONTENT_SPLITOR) + .append("0A9A003F00002A9F0000000000000319").append(TraceConstants.CONTENT_SPLITOR) + .append("0").append(TraceConstants.CONTENT_SPLITOR) + .append("KeyA").append(TraceConstants.FIELD_SPLITOR); + // subAfter trace data + sb.append(TraceType.SubAfter.name()).append(TraceConstants.CONTENT_SPLITOR) + .append("7F000001752818B4AAC2951341580000").append(TraceConstants.CONTENT_SPLITOR) + .append("0A9A003F00002A9F0000000000000319").append(TraceConstants.CONTENT_SPLITOR) + .append("200").append(TraceConstants.CONTENT_SPLITOR) + .append("true").append(TraceConstants.CONTENT_SPLITOR) + .append("KeyA").append(TraceConstants.CONTENT_SPLITOR) + .append("0").append(TraceConstants.FIELD_SPLITOR); + // endTransaction trace data + sb.append(TraceType.EndTransaction.name()).append(TraceConstants.CONTENT_SPLITOR) + .append("1627569868519").append(TraceConstants.CONTENT_SPLITOR) + .append("DefaultRegion").append(TraceConstants.CONTENT_SPLITOR) + .append("group_test").append(TraceConstants.CONTENT_SPLITOR) + .append("topic_test").append(TraceConstants.CONTENT_SPLITOR) + .append("0A9A003F00002A9F0000000000000319").append(TraceConstants.CONTENT_SPLITOR) + .append("TagA").append(TraceConstants.CONTENT_SPLITOR) + .append("KeyA").append(TraceConstants.CONTENT_SPLITOR) + .append("127.0.0.1:10911").append(TraceConstants.CONTENT_SPLITOR) + .append(2).append(TraceConstants.CONTENT_SPLITOR) + .append("7F000001752818B4AAC2951341580000").append(TraceConstants.CONTENT_SPLITOR) + .append(LocalTransactionState.COMMIT_MESSAGE).append(TraceConstants.CONTENT_SPLITOR) + .append("true").append(TraceConstants.FIELD_SPLITOR); + return sb.toString(); + } }