/*
* 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.integration.loadui;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.LoadTestLimitTypesConfig;
import com.eviware.soapui.impl.wsdl.loadtest.LoadTestAssertion;
import com.eviware.soapui.impl.wsdl.loadtest.WsdlLoadTest;
import com.eviware.soapui.impl.wsdl.loadtest.assertions.TestStepAverageAssertion;
import com.eviware.soapui.impl.wsdl.loadtest.assertions.TestStepMaxAssertion;
import com.eviware.soapui.impl.wsdl.loadtest.assertions.TestStepTpsAssertion;
import com.eviware.soapui.impl.wsdl.loadtest.strategy.BurstLoadStrategy;
import com.eviware.soapui.impl.wsdl.loadtest.strategy.LoadStrategy;
import com.eviware.soapui.impl.wsdl.loadtest.strategy.SimpleLoadStrategy;
import com.eviware.soapui.impl.wsdl.loadtest.strategy.ThreadCountChangeLoadStrategy;
import com.eviware.soapui.impl.wsdl.loadtest.strategy.VarianceLoadStrategy;
import com.eviware.soapui.settings.HttpSettings;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ContextMapping {
private static final String NOT_SELECTED = "-";
private static final String TEST_CASE = "testCase";
private static final String TEST_SUITE = "testSuite";
private static final String PROJECT_FILE = "projectFile";
public static final String MOCK_SERVICE = "mockService";
public static final String PATH = "path";
public static final String PORT = "port";
private static final String CLOSE_CONNECTIONS_AFTER_REQUEST = "closeConnectionsAfterRequest";
private static final String SOAPUI_RUNNER_LABEL = "soapuiSamplerLabel";
public static final String LOADUI_TEST_CASE_NAME = "loaduiTestCaseName";
public static final String LOADUI_PROJECT_NAME = "loaduiProjectName";
private static final String SOAPUI_RUNNER_PROPERTIES = "SoapUISamplerComponent_properties";
private static final String MOCKSERVICE_RUNNER_LABEL = "mockRunnerLabel";
private static final String MOCKSERVICE_RUNNER_PROPERTIES = "MockServiceComponent_properties";
private static final String ASSERTION_LABEL = "assertionLabel";
private static final String ASSERTION_TYPE = "assertionType";
private static final String ASSERTION_PROPERTIES = "assertionProperties";
private static final String ASSERTION = "Assertion";
private static final String ASSERTION_CREATE_NEW = "assertionCreateNew";
private static final String STATISTICS_LABEL = "statisticsLabel";
private static final String STATISTICS_TYPE = "statisticsType";
private static final String STATISTICS_PROPERTIES = "statisticsProperties";
private static final String STATISTICS = "Statistics";
private static final String STATISTICS_CREATE_NEW = "statisticsCreateNew";
private static final String TRIGGER_LABEL = "triggerLabel";
private static final String TRIGGER_TYPE = "triggerType";
protected static final String TRIGGER_PROPERTIES = "triggerProperties";
private static final String TRIGGER_CREATE_NEW = "triggerCreateNew";
private static final String DELAY_LABEL = "delayLabel";
private static final String DELAY_TYPE = "delayType";
private static final String DELAY_PROPERTIES = "delayProperties";
private static final String DELAY = "Delay";
private static final String DELAY_CREATE_NEW = "delayCreateNew";
protected static final String FIXED_LOAD_TRIGGER = "Fixed Load";
private static final String VARIANCE_TRIGGER = "Variance";
private static final String RAMP_TRIGGER = "Ramp";
private WsdlLoadTest loadTest;
private String loadUIProject;
private String loadUITestCase;
private String loadUISoapUISampler;
private String soapUIProjectPath;
private String soapUITestSuite;
private String soapUITestCase;
protected String loadUITriggerType;
private String soapUIMockService;
private String mockServicePath;
private String mockServicePort;
private String loadUIMockServiceRunner;
HashMap<String, String> triggerProperties;
HashMap<String, String> delayProperties;
List<HashMap<String, String>> assertionPropertiesList;
HashMap<String, String> statisticsProperties;
public ContextMapping(WsdlLoadTest loadTest, String loadUIProject, String loadUITestCase, String loadUISoapUISampler) {
this.loadTest = loadTest;
this.loadUIProject = loadUIProject;
this.loadUITestCase = loadUITestCase;
this.loadUISoapUISampler = loadUISoapUISampler;
}
public ContextMapping(String soapUIProjectPath, String soapUITestSuite, String soapUITestCase,
String loadUIProject, String loadUITestCase, String loadUISoapUISampler) {
this.loadUIProject = loadUIProject;
this.loadUITestCase = loadUITestCase;
this.loadUISoapUISampler = loadUISoapUISampler;
this.soapUIProjectPath = soapUIProjectPath;
this.soapUITestSuite = soapUITestSuite;
this.soapUITestCase = soapUITestCase;
}
public ContextMapping(String soapUIProjectPath, String soapUIMockService, String path, String port,
String loadUIProject, String loadUITestCase, String loadUIMockServiceRunner) {
this.loadUIProject = loadUIProject;
this.loadUITestCase = loadUITestCase;
this.loadUIMockServiceRunner = loadUIMockServiceRunner;
this.soapUIProjectPath = soapUIProjectPath;
this.soapUIMockService = soapUIMockService;
this.mockServicePath = path;
this.mockServicePort = port;
}
public static String createProperyValue(Class clazz, String value) {
return clazz.getName() + "@" + value;
}
public HashMap<String, Object> setCreateSoapUIRunnerContext(String generatorType, String analisysType) {
HashMap<String, Object> context = new HashMap<String, Object>();
HashMap<String, String> properties = new HashMap<String, String>();
properties.put(PROJECT_FILE, createProperyValue(File.class, soapUIProjectPath));
properties.put(TEST_SUITE, createProperyValue(String.class, soapUITestSuite));
properties.put(TEST_CASE, createProperyValue(String.class, soapUITestCase));
context.put(LOADUI_PROJECT_NAME, loadUIProject);
context.put(LOADUI_TEST_CASE_NAME, loadUITestCase);
context.put(SOAPUI_RUNNER_LABEL, loadUISoapUISampler);
context.put(SOAPUI_RUNNER_PROPERTIES, properties);
if (!NOT_SELECTED.equals(generatorType)) {
mapDefaultTriggerProperties(generatorType);
context.put(TRIGGER_PROPERTIES, triggerProperties);
context.put(TRIGGER_LABEL, loadUITriggerType);
context.put(TRIGGER_TYPE, loadUITriggerType);
context.put(TRIGGER_CREATE_NEW, new Boolean(true));
}
if (!NOT_SELECTED.equals(analisysType)) {
mapStatisticsProperties(null);
context.put(STATISTICS_PROPERTIES, statisticsProperties);
context.put(STATISTICS_LABEL, STATISTICS);
context.put(STATISTICS_TYPE, STATISTICS);
context.put(STATISTICS_CREATE_NEW, new Boolean(true));
}
return context;
}
public HashMap<String, Object> setCreateMockServiceRunnerContext() {
HashMap<String, Object> context = new HashMap<String, Object>();
HashMap<String, String> properties = new HashMap<String, String>();
properties.put(PROJECT_FILE, createProperyValue(File.class, soapUIProjectPath));
properties.put(MOCK_SERVICE, createProperyValue(String.class, soapUIMockService));
properties.put(PATH, createProperyValue(String.class, mockServicePath));
properties.put(PORT, createProperyValue(String.class, mockServicePort));
context.put(LOADUI_PROJECT_NAME, loadUIProject);
context.put(LOADUI_TEST_CASE_NAME, loadUITestCase);
context.put(MOCKSERVICE_RUNNER_LABEL, loadUIMockServiceRunner);
context.put(MOCKSERVICE_RUNNER_PROPERTIES, properties);
return context;
}
public HashMap<String, Object> setInitExportLoadTestToLoadUIContext() {
HashMap<String, Object> context = new HashMap<String, Object>();
HashMap<String, String> properties = new HashMap<String, String>();
properties.put(PROJECT_FILE,
createProperyValue(File.class, loadTest.getTestCase().getTestSuite().getProject().getPath()));
properties.put(TEST_SUITE, createProperyValue(String.class, loadTest.getTestCase().getTestSuite().getName()));
properties.put(TEST_CASE, createProperyValue(String.class, loadTest.getTestCase().getName()));
properties.put(
CLOSE_CONNECTIONS_AFTER_REQUEST,
createProperyValue(Boolean.class,
Boolean.toString(loadTest.getSettings().getBoolean(HttpSettings.CLOSE_CONNECTIONS))));
context.put(LOADUI_PROJECT_NAME, loadUIProject);
context.put(LOADUI_TEST_CASE_NAME, loadUITestCase);
context.put(SOAPUI_RUNNER_LABEL, loadUISoapUISampler);
context.put(SOAPUI_RUNNER_PROPERTIES, properties);
mapInitialTriggerProperties(loadTest);
context.put(TRIGGER_PROPERTIES, triggerProperties);
context.put(TRIGGER_LABEL, loadUITriggerType);
context.put(TRIGGER_TYPE, loadUITriggerType);
context.put(TRIGGER_CREATE_NEW, new Boolean(true));
if (delayProperties != null) {
context.put(DELAY_PROPERTIES, delayProperties);
context.put(DELAY_LABEL, DELAY);
context.put(DELAY_TYPE, DELAY);
context.put(DELAY_CREATE_NEW, new Boolean(true));
}
mapAssertionProperties(loadTest);
for (int i = 0; i < assertionPropertiesList.size(); i++) {
context.put(ASSERTION_PROPERTIES + i, assertionPropertiesList.get(i));
context.put(ASSERTION_LABEL + i, ASSERTION + i);
context.put(ASSERTION_TYPE + i, ASSERTION);
context.put(ASSERTION_CREATE_NEW + i, new Boolean(true));
}
mapStatisticsProperties(loadTest);
context.put(STATISTICS_PROPERTIES, statisticsProperties);
context.put(STATISTICS_LABEL, STATISTICS);
context.put(STATISTICS_TYPE, STATISTICS);
context.put(STATISTICS_CREATE_NEW, new Boolean(true));
return context;
}
protected void mapInitialTriggerProperties(WsdlLoadTest loadTest) {
triggerProperties = new HashMap<String, String>();
LoadStrategy loadStrategy = loadTest.getLoadStrategy();
if (loadStrategy instanceof SimpleLoadStrategy) {
SimpleLoadStrategy currentStrategy = (SimpleLoadStrategy) loadStrategy;
loadUITriggerType = FIXED_LOAD_TRIGGER;
triggerProperties.put("load", createProperyValue(Long.class, Long.toString(loadTest.getThreadCount())));
long testDelay = currentStrategy.getTestDelay();
if (testDelay > 0) {
delayProperties = new HashMap<String, String>();
delayProperties.put("delay", createProperyValue(Long.class, Long.toString(testDelay)));
int randomFactor = (int) (currentStrategy.getRandomFactor() * 100);
delayProperties.put("randomDelay", createProperyValue(Long.class, Integer.toString(randomFactor)));
}
return;
}
if (loadStrategy instanceof VarianceLoadStrategy) {
loadUITriggerType = VARIANCE_TRIGGER;
VarianceLoadStrategy currentStrategy = (VarianceLoadStrategy) loadStrategy;
return;
}
if (loadStrategy instanceof ThreadCountChangeLoadStrategy) {
loadUITriggerType = RAMP_TRIGGER;
ThreadCountChangeLoadStrategy currentStrategy = (ThreadCountChangeLoadStrategy) loadStrategy;
return;
}
if (loadStrategy instanceof BurstLoadStrategy) {
loadUITriggerType = FIXED_LOAD_TRIGGER;
triggerProperties.put("load", createProperyValue(Long.class, Long.toString(loadTest.getThreadCount())));
return;
}
}
protected void mapDefaultTriggerProperties(String generatorType) {
triggerProperties = new HashMap<String, String>();
loadUITriggerType = generatorType;
}
public HashMap<String, Object> setFinalExportLoadTestToLoadUIContext(HashMap<String, Object> createdItemContext) {
mapExistingTriggerProperties(loadTest, createdItemContext);
createdItemContext.put(TRIGGER_PROPERTIES, triggerProperties);
return createdItemContext;
}
// repopulates the properties with right values, if property is not set old
// value it means leave the old value
protected HashMap<String, String> mapExistingTriggerProperties(WsdlLoadTest loadTest,
HashMap<String, Object> createdItemContext) {
LoadStrategy loadStrategy = loadTest.getLoadStrategy();
triggerProperties = (HashMap<String, String>) createdItemContext.get(TRIGGER_PROPERTIES);
if (loadStrategy instanceof VarianceLoadStrategy) {
loadUITriggerType = VARIANCE_TRIGGER;
VarianceLoadStrategy currentStrategy = (VarianceLoadStrategy) loadStrategy;
long rate = extractLongProperty("rate");
triggerProperties.put("shape", createProperyValue(String.class, "Sine-wave"));
triggerProperties.put("amplitude",
createProperyValue(Long.class, Long.toString(((long) (currentStrategy.getVariance() * rate)))));
triggerProperties.put("period",
createProperyValue(Long.class, Long.toString(currentStrategy.getInterval() / 1000)));
}
if (loadStrategy instanceof ThreadCountChangeLoadStrategy) {
loadUITriggerType = RAMP_TRIGGER;
ThreadCountChangeLoadStrategy currentStrategy = (ThreadCountChangeLoadStrategy) loadStrategy;
long end = extractLongProperty("end");
triggerProperties.put(
"end",
createProperyValue(
Long.class,
Long.toString(end
* (currentStrategy.getEndThreadCount() / currentStrategy.getStartThreadCount()))));
if (loadTest.getLimitType().equals(LoadTestLimitTypesConfig.TIME)) {
triggerProperties
.put("period", createProperyValue(Long.class, Long.toString(loadTest.getTestLimit())));
}
}
return triggerProperties;
}
public Long extractLongProperty(String propertyKey) {
Long value = null;
String[] parts = triggerProperties.get(propertyKey).split("@");
try {
value = new Long(parts[1]);
} catch (NumberFormatException e) {
SoapUI.logError(e, "property " + propertyKey + "is not a Long");
}
return value;
}
private void mapAssertionProperties(WsdlLoadTest loadTest) {
assertionPropertiesList = new ArrayList<HashMap<String, String>>();
List<LoadTestAssertion> loadTestAssertions = loadTest.getAssertionList();
for (LoadTestAssertion loadTestAssertion : loadTestAssertions) {
if (loadTestAssertion.getTargetStep().equals(LoadTestAssertion.ALL_TEST_STEPS)) {
HashMap<String, String> asrtProperties = new HashMap<String, String>();
if (loadTestAssertion instanceof TestStepTpsAssertion) {
asrtProperties.put("value", createProperyValue(String.class, "Tps"));
}
if (loadTestAssertion instanceof TestStepMaxAssertion) {
asrtProperties.put("value", createProperyValue(String.class, "Max"));
}
if (loadTestAssertion instanceof TestStepAverageAssertion) {
asrtProperties.put("value", createProperyValue(String.class, "Avg"));
}
assertionPropertiesList.add(asrtProperties);
}
}
}
private void mapStatisticsProperties(WsdlLoadTest loadTest) {
statisticsProperties = new HashMap<String, String>();
}
public boolean isFinalTriggerMappingNeeded() {
if (loadUITriggerType.equals(VARIANCE_TRIGGER) || loadUITriggerType.equals(RAMP_TRIGGER)) {
return true;
} else {
return false;
}
}
}