/*
* 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.teststeps;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.AttachmentConfig;
import com.eviware.soapui.config.TestAssertionConfig;
import com.eviware.soapui.config.WsdlRequestConfig;
import com.eviware.soapui.impl.settings.XmlBeansSettingsImpl;
import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlOperation;
import com.eviware.soapui.impl.wsdl.WsdlRequest;
import com.eviware.soapui.impl.wsdl.submit.transports.http.HttpResponse;
import com.eviware.soapui.impl.wsdl.submit.transports.jms.JMSResponse;
import com.eviware.soapui.impl.wsdl.support.assertions.AssertableConfig;
import com.eviware.soapui.impl.wsdl.support.assertions.AssertionsSupport;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext;
import com.eviware.soapui.impl.wsdl.teststeps.assertions.TestAssertionRegistry.AssertableType;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.iface.Submit;
import com.eviware.soapui.model.iface.SubmitContext;
import com.eviware.soapui.model.testsuite.Assertable;
import com.eviware.soapui.model.testsuite.AssertionsListener;
import com.eviware.soapui.model.testsuite.TestAssertion;
import com.eviware.soapui.monitor.TestMonitor;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.resolver.ResolveContext;
import javax.swing.ImageIcon;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* WsdlRequest extension that adds WsdlAssertions
*
* @author Ole.Matzura
*/
public class WsdlTestRequest extends WsdlRequest implements Assertable, TestRequest {
public static final String RESPONSE_PROPERTY = WsdlTestRequest.class.getName() + "@response";
public static final String STATUS_PROPERTY = WsdlTestRequest.class.getName() + "@status";
private static ImageIcon validRequestIcon;
private static ImageIcon failedRequestIcon;
private static ImageIcon disabledRequestIcon;
private static ImageIcon unknownRequestIcon;
private AssertionStatus currentStatus;
private final WsdlTestRequestStep testStep;
private AssertionsSupport assertionsSupport;
private WsdlResponseMessageExchange messageExchange;
private final boolean forLoadTest;
private PropertyChangeNotifier notifier;
public WsdlTestRequest(WsdlOperation operation, WsdlRequestConfig callConfig, WsdlTestRequestStep testStep,
boolean forLoadTest) {
super(operation, callConfig, forLoadTest);
this.forLoadTest = forLoadTest;
setSettings(new XmlBeansSettingsImpl(this, testStep.getSettings(), callConfig.getSettings()));
this.testStep = testStep;
initAssertions();
if (!forLoadTest) {
initIcons();
}
}
public WsdlTestCase getTestCase() {
return testStep.getTestCase();
}
public ModelItem getParent() {
return getTestStep();
}
protected void initIcons() {
if (validRequestIcon == null) {
validRequestIcon = UISupport.createImageIcon("/valid_soap_request_step.png");
}
if (failedRequestIcon == null) {
failedRequestIcon = UISupport.createImageIcon("/invalid_soap_request_step.png");
}
if (unknownRequestIcon == null) {
unknownRequestIcon = UISupport.createImageIcon("/soap_request_step.png");
}
if (disabledRequestIcon == null) {
disabledRequestIcon = UISupport.createImageIcon("/disabled_request.gif");
}
}
@Override
protected RequestIconAnimator<?> initIconAnimator() {
return new TestRequestIconAnimator(this);
}
private void initAssertions() {
assertionsSupport = new AssertionsSupport(testStep, new AssertableConfig() {
public TestAssertionConfig addNewAssertion() {
return getConfig().addNewAssertion();
}
public List<TestAssertionConfig> getAssertionList() {
return getConfig().getAssertionList();
}
public void removeAssertion(int ix) {
getConfig().removeAssertion(ix);
}
public TestAssertionConfig insertAssertion(TestAssertionConfig source, int ix) {
TestAssertionConfig conf = getConfig().insertNewAssertion(ix);
conf.set(source);
return conf;
}
});
}
public int getAssertionCount() {
return assertionsSupport.getAssertionCount();
}
public WsdlMessageAssertion getAssertionAt(int c) {
return assertionsSupport.getAssertionAt(c);
}
public void setResponse(HttpResponse response, SubmitContext context) {
super.setResponse(response, context);
assertResponse(context);
}
public void assertResponse(SubmitContext context) {
if (notifier == null) {
notifier = new PropertyChangeNotifier();
}
if (getResponse() instanceof JMSResponse) {
messageExchange = getResponse() == null ? null : new WsdlResponseMessageExchange(this) {
@Override
public boolean hasResponse() {// JMS tweak
String responseContent = getResponseContent();
return responseContent != null;
}
};
} else {
messageExchange = getResponse() == null ? null : new WsdlResponseMessageExchange(this);
}
if (messageExchange != null) {
// assert!
for (WsdlMessageAssertion assertion : assertionsSupport.getAssertionList()) {
assertion.assertResponse(messageExchange, context);
}
}
notifier.notifyChange();
}
private class PropertyChangeNotifier {
private AssertionStatus oldStatus;
private ImageIcon oldIcon;
public PropertyChangeNotifier() {
oldStatus = getAssertionStatus();
oldIcon = getIcon();
}
public void notifyChange() {
AssertionStatus newStatus = getAssertionStatus();
ImageIcon newIcon = getIcon();
if (oldStatus != newStatus) {
notifyPropertyChanged(STATUS_PROPERTY, oldStatus, newStatus);
}
if (oldIcon != newIcon) {
notifyPropertyChanged(ICON_PROPERTY, oldIcon, getIcon());
}
oldStatus = newStatus;
oldIcon = newIcon;
}
}
public WsdlMessageAssertion addAssertion(String assertionLabel) {
PropertyChangeNotifier notifier = new PropertyChangeNotifier();
try {
WsdlMessageAssertion assertion = assertionsSupport.addWsdlAssertion(assertionLabel);
if (assertion == null) {
return null;
}
if (getResponse() != null) {
assertion.assertResponse(new WsdlResponseMessageExchange(this), new WsdlTestRunContext(testStep));
notifier.notifyChange();
}
return assertion;
} catch (Exception e) {
SoapUI.logError(e);
return null;
}
}
public void removeAssertion(TestAssertion assertion) {
PropertyChangeNotifier notifier = new PropertyChangeNotifier();
try {
assertionsSupport.removeAssertion((WsdlMessageAssertion) assertion);
} finally {
((WsdlMessageAssertion) assertion).release();
notifier.notifyChange();
}
}
public TestAssertion moveAssertion(int ix, int offset) {
WsdlMessageAssertion assertion = getAssertionAt(ix);
PropertyChangeNotifier notifier = new PropertyChangeNotifier();
try {
return assertionsSupport.moveAssertion(ix, offset);
} finally {
((WsdlMessageAssertion) assertion).release();
notifier.notifyChange();
}
}
public AssertionStatus getAssertionStatus() {
currentStatus = AssertionStatus.UNKNOWN;
if (messageExchange != null) {
/*
* if( !messageExchange.hasResponse() &&
* getOperation().isBidirectional() && !isWsaEnabled() ) {
* currentStatus = AssertionStatus.FAILED; }
*/
} else {
return currentStatus;
}
int cnt = getAssertionCount();
if (cnt == 0) {
return currentStatus;
}
boolean hasEnabled = false;
for (int c = 0; c < cnt; c++) {
if (!getAssertionAt(c).isDisabled()) {
hasEnabled = true;
}
if (getAssertionAt(c).getStatus() == AssertionStatus.FAILED) {
currentStatus = AssertionStatus.FAILED;
break;
}
}
if (currentStatus == AssertionStatus.UNKNOWN && hasEnabled) {
currentStatus = AssertionStatus.VALID;
}
return currentStatus;
}
@Override
public ImageIcon getIcon() {
if (forLoadTest || getIconAnimator() == null) {
return null;
}
TestMonitor testMonitor = SoapUI.getTestMonitor();
if (testMonitor != null && (testMonitor.hasRunningLoadTest(testStep.getTestCase()))) {
return disabledRequestIcon;
}
ImageIcon icon = getIconAnimator().getIcon();
if (icon == getIconAnimator().getBaseIcon()) {
AssertionStatus status = getAssertionStatus();
if (status == AssertionStatus.VALID) {
return validRequestIcon;
} else if (status == AssertionStatus.FAILED) {
return failedRequestIcon;
} else if (status == AssertionStatus.UNKNOWN) {
return unknownRequestIcon;
}
}
return icon;
}
public void addAssertionsListener(AssertionsListener listener) {
assertionsSupport.addAssertionsListener(listener);
}
public void removeAssertionsListener(AssertionsListener listener) {
assertionsSupport.removeAssertionsListener(listener);
}
/**
* Called when a testrequest is moved in a testcase
*/
@Override
public void updateConfig(WsdlRequestConfig request) {
super.updateConfig(request);
assertionsSupport.refresh();
List<AttachmentConfig> attachmentConfigs = getConfig().getAttachmentList();
for (int i = 0; i < attachmentConfigs.size(); i++) {
AttachmentConfig config = attachmentConfigs.get(i);
getAttachmentsList().get(i).updateConfig(config);
}
}
@Override
public void release() {
super.release();
assertionsSupport.release();
}
public String getAssertableContentAsXml() {
return getAssertableContent();
}
public String getAssertableContent() {
return getResponse() == null ? null : getResponse().getContentAsString();
}
public WsdlTestRequestStep getTestStep() {
return testStep;
}
public WsdlInterface getInterface() {
return getOperation().getInterface();
}
protected static class TestRequestIconAnimator extends RequestIconAnimator<WsdlTestRequest> {
public TestRequestIconAnimator(WsdlTestRequest modelItem) {
super(modelItem, "/soap_request.png", "/soap_request.png", 4);
}
@Override
public boolean beforeSubmit(Submit submit, SubmitContext context) {
if (SoapUI.getTestMonitor() != null
&& (SoapUI.getTestMonitor().hasRunningLoadTest(getTarget().getTestCase()))) {
return true;
}
return super.beforeSubmit(submit, context);
}
@Override
public void afterSubmit(Submit submit, SubmitContext context) {
if (submit.getRequest() == getTarget()) {
stop();
}
}
}
public AssertableType getAssertableType() {
return AssertableType.BOTH;
}
public String getInterfaceName() {
return testStep.getInterfaceName();
}
public String getOperationName() {
return testStep.getOperationName();
}
public TestAssertion cloneAssertion(TestAssertion source, String name) {
return assertionsSupport.cloneAssertion(source, name);
}
public WsdlMessageAssertion importAssertion(WsdlMessageAssertion source, boolean overwrite, boolean createCopy,
String newName) {
return assertionsSupport.importAssertion(source, overwrite, createCopy, newName);
}
public List<TestAssertion> getAssertionList() {
return new ArrayList<TestAssertion>(assertionsSupport.getAssertionList());
}
public WsdlMessageAssertion getAssertionByName(String name) {
return assertionsSupport.getAssertionByName(name);
}
public ModelItem getModelItem() {
return testStep;
}
public Map<String, TestAssertion> getAssertions() {
return assertionsSupport.getAssertions();
}
public String getDefaultAssertableContent() {
return getOperation().createResponse(true);
}
public void resolve(ResolveContext<?> context) {
super.resolve(context);
assertionsSupport.resolve(context);
}
public boolean isDiscardResponse() {
return getSettings().getBoolean("discardResponse");
}
public void setDiscardResponse(boolean discardResponse) {
getSettings().setBoolean("discardResponse", discardResponse);
}
}