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