blob: e196b5fbbf80546a49ba762e84df152206715562 [file] [log] [blame]
/*
* 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.dashboard.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.dashboard.service.impl.DashboardCollectServiceImpl;
import org.apache.rocketmq.dashboard.service.impl.DashboardServiceImpl;
import org.apache.rocketmq.dashboard.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.getDashboardCollectData()).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.query";
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<String /*brokerName:brokerId*/, List<String/*timestamp,tps*/>> resultMap = Maps.newHashMap();
List<String> 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<String /*topicName*/, List<String/*timestamp,inTps,inMsgCntToday,outTps,outMsgCntToday*/>> resultMap = Maps.newHashMap();
List<String> 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;
}
}