diff options
Diffstat (limited to 'pw_rpc/nanopb/server_reader_writer_test.cc')
-rw-r--r-- | pw_rpc/nanopb/server_reader_writer_test.cc | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/pw_rpc/nanopb/server_reader_writer_test.cc b/pw_rpc/nanopb/server_reader_writer_test.cc index 98a3b52bc..909063de0 100644 --- a/pw_rpc/nanopb/server_reader_writer_test.cc +++ b/pw_rpc/nanopb/server_reader_writer_test.cc @@ -14,6 +14,8 @@ #include "pw_rpc/nanopb/server_reader_writer.h" +#include <optional> + #include "gtest/gtest.h" #include "pw_rpc/nanopb/fake_channel_output.h" #include "pw_rpc/nanopb/test_method_context.h" @@ -54,7 +56,7 @@ struct ReaderWriterTestContext { ReaderWriterTestContext() : channel(Channel::Create<kChannelId>(&output)), - server(std::span(&channel, 1)) {} + server(span(&channel, 1)) {} TestServiceImpl service; NanopbFakeChannelOutput<4> output; @@ -266,6 +268,32 @@ TEST(RawServerReaderWriter, Open_UnknownChannel) { EXPECT_EQ(call.channel_id(), Channel::kUnassignedChannelId); } +TEST(RawServerReaderWriter, Open_MultipleTimes_CancelsPrevious) { + ReaderWriterTestContext<TestService::TestBidirectionalStreamRpc> ctx; + + NanopbServerReaderWriter one = + NanopbServerReaderWriter<pw_rpc_test_TestRequest, + pw_rpc_test_TestStreamResponse>:: + Open<TestService::TestBidirectionalStreamRpc>( + ctx.server, ctx.kChannelId, ctx.service); + + std::optional<Status> error; + one.set_on_error([&error](Status status) { error = status; }); + + ASSERT_TRUE(one.active()); + + NanopbServerReaderWriter two = + NanopbServerReaderWriter<pw_rpc_test_TestRequest, + pw_rpc_test_TestStreamResponse>:: + Open<TestService::TestBidirectionalStreamRpc>( + ctx.server, ctx.kChannelId, ctx.service); + + EXPECT_FALSE(one.active()); + EXPECT_TRUE(two.active()); + + EXPECT_EQ(Status::Cancelled(), error); +} + TEST(NanopbServerReader, CallbacksMoveCorrectly) { PW_NANOPB_TEST_METHOD_CONTEXT(TestServiceImpl, TestClientStreamRpc) ctx; |