aboutsummaryrefslogtreecommitdiff
path: root/pw_rpc/nanopb/server_reader_writer_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'pw_rpc/nanopb/server_reader_writer_test.cc')
-rw-r--r--pw_rpc/nanopb/server_reader_writer_test.cc30
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;