/*
* Licensed 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.ngrinder.perftest.service;
import net.grinder.StopReason;
import net.grinder.common.GrinderProperties;
import net.grinder.console.model.ConsoleProperties;
import org.junit.Before;
import org.junit.Test;
import org.ngrinder.common.model.Home;
import org.ngrinder.common.util.ThreadUtils;
import org.ngrinder.infra.config.Config;
import org.ngrinder.model.PerfTest;
import org.ngrinder.model.Status;
import org.ngrinder.monitor.controller.model.SystemDataModel;
import org.ngrinder.monitor.share.domain.SystemInfo;
import org.ngrinder.perftest.repository.PerfTestRepository;
import org.ngrinder.perftest.service.monitor.MonitorClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import java.io.File;
import java.io.IOException;
import java.util.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
/**
* {@link PerfTestService} test.
*
* @author Mavlarn
* @since 3.0
*/
public class PerfTestServiceTest extends AbstractPerfTestTransactionalTest {
@Autowired
private PerfTestService testService;
@Autowired
PerfTestRepository perfTestRepository;
@Before
public void clearPerfTest() {
clearAllPerfTest();
}
@Test
public void testGetTestListAll() {
createPerfTest("new Test1", Status.TESTING, new Date());
createPerfTest("new Test2", Status.FINISHED, new Date());
PerfTest candidate = testService.getNextRunnablePerfTestPerfTestCandidate();
assertThat(candidate, nullValue());
Pageable pageable = new PageRequest(0, 10);
Page<PerfTest> testList = testService.getPagedAll(getTestUser(), null, null, null, pageable);
assertThat(testList.getContent().size(), is(2));
testList = testService.getPagedAll(getTestUser(), null, null, "F", pageable);
assertThat(testList.getContent().size(), is(1));
// test with no paging
testList = testService.getPagedAll(getTestUser(), null, null, null, null);
assertThat(testList.getContent().size(), is(2));
testList = testService.getPagedAll(getTestUser(), null, null, "F", null);
assertThat(testList.getContent().size(), is(1));
List<PerfTest> list = testService.getAllTesting();
assertThat(list.size(), is(1));
for (PerfTest test : list) {
long systemTimeMills = System.currentTimeMillis();
test.setStartTime(new Date(systemTimeMills));
PerfTest testTemp = testService.getOne(getTestUser(), test.getId());
assertThat(testTemp.getId(), is(test.getId()));
assertThat(testTemp.getStartTime().getTime(), is(systemTimeMills));
testService.markAbnormalTermination(testTemp, StopReason.CANCEL_BY_USER);
testService.markProgress(testTemp, "this test will be TESTING again");
testService.markStatusAndProgress(testTemp, Status.TESTING, "this is just test unit");
List<PerfTest> testingList = testService.getAll(getTestUser(), new Status[]{Status.TESTING});
assertThat(testingList.size(), is(1));
Long testCount = testService.count(getTestUser(), new Status[]{Status.TESTING});
assertThat(testCount, is(1L));
GrinderProperties properties = testService.getGrinderProperties(test);
assertThat(properties, not(nullValue()));
}
createPerfTest("new Test2", Status.getProcessingOrTestingTestStatus()[0], new Date());
list = testService.getCurrentlyRunningTest();
assertThat(list.size(), is(2));
PerfTest finishedTest = createPerfTest("new Test3", Status.ABNORMAL_TESTING, new Date());
finishedTest.setPort(0); // need port number for finishing
list = testService.getAllAbnormalTesting();
assertThat(list.size(), is(1));
testService.updatePerfTestAfterTestFinish(finishedTest);
createPerfTest("new Test3", Status.START_AGENTS, new Date());
List<PerfTest> errorList = testService.getAll(getTestUser(), new Status[]{Status.START_AGENTS});
assertThat(errorList.size(), is(1));
testService.markAbnormalTermination(errorList.get(0), "this is error test");
}
@Test
public void testTestScriptAll() {
int maxConcurrent = testService.getMaximumConcurrentTestCount();
assertThat(maxConcurrent, is(10));
PerfTest testScript = createPerfTest("new TestScript", Status.READY, new Date());
testService.addCommentOn(getTestUser(), testScript.getId(), "this is TestScript method", "");
PerfTest testing = testService.markProgressAndStatus(testScript, Status.TESTING, "It is testing from ready");
assertThat(testing.getStatus(), is(Status.TESTING));
File testPath = testService.getDistributionPath(testScript);
assertThat(testPath, not(nullValue()));
List<String> fileList = testService.getLogFiles(testScript.getId());
assertThat(fileList, not(nullValue()));
File scriptFile = testService.getLogFile(testScript.getId(), testScript.getScriptName());
assertThat(scriptFile, not(nullValue()));
ConsoleProperties consoleProperties = testService.createConsoleProperties(testScript);
assertThat(consoleProperties, not(nullValue()));
}
@Test
public void testGetReportDataWithExistingData() throws IOException {
long testId = 123456L; // there is sample monitor data in test resources.
// Given
File testHomeDir = new ClassPathResource("world.py").getFile().getParentFile();
Home mockHome = new Home(testHomeDir);
LOG.debug("mock home dir is:{}", mockHome.getDirectory());
Config mockConfig = spy(config);
when(mockConfig.getHome()).thenReturn(mockHome);
PerfTestService mockService = spy(testService);
mockService.setConfig(mockConfig);
// When
// TPS,Errors,Mean_Test_Time_(ms)
int interval = mockService.getReportDataInterval(testId, "TPS", 700);
// Then
assertThat(mockService.getSingleReportDataAsJson(testId, "TPS", interval).length(), greaterThan(100));
assertThat(mockService.getSingleReportDataAsJson(testId, "Mean_Test_Time_(ms)", interval).length(),
greaterThan(100));
}
@Test
public void testGetMonitorDataWithExistingData() throws IOException {
// Given
long testId = 123456L; // there is sample monitor data in test resources.
File testHomeDir = new ClassPathResource("world.py").getFile().getParentFile();
Home mockHome = new Home(testHomeDir);
LOG.debug("mock home dir is:{}", mockHome.getDirectory());
Config mockConfig = spy(config);
when(mockConfig.getHome()).thenReturn(mockHome);
PerfTestService mockService = spy(testService);
mockService.setConfig(mockConfig);
// When
int interval = mockService.getMonitorGraphInterval(testId, "127.0.0.1", 700);
Map<String, String> reportDataMap = mockService.getMonitorGraph(testId, "127.0.0.1", interval);
// Then
assertThat(reportDataMap.get("cpu").length(), greaterThanOrEqualTo(300));
assertThat(reportDataMap.get("memory").length(), greaterThanOrEqualTo(300));
assertThat(reportDataMap.get("received").length(), greaterThanOrEqualTo(300));
assertThat(reportDataMap.get("sent").length(), greaterThanOrEqualTo(300));
}
@Test
public void testGetProperSizedStatusString() {
File tempRepo = new File(System.getProperty("java.io.tmpdir"), "test-repo");
tempRepo.mkdir();
tempRepo.deleteOnExit();
MonitorClientService client = new MonitorClientService("127.0.0.1", 13243);
client.init();
Map<String, SystemDataModel> rtnMap = new HashMap<String, SystemDataModel>();
Random random = new Random();
for (int i = 0; i < 80; i++) {
client.update();
SystemInfo info = client.getSystemInfo();
if (info == null) {
return;
}
info.setCustomValues(random.nextInt() + "," + random.nextInt());
SystemDataModel data1 = new SystemDataModel(info, "3.1.2");
rtnMap.put("test-" + random.nextInt(), data1);
ThreadUtils.sleep(100);
}
String statusString = perfTestService.getProperSizedStatusString(rtnMap);
System.out.println("Status string size is:" + statusString.length());
assertTrue(statusString.length() < 9950);
}
@Test
public void testCleanUpRuntimeOnlyData() {
PerfTest test = createPerfTest("new test", Status.READY, new Date());
test.setAgentState("{\"NC-PL-DEV013\":{\"freeMemory\":2937684,\"totalMemory\":8301204,\"cpuUsedPercentage\":31.234259,\"receivedPerSec\":1874668,\"sentPerSec\":1881129}}");
test.setMonitorState("{\"127.0.0.1\":{\"freeMemory\":1091352,\"totalMemory\":4042436,\"cpuUsedPercentage\":0.24937657,\"receivedPerSec\":102718,\"sentPerSec\":135072}}");
test.setRunningSample("{\"process\":1,\"peakTpsForGraph\":2192.0,\"lastSampleStatistics\":[{\"Peak_TPS\":0.0,\"Tests\":2145.0,\"Mean_time_to_first_byte\":0.3142191142191142,\"testDescription\":\"Test1\",\"Response_bytes_per_second\":62205.0,\"Errors\":0.0,\"TPS\":2145.0,\"testNumber\":1,\"Mean_Test_Time_(ms)\":0.4205128205128205}],\"thread\":1,\"cumulativeStatistics\":[{\"Peak_TPS\":2192.0,\"Tests\":197185.0,\"Mean_time_to_first_byte\":0.3229910997286812,\"testDescription\":\"Test1\",\"Response_bytes_per_second\":57481.98148390145,\"Errors\":0.0,\"TPS\":1982.1372925483258,\"testNumber\":1,\"Mean_Test_Time_(ms)\":0.4425539468012273}],\"tpsChartData\":2145.0,\"success\":true,\"totalStatistics\":{\"Peak_TPS\":2192.0,\"Tests\":197185.0,\"Mean_time_to_first_byte\":0.3229910997286812,\"Response_bytes_per_second\":57481.98148390145,\"Errors\":0.0,\"TPS\":1982.1372925483258,\"Mean_Test_Time_(ms)\":0.4425539468012273},\"test_time\":105}");
perfTestService.save(getTestUser(), test);
PerfTest testInDB = perfTestService.getOne(test.getId());
assertTrue(testInDB.getAgentState().length() > 0 && testInDB.getMonitorState().length() > 0);
test.setAgentState(null);
test.setMonitorState(null);
test.setRunningSample(null);
perfTestService.save(getTestUser(), test);
testInDB = perfTestService.getOne(test.getId());
assertTrue(testInDB.getAgentState() == null && testInDB.getMonitorState() == null);
}
}