blob: e066ee6c69c9a5ab189b8d2765560c7c2f66b71d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.jaxws.message;
import junit.framework.TestCase;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder;
import org.apache.axis2.jaxws.message.factory.BlockFactory;
import org.apache.axis2.jaxws.message.factory.MessageFactory;
import org.apache.axis2.jaxws.message.factory.SourceBlockFactory;
import org.apache.axis2.jaxws.registry.FactoryRegistry;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
import java.util.Locale;
/**
* MessageTests
* Tests to create and validate Message processing
* These are not client/server tests.
*/
public class FaultTests extends TestCase {
private static final String faultString = "Internal server error from WAS";
// String test variables
private static final String sampleSOAP11FaultEnvelope1 =
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ "<soapenv:Body>"
+ "<soapenv:Fault>"
+ "<faultcode>soapenv:Server</faultcode>"
+ "<faultstring>" + faultString + "sampleSOAP11FaultEnvelope1</faultstring>"
+ "</soapenv:Fault>"
+ "</soapenv:Body>"
+ "</soapenv:Envelope>";
private static final String sampleSOAP11FaultEnvelope2 =
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"" +
" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xmlns:cwmp=\"http://cwmp.com\">" +
" <soapenv:Header>" +
" <cwmp:ID soapenv:mustUnderstand=\"1\">HEADERID-7867678</cwmp:ID>" +
" </soapenv:Header>" +
" <soapenv:Body>" +
" <soapenv:Fault>" +
" <faultcode>soapenv:Client</faultcode>" +
" <faultstring>" + faultString + "sampleSOAP11FaultEnvelope2</faultstring>" +
" <faultactor>http://gizmos.com/order</faultactor>" +
" <detail>" +
" <cwmp:Fault>" +
" <cwmp:FaultCode>This is the fault code</cwmp:FaultCode>" +
" <cwmp:FaultString>Fault Message</cwmp:FaultString>" +
" <cwmp:Message>This is a test fault</cwmp:Message>" +
" </cwmp:Fault>" +
" </detail>" + /**/
" </soapenv:Fault>" +
" </soapenv:Body>" +
" </soapenv:Envelope>";
private final static String sampleSOAP12FaultEnvelope1 =
//"<?xml version='1.0' encoding='UTF-8'?>"
"<env:Envelope xmlns:env=\"http://www.w3.org/2003/05/soap-envelope\">"
+ "<env:Body>"
+ "<env:Fault>"
+ "<env:Code><env:Value>env:Receiver</env:Value></env:Code>"
+ "<env:Reason><env:Text lang=\""+ Locale.getDefault().getLanguage() +"\">"
+ faultString + "sampleSOAP12FaultEnvelope1</env:Text></env:Reason>"
+ "</env:Fault>"
+ "</env:Body>"
+ "</env:Envelope>";
// missing namespace for faultcode value
private final static String sampleSOAP12FaultEnvelope2 =
//"<?xml version='1.0' encoding='UTF-8'?>"
"<env:Envelope xmlns:env=\"http://www.w3.org/2003/05/soap-envelope\">"
+ "<env:Body>"
+ "<env:Fault>"
+ "<env:Code><env:Value>Sender</env:Value></env:Code>"
+ "<env:Reason><env:Text lang=\""+ Locale.getDefault().getLanguage() +"\">"
+ faultString + "sampleSOAP12FaultEnvelope2</env:Text></env:Reason>"
+ "</env:Fault>"
+ "</env:Body>"
+ "</env:Envelope>";
private static XMLInputFactory inputFactory = XMLInputFactory.newInstance();
public FaultTests() {
super();
}
public FaultTests(String arg0) {
super(arg0);
}
/**
* This test effectively tests XMLFault construction from
*
* org.apache.axiom.soap.SOAPFault soapfault, List<Block> detailBlks
*
* which is a client-side operation. Also tests the "serialization" of the
* XMLFault object into a Message object which is a server-side operation.
*
* @throws Exception
*/
public void testStringInflow1() throws Exception {
try {
// On inbound, there will already be an OM
// which represents the message. The following code simulates the input
// OM
StringReader sr = new StringReader(sampleSOAP11FaultEnvelope1);
XMLStreamReader inflow = inputFactory.createXMLStreamReader(sr);
StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(inflow, null);
OMElement omElement = builder.getSOAPEnvelope();
// The JAX-WS layer creates a Message from the OM
MessageFactory mf = (MessageFactory)
FactoryRegistry.getFactory(MessageFactory.class);
Message m = mf.createFrom(omElement, null);
assertTrue(m.isFault());
if (m.isFault()) {
XMLFault x = m.getXMLFault();
assertEquals(faultString + "sampleSOAP11FaultEnvelope1", x.getReason().getText());
assertEquals("Server", x.getCode().
toQName("http://schemas.xmlsoap.org/soap/envelope/").getLocalPart());
} else {
fail("Message should be marked as a fault.");
}
} catch (Exception e) {
e.printStackTrace();
fail(e.toString());
}
}
public void testStringInflow2() throws Exception {
try {
// On inbound, there will already be an OM
// which represents the message. The following code simulates the
// input
// OM
StringReader sr = new StringReader(sampleSOAP11FaultEnvelope2);
XMLStreamReader inflow = inputFactory.createXMLStreamReader(sr);
StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(inflow,
null);
OMElement omElement = builder.getSOAPEnvelope();
// The JAX-WS layer creates a Message from the OM
MessageFactory mf = (MessageFactory) FactoryRegistry
.getFactory(MessageFactory.class);
Message m = mf.createFrom(omElement, null);
assertTrue(m.isFault());
if (m.isFault()) {
XMLFault x = m.getXMLFault();
assertEquals(faultString + "sampleSOAP11FaultEnvelope2", x.getReason().getText());
assertEquals("Client", x.getCode().
toQName("http://schemas.xmlsoap.org/soap/envelope/").getLocalPart());
// drill down to the faultcode text in the detail to make sure it's there and it's set
Block[] blocks = x.getDetailBlocks();
Block block = blocks[0];
OMElement element = block.getOMElement();
OMElement child = (OMElement)element.getChildElements().next();
String text = child.getText();
assertEquals("This is the fault code", text);
} else {
fail("Message should be marked as a fault.");
}
} catch (Exception e) {
e.printStackTrace();
fail(e.toString());
}
}
/**
* This test effectively tests XMLFault construction from
*
* org.apache.axiom.soap.SOAPFault soapfault, List<Block> detailBlks
*
* which is a client-side operation. Also tests the "serialization" of the
* XMLFault object into a Message object which is a server-side operation.
*
* @throws Exception
*/
public void testStringInflow3() throws Exception {
try {
// On inbound, there will already be an OM
// which represents the message. The following code simulates the input
// OM
StringReader sr = new StringReader(sampleSOAP12FaultEnvelope1);
XMLStreamReader inflow = inputFactory.createXMLStreamReader(sr);
StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(inflow, null);
OMElement omElement = builder.getSOAPEnvelope();
// The JAX-WS layer creates a Message from the OM
MessageFactory mf = (MessageFactory)
FactoryRegistry.getFactory(MessageFactory.class);
Message m = mf.createFrom(omElement, null);
assertTrue(m.isFault());
if (m.isFault()) {
XMLFault x = m.getXMLFault();
assertEquals(faultString + "sampleSOAP12FaultEnvelope1", x.getReason().getText());
assertEquals("Receiver", x.getCode().
toQName("http://www.w3.org/2003/05/soap-envelope").getLocalPart());
} else {
fail("Message should be marked as a fault.");
}
} catch (Exception e) {
e.printStackTrace();
fail(e.toString());
}
}
public void testStringInflow4() throws Exception {
try {
// On inbound, there will already be an OM
// which represents the message. The following code simulates the input
// OM
StringReader sr = new StringReader(sampleSOAP12FaultEnvelope2);
XMLStreamReader inflow = inputFactory.createXMLStreamReader(sr);
StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(inflow, null);
OMElement omElement = builder.getSOAPEnvelope();
// The JAX-WS layer creates a Message from the OM
MessageFactory mf = (MessageFactory)
FactoryRegistry.getFactory(MessageFactory.class);
Message m = mf.createFrom(omElement, null);
assertTrue(m.isFault());
if (m.isFault()) {
XMLFault x = m.getXMLFault();
assertEquals(faultString + "sampleSOAP12FaultEnvelope2", x.getReason().getText());
assertEquals("Sender", x.getCode().
toQName("http://www.w3.org/2003/05/soap-envelope").getLocalPart());
} else {
fail("Message should be marked as a fault.");
}
} catch (Exception e) {
e.printStackTrace();
fail(e.toString());
}
}
public void testGetSOAP11XMLFaultAsOM() throws Exception {
MessageFactory factory = (MessageFactory) FactoryRegistry.getFactory(MessageFactory.class);
Message msg = factory.create(Protocol.soap11);
XMLFaultReason reason = new XMLFaultReason("sample fault reason");
XMLFault fault = new XMLFault(XMLFaultCode.SENDER, reason);
msg.setXMLFault(fault);
OMElement om = msg.getAsOMElement();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
om.serializeAndConsume(baos);
String env = new String(baos.toByteArray());
assertTrue(env.indexOf("faultcode") > 0);
assertTrue(env.indexOf("faultstring") > 0);
}
public void testGetSOAP11XMLFaultAsBlock() throws Exception {
MessageFactory factory = (MessageFactory) FactoryRegistry.getFactory(MessageFactory.class);
Message msg = factory.create(Protocol.soap11);
XMLFaultReason reason = new XMLFaultReason("sample fault reason");
XMLFault fault = new XMLFault(XMLFaultCode.SENDER, reason);
msg.setXMLFault(fault);
BlockFactory bf = (BlockFactory) FactoryRegistry.getFactory(SourceBlockFactory.class);
Block b = msg.getBodyBlock(null, bf);
Source content = (Source) b.getBusinessObject(true);
byte[] bytes = _getBytes(content);
String faultContent = new String(bytes);
System.out.println(">> fault content: " + faultContent);
assertTrue(faultContent.indexOf("faultcode") > 0);
assertTrue(faultContent.indexOf("faultstring") > 0);
}
private byte[] _getBytes(Source input) throws Exception {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
StreamResult output = new StreamResult(baos);
t.transform(input, output);
return baos.toByteArray();
}
}