Created testcase for #SWS-74: Namespace not being applied correctly to soap fault detail elements. Cannot reproduce.

This commit is contained in:
Arjen Poutsma
2007-01-04 17:27:16 +00:00
parent f6abe5c93f
commit 8fd81f36e6
3 changed files with 107 additions and 39 deletions

View File

@@ -16,6 +16,7 @@
package org.springframework.ws.endpoint.interceptor;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Locale;
import javax.xml.XMLConstants;
@@ -26,7 +27,9 @@ import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import junit.framework.TestCase;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory;
import org.custommonkey.xmlunit.XMLTestCase;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.ws.MockWebServiceMessage;
@@ -35,13 +38,16 @@ import org.springframework.ws.context.DefaultMessageContext;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.soap.SoapMessage;
import org.springframework.ws.soap.SoapVersion;
import org.springframework.ws.soap.axiom.AxiomSoapMessage;
import org.springframework.ws.soap.saaj.SaajSoapMessage;
import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
import org.springframework.ws.soap.saaj.support.SaajUtils;
import org.springframework.ws.soap.soap11.Soap11Fault;
import org.springframework.ws.soap.soap12.Soap12Fault;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.LocatorImpl;
public class PayloadValidatingInterceptorTest extends TestCase {
public class PayloadValidatingInterceptorTest extends XMLTestCase {
private PayloadValidatingInterceptor interceptor;
@@ -248,4 +254,25 @@ public class PayloadValidatingInterceptorTest extends TestCase {
boolean result = interceptor.handleResponse(context, null);
assertTrue("Invalid response from interceptor", result);
}
public void testCreateRequestValidationFaultAxiom() throws Exception {
SOAPFactory soapFactory = new SOAP11Factory();
AxiomSoapMessage message = new AxiomSoapMessage(soapFactory);
LocatorImpl locator = new LocatorImpl();
locator.setLineNumber(0);
locator.setColumnNumber(0);
SAXParseException[] exceptions = new SAXParseException[]{new SAXParseException("Message 1", locator),
new SAXParseException("Message 2", locator),};
interceptor.createRequestValidationFault(message, exceptions);
ByteArrayOutputStream os = new ByteArrayOutputStream();
message.writeTo(os);
assertXMLEqual("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
"<soapenv:Header />" + "<soapenv:Body>" + "<soapenv:Fault>" + "<faultcode>soapenv:Client</faultcode>" +
"<faultstring>Validation error</faultstring>" + "<detail>" +
"<spring-ws:ValidationError xmlns:spring-ws=\"http://springframework.org/spring-ws\">Message 1</spring-ws:ValidationError>" +
"<spring-ws:ValidationError xmlns:spring-ws=\"http://springframework.org/spring-ws\">Message 2</spring-ws:ValidationError>" +
"</detail>" + "</soapenv:Fault>" + "</soapenv:Body>" + "</soapenv:Envelope>", os.toString());
}
}

View File

@@ -1,39 +1,73 @@
package org.springframework.ws.soap.axiom;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.dom.DOMSource;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.soap.SOAPFactory;
import org.springframework.ws.soap.SoapBody;
import org.springframework.ws.soap.SoapVersion;
import org.springframework.ws.soap.soap11.AbstractSoap11BodyTestCase;
import org.springframework.ws.soap.soap11.Soap11Body;
import org.springframework.ws.soap.soap11.Soap11Fault;
import org.springframework.xml.transform.StringResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class AxiomSoap11BodyTest extends AbstractSoap11BodyTestCase {
private AxiomSoapMessage axiomSoapMessage;
private DocumentBuilder documentBuilder;
protected SoapBody createSoapBody() throws Exception {
SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory();
AxiomSoapMessage axiomSoapMessage = new AxiomSoapMessage(axiomFactory);
axiomSoapMessage = new AxiomSoapMessage(axiomFactory);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
documentBuilder = documentBuilderFactory.newDocumentBuilder();
return axiomSoapMessage.getSoapBody();
}
public void testAddMustUnderstandFault() throws Exception {
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
}
public void testAddClientFault() throws Exception {
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
}
public void testAddServerFault() throws Exception {
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
}
public void testAddFault() throws Exception {
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
QName faultCode = new QName("http://www.springframework.org", "fault", "spring");
String faultString = "faultString";
Soap11Fault fault = ((Soap11Body) soapBody).addFault(faultCode, faultString, null);
assertNotNull("Null returned", fault);
assertTrue("SoapBody has no fault", soapBody.hasFault());
assertNotNull("SoapBody has no fault", soapBody.getFault());
assertEquals("Invalid fault code", faultCode, fault.getFaultCode());
assertEquals("Invalid fault string", faultString, fault.getFaultString());
String actor = "http://www.springframework.org/actor";
fault.setFaultActorOrRole(actor);
assertEquals("Invalid fault actor", actor, fault.getFaultActorOrRole());
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' " +
"xmlns:spring='http://www.springframework.org'>" + "<faultcode>spring:fault</faultcode>" +
"<faultstring>" + faultString + "</faultstring>" + "<faultactor>" + actor + "</faultactor>" +
"</SOAP-ENV:Fault>");
}
public void testAddFaultWithDetail() throws Exception {
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
}
public void testAddFaultWithDetailResult() throws Exception {
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
/**
* Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38. Axiom does not return valid xml
*/
protected void assertPayloadEqual(String expectedPayload) throws Exception {
ByteArrayOutputStream os = new ByteArrayOutputStream();
axiomSoapMessage.writeTo(os);
Document document = documentBuilder.parse(new ByteArrayInputStream(os.toByteArray()));
NodeList nodes = document.getElementsByTagNameNS(SoapVersion.SOAP_11.getEnvelopeNamespaceUri(), "Body");
assertEquals("No Body found", 1, nodes.getLength());
assertEquals("No Body found", Node.ELEMENT_NODE, nodes.item(0).getNodeType());
Element bodyElement = (Element) nodes.item(0);
Element firstChild = (Element) bodyElement.getFirstChild();
Result result = new StringResult();
transformer.transform(new DOMSource(firstChild), result);
assertXMLEqual("Invalid payload contents", expectedPayload, result.toString());
}
}

View File

@@ -45,7 +45,7 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas
assertEquals("Invalid fault code", new QName("http://schemas.xmlsoap.org/soap/envelope/", "MustUnderstand"),
fault.getFaultCode());
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" +
"<faultcode>SOAP-ENV:MustUnderstand</faultcode>" +
"<faultcode>" + soapBody.getName().getPrefix() + ":MustUnderstand</faultcode>" +
"<faultstring>SOAP Must Understand Error</faultstring></SOAP-ENV:Fault>");
}
@@ -54,8 +54,8 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas
assertEquals("Invalid fault code", new QName("http://schemas.xmlsoap.org/soap/envelope/", "Client"),
fault.getFaultCode());
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" +
"<faultcode>SOAP-ENV:Client</faultcode>" + "<faultstring>faultString</faultstring>" +
"</SOAP-ENV:Fault>");
"<faultcode>" + soapBody.getName().getPrefix() + ":Client</faultcode>" +
"<faultstring>faultString</faultstring>" + "</SOAP-ENV:Fault>");
}
public void testAddServerFault() throws Exception {
@@ -63,18 +63,18 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas
assertEquals("Invalid fault code", new QName("http://schemas.xmlsoap.org/soap/envelope/", "Server"),
fault.getFaultCode());
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" +
"<faultcode>SOAP-ENV:Server</faultcode>" + "<faultstring>faultString</faultstring>" +
"</SOAP-ENV:Fault>");
"<faultcode>" + soapBody.getName().getPrefix() + ":Server</faultcode>" +
"<faultstring>faultString</faultstring>" + "</SOAP-ENV:Fault>");
}
public void testAddFault() throws Exception {
QName faultCode = new QName("http://www.springframework.org", "fault", "spring");
Soap11Fault fault = ((Soap11Body) soapBody).addFault(faultCode, "faultString", Locale.ENGLISH);
String faultString = "faultString";
Soap11Fault fault = ((Soap11Body) soapBody).addFault(faultCode, faultString, Locale.ENGLISH);
assertNotNull("Null returned", fault);
assertTrue("SoapBody has no fault", soapBody.hasFault());
assertNotNull("SoapBody has no fault", soapBody.getFault());
assertEquals("Invalid fault code", faultCode, fault.getFaultCode());
String faultString = "faultString";
assertEquals("Invalid fault string", faultString, fault.getFaultString());
assertEquals("Invalid fault string locale", Locale.ENGLISH, fault.getFaultStringLocale());
String actor = "http://www.springframework.org/actor";
@@ -87,18 +87,25 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas
}
public void testAddFaultWithDetail() throws Exception {
SoapFault fault = ((Soap11Body) soapBody)
.addFault(new QName("namespace", "localPart", "prefix"), "Fault", null);
QName faultCode = new QName("http://www.springframework.org", "fault", "spring");
String faultString = "faultString";
SoapFault fault = ((Soap11Body) soapBody).addFault(faultCode, faultString, null);
SoapFaultDetail detail = fault.addFaultDetail();
SoapFaultDetailElement detailElement =
detail.addFaultDetailElement(new QName("namespace", "localPart", "prefix"));
QName detailName = new QName("http://www.springframework.org", "detailEntry", "spring");
SoapFaultDetailElement detailElement1 = detail.addFaultDetailElement(detailName);
StringSource detailContents = new StringSource("<detailContents xmlns='namespace'/>");
transformer.transform(detailContents, detailElement.getResult());
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" +
"<faultcode xmlns:prefix='namespace'>prefix:localPart</faultcode>" +
"<faultstring>Fault</faultstring>" +
"<detail><prefix:localPart xmlns:prefix='namespace'><detailContents xmlns='namespace'/>" +
"</prefix:localPart></detail></SOAP-ENV:Fault>");
transformer.transform(detailContents, detailElement1.getResult());
SoapFaultDetailElement detailElement2 = detail.addFaultDetailElement(detailName);
detailContents = new StringSource("<detailContents xmlns='namespace'/>");
transformer.transform(detailContents, detailElement2.getResult());
assertPayloadEqual(
"<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:spring='http://www.springframework.org'>" +
"<faultcode>spring:fault</faultcode>" + "<faultstring>" + faultString + "</faultstring>" +
"<detail>" +
"<spring:detailEntry xmlns:spring='http://www.springframework.org'><detailContents xmlns='namespace'/></spring:detailEntry>" +
"<spring:detailEntry xmlns:spring='http://www.springframework.org'><detailContents xmlns='namespace'/></spring:detailEntry>" +
"</detail>" + "</SOAP-ENV:Fault>");
}
public void testAddFaultWithDetailResult() throws Exception {