org.sakuli.datamodel.TestSuite.java Source code

Java tutorial

Introduction

Here is the source code for org.sakuli.datamodel.TestSuite.java

Source

/*
 * Sakuli - Testing and Monitoring-Tool for Websites and common UIs.
 *
 * Copyright 2013 - 2015 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.datamodel;

import org.sakuli.datamodel.properties.SakuliProperties;
import org.sakuli.datamodel.properties.TestSuiteProperties;
import org.sakuli.datamodel.state.TestCaseState;
import org.sakuli.datamodel.state.TestSuiteState;
import org.sakuli.exceptions.SakuliException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.nio.file.Path;
import java.util.*;

import static org.apache.commons.lang.StringUtils.*;

/**
 * @author tschneck Date: 10.06.13
 */
@Component
public class TestSuite extends AbstractTestDataEntity<SakuliException, TestSuiteState> {

    //browser name where to start the test execution
    private String browserName;
    //additional browser infos from sahi proxy
    private String browserInfo;
    private String host;
    private Path testSuiteFolder;
    private Path testSuiteFile;
    private int dbJobPrimaryKey = -1;
    private Map<String, TestCase> testCases;

    public TestSuite() {
    }

    @Autowired
    public TestSuite(TestSuiteProperties properties) {
        id = properties.getTestSuiteId();
        name = properties.getTestSuiteName();
        //if name is not set, use the id
        if (isEmpty(name)) {
            name = id;
        }
        warningTime = properties.getWarningTime();
        criticalTime = properties.getCriticalTime();
        testSuiteFolder = properties.getTestSuiteFolder();
        testSuiteFile = properties.getTestSuiteSuiteFile();
        browserName = properties.getBrowserName();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void refreshState() {
        if (exception != null) {
            state = TestSuiteState.ERRORS;
        } else if (testCases == null) {
            state = TestSuiteState.RUNNING;
        } else {
            for (TestCase tc : testCases.values()) {
                tc.refreshState();

                //if errors are found suite state is always error!
                if (tc.getState() == null) {
                    tc.addException(new SakuliException("ERROR: NO RESULT STATE SET"));
                    state = TestSuiteState.ERRORS;
                } else if (tc.getState().equals(TestCaseState.ERRORS)) {
                    state = TestSuiteState.ERRORS;
                }
                //if at least on test case has not finished, test suite is still running!
                else if (tc.getStopDate() == null) {
                    state = TestSuiteState.RUNNING;
                    return;
                }
                //now check if thresholds didn't exceed
                else if (tc.getState().equals(TestCaseState.CRITICAL)
                        && state.getErrorCode() < TestSuiteState.CRITICAL_IN_CASE.getErrorCode()) {
                    state = TestSuiteState.CRITICAL_IN_CASE;
                } else if (tc.getState().equals(TestCaseState.WARNING)
                        && state.getErrorCode() < TestSuiteState.WARNING_IN_CASE.getErrorCode()) {
                    state = TestSuiteState.WARNING_IN_CASE;
                } else if (tc.getState().equals(TestCaseState.WARNING_IN_STEP)
                        && state.getErrorCode() < TestSuiteState.WARNING_IN_STEP.getErrorCode()) {
                    state = TestSuiteState.WARNING_IN_STEP;
                }
                //all thresholds ok, no errors, case finished
                else if (tc.getState().equals(TestCaseState.OK)
                        && state.getErrorCode() < TestSuiteState.OK.getErrorCode()) {
                    state = TestSuiteState.OK;
                }
            }
            if (state.getErrorCode() < TestSuiteState.ERRORS.getErrorCode()) {
                if (criticalTime > 0 && getDuration() > criticalTime
                        && state.getErrorCode() < TestSuiteState.CRITICAL_IN_SUITE.getErrorCode()) {
                    state = TestSuiteState.CRITICAL_IN_SUITE;
                } else if (warningTime > 0 && getDuration() > warningTime
                        && state.getErrorCode() < TestSuiteState.WARNING_IN_SUITE.getErrorCode()) {
                    state = TestSuiteState.WARNING_IN_SUITE;
                }
            }
        }
    }

    @Override
    public String getResultString() {
        String stout = "\n=========== RESULT of SAKULI Testsuite \"" + getId() + "\" - " + getState()
                + " =================" + "\ntest suite id: " + this.getId() + "\nguid: " + this.getGuid()
                + super.getResultString() + "\ndb primary key of job table: " + this.getDbJobPrimaryKey()
                + "\nbrowser: " + this.getBrowserInfo();
        if (!CollectionUtils.isEmpty(testCases)) {
            for (TestCase tc : getTestCasesAsSortedSet()) {
                stout += tc.getResultString();
            }
        }
        return stout;
    }

    @Override
    public String getExceptionMessages(boolean flatFormatted) {
        StringBuilder suiteErrorMessage = new StringBuilder(trimToEmpty(super.getExceptionMessages(flatFormatted)));
        for (TestCase testCase : getTestCasesAsSortedSet()) {
            final String tcErrorMessage = testCase.getExceptionMessages(flatFormatted);

            if (isNotBlank(tcErrorMessage)) {
                if (suiteErrorMessage.length() > 0) {
                    suiteErrorMessage.append(flatFormatted ? " -- " : "\n");
                }
                suiteErrorMessage.append("CASE \"").append(testCase.getId()).append("\": ").append(tcErrorMessage);
            }
        }
        return suiteErrorMessage.toString();
    }

    public String getAbsolutePathOfTestSuiteFile() {
        return testSuiteFile == null ? null : testSuiteFile.toAbsolutePath().toString();
    }

    public Path getTestSuiteFolder() {
        return testSuiteFolder;
    }

    public void setTestSuiteFolder(Path testSuiteFolder) {
        this.testSuiteFolder = testSuiteFolder;
    }

    public String getBrowserName() {
        return browserName;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public Map<String, TestCase> getTestCases() {
        return testCases;
    }

    public void setTestCases(Map<String, TestCase> testCases) {
        this.testCases = testCases;
    }

    public int getDbJobPrimaryKey() {
        return dbJobPrimaryKey;
    }

    public void setDbJobPrimaryKey(int dbJobPrimaryKey) {
        this.dbJobPrimaryKey = dbJobPrimaryKey;
    }

    public String getBrowserInfo() {
        if (browserInfo == null || browserInfo.isEmpty()) {
            return browserName;
        }
        return browserInfo;
    }

    public void setBrowserInfo(String browserInfo) {
        this.browserInfo = browserInfo;
    }

    /**
     * @return a unique identifier for each execution of the test suite
     */
    public String getGuid() {
        Date guidDate = startDate != null ? startDate : new Date();
        return id + "__" + GUID_DATE_FORMATE.format(guidDate);
    }

    public void addTestCase(String testCaseId, TestCase testCase) {
        if (this.testCases == null) {
            this.testCases = new HashMap<>();
        }
        this.testCases.put(testCaseId, testCase);
    }

    public void addTestCase(TestCase testCase) {
        this.addTestCase(testCase.getId(), testCase);
    }

    public TestCase getTestCase(String testCaseId) {
        if (this.getTestCases().containsKey(testCaseId)) {
            return this.getTestCases().get(testCaseId);
        }
        return null;
    }

    /**
     * checks if the test case id is valid
     *
     * @return true if valid
     */
    public boolean checkTestCaseID(String testCaseID) {
        return testCaseID != null && this.getTestCases() != null && this.getTestCases().containsKey(testCaseID);
    }

    @Override
    public String toString() {
        return "TestSuite{" + super.toString() + ", id='" + id + '\'' + ", browserName='" + browserName + '\''
                + ", browserInfo='" + browserInfo + '\'' + ", host='" + host + '\'' + ", testSuiteFolder="
                + testSuiteFolder + ", testSuiteFile=" + testSuiteFile + ", dbJobPrimaryKey=" + dbJobPrimaryKey
                + ", testCases=" + testCases + '}';
    }

    /**
     * @return all {@link TestCase}s as {@link SortedSet} or a empty set if no test cases are specified.
     */
    public SortedSet<TestCase> getTestCasesAsSortedSet() {
        if (!CollectionUtils.isEmpty(testCases)) {
            return new TreeSet<>(testCases.values());
        }
        return new TreeSet<>();
    }

}