1 package org.objectweb.celtix.bus.bindings.soap; 2 3 import java.io.ByteArrayInputStream ; 4 import java.io.InputStream ; 5 import java.lang.reflect.Method ; 6 7 import javax.xml.namespace.QName ; 8 import javax.xml.soap.Detail ; 9 import javax.xml.soap.SOAPException ; 10 import javax.xml.soap.SOAPFault ; 11 import javax.xml.soap.SOAPMessage ; 12 import javax.xml.ws.WebFault; 13 import javax.xml.ws.soap.SOAPFaultException; 14 15 import org.w3c.dom.Node ; 16 import org.w3c.dom.NodeList ; 17 18 19 import junit.framework.TestCase; 20 21 import org.objectweb.celtix.bindings.DataBindingCallback; 22 import org.objectweb.celtix.bus.bindings.TestInputStreamContext; 23 import org.objectweb.celtix.bus.bindings.TestOutputStreamContext; 24 import org.objectweb.celtix.bus.jaxws.JAXBDataBindingCallback; 25 import org.objectweb.celtix.context.GenericMessageContext; 26 import org.objectweb.celtix.context.ObjectMessageContext; 27 import org.objectweb.celtix.context.ObjectMessageContextImpl; 28 import org.objectweb.hello_world_soap_http.BadRecordLitFault; 29 import org.objectweb.hello_world_soap_http.Greeter; 30 import org.objectweb.hello_world_soap_http.NoSuchCodeLitFault; 31 import org.objectweb.hello_world_soap_http.types.ErrorCode; 32 import org.objectweb.hello_world_soap_http.types.NoSuchCodeLit; 33 import org.objectweb.type_test.doc.TypeTestPortType; 34 35 public class SoapBindingImplTest extends TestCase { 36 private SOAPBindingImpl binding; 37 private ObjectMessageContextImpl objContext; 38 private SOAPMessageContextImpl soapContext; 39 public SoapBindingImplTest(String arg0) { 40 super(arg0); 41 } 42 43 public static void main(String [] args) { 44 junit.textui.TestRunner.run(SoapBindingImplTest.class); 45 } 46 47 protected void setUp() throws Exception { 48 super.setUp(); 49 50 binding = new SOAPBindingImpl(false); 51 objContext = new ObjectMessageContextImpl(); 52 soapContext = new SOAPMessageContextImpl(new GenericMessageContext()); 53 54 objContext.setMethod(SOAPMessageUtil.getMethod(Greeter.class, "greetMe")); 55 } 56 57 public void testCreateBindingMessageContext() throws Exception { 58 binding = new SOAPBindingImpl(false); 59 byte[] bArray = new byte[0]; 60 TestInputStreamContext inCtx = new TestInputStreamContext(bArray); 61 assertNotNull(binding.createBindingMessageContext(inCtx)); 62 } 63 64 public void testGetMessageFactory() throws Exception { 65 assertNotNull(binding.getSOAPFactory()); 66 } 67 68 public void testMarshalWrapDocLitInputMessage() throws Exception { 69 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false); 71 72 String arg0 = new String ("TestSOAPInputPMessage"); 73 objContext.setMessageObjects(arg0); 74 75 binding.marshal(objContext, 76 soapContext, 77 new JAXBDataBindingCallback(objContext.getMethod(), 78 DataBindingCallback.Mode.PARTS, 79 null)); 80 SOAPMessage msg = soapContext.getMessage(); 81 assertNotNull(msg); 82 83 assertTrue(msg.getSOAPBody().hasChildNodes()); 84 NodeList list = msg.getSOAPBody().getChildNodes(); 85 assertEquals(1, list.getLength()); 86 Node wrappedNode = list.item(0).getFirstChild(); 87 assertTrue(wrappedNode.hasChildNodes()); 88 assertEquals(arg0, wrappedNode.getFirstChild().getNodeValue()); 89 } 90 91 public void testMarshalWrapDocLitMessageForInOutVar() throws Exception { 92 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false); 94 Method testInt = SOAPMessageUtil.getMethod(TypeTestPortType.class, "testInt"); 95 assertNotNull(testInt); 96 objContext.setMethod(testInt); 97 98 Object [] methodArg = SOAPMessageUtil.getMessageObjects(testInt); 99 int arg0 = 5; 100 methodArg[0] = arg0; 101 methodArg[1].getClass().getField("value").set(methodArg[1], arg0); 103 objContext.setMessageObjects(methodArg); 104 105 binding.marshal(objContext, 106 soapContext, 107 new JAXBDataBindingCallback(objContext.getMethod(), 108 DataBindingCallback.Mode.PARTS, 109 null)); 110 SOAPMessage msg = soapContext.getMessage(); 111 assertNotNull(msg); 112 113 assertTrue(msg.getSOAPBody().hasChildNodes()); 114 NodeList list = msg.getSOAPBody().getChildNodes(); 115 assertEquals(1, list.getLength()); 116 list = list.item(0).getChildNodes(); 117 assertEquals(2, list.getLength()); 118 Node wrappedNode = list.item(0); 119 assertEquals(String.valueOf(arg0), wrappedNode.getFirstChild().getNodeValue()); 120 121 wrappedNode = list.item(1); 122 assertEquals(String.valueOf(arg0), wrappedNode.getFirstChild().getNodeValue()); 123 } 124 125 public void testMarshalWrapDocLitOutputMessage() throws Exception { 126 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, true); 128 objContext.setMessageObjects(new Object [0]); 129 130 String arg0 = new String ("TestSOAPOutputMessage"); 131 objContext.setReturn(arg0); 132 133 binding.marshal(objContext, 134 soapContext, 135 new JAXBDataBindingCallback(objContext.getMethod(), 136 DataBindingCallback.Mode.PARTS, 137 null)); 138 SOAPMessage msg = soapContext.getMessage(); 139 assertNotNull(msg); 140 assertTrue(msg.getSOAPBody().hasChildNodes()); 141 NodeList list = msg.getSOAPBody().getChildNodes(); 142 assertEquals(1, list.getLength()); 143 Node wrappedNode = list.item(0).getFirstChild(); 144 assertTrue(wrappedNode.hasChildNodes()); 145 assertEquals(arg0, wrappedNode.getFirstChild().getNodeValue()); 146 } 147 148 public void testParseWrapDocLitInputMessage() throws Exception { 149 153 QName wrapName = new QName ("http://objectweb.org/hello_world_soap_http/types", "greetMe"); 154 QName elName = new QName ("http://objectweb.org/hello_world_soap_http/types", "requestType"); 155 String data = new String ("TestSOAPInputMessage"); 156 String str = SOAPMessageUtil.createWrapDocLitSOAPMessage(wrapName, elName, data); 157 158 TestInputStreamContext inCtx = new TestInputStreamContext(str.getBytes()); 159 binding.read(inCtx, soapContext); 160 161 SOAPMessage msg = soapContext.getMessage(); 162 assertNotNull(msg); 163 assertTrue(msg.getSOAPBody().hasChildNodes()); 164 NodeList list = msg.getSOAPBody().getChildNodes(); 165 166 assertEquals(1, list.getLength()); 167 Node wrappedNode = list.item(0).getFirstChild(); 168 assertTrue(wrappedNode.hasChildNodes()); 169 assertEquals(data, wrappedNode.getFirstChild().getNodeValue()); 170 171 InputStream is = getClass().getResourceAsStream("resources/Soap12message.xml"); 173 inCtx.setInputStream(is); 174 try { 175 binding.read(inCtx, soapContext); 176 fail("Should have received a SOAP FaultException"); 177 } catch (SOAPFaultException sfe) { 178 SOAPFault sf = sfe.getFault(); 179 assertNotNull("Should have a non null soap fault", sf); 180 assertEquals(SOAPConstants.FAULTCODE_VERSIONMISMATCH, sf.getFaultCodeAsQName()); 181 } 182 } 183 public void testUnmarshalWrapDocLitInputMessage() throws Exception { 184 QName wrapName = new QName ("http://objectweb.org/hello_world_soap_http/types", "greetMe"); 186 QName elName = new QName ("http://objectweb.org/hello_world_soap_http/types", "requestType"); 187 String data = new String ("TestSOAPInputMessage"); 188 String str = SOAPMessageUtil.createWrapDocLitSOAPMessage(wrapName, elName, data); 189 InputStream in = new ByteArrayInputStream (str.getBytes()); 190 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false); 191 192 assertNotNull(binding.getMessageFactory()); 193 SOAPMessage soapMessage = binding.getMessageFactory().createMessage(null, in); 194 soapContext.setMessage(soapMessage); 195 196 objContext.setMessageObjects(new Object [1]); 198 binding.unmarshal(soapContext, 199 objContext, 200 new JAXBDataBindingCallback(objContext.getMethod(), 201 DataBindingCallback.Mode.PARTS, 202 null)); 203 204 Object [] params = objContext.getMessageObjects(); 205 assertNotNull(params); 206 assertNull(objContext.getReturn()); 207 assertEquals(1, params.length); 208 assertEquals(data, (String )params[0]); 209 } 210 public void testUnmarshalWrapDocLitMessageWithInOutVar() throws Exception { 211 Method testInt = SOAPMessageUtil.getMethod(TypeTestPortType.class, "testInt"); 213 assertNotNull(testInt); 214 objContext.setMethod(testInt); 215 216 InputStream is = getClass().getResourceAsStream("resources/TestIntDocLitTypeTestReq.xml"); 217 assertNotNull(binding.getMessageFactory()); 218 SOAPMessage faultMsg = binding.getMessageFactory().createMessage(null, is); 219 soapContext.setMessage(faultMsg); 220 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false); 221 222 Object [] methodArg = SOAPMessageUtil.getMessageObjects(testInt); 223 assertNotNull(methodArg); 224 objContext.setMessageObjects(methodArg); 225 226 binding.unmarshal(soapContext, 227 objContext, 228 new JAXBDataBindingCallback(objContext.getMethod(), 229 DataBindingCallback.Mode.PARTS, 230 null)); 231 232 assertNotNull(objContext.getMessageObjects()); 233 methodArg = objContext.getMessageObjects(); 234 235 assertNull(objContext.getReturn()); 236 assertEquals(3, methodArg.length); 237 assertEquals("5", String.valueOf(methodArg[0])); 238 } 239 240 public void testUnmarshalWrapDocLiteralOutputMessage() throws Exception { 241 242 QName wrapName = 243 new QName ("http://objectweb.org/hello_world_soap_http/types", "greetMeResponse"); 244 QName elName = 245 new QName ("http://objectweb.org/hello_world_soap_http/types", "responseType"); 246 String data = new String ("TestSOAPOutputMessage"); 247 String str = SOAPMessageUtil.createWrapDocLitSOAPMessage(wrapName, elName, data); 248 ByteArrayInputStream in = new ByteArrayInputStream (str.getBytes()); 249 250 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, true); 251 assertNotNull(binding.getMessageFactory()); 252 SOAPMessage soapMessage = binding.getMessageFactory().createMessage(null, in); 253 soapContext.setMessage(soapMessage); 254 255 binding.unmarshal(soapContext, 256 objContext, 257 new JAXBDataBindingCallback(objContext.getMethod(), 258 DataBindingCallback.Mode.PARTS, 259 null)); 260 261 assertNull(objContext.getMessageObjects()); 262 assertNotNull(objContext.getReturn()); 263 assertEquals(data, (String )objContext.getReturn()); 264 } 265 266 public void testMarshalDocLiteralUserFaults() throws Exception { 267 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false); 269 270 String exMessage = new String ("Test Exception"); 271 ErrorCode ec = new ErrorCode(); 272 ec.setMajor((short)1); 273 ec.setMinor((short)1); 274 NoSuchCodeLit nscl = new NoSuchCodeLit(); 275 nscl.setCode(ec); 276 NoSuchCodeLitFault ex = new NoSuchCodeLitFault(exMessage, nscl); 277 objContext.setException(ex); 278 279 binding.marshalFault(objContext, 280 soapContext, 281 new JAXBDataBindingCallback(objContext.getMethod(), 282 DataBindingCallback.Mode.PARTS, 283 null)); 284 SOAPMessage msg = soapContext.getMessage(); 285 286 assertNotNull(msg); 287 Node xmlNode = msg.getSOAPBody(); 288 assertNotNull(xmlNode); 289 assertEquals(1, xmlNode.getChildNodes().getLength()); 290 assertTrue(msg.getSOAPBody().hasFault()); 291 SOAPFault fault = msg.getSOAPBody().getFault(); 292 assertNotNull(fault); 293 assertEquals( 294 getExceptionString(ex, exMessage), 295 fault.getFaultString()); 296 assertTrue(fault.hasChildNodes()); 297 Detail detail = fault.getDetail(); 298 assertNotNull(detail); 299 300 NodeList list = detail.getChildNodes(); 301 assertEquals(1, list.getLength()); 302 303 WebFault wfAnnotation = ex.getClass().getAnnotation(WebFault.class); 304 assertEquals(wfAnnotation.targetNamespace(), list.item(0).getNamespaceURI()); 305 assertEquals(wfAnnotation.name(), list.item(0).getLocalName()); 306 } 307 308 public void testMarshalSystemFaults() throws Exception { 309 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false); 311 312 SOAPException se = new SOAPException ("SAAJ Exception"); 313 objContext.setException(se); 314 315 binding.marshalFault(objContext, 316 soapContext, 317 new JAXBDataBindingCallback(objContext.getMethod(), 318 DataBindingCallback.Mode.PARTS, 319 null)); 320 SOAPMessage msg = soapContext.getMessage(); 321 322 assertNotNull(msg); 323 Node xmlNode = msg.getSOAPBody(); 324 assertNotNull(xmlNode); 325 assertEquals(1, xmlNode.getChildNodes().getLength()); 326 327 assertTrue(msg.getSOAPBody().hasFault()); 328 SOAPFault fault = msg.getSOAPBody().getFault(); 329 assertNotNull(fault); 330 assertEquals( 331 getExceptionString(se, se.getMessage()), 332 fault.getFaultString()); 333 assertTrue(fault.hasChildNodes()); 334 NodeList list = fault.getChildNodes(); 335 assertEquals(2, list.getLength()); 336 } 337 338 public void testUnmarshalDocLiteralUserFaults() throws Exception { 339 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, true); 341 objContext.setMethod(SOAPMessageUtil.getMethod(Greeter.class, "testDocLitFault")); 342 343 InputStream is = getClass().getResourceAsStream("resources/NoSuchCodeDocLiteral.xml"); 344 SOAPMessage faultMsg = binding.getMessageFactory().createMessage(null, is); 345 soapContext.setMessage(faultMsg); 346 347 binding.unmarshalFault(soapContext, objContext, 348 new JAXBDataBindingCallback(objContext.getMethod(), 349 DataBindingCallback.Mode.PARTS, 350 null)); 351 assertNotNull(objContext.getException()); 352 Object faultEx = objContext.getException(); 353 assertTrue(NoSuchCodeLitFault.class.isAssignableFrom(faultEx.getClass())); 354 NoSuchCodeLitFault nscf = (NoSuchCodeLitFault)faultEx; 355 assertNotNull(nscf.getFaultInfo()); 356 NoSuchCodeLit faultInfo = nscf.getFaultInfo(); 357 358 assertNotNull(faultInfo.getCode()); 359 ErrorCode ec = faultInfo.getCode(); 360 assertEquals(ec.getMajor(), (short)666); 361 assertEquals(ec.getMinor(), (short)999); 362 363 assertEquals(nscf.getMessage(), "Test Exception"); 364 365 is = getClass().getResourceAsStream("resources/BadRecordDocLiteral.xml"); 366 faultMsg = binding.getMessageFactory().createMessage(null, is); 367 soapContext.setMessage(faultMsg); 368 binding.unmarshalFault(soapContext, objContext, 369 new JAXBDataBindingCallback(objContext.getMethod(), 370 DataBindingCallback.Mode.PARTS, 371 null)); 372 assertNotNull(objContext.getException()); 373 faultEx = objContext.getException(); 374 assertTrue(BadRecordLitFault.class.isAssignableFrom(faultEx.getClass())); 375 BadRecordLitFault brlf = (BadRecordLitFault)faultEx; 376 assertEquals(brlf.getFaultInfo(), "BadRecordTested"); 377 378 is = getClass().getResourceAsStream("resources/SystemFault.xml"); 379 faultMsg = binding.getMessageFactory().createMessage(null, is); 380 soapContext.setMessage(faultMsg); 381 binding.unmarshalFault(soapContext, objContext, 382 new JAXBDataBindingCallback(objContext.getMethod(), 383 DataBindingCallback.Mode.PARTS, 384 null)); 385 assertNotNull(objContext.getException()); 386 faultEx = objContext.getException(); 387 assertTrue("Should be a SOAPFaultException", 388 SOAPFaultException.class.isAssignableFrom(faultEx.getClass())); 389 SOAPFaultException sfe = (SOAPFaultException)faultEx; 390 SOAPFault sf = sfe.getFault(); 391 assertNotNull(sf); 392 } 393 394 public void testMarshalBareDocLitInputMessage() throws Exception { 396 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false); 398 objContext.setMethod(SOAPMessageUtil.getMethod(Greeter.class, "testDocLitBare")); 399 400 String arg0 = new String ("DocLitBareDocumentInputMessage"); 401 objContext.setMessageObjects(arg0); 402 403 binding.marshal(objContext, 404 soapContext, 405 new JAXBDataBindingCallback(objContext.getMethod(), 406 DataBindingCallback.Mode.PARTS, 407 null)); 408 SOAPMessage msg = soapContext.getMessage(); 409 assertNotNull(msg); 410 assertTrue(msg.getSOAPBody().hasChildNodes()); 412 NodeList list = msg.getSOAPBody().getChildNodes(); 413 assertEquals(1, list.getLength()); 414 Node msgnode = list.item(0).getFirstChild(); 415 assertTrue(!msgnode.hasChildNodes()); 416 assertEquals(arg0, msgnode.getNodeValue()); 417 } 418 419 public void testUnmarshalBareDocLitInputMessage() throws Exception { 420 objContext.setMethod(SOAPMessageUtil.getMethod(Greeter.class, "testDocLitBare")); 422 QName elName = new QName ("http://objectweb.org/hello_world_soap_http/types", "BareDocument"); 423 424 String data = new String ("DocLitBareDocumentInputMessage"); 425 String str = SOAPMessageUtil.createBareDocLitSOAPMessage(elName, data); 426 427 ByteArrayInputStream in = new ByteArrayInputStream (str.getBytes()); 428 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false); 429 430 assertNotNull(binding.getMessageFactory()); 431 SOAPMessage soapMessage = binding.getMessageFactory().createMessage(null, in); 432 soapContext.setMessage(soapMessage); 433 434 objContext.setMessageObjects(new Object [1]); 436 binding.unmarshal(soapContext, objContext, 437 new JAXBDataBindingCallback(objContext.getMethod(), 438 DataBindingCallback.Mode.PARTS, 439 null)); 440 441 Object [] params = objContext.getMessageObjects(); 442 assertNotNull(params); 443 assertNull(objContext.getReturn()); 444 assertEquals(1, params.length); 445 assertEquals(data, (String )params[0]); 446 } 447 448 public void testMarshalEmptyBody() throws Exception { 449 450 soapContext.put(ObjectMessageContext.MESSAGE_INPUT, false); 451 452 binding.marshal(objContext, 453 soapContext, 454 null); 455 SOAPMessage msg = soapContext.getMessage(); 456 assertNotNull(msg); 457 assertTrue(!msg.getSOAPBody().hasChildNodes()); 458 459 TestOutputStreamContext ostreamCtx = new TestOutputStreamContext(null, soapContext); 460 461 binding.write(soapContext, ostreamCtx); 462 463 } 464 465 public void testUnmarshalEmptyBody() throws Exception { 466 TestInputStreamContext inCtx = new TestInputStreamContext(null); 467 InputStream is = getClass().getResourceAsStream("resources/EmptyBody.xml"); 468 inCtx.setInputStream(is); 469 binding.read(inCtx, soapContext); 470 471 SOAPMessage msg = soapContext.getMessage(); 472 assertNotNull(msg); 473 assertTrue(!msg.getSOAPBody().hasChildNodes()); 474 475 assertNull(objContext.getMessageObjects()); 476 assertNull(objContext.getReturn()); 477 binding.unmarshal(soapContext, objContext, null); 478 assertNull(objContext.getMessageObjects()); 479 assertNull(objContext.getReturn()); 480 } 481 482 483 private String getExceptionString(Exception ex, String faultString) { 484 StringBuffer str = new StringBuffer (); 485 if (ex != null) { 486 str.append(ex.getClass().getName()); 487 str.append(": "); 488 } 489 str.append(faultString); 490 491 if (!ex.getClass().isAnnotationPresent(WebFault.class)) { 492 str.append("\n"); 493 for (StackTraceElement s : ex.getStackTrace()) { 494 str.append(s.toString()); 495 str.append("\n"); 496 } 497 } 498 return str.toString(); 499 } 500 } 501 | Popular Tags |