1   package org.codehaus.xfire.fault;
2   
3   import java.io.ByteArrayOutputStream;
4   import java.io.StringReader;
5   
6   import org.codehaus.xfire.AbstractXFireTest;
7   import org.codehaus.xfire.MessageContext;
8   import org.codehaus.xfire.SOAPConstants;
9   import org.codehaus.xfire.handler.BadHandler;
10  import org.codehaus.xfire.service.SimpleService;
11  import org.codehaus.xfire.util.DOMUtils;
12  import org.dom4j.Document;
13  import org.dom4j.io.SAXReader;
14  import org.w3c.dom.Element;
15  
16  /***
17   * XFireTest
18   * 
19   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
20   */
21  public class XFireFaultTest
22      extends AbstractXFireTest
23  {
24      public void testFaults()
25          throws Exception
26      {
27          SOAP12FaultHandler soap12 = new SOAP12FaultHandler();
28          
29          XFireFault fault = new XFireFault(new Exception());
30          fault.setSubCode("m:NotAvailable");
31          Element details = fault.getDetailElement();
32          Element e = details.getOwnerDocument().createElement("bah");
33          DOMUtils.setText(e, "bleh");
34          details.appendChild(e);
35          
36          e = details.getOwnerDocument().createElementNS("urn:test2", "bah2");
37          DOMUtils.setText(e, "bleh");
38          details.appendChild(e);
39          
40          fault.addNamespace("m", "urn:test");
41          
42          ByteArrayOutputStream out = new ByteArrayOutputStream();
43          MessageContext context = 
44              new MessageContext( "Echo",
45                                  null,
46                                  out,
47                                  null,
48                                  null );
49          
50          soap12.handleFault( fault, context);
51          
52          SAXReader reader = new SAXReader();
53          Document doc = reader.read( new StringReader(out.toString()) );
54          printNode(doc);
55          addNamespace("s", SOAPConstants.SOAP12_ENVELOPE_NS);
56          assertValid("//s:SubCode/s:Value[text()='m:NotAvailable']", doc );
57          addNamespace("t", "urn:test2");
58          assertValid("//s:Detail/t:bah2[text()='bleh']", doc );
59      }
60   
61      
62      public void testFaults11()
63          throws Exception
64      {
65          SOAP11FaultHandler soap11 = new SOAP11FaultHandler();
66          
67          XFireFault fault = new XFireFault(new Exception());
68          Element details = fault.getDetailElement();
69          Element e = details.getOwnerDocument().createElement("bah");
70          DOMUtils.setText(e, "bleh");
71          details.appendChild(e);
72          
73          e = details.getOwnerDocument().createElementNS("urn:test2", "bah2");
74          DOMUtils.setText(e, "bleh");
75          details.appendChild(e);
76  
77          fault.addNamespace("m", "urn:test");
78          
79          ByteArrayOutputStream out = new ByteArrayOutputStream();
80          MessageContext context = 
81              new MessageContext( "Echo",
82                                  null,
83                                  out,
84                                  null,
85                                  null );
86          
87          soap11.handleFault( fault, context );
88          System.err.println(out.toString());
89          SAXReader reader = new SAXReader();
90          Document doc = reader.read( new StringReader(out.toString()) );
91          printNode(doc);
92          addNamespace("s", SOAPConstants.SOAP12_ENVELOPE_NS);
93          addNamespace("t", "urn:test2");
94          assertValid("//detail/t:bah2[text()='bleh']", doc );
95      }
96  
97      public void testSOAP12()
98          throws Exception
99      {
100         SOAP12FaultHandler soap12 = new SOAP12FaultHandler();
101         
102         testHandler( soap12 );
103     }
104     
105     public void testSOAP11()
106         throws Exception
107     {
108         SOAP11FaultHandler soap11 = new SOAP11FaultHandler();
109         
110         testHandler( soap11 );
111     }
112     
113     /***
114      * @param soap11
115      */
116     private void testHandler( FaultHandler soap11 )
117     {
118         SimpleService service = new SimpleService();
119         service.setName("Echo");
120         service.setSoapVersion(SOAPConstants.SOAP12_ENVELOPE_NS);
121         service.setWSDLURL(getClass().getResource("/org/codehaus/xfire/echo11.wsdl").toString());
122         
123         service.setServiceHandler(new BadHandler());
124         service.setFaultHandler(soap11);
125         
126         getServiceRegistry().register(service);
127         
128         ByteArrayOutputStream out = new ByteArrayOutputStream();
129         MessageContext context = 
130             new MessageContext( "Echo",
131                                 null,
132                                 out,
133                                 null,
134                                 null );
135         
136         getXFire().invoke(
137                 getResourceAsStream( "/org/codehaus/xfire/echo11.xml" ),
138                 context );
139         
140         System.out.println(out.toString());
141     }
142 }