Package org.objectweb.celtix.bus.bindings.soap

Source Code of org.objectweb.celtix.bus.bindings.soap.SoapBindingImplTest

package org.objectweb.celtix.bus.bindings.soap;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;

import javax.xml.namespace.QName;
import javax.xml.soap.Detail;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.WebFault;
import javax.xml.ws.soap.SOAPFaultException;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


import junit.framework.TestCase;

import org.objectweb.celtix.bindings.DataBindingCallback;
import org.objectweb.celtix.bus.bindings.TestInputStreamContext;
import org.objectweb.celtix.bus.bindings.TestOutputStreamContext;
import org.objectweb.celtix.bus.jaxws.JAXBDataBindingCallback;
import org.objectweb.celtix.context.GenericMessageContext;
import org.objectweb.celtix.context.ObjectMessageContext;
import org.objectweb.celtix.context.ObjectMessageContextImpl;
import org.objectweb.hello_world_soap_http.BadRecordLitFault;
import org.objectweb.hello_world_soap_http.Greeter;
import org.objectweb.hello_world_soap_http.NoSuchCodeLitFault;
import org.objectweb.hello_world_soap_http.types.ErrorCode;
import org.objectweb.hello_world_soap_http.types.NoSuchCodeLit;
import org.objectweb.type_test.doc.TypeTestPortType;

public class SoapBindingImplTest extends TestCase {
    private SOAPBindingImpl binding;
    private ObjectMessageContextImpl objContext;
    private SOAPMessageContextImpl soapContext;
    public SoapBindingImplTest(String arg0) {
        super(arg0);
    }

    public static void main(String[] args) {
        junit.textui.TestRunner.run(SoapBindingImplTest.class);
    }
   
    protected void setUp() throws Exception {
        super.setUp();
       
        binding = new SOAPBindingImpl(false);
        objContext = new ObjectMessageContextImpl();
        soapContext = new SOAPMessageContextImpl(new GenericMessageContext());
       
        objContext.setMethod(SOAPMessageUtil.getMethod(Greeter.class, "greetMe"));
    }
   
    public void testCreateBindingMessageContext() throws Exception {      
        binding = new SOAPBindingImpl(false);
        byte[] bArray = new byte[0];
        TestInputStreamContext inCtx = new TestInputStreamContext(bArray);
        assertNotNull(binding.createBindingMessageContext(inCtx));
    }

    public void testGetMessageFactory() throws Exception {
        assertNotNull(binding.getSOAPFactory());
    }
   
    public void testMarshalWrapDocLitInputMessage() throws Exception {
        //Test The InputMessage of GreetMe Operation
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false);

        String arg0 = new String("TestSOAPInputPMessage");
        objContext.setMessageObjects(arg0);

        binding.marshal(objContext,
                         soapContext,
                         new JAXBDataBindingCallback(objContext.getMethod(),
                                                     DataBindingCallback.Mode.PARTS,
                                                     null));
        SOAPMessage msg = soapContext.getMessage();
        assertNotNull(msg);

        assertTrue(msg.getSOAPBody().hasChildNodes());
        NodeList list = msg.getSOAPBody().getChildNodes();
        assertEquals(1, list.getLength());
        Node wrappedNode = list.item(0).getFirstChild();
        assertTrue(wrappedNode.hasChildNodes());
        assertEquals(arg0, wrappedNode.getFirstChild().getNodeValue());
    }

    public void testMarshalWrapDocLitMessageForInOutVar() throws Exception {
        //Test The InputMessage of GreetMe Operation
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false);
        Method testInt = SOAPMessageUtil.getMethod(TypeTestPortType.class, "testInt");
        assertNotNull(testInt);
        objContext.setMethod(testInt);
       
        Object[] methodArg = SOAPMessageUtil.getMessageObjects(testInt);
        int arg0 = 5;
        methodArg[0] = arg0;
        //INOUT Variable
        methodArg[1].getClass().getField("value").set(methodArg[1], arg0);
        objContext.setMessageObjects(methodArg);

        binding.marshal(objContext,
                         soapContext,
                         new JAXBDataBindingCallback(objContext.getMethod(),
                                                     DataBindingCallback.Mode.PARTS,
                                                     null));
        SOAPMessage msg = soapContext.getMessage();
        assertNotNull(msg);

        assertTrue(msg.getSOAPBody().hasChildNodes());
        NodeList list = msg.getSOAPBody().getChildNodes();
        assertEquals(1, list.getLength());
        list = list.item(0).getChildNodes();
        assertEquals(2, list.getLength());
        Node wrappedNode = list.item(0);
        assertEquals(String.valueOf(arg0), wrappedNode.getFirstChild().getNodeValue());
       
        wrappedNode = list.item(1);
        assertEquals(String.valueOf(arg0), wrappedNode.getFirstChild().getNodeValue());       
    }
   
    public void testMarshalWrapDocLitOutputMessage() throws Exception {
        //Test The Output of GreetMe Operation
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, true);
        objContext.setMessageObjects(new Object[0]);

        String arg0 = new String("TestSOAPOutputMessage");
        objContext.setReturn(arg0);
       
        binding.marshal(objContext,
                        soapContext,
                         new JAXBDataBindingCallback(objContext.getMethod(),
                                                     DataBindingCallback.Mode.PARTS,
                                                     null));
        SOAPMessage msg = soapContext.getMessage();
        assertNotNull(msg);
        assertTrue(msg.getSOAPBody().hasChildNodes());
        NodeList list = msg.getSOAPBody().getChildNodes();
        assertEquals(1, list.getLength());
        Node wrappedNode = list.item(0).getFirstChild();
        assertTrue(wrappedNode.hasChildNodes());
        assertEquals(arg0, wrappedNode.getFirstChild().getNodeValue());
    }

    public void testParseWrapDocLitInputMessage() throws Exception {
        //Test The InputMessage of GreetMe Operation
        //Assumption the Wrapper element and the inner element are in the same namespace
        //elementFormDefault is qualified
       
        QName wrapName = new QName("http://objectweb.org/hello_world_soap_http/types", "greetMe");
        QName elName = new QName("http://objectweb.org/hello_world_soap_http/types", "requestType");
        String data = new String("TestSOAPInputMessage");
        String str = SOAPMessageUtil.createWrapDocLitSOAPMessage(wrapName, elName, data);       
       
        TestInputStreamContext inCtx = new TestInputStreamContext(str.getBytes());
        binding.read(inCtx, soapContext);

        SOAPMessage msg = soapContext.getMessage();
        assertNotNull(msg);
        assertTrue(msg.getSOAPBody().hasChildNodes());
        NodeList list = msg.getSOAPBody().getChildNodes();

        assertEquals(1, list.getLength());
        Node wrappedNode = list.item(0).getFirstChild();
        assertTrue(wrappedNode.hasChildNodes());
        assertEquals(data, wrappedNode.getFirstChild().getNodeValue());
       
        //Parse SOAP 1.2 message
        InputStream is =  getClass().getResourceAsStream("resources/Soap12message.xml");
        inCtx.setInputStream(is);
        try {
            binding.read(inCtx, soapContext);
            fail("Should have received a SOAP FaultException");
        } catch (SOAPFaultException sfe) {
            SOAPFault sf = sfe.getFault();
            assertNotNull("Should have a non null soap fault", sf);
            assertEquals(SOAPConstants.FAULTCODE_VERSIONMISMATCH, sf.getFaultCodeAsQName());
        }
    }
    public void testUnmarshalWrapDocLitInputMessage() throws Exception {
        //Test The InputMessage of GreetMe Operation
        QName wrapName = new QName("http://objectweb.org/hello_world_soap_http/types", "greetMe");       
        QName elName = new QName("http://objectweb.org/hello_world_soap_http/types", "requestType");
        String data = new String("TestSOAPInputMessage");
        String str = SOAPMessageUtil.createWrapDocLitSOAPMessage(wrapName, elName, data);
        InputStream in = new ByteArrayInputStream(str.getBytes());
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false);

        assertNotNull(binding.getMessageFactory());
        SOAPMessage soapMessage = binding.getMessageFactory().createMessage(null, in);
        soapContext.setMessage(soapMessage);

        //GreetMe method has a IN parameter
        objContext.setMessageObjects(new Object[1]);
        binding.unmarshal(soapContext,
                          objContext,
                          new JAXBDataBindingCallback(objContext.getMethod(),
                                                      DataBindingCallback.Mode.PARTS,
                                                      null));
       
        Object[] params = objContext.getMessageObjects();
        assertNotNull(params);
        assertNull(objContext.getReturn());
        assertEquals(1, params.length);
        assertEquals(data, (String)params[0]);
    }   
    public void testUnmarshalWrapDocLitMessageWithInOutVar() throws Exception {
        //Test The testInt Operation of TypeTestPortType SEI
        Method testInt = SOAPMessageUtil.getMethod(TypeTestPortType.class, "testInt");
        assertNotNull(testInt);
        objContext.setMethod(testInt);
       
        InputStream is =  getClass().getResourceAsStream("resources/TestIntDocLitTypeTestReq.xml");
        assertNotNull(binding.getMessageFactory());
        SOAPMessage faultMsg = binding.getMessageFactory().createMessage(null,  is);
        soapContext.setMessage(faultMsg);
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false);

        Object[] methodArg = SOAPMessageUtil.getMessageObjects(testInt);
        assertNotNull(methodArg);
        objContext.setMessageObjects(methodArg);
       
        binding.unmarshal(soapContext,
                          objContext,
                          new JAXBDataBindingCallback(objContext.getMethod(),
                                                      DataBindingCallback.Mode.PARTS,
                                                      null));

        assertNotNull(objContext.getMessageObjects());       
        methodArg = objContext.getMessageObjects();

        assertNull(objContext.getReturn());
        assertEquals(3, methodArg.length);
        assertEquals("5", String.valueOf(methodArg[0]));
    }   
 
    public void testUnmarshalWrapDocLiteralOutputMessage() throws Exception {

        QName wrapName =
            new QName("http://objectweb.org/hello_world_soap_http/types", "greetMeResponse");       
        QName elName =
            new QName("http://objectweb.org/hello_world_soap_http/types", "responseType");
        String data = new String("TestSOAPOutputMessage");
        String str = SOAPMessageUtil.createWrapDocLitSOAPMessage(wrapName, elName, data);
        ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes());

        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, true);       
        assertNotNull(binding.getMessageFactory());
        SOAPMessage soapMessage = binding.getMessageFactory().createMessage(null, in);
        soapContext.setMessage(soapMessage);

        binding.unmarshal(soapContext,
                          objContext,
                          new JAXBDataBindingCallback(objContext.getMethod(),
                                                      DataBindingCallback.Mode.PARTS,
                                                      null));
       
        assertNull(objContext.getMessageObjects());
        assertNotNull(objContext.getReturn());
        assertEquals(data, (String)objContext.getReturn());
    }   
   
    public void testMarshalDocLiteralUserFaults() throws Exception {
        //Test The InputMessage of GreetMe Operation
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false);

        String exMessage = new String("Test Exception");
        ErrorCode ec = new ErrorCode();
        ec.setMajor((short)1);
        ec.setMinor((short)1);
        NoSuchCodeLit nscl = new NoSuchCodeLit();
        nscl.setCode(ec);
        NoSuchCodeLitFault ex = new NoSuchCodeLitFault(exMessage, nscl);
        objContext.setException(ex);

        binding.marshalFault(objContext,
                             soapContext,
                             new JAXBDataBindingCallback(objContext.getMethod(),
                                                         DataBindingCallback.Mode.PARTS,
                                                         null));
        SOAPMessage msg = soapContext.getMessage();

        assertNotNull(msg);
        Node xmlNode = msg.getSOAPBody();
        assertNotNull(xmlNode);
        assertEquals(1, xmlNode.getChildNodes().getLength());
        assertTrue(msg.getSOAPBody().hasFault());
        SOAPFault fault = msg.getSOAPBody().getFault();
        assertNotNull(fault);
        assertEquals(
                     getExceptionString(ex, exMessage),
                     fault.getFaultString());
        assertTrue(fault.hasChildNodes());
        Detail detail = fault.getDetail();
        assertNotNull(detail);
       
        NodeList list = detail.getChildNodes();
        assertEquals(1, list.getLength());
       
        WebFault wfAnnotation = ex.getClass().getAnnotation(WebFault.class);
        assertEquals(wfAnnotation.targetNamespace(), list.item(0).getNamespaceURI());
        assertEquals(wfAnnotation.name(), list.item(0).getLocalName());
    }   
   
    public void testMarshalSystemFaults() throws Exception {
        //Test The InputMessage of GreetMe Operation
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false);

        SOAPException se = new SOAPException("SAAJ Exception");
        objContext.setException(se);

        binding.marshalFault(objContext,
                             soapContext,
                             new JAXBDataBindingCallback(objContext.getMethod(),
                                                         DataBindingCallback.Mode.PARTS,
                                                         null));
        SOAPMessage msg = soapContext.getMessage();
       
        assertNotNull(msg);
        Node xmlNode = msg.getSOAPBody();
        assertNotNull(xmlNode);
        assertEquals(1, xmlNode.getChildNodes().getLength());

        assertTrue(msg.getSOAPBody().hasFault());
        SOAPFault fault = msg.getSOAPBody().getFault();
        assertNotNull(fault);
        assertEquals(
                     getExceptionString(se, se.getMessage()),
                     fault.getFaultString());
        assertTrue(fault.hasChildNodes());
        NodeList list = fault.getChildNodes();
        assertEquals(2, list.getLength());        
    }

    public void testUnmarshalDocLiteralUserFaults() throws Exception {
        //Test The InputMessage of GreetMe Operation
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, true);
        objContext.setMethod(SOAPMessageUtil.getMethod(Greeter.class, "testDocLitFault"));

        InputStream is =  getClass().getResourceAsStream("resources/NoSuchCodeDocLiteral.xml");
        SOAPMessage faultMsg = binding.getMessageFactory().createMessage(null,  is);
        soapContext.setMessage(faultMsg);

        binding.unmarshalFault(soapContext, objContext,
                               new JAXBDataBindingCallback(objContext.getMethod(),
                                                           DataBindingCallback.Mode.PARTS,
                                                           null));
        assertNotNull(objContext.getException());
        Object faultEx = objContext.getException();
        assertTrue(NoSuchCodeLitFault.class.isAssignableFrom(faultEx.getClass()));
        NoSuchCodeLitFault nscf = (NoSuchCodeLitFault)faultEx;
        assertNotNull(nscf.getFaultInfo());
        NoSuchCodeLit faultInfo = nscf.getFaultInfo();

        assertNotNull(faultInfo.getCode());
        ErrorCode ec = faultInfo.getCode();
        assertEquals(ec.getMajor(), (short)666);
        assertEquals(ec.getMinor(), (short)999);
       
        assertEquals(nscf.getMessage(), "Test Exception");
       
        is =  getClass().getResourceAsStream("resources/BadRecordDocLiteral.xml");
        faultMsg = binding.getMessageFactory().createMessage(null,  is);
        soapContext.setMessage(faultMsg);
        binding.unmarshalFault(soapContext, objContext,
                               new JAXBDataBindingCallback(objContext.getMethod(),
                                                           DataBindingCallback.Mode.PARTS,
                                                           null));
        assertNotNull(objContext.getException());
        faultEx = objContext.getException();
        assertTrue(BadRecordLitFault.class.isAssignableFrom(faultEx.getClass()));
        BadRecordLitFault brlf = (BadRecordLitFault)faultEx;
        assertEquals(brlf.getFaultInfo(), "BadRecordTested");
       
        is =  getClass().getResourceAsStream("resources/SystemFault.xml");
        faultMsg = binding.getMessageFactory().createMessage(null,  is);
        soapContext.setMessage(faultMsg);
        binding.unmarshalFault(soapContext, objContext,
                               new JAXBDataBindingCallback(objContext.getMethod(),
                                                           DataBindingCallback.Mode.PARTS,
                                                           null));
        assertNotNull(objContext.getException());
        faultEx = objContext.getException();
        assertTrue("Should be a SOAPFaultException",
                   SOAPFaultException.class.isAssignableFrom(faultEx.getClass()));
        SOAPFaultException sfe = (SOAPFaultException)faultEx;
        SOAPFault sf = sfe.getFault();
        assertNotNull(sf);
    }
   
    //Bare Doc Literal Tests
    public void testMarshalBareDocLitInputMessage() throws Exception {
        //Test The InputMessage of testDocLitBare Operation
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false);
        objContext.setMethod(SOAPMessageUtil.getMethod(Greeter.class, "testDocLitBare"));
       
        String arg0 = new String("DocLitBareDocumentInputMessage");
        objContext.setMessageObjects(arg0);

        binding.marshal(objContext,
                        soapContext,
                        new JAXBDataBindingCallback(objContext.getMethod(),
                                                    DataBindingCallback.Mode.PARTS,
                                                    null));
        SOAPMessage msg = soapContext.getMessage();
        assertNotNull(msg);
        //msg.writeTo(System.out);
        assertTrue(msg.getSOAPBody().hasChildNodes());
        NodeList list = msg.getSOAPBody().getChildNodes();
        assertEquals(1, list.getLength());
        Node msgnode = list.item(0).getFirstChild();
        assertTrue(!msgnode.hasChildNodes());
        assertEquals(arg0, msgnode.getNodeValue());
    }
   
    public void testUnmarshalBareDocLitInputMessage() throws Exception {
        //Test The InputMessage of testDocLitBare Operation
        objContext.setMethod(SOAPMessageUtil.getMethod(Greeter.class, "testDocLitBare"));
        QName elName = new QName("http://objectweb.org/hello_world_soap_http/types", "BareDocument");       

        String data = new String("DocLitBareDocumentInputMessage");
        String str = SOAPMessageUtil.createBareDocLitSOAPMessage(elName, data);
       
        ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes());
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false);

        assertNotNull(binding.getMessageFactory());
        SOAPMessage soapMessage = binding.getMessageFactory().createMessage(null, in);
        soapContext.setMessage(soapMessage);

        //testDocLitBare method has a IN parameter
        objContext.setMessageObjects(new Object[1]);
        binding.unmarshal(soapContext, objContext,
                          new JAXBDataBindingCallback(objContext.getMethod(),
                                                      DataBindingCallback.Mode.PARTS,
                                                      null));
       
        Object[] params = objContext.getMessageObjects();
        assertNotNull(params);
        assertNull(objContext.getReturn());
        assertEquals(1, params.length);
        assertEquals(data, (String)params[0]);
    }
   
    public void testMarshalEmptyBody() throws Exception {
      
        soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false);

        binding.marshal(objContext,
                        soapContext,
                        null);
        SOAPMessage msg = soapContext.getMessage();
        assertNotNull(msg);
        assertTrue(!msg.getSOAPBody().hasChildNodes());
       
        TestOutputStreamContext ostreamCtx = new TestOutputStreamContext(null, soapContext);
       
        binding.write(soapContext, ostreamCtx);
       
    }
   
    public void testUnmarshalEmptyBody() throws Exception {
        TestInputStreamContext inCtx = new TestInputStreamContext(null);
        InputStream is =  getClass().getResourceAsStream("resources/EmptyBody.xml");
        inCtx.setInputStream(is);
        binding.read(inCtx, soapContext);

        SOAPMessage msg = soapContext.getMessage();
        assertNotNull(msg);
        assertTrue(!msg.getSOAPBody().hasChildNodes());
       
        assertNull(objContext.getMessageObjects());
        assertNull(objContext.getReturn());
        binding.unmarshal(soapContext, objContext, null);
        assertNull(objContext.getMessageObjects());
        assertNull(objContext.getReturn());
    }
   
   
    private String getExceptionString(Exception ex, String faultString) {
        StringBuffer str = new StringBuffer();
        if (ex != null) {
            str.append(ex.getClass().getName());
            str.append(": ");
        }
        str.append(faultString);
       
        if (!ex.getClass().isAnnotationPresent(WebFault.class)) {
            str.append("\n");
            for (StackTraceElement s : ex.getStackTrace()) {
                str.append(s.toString());
                str.append("\n");
            }         
        }
        return str.toString();
    }
}
TOP

Related Classes of org.objectweb.celtix.bus.bindings.soap.SoapBindingImplTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.