|
28 | 28 | import io.rsocket.frame.PayloadFrameCodec;
|
29 | 29 | import io.rsocket.frame.decoder.PayloadDecoder;
|
30 | 30 | import io.rsocket.internal.subscriber.AssertSubscriber;
|
| 31 | +import io.rsocket.test.util.TestDuplexConnection; |
31 | 32 | import io.rsocket.util.ByteBufPayload;
|
32 | 33 | import io.rsocket.util.RSocketProxy;
|
33 | 34 | import java.time.Duration;
|
@@ -495,6 +496,107 @@ public Mono<Void> onClose() {
|
495 | 496 | Assertions.assertThat(rule.socket.isDisposed()).isTrue();
|
496 | 497 | }
|
497 | 498 |
|
| 499 | + @Test |
| 500 | + public void shouldResolveOnStartSource() { |
| 501 | + AssertSubscriber<RSocket> assertSubscriber = AssertSubscriber.create(); |
| 502 | + Assertions.assertThat(rule.client.connect()).isTrue(); |
| 503 | + rule.client.source().subscribe(assertSubscriber); |
| 504 | + rule.delayer.run(); |
| 505 | + assertSubscriber.assertTerminated().assertValueCount(1); |
| 506 | + |
| 507 | + rule.client.dispose(); |
| 508 | + |
| 509 | + Assertions.assertThat(rule.client.isDisposed()).isTrue(); |
| 510 | + |
| 511 | + AssertSubscriber<Void> assertSubscriber1 = AssertSubscriber.create(); |
| 512 | + |
| 513 | + rule.client.onClose().subscribe(assertSubscriber1); |
| 514 | + |
| 515 | + assertSubscriber1.assertTerminated().assertComplete(); |
| 516 | + |
| 517 | + Assertions.assertThat(rule.socket.isDisposed()).isTrue(); |
| 518 | + } |
| 519 | + |
| 520 | + @Test |
| 521 | + public void shouldNotStartTwiceSubscriptionToSource() { |
| 522 | + Assertions.assertThat(rule.client.connect()).isTrue(); |
| 523 | + Assertions.assertThat(rule.client.connect()).isFalse(); |
| 524 | + rule.delayer.run(); |
| 525 | + |
| 526 | + rule.client.dispose(); |
| 527 | + |
| 528 | + Assertions.assertThat(rule.client.isDisposed()).isTrue(); |
| 529 | + |
| 530 | + AssertSubscriber<Void> assertSubscriber1 = AssertSubscriber.create(); |
| 531 | + |
| 532 | + rule.client.onClose().subscribe(assertSubscriber1); |
| 533 | + |
| 534 | + assertSubscriber1.assertTerminated().assertComplete(); |
| 535 | + |
| 536 | + Assertions.assertThat(rule.socket.isDisposed()).isTrue(); |
| 537 | + } |
| 538 | + |
| 539 | + @Test |
| 540 | + public void shouldNotStartSubscriptionToSourceIfSourceWasSubscribedDifferently() { |
| 541 | + AssertSubscriber<RSocket> assertSubscriber = AssertSubscriber.create(); |
| 542 | + rule.client.source().subscribe(assertSubscriber); |
| 543 | + Assertions.assertThat(rule.client.connect()).isFalse(); |
| 544 | + rule.delayer.run(); |
| 545 | + assertSubscriber.assertTerminated().assertValueCount(1); |
| 546 | + |
| 547 | + rule.client.dispose(); |
| 548 | + |
| 549 | + Assertions.assertThat(rule.client.isDisposed()).isTrue(); |
| 550 | + |
| 551 | + AssertSubscriber<Void> assertSubscriber1 = AssertSubscriber.create(); |
| 552 | + |
| 553 | + rule.client.onClose().subscribe(assertSubscriber1); |
| 554 | + |
| 555 | + assertSubscriber1.assertTerminated().assertComplete(); |
| 556 | + |
| 557 | + Assertions.assertThat(rule.socket.isDisposed()).isTrue(); |
| 558 | + } |
| 559 | + |
| 560 | + @Test |
| 561 | + public void shouldBeRestartedIfSourceWasClosed() { |
| 562 | + AssertSubscriber<RSocket> assertSubscriber = AssertSubscriber.create(); |
| 563 | + AssertSubscriber<Void> terminateSubscriber = AssertSubscriber.create(); |
| 564 | + |
| 565 | + Assertions.assertThat(rule.client.connect()).isTrue(); |
| 566 | + rule.client.source().subscribe(assertSubscriber); |
| 567 | + rule.client.onClose().subscribe(terminateSubscriber); |
| 568 | + |
| 569 | + rule.delayer.run(); |
| 570 | + |
| 571 | + assertSubscriber.assertTerminated().assertValueCount(1); |
| 572 | + |
| 573 | + rule.socket.dispose(); |
| 574 | + |
| 575 | + terminateSubscriber.assertNotTerminated(); |
| 576 | + Assertions.assertThat(rule.client.isDisposed()).isFalse(); |
| 577 | + |
| 578 | + rule.connection = new TestDuplexConnection(rule.allocator); |
| 579 | + rule.socket = rule.newRSocket(); |
| 580 | + rule.producer = Sinks.one(); |
| 581 | + |
| 582 | + AssertSubscriber<RSocket> assertSubscriber2 = AssertSubscriber.create(); |
| 583 | + |
| 584 | + Assertions.assertThat(rule.client.connect()).isTrue(); |
| 585 | + rule.client.source().subscribe(assertSubscriber2); |
| 586 | + |
| 587 | + rule.delayer.run(); |
| 588 | + |
| 589 | + assertSubscriber2.assertTerminated().assertValueCount(1); |
| 590 | + |
| 591 | + rule.client.dispose(); |
| 592 | + |
| 593 | + terminateSubscriber.assertTerminated().assertComplete(); |
| 594 | + |
| 595 | + Assertions.assertThat(rule.client.connect()).isFalse(); |
| 596 | + |
| 597 | + Assertions.assertThat(rule.socket.isDisposed()).isTrue(); |
| 598 | + } |
| 599 | + |
498 | 600 | @Test
|
499 | 601 | public void shouldDisposeOriginalSourceIfRacing() {
|
500 | 602 | for (int i = 0; i < RaceTestConstants.REPEATS; i++) {
|
@@ -523,6 +625,37 @@ public void shouldDisposeOriginalSourceIfRacing() {
|
523 | 625 | }
|
524 | 626 | }
|
525 | 627 |
|
| 628 | + @Test |
| 629 | + public void shouldStartOriginalSourceOnceIfRacing() { |
| 630 | + for (int i = 0; i < RaceTestConstants.REPEATS; i++) { |
| 631 | + ClientSocketRule rule = new ClientSocketRule(); |
| 632 | + |
| 633 | + rule.init(); |
| 634 | + |
| 635 | + AssertSubscriber<RSocket> assertSubscriber = AssertSubscriber.create(); |
| 636 | + |
| 637 | + RaceTestUtils.race( |
| 638 | + () -> rule.client.source().subscribe(assertSubscriber), () -> rule.client.connect()); |
| 639 | + |
| 640 | + Assertions.assertThat(rule.producer.currentSubscriberCount()).isOne(); |
| 641 | + |
| 642 | + rule.delayer.run(); |
| 643 | + |
| 644 | + assertSubscriber.assertTerminated(); |
| 645 | + |
| 646 | + rule.client.dispose(); |
| 647 | + |
| 648 | + Assertions.assertThat(rule.client.isDisposed()).isTrue(); |
| 649 | + Assertions.assertThat(rule.socket.isDisposed()).isTrue(); |
| 650 | + |
| 651 | + AssertSubscriber<Void> assertSubscriber1 = AssertSubscriber.create(); |
| 652 | + |
| 653 | + rule.client.onClose().subscribe(assertSubscriber1); |
| 654 | + |
| 655 | + assertSubscriber1.assertTerminated().assertComplete(); |
| 656 | + } |
| 657 | + } |
| 658 | + |
526 | 659 | public static class ClientSocketRule extends AbstractSocketRule<RSocket> {
|
527 | 660 |
|
528 | 661 | protected RSocketClient client;
|
|
0 commit comments