|
18 | 18 | #include <yarpl/single/SingleSubscriptions.h> |
19 | 19 | #include <yarpl/single/Singles.h> |
20 | 20 | #include <yarpl/test_utils/Mocks.h> |
| 21 | +#include "rsocket/RSocketConnectionEvents.h" |
21 | 22 | #include "rsocket/RSocketResponder.h" |
22 | 23 | #include "rsocket/framing/FrameSerializer_v1_0.h" |
23 | 24 | #include "rsocket/framing/FrameTransportImpl.h" |
@@ -68,6 +69,11 @@ class ResponderMock : public RSocketResponder { |
68 | 69 | } |
69 | 70 | }; |
70 | 71 |
|
| 72 | +struct ConnectionEventsMock : public RSocketConnectionEvents { |
| 73 | + MOCK_METHOD1(onDisconnected, void(const folly::exception_wrapper&)); |
| 74 | + MOCK_METHOD0(onStreamsPaused, void()); |
| 75 | +}; |
| 76 | + |
71 | 77 | class RSocketStateMachineTest : public Test { |
72 | 78 | public: |
73 | 79 | auto createClient( |
@@ -96,6 +102,37 @@ class RSocketStateMachineTest : public Test { |
96 | 102 | return stateMachine; |
97 | 103 | } |
98 | 104 |
|
| 105 | + auto createServer( |
| 106 | + std::unique_ptr<MockDuplexConnection> connection, |
| 107 | + std::shared_ptr<RSocketResponder> responder, |
| 108 | + folly::Optional<ResumeIdentificationToken> resumeToken = folly::none, |
| 109 | + std::shared_ptr<RSocketConnectionEvents> connectionEvents = nullptr) { |
| 110 | + auto transport = |
| 111 | + std::make_shared<FrameTransportImpl>(std::move(connection)); |
| 112 | + |
| 113 | + auto stateMachine = std::make_shared<RSocketStateMachine>( |
| 114 | + std::move(responder), |
| 115 | + nullptr, |
| 116 | + RSocketMode::SERVER, |
| 117 | + nullptr, |
| 118 | + std::move(connectionEvents), |
| 119 | + ResumeManager::makeEmpty(), |
| 120 | + nullptr); |
| 121 | + |
| 122 | + if (resumeToken) { |
| 123 | + SetupParameters setupParameters; |
| 124 | + setupParameters.resumable = true; |
| 125 | + setupParameters.token = *resumeToken; |
| 126 | + stateMachine->connectServer(std::move(transport), setupParameters); |
| 127 | + } else { |
| 128 | + SetupParameters setupParameters; |
| 129 | + setupParameters.resumable = false; |
| 130 | + stateMachine->connectServer(std::move(transport), setupParameters); |
| 131 | + } |
| 132 | + |
| 133 | + return stateMachine; |
| 134 | + } |
| 135 | + |
99 | 136 | const std::unordered_map<StreamId, std::shared_ptr<StreamStateMachineBase>>& |
100 | 137 | getStreams(RSocketStateMachine& stateMachine) { |
101 | 138 | return stateMachine.streams_; |
@@ -370,4 +407,25 @@ TEST_F(RSocketStateMachineTest, TransportOnNextClose) { |
370 | 407 | rawTransport->onNext(std::move(buf)); |
371 | 408 | } |
372 | 409 |
|
| 410 | +TEST_F(RSocketStateMachineTest, ResumeWithCurrentConnection) { |
| 411 | + auto resumeToken = ResumeIdentificationToken::generateNew(); |
| 412 | + |
| 413 | + auto eventsMock = std::make_shared<ConnectionEventsMock>(); |
| 414 | + auto stateMachine = createServer( |
| 415 | + std::make_unique<NiceMock<MockDuplexConnection>>(), |
| 416 | + std::make_shared<RSocketResponder>(), |
| 417 | + resumeToken, |
| 418 | + eventsMock); |
| 419 | + |
| 420 | + EXPECT_CALL(*eventsMock, onDisconnected(_)).Times(0); |
| 421 | + EXPECT_CALL(*eventsMock, onStreamsPaused()).Times(0); |
| 422 | + |
| 423 | + ResumeParameters resumeParams{resumeToken, 0, 0, ProtocolVersion::Latest}; |
| 424 | + auto transport = std::make_shared<FrameTransportImpl>( |
| 425 | + std::make_unique<NiceMock<MockDuplexConnection>>()); |
| 426 | + stateMachine->resumeServer(transport, resumeParams); |
| 427 | + |
| 428 | + stateMachine->close({}, StreamCompletionSignal::CONNECTION_END); |
| 429 | +} |
| 430 | + |
373 | 431 | } // namespace rsocket |
0 commit comments