org.sakuli.services.forwarder.AbstractPerformanceDataBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.sakuli.services.forwarder.AbstractPerformanceDataBuilder.java

Source

/*
 * 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;
    }
}