1 package org.codehaus.xfire.plexus;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.InputStream;
5 import java.io.StringReader;
6 import java.util.HashMap;
7 import java.util.List;
8 import java.util.Map;
9
10 import javax.xml.stream.XMLStreamException;
11
12 import org.codehaus.plexus.PlexusTestCase;
13 import org.codehaus.xfire.MessageContext;
14 import org.codehaus.xfire.XFire;
15 import org.codehaus.xfire.exchange.InMessage;
16 import org.codehaus.xfire.service.Service;
17 import org.codehaus.xfire.service.ServiceRegistry;
18 import org.codehaus.xfire.soap.Soap11;
19 import org.codehaus.xfire.soap.Soap12;
20 import org.codehaus.xfire.test.XPathAssert;
21 import org.codehaus.xfire.transport.Channel;
22 import org.codehaus.xfire.transport.Transport;
23 import org.codehaus.xfire.transport.local.LocalTransport;
24 import org.codehaus.xfire.util.STAXUtils;
25 import org.codehaus.xfire.wsdl.WSDLWriter;
26 import org.codehaus.yom.Document;
27 import org.codehaus.yom.Node;
28 import org.codehaus.yom.Serializer;
29 import org.codehaus.yom.stax.StaxBuilder;
30
31 /***
32 * Contains helpful methods to test SOAP services.
33 *
34 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
35 */
36 public class PlexusXFireTest
37 extends PlexusTestCase
38 {
39 /***
40 * Namespaces for the XPath expressions.
41 */
42 private Map namespaces = new HashMap();
43
44 protected void printNode(Node node)
45 throws Exception
46 {
47 Serializer writer = new Serializer(System.out);
48 writer.setOutputStream(System.out);
49
50 if (node instanceof Document)
51 writer.write((Document) node);
52 else
53 {
54 writer.flush();
55 writer.writeChild(node);
56 }
57 }
58
59 /***
60 * Invoke a service with the specified document.
61 *
62 * @param service The name of the service.
63 * @param document The request as an xml document in the classpath.
64 */
65 protected Document invokeService(String service, String document)
66 throws Exception
67 {
68 ByteArrayOutputStream out = new ByteArrayOutputStream();
69 MessageContext context = new MessageContext();
70 context.setXFire(getXFire());
71 context.setProperty(Channel.BACKCHANNEL_URI, out);
72
73 if (service != null)
74 context.setService(getServiceRegistry().getService(service));
75
76 InputStream stream = getResourceAsStream(document);
77 InMessage msg = new InMessage(STAXUtils.createXMLStreamReader(stream, "UTF-8"));
78
79 Transport t = getXFire().getTransportManager().getTransport(LocalTransport.NAME);
80 Channel c = t.createChannel();
81
82 c.receive(context, msg);
83
84 String response = out.toString();
85 if (response == null || response.length() == 0)
86 return null;
87
88 return readDocument(response);
89 }
90
91 protected Document readDocument(String text)
92 throws XMLStreamException
93 {
94 try
95 {
96 StaxBuilder builder = new StaxBuilder();
97 return builder.build(new StringReader(text));
98 }
99 catch (XMLStreamException e)
100 {
101 System.err.println("Could not read the document!");
102 System.out.println(text);
103 throw e;
104 }
105 }
106
107 protected Document getWSDLDocument(String service)
108 throws Exception
109 {
110 ByteArrayOutputStream out = new ByteArrayOutputStream();
111
112 getXFire().generateWSDL(service, out);
113
114 return readDocument(out.toString());
115 }
116
117 /***
118 * @see junit.framework.TestCase#setUp()
119 */
120 protected void setUp()
121 throws Exception
122 {
123 super.setUp();
124
125 addNamespace("s", Soap11.getInstance().getNamespace());
126 addNamespace("soap12", Soap12.getInstance().getNamespace());
127 }
128
129 /***
130 * Assert that the following XPath query selects one or more nodes.
131 *
132 * @param xpath
133 * @return
134 */
135 public List assertValid(String xpath, Node node)
136 throws Exception
137 {
138 return XPathAssert.assertValid(xpath, node, namespaces);
139 }
140
141 /***
142 * Assert that the following XPath query selects no nodes.
143 *
144 * @param xpath
145 * @return
146 */
147 public List assertInvalid(String xpath, Node node)
148 throws Exception
149 {
150 return XPathAssert.assertInvalid(xpath, node, namespaces);
151 }
152
153 /***
154 * Asser that the text of the xpath node retrieved is equal to the value specified.
155 *
156 * @param xpath
157 * @param value
158 * @param node
159 */
160 public void assertXPathEquals(String xpath, String value, Node node)
161 throws Exception
162 {
163 XPathAssert.assertXPathEquals(xpath, value, node, namespaces);
164 }
165
166 public void assertNoFault(Node node)
167 throws Exception
168 {
169 XPathAssert.assertNoFault(node);
170 }
171
172 /***
173 * Add a namespace that will be used for XPath expressions.
174 *
175 * @param ns Namespace name.
176 * @param uri The namespace uri.
177 */
178 public void addNamespace(String ns, String uri)
179 {
180 namespaces.put(ns, uri);
181 }
182
183 /***
184 * Get the WSDL for a service.
185 *
186 * @param string The name of the service.
187 * @return
188 * @throws Exception
189 */
190 protected WSDLWriter getWSDL(String service)
191 throws Exception
192 {
193 ServiceRegistry reg = getServiceRegistry();
194 Service hello = reg.getService(service);
195
196 return hello.getWSDLWriter();
197 }
198
199 protected XFire getXFire()
200 throws Exception
201 {
202 return (XFire) lookup(XFire.ROLE);
203 }
204
205 protected ServiceRegistry getServiceRegistry()
206 throws Exception
207 {
208 return getXFire().getServiceRegistry();
209 }
210 }