/* * 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; /** * @author tschneck * Date: 2/23/16 */ import org.apache.commons.lang.StringUtils; import org.sakuli.datamodel.TestCase; import org.sakuli.datamodel.TestCaseStep; import org.sakuli.datamodel.TestSuite; import org.sakuli.services.forwarder.gearman.model.builder.NagiosFormatter; import org.springframework.beans.factory.annotation.Autowired; import java.util.SortedSet; public abstract class AbstractPerformanceDataBuilder { /** * name = value; warning; critical */ private static final String PERFORMANCE_DATA_TEMPLATE = "%s=%s;%s;%s;;"; @Autowired protected TestSuite testSuite; /** * Add to the assigned 'performanceData' a new data set in respect of the template {@link * #PERFORMANCE_DATA_TEMPLATE}. */ static String addPerformanceDataRow(String performanceData, String name, String value, String warning, String critical) { performanceData = (performanceData == null) ? "" : performanceData; name = (name == null) ? "" : StringUtils.replace(name.trim(), " ", "_"); value = (value == null) ? "" : value.trim(); warning = (warning == null) ? "" : warning.trim(); critical = (critical == null) ? "" : critical.trim(); //format string and remove not needed spaces at beginn and ending return performanceData.concat(" ").concat(String.format(PERFORMANCE_DATA_TEMPLATE, name, value, warning, critical)).trim(); } /** * Small wrapper for non overview data for the {@link #addPerformanceDataRow(String, String, String, String, * String)} */ static String addPerformanceDataRow(String performanceData, String name, float duration, int warningTime, int criticalTime) { String warningTimeString = (warningTime > 0) ? String.valueOf(warningTime) : null; String criticalTimeString = (criticalTime > 0) ? String.valueOf(criticalTime) : null; return addPerformanceDataRow(performanceData, name, NagiosFormatter.formatToSec(duration), warningTimeString, criticalTimeString); } /** * Small wrapper for threshold data like`suite__warning` or `case__warning`. */ static String addPerformanceDataRow4Threshold(String performanceData, String name, int warningTime, int criticalTime) { if (warningTime > 0) { performanceData = addPerformanceDataRow(performanceData, name + "__warning", NagiosFormatter.formatToSec(warningTime), null, null); } if (criticalTime > 0) { performanceData = addPerformanceDataRow(performanceData, name + "__critical", NagiosFormatter.formatToSec(criticalTime), null, null); } return performanceData; } /** * Add a line without any performance values and only with values to the performance data. * See {@link #addPerformanceDataRow(String, String, String, String, String)} */ static String addUnknownPerformanceDataRow(String data, String stepName) { return addPerformanceDataRow(data, stepName, "U", null, null); } /** * Generates the performance data for assigned {@link TestSuite}as an {@link String}. * * @param testSuite instance of the current {@link TestSuite} * @return formatted payload string */ protected static String getTestSuitePerformanceData(TestSuite testSuite) { OutputState outputState = OutputState.lookupSakuliState(testSuite.getState()); String data = ""; data = addPerformanceDataRow(data, "suite__state", String.valueOf(outputState.getErrorCode()), null, null); data = addPerformanceDataRow4Threshold(data, "suite", testSuite.getWarningTime(), testSuite.getCriticalTime()); final String suiteName = "suite_" + testSuite.getId(); if (testSuite.getState() != null && testSuite.getState().isFinishedWithoutErrors()) { data = addPerformanceDataRow(data, suiteName, testSuite.getDuration(), testSuite.getWarningTime(), testSuite.getCriticalTime()); } else { //add data performance data with unknown state data = addUnknownPerformanceDataRow(data, suiteName); } //add testcase data data = addTestCasePerformanceData(data, testSuite.getTestCasesAsSortedSet()); return data; } /** * Generates the performance data for assigned {@link TestCase}s as an {@link String}. * * @param data already produced performance data * @param testCases {@link SortedSet} of {@link TestCase}s * @return formatted payload string */ protected static String addTestCasePerformanceData(String data, SortedSet<TestCase> testCases) { int i = 1; for (TestCase tc : testCases) { OutputState tcOutputState = OutputState.lookupSakuliState(tc.getState()); String prefix = String.format("c_%03d", i); data = addPerformanceDataRow(data, prefix + "__state", String.valueOf(tcOutputState.getErrorCode()), null, null); data = addPerformanceDataRow4Threshold(data, prefix, tc.getWarningTime(), tc.getCriticalTime()); final String caseName = prefix + "_" + tc.getId(); if (tc.getState() != null && tc.getState().isFinishedWithoutErrors()) { data = addPerformanceDataRow(data, caseName, tc.getDuration(), tc.getWarningTime(), tc.getCriticalTime()); } else { //add data performance data with unknown state data = addUnknownPerformanceDataRow(data, caseName); } data = addTestCaseStepPerformanceData(data, tc.getStepsAsSortedSet(), i); i++; } return data; } /** * Generates the performance data for assigned {@link TestCaseStep}s as an {@link String}. * * @param data already produced performance data * @param testCaseSteps {@link SortedSet} of {@link TestCaseStep}s * @param countOfTestCase current count of the parent {@link TestCase} * @return formatted payload string */ protected static String addTestCaseStepPerformanceData(String data, SortedSet<TestCaseStep> testCaseSteps, int countOfTestCase) { int j = 1; for (TestCaseStep step : testCaseSteps) { final String stepName = String.format("s_%03d_%03d_%s", countOfTestCase, j, step.getId()); if (step.getState().isFinishedWithoutErrors()) { data = addPerformanceDataRow(data, stepName, step.getDuration(), step.getWarningTime(), 0); } else { //add data performance data with unknown state data = addUnknownPerformanceDataRow(data, stepName); } j++; } return data; } }