/* * Sakuli - Testing and Monitoring-Tool for Websites and common UIs. * * Copyright 2013 - 2016 the original author or authors. * * 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.sakuli.services.forwarder; import org.apache.commons.lang.time.DateUtils; import org.joda.time.DateTime; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.Spy; import org.sakuli.builder.TestCaseExampleBuilder; import org.sakuli.builder.TestCaseStepExampleBuilder; import org.sakuli.builder.TestSuiteExampleBuilder; import org.sakuli.datamodel.TestCase; import org.sakuli.datamodel.TestCaseStep; import org.sakuli.datamodel.TestSuite; import org.sakuli.datamodel.properties.SakuliProperties; import org.sakuli.datamodel.state.TestCaseState; import org.sakuli.datamodel.state.TestCaseStepState; import org.sakuli.datamodel.state.TestSuiteState; import org.sakuli.exceptions.SakuliException; import org.sakuli.exceptions.SakuliRuntimeException; import org.sakuli.services.forwarder.gearman.GearmanProperties; import org.springframework.test.util.ReflectionTestUtils; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; import java.nio.file.Paths; import java.util.*; import static org.mockito.Mockito.when; import static org.sakuli.services.forwarder.gearman.TextPlaceholder.*; import static org.testng.Assert.assertEquals; /** * @author tschneck * Date: 2/24/16 */ public class AbstractOutputBuilderTest { @Mock private AbstractMonitoringTemplateProperties properties = new GearmanProperties(); @Spy @InjectMocks private AbstractOutputBuilder testling = new AbstractOutputBuilder() { @Override protected int getSummaryMaxLength() { return 150; } @Override protected String getOutputScreenshotDivWidth() { return "640px"; } }; @Spy @InjectMocks private ScreenshotDivConverter screenshotDivConverter; @DataProvider(name = "placeholder") public static Object[][] placeholder() { return new Object[][]{ {"empty {{}} test", "empty {{}} test"}, {"test message " + STATE.getPattern() + " test", "test message OK test"}, {STATE.getPattern() + " test", "OK test"}, {STATE.getPattern() + " test-" + STATE.getPattern(), "OK test-OK"}, {"test message " + STATE.getPattern(), "test message OK"}, {"test message " + STATE.getPattern() + " with id \"" + ID.getPattern() + "\"", "test message OK with id \"sakuli-123\""}, }; } @BeforeMethod public void setUp() throws Exception { MockitoAnnotations.initMocks(this); ReflectionTestUtils.setField(testling, "screenshotDivConverter", screenshotDivConverter); MonitoringPropertiesTestHelper.initMonitoringMock(properties); } @Test(dataProvider = "placeholder") public void testReplacePlaceHolder(String testMessage, String expectedMesaage) throws Exception { PlaceholderMap map = new PlaceholderMap(); map.put(STATE, "OK"); map.put(ID, "sakuli-123"); assertEquals(AbstractOutputBuilder.replacePlaceHolder(testMessage, map), expectedMesaage); //test recusiv map.put(STATE, STATE_DESC.getPattern()); map.put(STATE_DESC, "OK"); assertEquals(AbstractOutputBuilder.replacePlaceHolder(testMessage, map), expectedMesaage); } @Test(expectedExceptions = SakuliRuntimeException.class) public void testPlaceholderNull() throws Exception { AbstractOutputBuilder.replacePlaceHolder(null, null); } @Test public void testCutTo() throws Exception { assertEquals(AbstractOutputBuilder.cutTo("xxxxxxxx", 50), "xxxxxxxx"); assertEquals(AbstractOutputBuilder.cutTo("xxxxxxxx", 5), "xxxxx ..."); assertEquals(AbstractOutputBuilder.cutTo(null, 5), null); } @Test public void testFormatTestSuiteStateMessageUnknown() throws Exception { TestSuite testSuiteExample = new TestSuiteExampleBuilder() .withId("sakuli-123") .withState(TestSuiteState.RUNNING) .withStopDate(null) .buildExample(); String result = testling.formatTestSuiteSummaryStateMessage(testSuiteExample, properties.getTemplateSuiteSummary()); assertEquals(result, "[UNKN] Sakuli suite \"sakuli-123\" suite still running. (Last suite run: xx)"); } @Test public void testFormatTestSuiteStateMessageOK() throws Exception { Date startDate = new Date(); TestSuite testSuiteExample = new TestSuiteExampleBuilder() .withId("sakuli-123") .withState(TestSuiteState.OK) .withStartDate(startDate) .withStopDate(DateUtils.addSeconds(startDate, 120)) .buildExample(); String result = testling.formatTestSuiteSummaryStateMessage(testSuiteExample, properties.getTemplateSuiteSummary()); String lastRun = AbstractOutputBuilder.dateFormat.format(testSuiteExample.getStopDate()); assertEquals(result, "[OK] Sakuli suite \"sakuli-123\" ok (120.00s). (Last suite run: " + lastRun + ")"); } @Test public void testFormatTestSuiteStateMessageException() throws Exception { Date startDate = new Date(); TestSuite testSuiteExample = new TestSuiteExampleBuilder() .withId("sakuli-123") .withState(TestSuiteState.ERRORS) .withStartDate(startDate) .withException(new SakuliException("TEST-ERROR")) .withStopDate(DateUtils.addSeconds(startDate, 120)) .buildExample(); String result = testling.formatTestSuiteSummaryStateMessage(testSuiteExample, properties.getTemplateSuiteSummary()); String lastRun = AbstractOutputBuilder.dateFormat.format(testSuiteExample.getStopDate()); assertEquals(result, "[CRIT] Sakuli suite \"sakuli-123\" (120.00s) EXCEPTION: 'TEST-ERROR'. (Last suite run: " + lastRun + ")"); } @Test public void testGetTextPlaceHolderTestSuite() throws Exception { TestSuite testSuite = new TestSuiteExampleBuilder() .withState(TestSuiteState.OK) .withTestSuiteFolder(Paths.get("folder")) .buildExample(); final PlaceholderMap textPlaceholder = testling.getTextPlaceholder(testSuite); assertEquals(textPlaceholder.get(STATE), "OK"); assertEquals(textPlaceholder.get(STATE_SHORT), "[OK]"); assertEquals(textPlaceholder.get(STATE_DESC), "ok"); assertEquals(textPlaceholder.get(SUITE_SUMMARY), "{{state_description}} ({{duration}}s)"); assertEquals(textPlaceholder.get(NAME), testSuite.getName()); assertEquals(textPlaceholder.get(ID), testSuite.getId()); assertEquals(textPlaceholder.get(DURATION), "120.00"); assertEquals(textPlaceholder.get(START_DATE), AbstractOutputBuilder.dateFormat.format(testSuite.getStartDate())); assertEquals(textPlaceholder.get(STOP_DATE), AbstractOutputBuilder.dateFormat.format(testSuite.getStopDate())); assertEquals(textPlaceholder.get(WARN_THRESHOLD), "0"); assertEquals(textPlaceholder.get(CRITICAL_THRESHOLD), "0"); assertEquals(textPlaceholder.get(ERROR_MESSAGE), ""); assertEquals(textPlaceholder.get(SUITE_FOLDER), "folder"); assertEquals(textPlaceholder.get(HOST), "localhost"); assertEquals(textPlaceholder.get(BROWSER_INFO), "firefox"); assertEquals(textPlaceholder.get(TD_CSS_CLASS), "serviceOK"); //assert empty fields assertEquals(textPlaceholder.get(CASE_FILE), ""); assertEquals(textPlaceholder.get(CASE_LAST_URL), ""); assertEquals(textPlaceholder.get(CASE_START_URL), ""); assertEquals(textPlaceholder.get(STEP_INFORMATION), ""); } @Test public void testGetTextPlaceHolderTestCase() throws Exception { TestCase testCase = new TestCaseExampleBuilder() .withState(TestCaseState.OK) .withTestCaseFile(Paths.get("folder/_tc.js")) .buildExample(); final PlaceholderMap textPlaceholder = testling.getTextPlaceholder(testCase); assertEquals(textPlaceholder.get(STATE), "OK"); assertEquals(textPlaceholder.get(STATE_SHORT), "[OK]"); assertEquals(textPlaceholder.get(STATE_DESC), "ok"); assertEquals(textPlaceholder.get(NAME), testCase.getName()); assertEquals(textPlaceholder.get(ID), testCase.getId()); assertEquals(textPlaceholder.get(DURATION), "3.00"); assertEquals(textPlaceholder.get(STOP_DATE), AbstractOutputBuilder.dateFormat.format(testCase.getStopDate())); assertEquals(textPlaceholder.get(START_DATE), AbstractOutputBuilder.dateFormat.format(testCase.getStartDate())); assertEquals(textPlaceholder.get(WARN_THRESHOLD), "4"); assertEquals(textPlaceholder.get(CRITICAL_THRESHOLD), "5"); assertEquals(textPlaceholder.get(ERROR_MESSAGE), ""); assertEquals(textPlaceholder.get(CASE_FILE), String.format("folder%s_tc.js", File.separator)); assertEquals(textPlaceholder.get(CASE_LAST_URL), "http://www.last-url.com"); assertEquals(textPlaceholder.get(CASE_START_URL), "http://www.start-url.com"); assertEquals(textPlaceholder.get(STEP_INFORMATION), ""); assertEquals(textPlaceholder.get(TD_CSS_CLASS), "serviceOK"); //assert empty fields assertEquals(textPlaceholder.get(SUITE_SUMMARY), ""); assertEquals(textPlaceholder.get(SUITE_FOLDER), ""); assertEquals(textPlaceholder.get(HOST), ""); assertEquals(textPlaceholder.get(BROWSER_INFO), ""); } @DataProvider public Object[][] testGenerateTestCaseStepInformationDP() { return new Object[][] { {new TestCaseStep[]{}, ""}, {new TestCaseStep[]{createTestCaseStep(null, new DateTime(), TestCaseStepState.WARNING)}, ", step \"step_for_unit_test\" over runtime (3.00s/warn at 4s)"}, {new TestCaseStep[]{createTestCaseStep(null, new DateTime(), TestCaseStepState.WARNING), createTestCaseStep("step_2", new DateTime().plusSeconds(1), TestCaseStepState.WARNING)}, ", step \"step_for_unit_test\" over runtime (3.00s/warn at 4s), step \"step_2\" over runtime (3.00s/warn at 4s)"}, {new TestCaseStep[]{createTestCaseStep("ok1", new DateTime(), TestCaseStepState.OK), createTestCaseStep("ok2", new DateTime().plusSeconds(1), TestCaseStepState.OK)}, ""}, }; } @Test(dataProvider = "testGenerateTestCaseStepInformationDP") public void testGenerateTestCaseStepInformation(TestCaseStep[] testCaseSteps, String expectedTestCaseStepInformation) throws Exception { SortedSet<TestCaseStep> input = new TreeSet<>(); input.addAll(Arrays.asList(testCaseSteps)); assertEquals(AbstractOutputBuilder.generateStepInformation(input), expectedTestCaseStepInformation); } @DataProvider public Object[][] testGenerateTestCaseInformationDP() { return new Object[][] { {new TestCase[]{}, ""}, {new TestCase[]{createTestCase(null, new DateTime(), TestCaseState.WARNING)}, ", case \"Unit Test Case\" over runtime (3.00s/warn at 4s)"}, {new TestCase[]{createTestCase(null, new DateTime(), TestCaseState.WARNING), createTestCase("case_2", new DateTime().plusSeconds(1), TestCaseState.WARNING)}, ", case \"Unit Test Case\" over runtime (3.00s/warn at 4s), case \"case_2\" over runtime (3.00s/warn at 4s)"}, {new TestCase[]{createTestCase("ok1", new DateTime(), TestCaseState.OK), createTestCase("ok2", new DateTime().plusSeconds(1), TestCaseState.OK)}, ""}, }; } @Test(dataProvider = "testGenerateTestCaseInformationDP") public void testGenerateTestCaseInformation(TestCase[] testCases, String expectedTestCaseInformation) throws Exception { SortedSet<TestCase> input = new TreeSet<>(); input.addAll(Arrays.asList(testCases)); assertEquals(AbstractOutputBuilder.generateCaseInformation(input), expectedTestCaseInformation); } private TestCase createTestCase(String name, DateTime creationDate, TestCaseState state) { TestCase testCase = new TestCaseExampleBuilder().withCreationDate(creationDate).withState(state).buildExample(); if (name != null) { testCase.setName(name); } return testCase; } private TestCaseStep createTestCaseStep(String name, DateTime creationDate, TestCaseStepState state) { TestCaseStep testCaseStep = new TestCaseStepExampleBuilder().withCreationDate(creationDate).withState(state).buildExample(); if (name != null) { testCaseStep.setName(name); } return testCaseStep; } }