package com.bansheeproject.test;
import java.io.ByteArrayInputStream;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import com.bansheeproject.ExceptionResponse;
import com.bansheeproject.Response;
import com.bansheeproject.SOAPInvocationData;
import com.bansheeproject.WebServicesInvocationData;
import com.bansheeproject.exceptions.ServiceInvokeException;
import com.bansheeproject.exceptions.WSDLRetrievalException;
import com.bansheeproject.test.entities.AnotherBusinessExceptionBean;
import com.bansheeproject.test.entities.BusinessExceptionData;
import com.bansheeproject.test.entities.ComplexOperation;
import com.bansheeproject.test.entities.ComplexOperationResponse;
import com.bansheeproject.test.entities.ComplexType;
import com.bansheeproject.test.entities.HandleHeaders;
import com.bansheeproject.test.entities.HandleHeadersResponse;
import com.bansheeproject.test.entities.HangOperation;
import com.bansheeproject.test.entities.HangOperationResponse;
import com.bansheeproject.test.entities.HangThenThrowExceptionOperation;
import com.bansheeproject.test.entities.HangThenThrowExceptionOperationResponse;
import com.bansheeproject.test.entities.OneWayOperation;
import com.bansheeproject.test.entities.OneWayOperationResponse;
import com.bansheeproject.test.entities.StringOperation;
import com.bansheeproject.test.entities.StringOperationResponse;
import com.bansheeproject.test.entities.ThrowBusinessExceptionOperation;
import com.bansheeproject.test.entities.ThrowBusinessExceptionOperationResponse;
import com.bansheeproject.test.entities.ThrowRandomException;
import com.bansheeproject.test.entities.ThrowRandomExceptionResponse;
public abstract class BaseSOAPTest {
@Test
public void invokeStringOperationViaString() throws ServiceInvokeException, WSDLRetrievalException {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.setStringParameter("<ser:stringOperation xmlns:ser=\"http://services.test.bansheeproject.com/\"><arg0>test</arg0></ser:stringOperation>");
Response response = invocationData.invoke();
Assert.assertFalse(response.isExceptionResponse());
Assert.assertEquals(String.class, response.getResponseType());
Assert.assertTrue(response.getResponseData().toString().contains("stringOperationResponse"));
Assert.assertTrue(response.getResponseData().toString().contains("test"));
}
@Test
public void invokeStringOperationViaObject() throws ServiceInvokeException, WSDLRetrievalException {
WebServicesInvocationData invocationData = getInvocationData();
StringOperation param = new StringOperation();
param.setArg0("teste");
invocationData.setObjectParameter(param, StringOperationResponse.class);
Response response = invocationData.invoke();
Assert.assertFalse(response.isExceptionResponse());
Assert.assertEquals(response.getResponseData().getClass(), StringOperationResponse.class);
Assert.assertEquals("teste", ((StringOperationResponse)response.getResponseData()).getReturn());
}
@Test
public void invokeOneWayOperationViaString() throws ServiceInvokeException, WSDLRetrievalException {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.setStringParameter("<ser:oneWayOperation xmlns:ser=\"http://services.test.bansheeproject.com/\"><arg0>test</arg0></ser:oneWayOperation>");
Response oneWayResponse = invocationData.invokeOneWay();
Assert.assertNull(oneWayResponse);
}
@Test
public void invokeOneWayOperationViaTwoWayString() throws ServiceInvokeException, WSDLRetrievalException {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.setStringParameter("<ser:oneWayOperation xmlns:ser=\"http://services.test.bansheeproject.com/\"><arg0>test</arg0></ser:oneWayOperation>");
Response twoWayResponse = invocationData.invoke();
Assert.assertNotNull(twoWayResponse);
Assert.assertFalse(twoWayResponse.isExceptionResponse());
Assert.assertTrue(twoWayResponse.getResponseData().toString().contains("oneWayOperationResponse"));
}
@Test
public void invokeOneWayOperationViaObject() throws ServiceInvokeException, WSDLRetrievalException {
WebServicesInvocationData invocationData = getInvocationData();
OneWayOperation oneWayOperation = new OneWayOperation();
oneWayOperation.setArg0("test");
invocationData.setObjectParameter(oneWayOperation, OneWayOperationResponse.class);
Response response = invocationData.invokeOneWay();
Assert.assertNull(response);
}
@Test
public void invokeOneWayOperationViaTwoWayObject() throws ServiceInvokeException, WSDLRetrievalException {
WebServicesInvocationData invocationData = getInvocationData();
OneWayOperation oneWayOperation = new OneWayOperation();
oneWayOperation.setArg0("test");
invocationData.setObjectParameter(oneWayOperation, OneWayOperationResponse.class);
Response response = invocationData.invoke();
Assert.assertNotNull(response);
Assert.assertFalse(response.isExceptionResponse());
Assert.assertEquals(OneWayOperationResponse.class, response.getResponseData().getClass());
}
@Test
public void invokeComplexOperationViaObject() throws ServiceInvokeException, WSDLRetrievalException {
WebServicesInvocationData invocationData = getInvocationData();
ComplexOperation complexOperation = new ComplexOperation();
ComplexType request = new ComplexType();
request.setArray(new Integer[]{1,2,3});
request.setString("testString");
complexOperation.setArg0(request);
invocationData.setObjectParameter(complexOperation, ComplexOperationResponse.class);
Response response = invocationData.invoke();
Assert.assertNotNull(response);
Assert.assertFalse(response.isExceptionResponse());
Assert.assertEquals(response.getResponseData().getClass(), ComplexOperationResponse.class);
ComplexOperationResponse responseData = (ComplexOperationResponse)response.getResponseData();
ComplexType responseComplexType = responseData.getReturn();
Assert.assertNotNull(responseComplexType);
Assert.assertEquals(responseComplexType.getArray(), new Integer[]{1,2,3});
Assert.assertEquals(responseComplexType.getString(), "testString");
}
@Test
public void invokeComplexOperationViaString() throws ServiceInvokeException, WSDLRetrievalException, XPathExpressionException {
WebServicesInvocationData invocationData = getInvocationData();
String requestData = "<ns1:complexOperation xmlns:ns1=\"http://services.test.bansheeproject.com/\"><arg0><array>1</array><array>2</array><array>3</array><string>testString</string></arg0></ns1:complexOperation>";
invocationData.setStringParameter(requestData);
Response response = invocationData.invoke();
Assert.assertNotNull(response);
Assert.assertEquals(response.getResponseData().getClass(), String.class);
XPath xpath = XPathFactory.newInstance().newXPath();
InputSource source = new InputSource(new ByteArrayInputStream(response.getResponseData().toString().getBytes()));
NodeList nodeList = (NodeList)xpath.evaluate("//*[local-name() = 'array']", source, XPathConstants.NODESET);
Assert.assertEquals(nodeList.getLength(), 3);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
Assert.assertEquals(Integer.valueOf(node.getTextContent()), new Integer( i + 1));
}
source = new InputSource(new ByteArrayInputStream(response.getResponseData().toString().getBytes()));
String stringSent = (String)xpath.evaluate("//*[local-name() = 'string']/.", source, XPathConstants.STRING);
Assert.assertEquals(stringSent, "testString");
}
@Test
public void invokeComplexOperationWithGarbageDataViaString() throws WSDLRetrievalException, ServiceInvokeException, XPathExpressionException {
WebServicesInvocationData invocationData = getInvocationData();
String requestData = "<ns1:complexOperation xmlns:ns1=\"http://services.test.bansheeproject.com/\"><arg0><garbage>test</garbage> <array>1</array><array>2</array><array>3</array><string>testString</string></arg0></ns1:complexOperation>";
invocationData.setStringParameter(requestData);
Response response = invocationData.invoke();
Assert.assertNotNull(response);
Assert.assertEquals(response.getResponseData().getClass(), String.class);
XPath xpath = XPathFactory.newInstance().newXPath();
InputSource source = new InputSource(new ByteArrayInputStream(response.getResponseData().toString().getBytes()));
NodeList nodeList = (NodeList)xpath.evaluate("//*[local-name() = 'array']", source, XPathConstants.NODESET);
Assert.assertEquals(nodeList.getLength(), 3);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
Assert.assertEquals(Integer.valueOf(node.getTextContent()), new Integer( i + 1));
}
source = new InputSource(new ByteArrayInputStream(response.getResponseData().toString().getBytes()));
String stringSent = (String)xpath.evaluate("//*[local-name() = 'string']/.", source, XPathConstants.STRING);
Assert.assertEquals(stringSent, "testString");
}
@Test
public void invokeComplexOperationWithGarbageData2ViaString() throws WSDLRetrievalException, ServiceInvokeException, XPathExpressionException {
WebServicesInvocationData invocationData = getInvocationData();
String requestData = "<ns1:complexOperation xmlns:ns1=\"http://services.test.bansheeproject.com/\"><garbage xmlns=\"nothing\">anything</garbage><arg0><garbage>test</garbage> <array>1</array><array>2</array><array>3</array><string>testString</string></arg0></ns1:complexOperation>";
invocationData.setStringParameter(requestData);
Response response = invocationData.invoke();
Assert.assertNotNull(response);
Assert.assertEquals(response.getResponseData().getClass(), String.class);
XPath xpath = XPathFactory.newInstance().newXPath();
InputSource source = new InputSource(new ByteArrayInputStream(response.getResponseData().toString().getBytes()));
NodeList nodeList = (NodeList)xpath.evaluate("//*[local-name() = 'array']", source, XPathConstants.NODESET);
Assert.assertEquals(nodeList.getLength(), 3);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
Assert.assertEquals(Integer.valueOf(node.getTextContent()), new Integer( i + 1));
}
source = new InputSource(new ByteArrayInputStream(response.getResponseData().toString().getBytes()));
String stringSent = (String)xpath.evaluate("//*[local-name() = 'string']/.", source, XPathConstants.STRING);
Assert.assertEquals(stringSent, "testString");
}
@Test
public void invokeException() throws ServiceInvokeException, WSDLRetrievalException {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.addExceptionType(BusinessExceptionData.class);
ThrowBusinessExceptionOperation operation = new ThrowBusinessExceptionOperation();
invocationData.setObjectParameter(operation, ThrowBusinessExceptionOperationResponse.class);
Response response = invocationData.invoke();
Assert.assertTrue(response.isExceptionResponse());
Assert.assertEquals(response.getClass(), ExceptionResponse.class);
ExceptionResponse exceptionResponse = (ExceptionResponse)response;
Object responseData = exceptionResponse.getResponseData();
Assert.assertEquals(responseData.getClass(), BusinessExceptionData.class);
BusinessExceptionData businessExceptionData = (BusinessExceptionData)responseData;
Assert.assertEquals(businessExceptionData.getMessage(), "should throw an exception");
}
@Test
public void invokeExceptionAsString() throws ServiceInvokeException, Exception {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.setHandleExceptionAsString(true);
ThrowBusinessExceptionOperation operation = new ThrowBusinessExceptionOperation();
invocationData.setObjectParameter(operation, ThrowBusinessExceptionOperationResponse.class);
Response response = invocationData.invoke();
Assert.assertTrue(response.isExceptionResponse());
Assert.assertEquals(response.getClass(), ExceptionResponse.class);
ExceptionResponse exceptionResponse = (ExceptionResponse)response;
Object responseData = exceptionResponse.getResponseData();
Assert.assertEquals(responseData.getClass(), String.class);
XPath xpath = XPathFactory.newInstance().newXPath();
InputSource source = new InputSource(new ByteArrayInputStream(((String)responseData).getBytes()));
String exceptionString = (String)xpath.evaluate("//*[local-name() = 'message']/.", source, XPathConstants.STRING);
Assert.assertEquals(exceptionString, "should throw an exception");
}
@Test()
public void invokeExceptionAsStringDoesntHandle() throws ServiceInvokeException, Exception {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.setHandleExceptionAsString(false);
ThrowBusinessExceptionOperation operation = new ThrowBusinessExceptionOperation();
invocationData.setObjectParameter(operation, ThrowBusinessExceptionOperationResponse.class);
String message = null;
try {
invocationData.invoke();
}
catch (ServiceInvokeException ex) {
message = ex.getMessage();
}
Assert.assertNotNull(message);
Assert.assertTrue(message.contains("should throw an exception"));
}
@Test(expectedExceptions={ServiceInvokeException.class})
public void invokeOperationInvalidString() throws WSDLRetrievalException, ServiceInvokeException {
WebServicesInvocationData invocationData = getInvocationData();
String invalidString = "asdkhsds";
invocationData.setStringParameter(invalidString);
invocationData.invoke();
}
@Test(expectedExceptions={IllegalStateException.class})
public void invokeOperationNullParameter() throws WSDLRetrievalException, ServiceInvokeException {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.invoke();
}
@Test(expectedExceptions={ServiceInvokeException.class})
public void invokeHangOperation() throws WSDLRetrievalException, ServiceInvokeException {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.setObjectParameter(new HangOperation(), HangOperationResponse.class);
invocationData.setTimeout(1000);
invocationData.invoke();
}
@Test
public void invokeHangAndThrowExceptionOperation() throws WSDLRetrievalException, ServiceInvokeException {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.setObjectParameter(new HangThenThrowExceptionOperation(), HangThenThrowExceptionOperationResponse.class);
invocationData.addExceptionType(BusinessExceptionData.class);
invocationData.setTimeout(5000);
Response response = invocationData.invoke();
Assert.assertNotNull(response);
Assert.assertTrue(response.isExceptionResponse());
Object responseData = response.getResponseData();
Assert.assertNotNull(responseData);
Assert.assertEquals(responseData.getClass(), BusinessExceptionData.class);
}
@Test
public void invokeWithHeaders () throws WSDLRetrievalException, ServiceInvokeException {
WebServicesInvocationData invocationData = getInvocationData();
SOAPInvocationData soapData = (SOAPInvocationData)invocationData;
soapData.addHeaderString("<ser:arg0 xmlns:ser=\"http://services.test.bansheeproject.com/\">arg</ser:arg0>");
soapData.setObjectParameter(new HandleHeaders(), HandleHeadersResponse.class);
Response response = soapData.invoke();
Assert.assertNotNull(response);
Assert.assertEquals(response.getResponseType(), HandleHeadersResponse.class);
HandleHeadersResponse responseData = (HandleHeadersResponse)response.getResponseData();
Assert.assertNotNull(responseData);
Assert.assertEquals(responseData.getReturn(), "arg");
}
@Test
public void invokeThrowRandomException() throws WSDLRetrievalException, ServiceInvokeException {
WebServicesInvocationData invocationData = getInvocationData();
invocationData.setObjectParameter(new ThrowRandomException(), ThrowRandomExceptionResponse.class);
invocationData.addExceptionType(BusinessExceptionData.class);
invocationData.addExceptionType(AnotherBusinessExceptionBean.class);
for (int i = 0; i < 10; i++) {
Response response = invocationData.invoke();
Assert.assertNotNull(response);
Assert.assertTrue(response.isExceptionResponse());
boolean isExpectedExceptionType = response.getResponseType().equals(BusinessExceptionData.class);
isExpectedExceptionType |= response.getResponseType().equals(AnotherBusinessExceptionBean.class);
Assert.assertTrue(isExpectedExceptionType);
}
}
@Test()
public void invokeLoggedOperation() throws WSDLRetrievalException, ServiceInvokeException {
SOAPInvocationData invocationData = (SOAPInvocationData)getInvocationData();
TestLogger logger = new TestLogger();
invocationData.logOperations(logger);
String parameter = "<ser:stringOperation xmlns:ser=\"http://services.test.bansheeproject.com/\"><arg0>test</arg0></ser:stringOperation>";
invocationData.setStringParameter(parameter);
Response response = invocationData.invoke();
Assert.assertTrue(logger.infoMessages.get(0).contains(parameter));
Assert.assertTrue(logger.infoMessages.get(1).contains(response.getResponseData().toString()));
}
@Test(expectedExceptions={ServiceInvokeException.class})
public void invokeMisleadAddress() throws WSDLRetrievalException, ServiceInvokeException {
SOAPInvocationData invocationData = (SOAPInvocationData)getInvocationData();
invocationData.overwriteInvocationAddress("http://nonexistentaddress/");
String parameter = "<ser:stringOperation xmlns:ser=\"http://services.test.bansheeproject.com/\"><arg0>test</arg0></ser:stringOperation>";
invocationData.setStringParameter(parameter);
invocationData.invoke();
}
protected abstract WebServicesInvocationData getInvocationData() throws WSDLRetrievalException;
}