| 1 package org.objectweb.celtix.systest.ws.rm; 2 3 import java.net.URL ; 4 import java.util.List ; 5 6 import javax.xml.namespace.QName ; 7 import javax.xml.soap.SOAPMessage ; 8 import javax.xml.ws.BindingProvider; 9 import javax.xml.ws.handler.Handler; 10 import javax.xml.ws.handler.LogicalMessageContext; 11 12 import junit.framework.Test; 13 import junit.framework.TestSuite; 14 15 import org.objectweb.celtix.Bus; 16 import org.objectweb.celtix.bindings.AbstractBindingImpl; 17 import org.objectweb.celtix.bus.busimpl.BusConfigurationBuilder; 18 import org.objectweb.celtix.bus.ws.rm.Names; 19 import org.objectweb.celtix.bus.ws.rm.RMHandler; 20 import org.objectweb.celtix.configuration.ConfigurationBuilder; 21 import org.objectweb.celtix.configuration.ConfigurationBuilderFactory; 22 import org.objectweb.celtix.greeter_control.Control; 23 import org.objectweb.celtix.greeter_control.ControlService; 24 import org.objectweb.celtix.greeter_control.Greeter; 25 import org.objectweb.celtix.greeter_control.GreeterService; 26 import org.objectweb.celtix.systest.common.ClientServerSetupBase; 27 import org.objectweb.celtix.systest.common.ClientServerTestBase; 28 29 32 public class SequenceTest extends ClientServerTestBase { 33 34 private static final String APP_NAMESPACE = "http://celtix.objectweb.org/greeter_control"; 35 private static final String GREETMEONEWAY_ACTION = APP_NAMESPACE + "/types/Greeter/greetMeOneWay"; 36 private static final String GREETME_ACTION = APP_NAMESPACE + "/types/Greeter/greetMe"; 37 private static final String GREETME_RESPONSE_ACTION = GREETME_ACTION + "Response"; 38 39 private static final QName CONTROL_SERVICE_NAME = new QName (APP_NAMESPACE, "ControlService"); 40 private static final QName SERVICE_NAME = new QName (APP_NAMESPACE, "GreeterService"); 41 private static final QName CONTROL_PORT_NAME = new QName (APP_NAMESPACE, "ControlPort"); 42 private static final QName PORT_NAME = new QName (APP_NAMESPACE, "GreeterPort"); 43 44 private Bus bus; 45 private GreeterService greeterService; 46 private Greeter greeter; 47 private Control control; 48 private String currentConfiguration; 49 private MessageFlow mf; 50 51 54 private boolean doTestOnewayAnonymousAcks = true; 55 private boolean doTestOnewayDeferredAnonymousAcks = true; 56 private boolean doTestOnewayDeferredNonAnonymousAcks = true; 57 private boolean doTestOnewayAnonymousAcksSequenceLength1 = true; 58 private boolean doTestOnewayAnonymousAcksSupressed = true; 59 private boolean doTestTwowayNonAnonymous = true; 60 private boolean doTestTwowayNonAnonymousDeferred = true; 61 private boolean doTestTwowayNonAnonymousMaximumSequenceLength2; 62 private boolean doTestTwowayNonAnonymousNoOffer; 63 private boolean doTestTwowayMessageLoss = true; 64 65 66 public static void main(String [] args) { 67 junit.textui.TestRunner.run(SequenceTest.class); 68 } 69 70 public static Test suite() throws Exception { 71 TestSuite suite = new TestSuite(SequenceTest.class); 72 return new ClientServerSetupBase(suite) { 73 public void startServers() throws Exception { 74 assertTrue("server did not launch correctly", launchServer(Server.class, "Windows 2000" 78 .equals(System.getProperty("os.name")))); 79 } 80 81 public void setUp() throws Exception { 82 ConfigurationBuilder builder = ConfigurationBuilderFactory.getBuilder(); 85 builder.buildConfiguration(BusConfigurationBuilder.BUS_CONFIGURATION_URI, "celtix"); 86 87 super.setUp(); 88 89 } 90 }; 91 } 92 93 public void tearDown() { 94 if (null != greeter) { 95 boolean found = false; 96 BindingProvider provider = (BindingProvider)greeter; 97 AbstractBindingImpl abi = (AbstractBindingImpl)provider.getBinding(); 98 List <Handler> handlerChain = abi.getPreLogicalSystemHandlers(); 99 for (Handler h : handlerChain) { 100 if (h instanceof RMHandler) { 101 ((RMHandler)h).destroy(); 102 found = true; 103 break; 104 } 105 } 106 assertTrue("Cound not find RM handler in pre logical system handler chain", found); 107 } 108 } 109 110 112 public void testOnewayAnonymousAcks() throws Exception { 113 if (!doTestOnewayAnonymousAcks) { 114 return; 115 } 116 setupEndpoints("anonymous"); 117 118 greeter.greetMeOneWay("once"); 119 greeter.greetMeOneWay("twice"); 120 greeter.greetMeOneWay("thrice"); 121 122 124 mf.verifyMessages(4, true); 125 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, GREETMEONEWAY_ACTION, 126 GREETMEONEWAY_ACTION, GREETMEONEWAY_ACTION}; 127 mf.verifyActions(expectedActions, true); 128 mf.verifyMessageNumbers(new String [] {null, "1", "2", "3"}, true); 129 130 mf.verifyMessages(5, false); 132 expectedActions = new String [] {null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, null, null, null}; 133 mf.verifyActions(expectedActions, false); 134 mf.verifyMessageNumbers(new String [] {null, null, null, null, null}, false); 135 mf.verifyAcknowledgements(new boolean[] {false, false, true, true, true}, false); 136 } 137 138 public void testOnewayDeferredAnonymousAcks() throws Exception { 139 if (!doTestOnewayDeferredAnonymousAcks) { 140 return; 141 } 142 setupEndpoints("anonymous-deferred"); 143 144 greeter.greetMeOneWay("once"); 145 greeter.greetMeOneWay("twice"); 146 147 try { 148 Thread.sleep(3 * 1000); 149 } catch (InterruptedException ex) { 150 } 152 153 greeter.greetMeOneWay("thrice"); 154 155 mf.verifyMessages(4, true); 157 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, GREETMEONEWAY_ACTION, 158 GREETMEONEWAY_ACTION, GREETMEONEWAY_ACTION}; 159 mf.verifyActions(expectedActions, true); 160 mf.verifyMessageNumbers(new String [] {null, "1", "2", "3"}, true); 161 162 165 mf.verifyMessages(5, false); 166 expectedActions = new String [] {null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, null, null, null}; 167 mf.verifyActions(expectedActions, false); 168 mf.verifyMessageNumbers(new String [] {null, null, null, null, null}, false); 169 mf.verifyAcknowledgements(new boolean[] {false, false, false, false, true}, false); 170 } 171 172 public void testOnewayDeferredNonAnonymousAcks() throws Exception { 173 if (!doTestOnewayDeferredNonAnonymousAcks) { 174 return; 175 } 176 setupEndpoints("nonanonymous-deferred"); 177 178 greeter.greetMeOneWay("once"); 179 greeter.greetMeOneWay("twice"); 180 181 183 mf.verifyMessages(3, true); 184 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, GREETMEONEWAY_ACTION, 185 GREETMEONEWAY_ACTION}; 186 mf.verifyActions(expectedActions, true); 187 mf.verifyMessageNumbers(new String [] {null, "1", "2"}, true); 188 189 191 mf.verifyMessages(4, false); 192 expectedActions = new String [] {null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, null, null}; 193 mf.verifyActions(expectedActions, false); 194 mf.verifyMessageNumbers(new String [4], false); 195 mf.verifyAcknowledgements(new boolean[4], false); 196 197 mf.getInboundContexts().clear(); 198 mf.getOutboundMessages().clear(); 199 200 try { 201 Thread.sleep(3 * 1000); 202 } catch (InterruptedException ex) { 203 } 205 206 208 mf.verifyMessages(0, true); 209 mf.verifyMessages(1, false); 210 211 } 212 213 public void testOnewayAnonymousAcksSequenceLength1() throws Exception { 214 if (!doTestOnewayAnonymousAcksSequenceLength1) { 215 return; 216 } 217 setupEndpoints("anonymous-seqlength1"); 218 219 greeter.greetMeOneWay("once"); 220 greeter.greetMeOneWay("twice"); 221 222 225 mf.verifyMessages(6, true); 226 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, GREETMEONEWAY_ACTION, 227 Names.WSRM_TERMINATE_SEQUENCE_ACTION, 228 Names.WSRM_CREATE_SEQUENCE_ACTION, GREETMEONEWAY_ACTION, 229 Names.WSRM_TERMINATE_SEQUENCE_ACTION}; 230 mf.verifyActions(expectedActions, true); 231 mf.verifyMessageNumbers(new String [] {null, "1", null, null, "1", null}, true); 232 mf.verifyLastMessage(new boolean[] {false, true, false, false, true, false}, true); 233 234 237 mf.verifyMessages(8, false, 100, 5); 238 239 expectedActions = new String [] {null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, null, null, 240 null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, null, null}; 241 mf.verifyActions(expectedActions, false); 242 mf.verifyMessageNumbers(new String [] {null, null, null, null, null, null, null, null}, false); 243 mf.verifyLastMessage(new boolean[] {false, false, false, false, false, false, false, false}, false); 244 mf.verifyAcknowledgements(new boolean[] {false, false, true, false, 245 false, false, true, false}, false); 246 } 247 248 public void testOnewayAnonymousAcksSupressed() throws Exception { 249 250 if (!doTestOnewayAnonymousAcksSupressed) { 251 return; 252 } 253 setupEndpoints("anonymous-suppressed"); 254 255 greeter.greetMeOneWay("once"); 256 greeter.greetMeOneWay("twice"); 257 greeter.greetMeOneWay("thrice"); 258 259 mf.verifyMessages(4, true); 261 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, GREETMEONEWAY_ACTION, 262 GREETMEONEWAY_ACTION, GREETMEONEWAY_ACTION}; 263 mf.verifyActions(expectedActions, true); 264 mf.verifyMessageNumbers(new String [] {null, "1", "2", "3"}, true); 265 266 269 mf.verifyMessages(5, false); 270 expectedActions = new String [] {null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, null, null, null}; 271 mf.verifyActions(expectedActions, false); 272 mf.verifyMessageNumbers(new String [] {null, null, null, null, null}, false); 273 mf.verifyAcknowledgements(new boolean[] {false, false, false, false, false}, false); 274 275 mf.getOutboundMessages().clear(); 276 mf.getInboundContexts().clear(); 277 278 Thread.sleep(10 * 1000); 280 281 288 int nOutbound = mf.getOutboundMessages().size(); 289 assertTrue("unexpected number of resends: " + nOutbound, 290 nOutbound >= 1); 291 } 293 294 public void testTwowayNonAnonymous() throws Exception { 295 if (!doTestTwowayNonAnonymous) { 296 return; 297 } 298 setupEndpoints("twoway"); 299 300 greeter.greetMe("one"); 301 greeter.greetMe("two"); 302 greeter.greetMe("three"); 303 304 307 mf.verifyMessages(4, true); 308 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, GREETME_ACTION, 309 GREETME_ACTION, GREETME_ACTION}; 310 mf.verifyActions(expectedActions, true); 311 mf.verifyMessageNumbers(new String [] {null, "1", "2", "3"}, true); 312 mf.verifyLastMessage(new boolean[] {false, false, false, false}, true); 313 mf.verifyAcknowledgements(new boolean[] {false, false, true, true}, true); 314 315 318 mf.verifyMessages(8, false); 319 expectedActions = new String [] {null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, null, 320 GREETME_RESPONSE_ACTION, null, GREETME_RESPONSE_ACTION, null, 321 GREETME_RESPONSE_ACTION}; 322 mf.verifyActions(expectedActions, false); 323 mf.verifyMessageNumbers(new String [] {null, null, null, "1", null, "2", null, "3"}, false); 324 mf.verifyLastMessage(new boolean[8], false); 325 mf.verifyAcknowledgements(new boolean[] {false, false, false, true, false, true, false, true}, false); 326 } 327 328 public void testTwowayNonAnonymousDeferred() throws Exception { 329 if (!doTestTwowayNonAnonymousDeferred) { 330 return; 331 } 332 setupEndpoints("nonanonymous-deferred"); 333 334 greeter.greetMe("one"); 335 greeter.greetMe("two"); 336 337 339 mf.verifyMessages(3, true); 340 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, GREETME_ACTION, 341 GREETME_ACTION}; 342 mf.verifyActions(expectedActions, true); 343 mf.verifyMessageNumbers(new String [] {null, "1", "2"}, true); 344 mf.verifyLastMessage(new boolean[3], true); 345 mf.verifyAcknowledgements(new boolean[3], true); 346 347 350 mf.verifyMessages(6, false); 351 expectedActions = new String [] {null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, null, 352 GREETME_RESPONSE_ACTION, null, 353 GREETME_RESPONSE_ACTION}; 354 mf.verifyActions(expectedActions, false); 355 mf.verifyMessageNumbers(new String [] {null, null, null, "1", null, "2"}, false); 356 mf.verifyLastMessage(new boolean[6], false); 357 mf.verifyAcknowledgements(new boolean[6], false); 358 359 mf.getInboundContexts().clear(); 360 mf.getOutboundMessages().clear(); 361 362 364 mf.verifyMessages(1, true, 1000, 5); 365 mf.verifyMessageNumbers(new String [1], true); 366 mf.verifyLastMessage(new boolean[1], true); 367 mf.verifyAcknowledgements(new boolean[] {true} , true); 368 369 371 } 372 373 383 384 public void testTwowayNonAnonymousMaximumSequenceLength2() throws Exception { 385 386 if (!doTestTwowayNonAnonymousMaximumSequenceLength2) { 387 return; 388 } 389 setupEndpoints("twoway-seqlength2"); 390 391 greeter.greetMe("one"); 392 greeter.greetMe("two"); 393 greeter.greetMe("three"); 394 395 mf.verifyMessages(7, true); 396 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, 397 GREETME_ACTION, 398 GREETME_ACTION, 399 Names.WSRM_TERMINATE_SEQUENCE_ACTION, 400 Names.WSRM_SEQUENCE_ACKNOWLEDGMENT_ACTION, 401 Names.WSRM_CREATE_SEQUENCE_ACTION, 402 GREETME_ACTION}; 403 mf.verifyActions(expectedActions, true); 404 mf.verifyMessageNumbers(new String [] {null, "1", "2", null, null, null, "1"}, true); 405 mf.verifyLastMessage(new boolean[] {false, false, true, false, false, false, false}, true); 406 mf.verifyAcknowledgements(new boolean[] {false, false, true, false, true, false, false}, true); 407 408 411 mf.verifyMessages(12, false, 100, 5); 412 413 expectedActions = new String [] {null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, 414 null, GREETME_RESPONSE_ACTION, 415 null, GREETME_RESPONSE_ACTION, 416 null, Names.WSRM_TERMINATE_SEQUENCE_ACTION, 417 null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, 418 null, GREETME_RESPONSE_ACTION}; 419 mf.verifyActions(expectedActions, false); 420 mf.verifyMessageNumbers( 421 new String [] {null, null, null, "1", null, "2", null, null, null, null, null, "1"}, false); 422 boolean[] expected = new boolean[12]; 423 expected[5] = true; 424 mf.verifyLastMessage(expected, false); 425 expected[3] = true; 426 expected[11] = true; 427 mf.verifyAcknowledgements(expected, false); 428 } 429 430 public void testTwowayNonAnonymousNoOffer() throws Exception { 431 if (!doTestTwowayNonAnonymousNoOffer) { 432 return; 433 } 434 setupEndpoints("twoway-no-offer"); 435 436 greeter.greetMe("one"); 437 greeter.greetMe("two"); 438 439 443 mf.verifyMessages(4, true); 444 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, GREETME_ACTION, 445 Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, GREETME_ACTION}; 446 mf.verifyActions(expectedActions, true); 447 mf.verifyMessageNumbers(new String [] {null, "1", null, "2"}, true); 448 mf.verifyLastMessage(new boolean[] {false, false, false, false}, true); 449 mf.verifyAcknowledgements(new boolean[] {false, false, false, true}, true); 450 451 455 mf.verifyMessages(8, false, 1000, 3); 456 457 mf.purgePartialResponses(); 458 459 expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, 460 Names.WSRM_CREATE_SEQUENCE_ACTION, 461 GREETME_RESPONSE_ACTION, 462 GREETME_RESPONSE_ACTION}; 463 mf.verifyActions(expectedActions, false); 464 mf.verifyMessageNumbers(new String [] {null, null, "1", "2"}, false); 465 mf.verifyAcknowledgements(new boolean[] {false, false, true, true}, false); 466 } 467 468 public void testTwowayMessageLoss() throws Exception { 469 if (!doTestTwowayMessageLoss) { 470 return; 471 } 472 setupEndpoints("twoway-message-loss"); 473 474 greeter.greetMe("one"); 475 greeter.greetMe("two"); 476 greeter.greetMe("three"); 477 greeter.greetMe("four"); 478 479 481 mf.verifyMessages(5, true); 482 String [] expectedActions = new String [] {Names.WSRM_CREATE_SEQUENCE_ACTION, GREETME_ACTION, 483 GREETME_ACTION, GREETME_ACTION, GREETME_ACTION}; 484 mf.verifyActions(expectedActions, true); 485 mf.verifyMessageNumbers(new String [] {null, "1", "2", "3", "4"}, true); 486 mf.verifyLastMessage(new boolean[] {false, false, false, false, false}, true); 487 mf.verifyAcknowledgements(new boolean[] {false, false, true, false, true}, true); 488 489 494 mf.verifyMessages(8, false); 495 expectedActions = new String [] {null, Names.WSRM_CREATE_SEQUENCE_RESPONSE_ACTION, null, 496 GREETME_RESPONSE_ACTION, GREETME_ACTION, null, 497 GREETME_RESPONSE_ACTION, GREETME_ACTION}; 498 mf.verifyActions(expectedActions, false); 499 mf.verifyMessageNumbers(new String [] {null, null, null, "1", null, null, "2", null}, false); 500 mf.verifyLastMessage(new boolean[8], false); 501 mf.verifyAcknowledgements(new boolean[] {false, false, false, true, false, false, true, false}, 502 false); 503 504 505 mf.clear(); 506 507 515 mf.verifyMessages(2, true, 1000, 10); 516 expectedActions = new String [] {GREETME_ACTION, GREETME_ACTION}; 517 mf.verifyActions(expectedActions, true); 518 519 } 520 521 523 524 private void createControl() { 525 if (null == control) { 526 URL wsdl = getClass().getResource("/wsdl/greeter_control.wsdl"); 527 ControlService controlService = new ControlService(wsdl, CONTROL_SERVICE_NAME); 528 control = controlService.getPort(CONTROL_PORT_NAME, Control.class); 529 } 530 } 531 532 private void setupEndpoints(String configuration) throws Exception { 533 534 if (configuration != null && configuration.equals(currentConfiguration)) { 535 return; 536 } 537 538 if (configuration.indexOf("shutdown") > 0 && null != bus) { 539 bus.shutdown(true); 540 bus = null; 541 } 542 543 if (null == bus) { 544 bus = Bus.init(); 545 } 546 547 createControl(); 548 549 control.stopGreeter(); 550 control.startGreeter(configuration); 551 552 if (null != configuration && configuration.length() > 0) { 553 ControlImpl.setConfigFileProperty(configuration); 554 } 555 556 TestConfigurator tc = new TestConfigurator(); 557 tc.configureClient(SERVICE_NAME, PORT_NAME.getLocalPart()); 558 559 URL wsdl = getClass().getResource("/wsdl/greeter_control.wsdl"); 560 greeterService = new GreeterService(wsdl, SERVICE_NAME); 561 greeter = greeterService.getPort(PORT_NAME, Greeter.class); 562 563 BindingProvider provider = (BindingProvider)greeter; 564 AbstractBindingImpl abi = (AbstractBindingImpl)provider.getBinding(); 565 List <Handler> handlerChain = abi.getHandlerChain(); 566 assertTrue(handlerChain.size() > 0); 567 568 List <SOAPMessage > outboundMessages = null; 569 List <LogicalMessageContext> inboundContexts = null; 570 571 boolean found = false; 572 for (Handler h : handlerChain) { 573 if (!found && h instanceof SOAPMessageRecorder) { 574 SOAPMessageRecorder recorder = (SOAPMessageRecorder)h; 575 outboundMessages = recorder.getOutboundMessages(); 576 outboundMessages.clear(); 577 found = true; 578 break; 579 } 580 } 581 assertTrue("Could not find SOAPMessageRecorder in post protocol handler chain", found); 582 583 handlerChain = abi.getPreLogicalSystemHandlers(); 584 assertTrue(handlerChain.size() > 0); 585 found = false; 586 for (Handler h : handlerChain) { 587 if (!found && h instanceof LogicalMessageContextRecorder) { 588 LogicalMessageContextRecorder recorder = (LogicalMessageContextRecorder)h; 589 inboundContexts = recorder.getInboundContexts(); 590 inboundContexts.clear(); 591 found = true; 592 break; 593 } 594 } 595 assertTrue("Could not find LogicalMessageContextRecorder in pre logical system handler chain", found); 596 currentConfiguration = configuration; 597 598 mf = new MessageFlow(outboundMessages, inboundContexts); 599 600 } 601 602 } 603 | Popular Tags |