/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wsdl.loadtest.assertions;
import com.eviware.soapui.config.LoadTestAssertionConfig;
import com.eviware.soapui.impl.wsdl.loadtest.WsdlLoadTest;
import com.eviware.soapui.impl.wsdl.loadtest.data.LoadTestStatistics;
import com.eviware.soapui.impl.wsdl.loadtest.data.LoadTestStatistics.Statistic;
import com.eviware.soapui.impl.wsdl.support.Configurable;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.model.testsuite.LoadTestRunContext;
import com.eviware.soapui.model.testsuite.LoadTestRunner;
import com.eviware.soapui.model.testsuite.TestCaseRunContext;
import com.eviware.soapui.model.testsuite.TestCaseRunner;
import com.eviware.soapui.model.testsuite.TestStep;
import com.eviware.soapui.model.testsuite.TestStepResult;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.types.StringToStringMap;
import com.eviware.soapui.support.xml.XmlObjectConfigurationBuilder;
import com.eviware.soapui.support.xml.XmlObjectConfigurationReader;
import com.eviware.x.form.XForm;
import com.eviware.x.form.XForm.FieldType;
import com.eviware.x.form.XFormDialog;
import com.eviware.x.form.XFormDialogBuilder;
import com.eviware.x.form.XFormFactory;
import org.apache.log4j.Logger;
import org.apache.xmlbeans.XmlObject;
import java.util.List;
/**
* LoadTestAssertion for asserting the maximum step time
*
* @author Ole.Matzura
*/
public class TestStepMaxAssertion extends AbstractLoadTestAssertion implements Configurable {
private static final String NAME_FIELD = "Name";
private static final String NAME_ELEMENT = "name";
private static final String MAX_VALUE_ELEMENT = "max-value";
private static final String MIN_REQUESTS_ELEMENT = "min-requests";
private static final String MAX_VALUE_FIELD = "Max Time";
private static final String MINIMUM_REQUESTS_FIELD = "Minimum Requests";
private static final String MAX_ERRORS_ELEMENT = "max-errors";
private static final String MAX_ERRORS_FIELD = "Max Errors";
private int minRequests;
private int maxValue;
private int maxErrors;
private XFormDialog dialog;
public static final String STEP_MAXIMUM_TYPE = "Step Maximum";
private final static Logger log = Logger.getLogger(TestStepMaxAssertion.class);
public TestStepMaxAssertion(LoadTestAssertionConfig assertionConfig, WsdlLoadTest loadTest) {
super(assertionConfig, loadTest);
init(assertionConfig);
initIcon("/max_loadtest_assertion.gif");
}
private void init(LoadTestAssertionConfig assertionConfig) {
XmlObject configuration = assertionConfig.getConfiguration();
XmlObjectConfigurationReader reader = new XmlObjectConfigurationReader(configuration);
setName(reader.readString(TestStepMaxAssertion.NAME_ELEMENT, "Step Maximum"));
minRequests = reader.readInt(TestStepMaxAssertion.MIN_REQUESTS_ELEMENT, 100);
maxValue = reader.readInt(TestStepMaxAssertion.MAX_VALUE_ELEMENT, 1000);
setTargetStep(reader.readString(TestStepMaxAssertion.TEST_STEP_ELEMENT, TestStepMaxAssertion.ANY_TEST_STEP));
maxErrors = reader.readInt(MAX_ERRORS_ELEMENT, -1);
}
public String assertResult(LoadTestRunner loadTestRunner, LoadTestRunContext context, TestStepResult result,
TestCaseRunner testRunner, TestCaseRunContext runContext) {
TestStep step = result.getTestStep();
if (targetStepMatches(step)) {
WsdlLoadTest loadTest = (WsdlLoadTest) loadTestRunner.getLoadTest();
LoadTestStatistics statisticsModel = loadTest.getStatisticsModel();
int index = step.getTestCase().getIndexOfTestStep(step);
long maximum = result.getTimeTaken();
if (statisticsModel.getStatistic(index, Statistic.COUNT) > minRequests && maximum >= maxValue) {
return returnErrorOrFail("Time [" + maximum + "] exceeds limit [" + maxValue + "]", maxErrors,
loadTestRunner, context);
}
}
return null;
}
public String assertResults(LoadTestRunner loadTestRunner, LoadTestRunContext context, TestCaseRunner testRunner,
TestCaseRunContext runContext) {
if (ALL_TEST_STEPS.equals(getTargetStep())) {
WsdlLoadTest loadTest = (WsdlLoadTest) loadTestRunner.getLoadTest();
LoadTestStatistics statisticsModel = loadTest.getStatisticsModel();
long sum = 0;
List<TestStepResult> results = testRunner.getResults();
for (int c = 0; c < results.size(); c++) {
TestStepResult result = results.get(c);
if (result == null) {
log.warn("Result [" + c + "] is null in TestCase [" + testRunner.getTestCase().getName() + "]");
continue;
}
sum += result.getTimeTaken();
}
if (statisticsModel.getStatistic(LoadTestStatistics.TOTAL, Statistic.COUNT) >= minRequests
&& sum >= maxValue) {
return returnErrorOrFail("Time [" + sum + "] exceeds limit [" + maxValue + "]", maxErrors, loadTestRunner,
context);
}
}
return null;
}
public String getDescription() {
return "testStep: " + getTargetStep() + ", minRequests: " + minRequests + ", maxValue: " + maxValue
+ ", maxErrors: " + maxErrors;
}
public boolean configure() {
if (dialog == null) {
buildDialog();
}
StringToStringMap values = new StringToStringMap();
values.put(TestStepMaxAssertion.NAME_FIELD, getName());
values.put(TestStepMaxAssertion.MINIMUM_REQUESTS_FIELD, String.valueOf(minRequests));
values.put(TestStepMaxAssertion.MAX_VALUE_FIELD, String.valueOf(maxValue));
values.put(TestStepMaxAssertion.TEST_STEP_FIELD, getTargetStep());
values.put(TestStepMaxAssertion.MAX_ERRORS_FIELD, String.valueOf(maxErrors));
dialog.setOptions(TestStepMaxAssertion.TEST_STEP_FIELD, getTargetStepOptions(true));
values = dialog.show(values);
if (dialog.getReturnValue() == XFormDialog.OK_OPTION) {
try {
minRequests = Integer.parseInt(values.get(TestStepMaxAssertion.MINIMUM_REQUESTS_FIELD));
maxValue = Integer.parseInt(values.get(TestStepMaxAssertion.MAX_VALUE_FIELD));
maxErrors = Integer.parseInt(values.get(TestStepMaxAssertion.MAX_ERRORS_FIELD));
setTargetStep(values.get(TestStepMaxAssertion.TEST_STEP_FIELD));
setName(values.get(TestStepMaxAssertion.NAME_FIELD));
} catch (Exception e) {
UISupport.showErrorMessage(e.getMessage());
}
updateConfiguration();
return true;
}
return false;
}
protected void updateConfiguration() {
XmlObjectConfigurationBuilder builder = new XmlObjectConfigurationBuilder();
builder.add(TestStepMaxAssertion.NAME_ELEMENT, getName());
builder.add(TestStepMaxAssertion.MIN_REQUESTS_ELEMENT, minRequests);
builder.add(TestStepMaxAssertion.MAX_VALUE_ELEMENT, maxValue);
builder.add(TestStepMaxAssertion.TEST_STEP_ELEMENT, getTargetStep());
builder.add(TestStepMaxAssertion.MAX_ERRORS_ELEMENT, maxErrors);
setConfiguration(builder.finish());
}
private void buildDialog() {
XFormDialogBuilder builder = XFormFactory.createDialogBuilder("Step Maximum Assertion");
XForm form = builder.createForm("Basic");
form.addTextField(TestStepMaxAssertion.NAME_FIELD, "Name of this assertion", FieldType.TEXT);
form.addTextField(TestStepMaxAssertion.MINIMUM_REQUESTS_FIELD, "Minimum steps before asserting", FieldType.TEXT);
form.addTextField(TestStepMaxAssertion.MAX_VALUE_FIELD, "Maximum allowed step time", FieldType.TEXT);
form.addTextField(TestStepMaxAssertion.MAX_ERRORS_FIELD, "Maximum number of errors before failing",
FieldType.TEXT);
form.addComboBox(TestStepMaxAssertion.TEST_STEP_FIELD, new String[0], "TestStep to assert");
dialog = builder.buildDialog(
builder.buildOkCancelHelpActions(HelpUrls.STEP_MAXIMUM_LOAD_TEST_ASSERTION_HELP_URL),
"Specify options for this Step Maximum Assertion", UISupport.OPTIONS_ICON);
}
}