xref: /aosp_15_r20/external/openscreen/cast/streaming/rpc_messenger_unittest.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #include "cast/streaming/rpc_messenger.h"
6*3f982cf4SFabien Sanglard 
7*3f982cf4SFabien Sanglard #include <memory>
8*3f982cf4SFabien Sanglard #include <string>
9*3f982cf4SFabien Sanglard #include <utility>
10*3f982cf4SFabien Sanglard #include <vector>
11*3f982cf4SFabien Sanglard 
12*3f982cf4SFabien Sanglard #include "cast/streaming/remoting.pb.h"
13*3f982cf4SFabien Sanglard #include "gmock/gmock.h"
14*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
15*3f982cf4SFabien Sanglard 
16*3f982cf4SFabien Sanglard using testing::_;
17*3f982cf4SFabien Sanglard using testing::Invoke;
18*3f982cf4SFabien Sanglard using testing::Return;
19*3f982cf4SFabien Sanglard 
20*3f982cf4SFabien Sanglard namespace openscreen {
21*3f982cf4SFabien Sanglard namespace cast {
22*3f982cf4SFabien Sanglard namespace {
23*3f982cf4SFabien Sanglard 
24*3f982cf4SFabien Sanglard class FakeMessenger {
25*3f982cf4SFabien Sanglard  public:
OnReceivedRpc(std::unique_ptr<RpcMessage> message)26*3f982cf4SFabien Sanglard   void OnReceivedRpc(std::unique_ptr<RpcMessage> message) {
27*3f982cf4SFabien Sanglard     received_rpc_ = std::move(message);
28*3f982cf4SFabien Sanglard     received_count_++;
29*3f982cf4SFabien Sanglard   }
30*3f982cf4SFabien Sanglard 
OnSentRpc(const std::vector<uint8_t> & message)31*3f982cf4SFabien Sanglard   void OnSentRpc(const std::vector<uint8_t>& message) {
32*3f982cf4SFabien Sanglard     EXPECT_TRUE(sent_rpc_.ParseFromArray(message.data(), message.size()));
33*3f982cf4SFabien Sanglard     sent_count_++;
34*3f982cf4SFabien Sanglard   }
35*3f982cf4SFabien Sanglard 
received_count() const36*3f982cf4SFabien Sanglard   int received_count() const { return received_count_; }
received_rpc() const37*3f982cf4SFabien Sanglard   const RpcMessage& received_rpc() const { return *received_rpc_; }
38*3f982cf4SFabien Sanglard 
sent_count() const39*3f982cf4SFabien Sanglard   int sent_count() const { return sent_count_; }
sent_rpc() const40*3f982cf4SFabien Sanglard   const RpcMessage& sent_rpc() const { return sent_rpc_; }
41*3f982cf4SFabien Sanglard 
set_handle(RpcMessenger::Handle handle)42*3f982cf4SFabien Sanglard   void set_handle(RpcMessenger::Handle handle) { handle_ = handle; }
handle()43*3f982cf4SFabien Sanglard   RpcMessenger::Handle handle() { return handle_; }
44*3f982cf4SFabien Sanglard 
45*3f982cf4SFabien Sanglard  private:
46*3f982cf4SFabien Sanglard   std::unique_ptr<RpcMessage> received_rpc_;
47*3f982cf4SFabien Sanglard   int received_count_ = 0;
48*3f982cf4SFabien Sanglard 
49*3f982cf4SFabien Sanglard   RpcMessage sent_rpc_;
50*3f982cf4SFabien Sanglard   int sent_count_ = 0;
51*3f982cf4SFabien Sanglard 
52*3f982cf4SFabien Sanglard   RpcMessenger::Handle handle_ = -1;
53*3f982cf4SFabien Sanglard };
54*3f982cf4SFabien Sanglard 
55*3f982cf4SFabien Sanglard }  // namespace
56*3f982cf4SFabien Sanglard 
57*3f982cf4SFabien Sanglard class RpcMessengerTest : public testing::Test {
58*3f982cf4SFabien Sanglard  protected:
SetUp()59*3f982cf4SFabien Sanglard   void SetUp() override {
60*3f982cf4SFabien Sanglard     fake_messenger_ = std::make_unique<FakeMessenger>();
61*3f982cf4SFabien Sanglard     ASSERT_FALSE(fake_messenger_->received_count());
62*3f982cf4SFabien Sanglard 
63*3f982cf4SFabien Sanglard     rpc_messenger_ = std::make_unique<RpcMessenger>(
64*3f982cf4SFabien Sanglard         [p = fake_messenger_.get()](std::vector<uint8_t> message) {
65*3f982cf4SFabien Sanglard           p->OnSentRpc(message);
66*3f982cf4SFabien Sanglard         });
67*3f982cf4SFabien Sanglard 
68*3f982cf4SFabien Sanglard     const auto handle = rpc_messenger_->GetUniqueHandle();
69*3f982cf4SFabien Sanglard     fake_messenger_->set_handle(handle);
70*3f982cf4SFabien Sanglard     rpc_messenger_->RegisterMessageReceiverCallback(
71*3f982cf4SFabien Sanglard         handle,
72*3f982cf4SFabien Sanglard         [p = fake_messenger_.get()](std::unique_ptr<RpcMessage> message) {
73*3f982cf4SFabien Sanglard           p->OnReceivedRpc(std::move(message));
74*3f982cf4SFabien Sanglard         });
75*3f982cf4SFabien Sanglard   }
76*3f982cf4SFabien Sanglard 
ProcessMessage(const RpcMessage & rpc)77*3f982cf4SFabien Sanglard   void ProcessMessage(const RpcMessage& rpc) {
78*3f982cf4SFabien Sanglard     std::vector<uint8_t> message(rpc.ByteSizeLong());
79*3f982cf4SFabien Sanglard     rpc.SerializeToArray(message.data(), message.size());
80*3f982cf4SFabien Sanglard     rpc_messenger_->ProcessMessageFromRemote(message.data(), message.size());
81*3f982cf4SFabien Sanglard   }
82*3f982cf4SFabien Sanglard 
83*3f982cf4SFabien Sanglard   std::unique_ptr<FakeMessenger> fake_messenger_;
84*3f982cf4SFabien Sanglard   std::unique_ptr<RpcMessenger> rpc_messenger_;
85*3f982cf4SFabien Sanglard };
86*3f982cf4SFabien Sanglard 
TEST_F(RpcMessengerTest,TestProcessMessageFromRemoteRegistered)87*3f982cf4SFabien Sanglard TEST_F(RpcMessengerTest, TestProcessMessageFromRemoteRegistered) {
88*3f982cf4SFabien Sanglard   RpcMessage rpc;
89*3f982cf4SFabien Sanglard   rpc.set_handle(fake_messenger_->handle());
90*3f982cf4SFabien Sanglard   ProcessMessage(rpc);
91*3f982cf4SFabien Sanglard   ASSERT_EQ(1, fake_messenger_->received_count());
92*3f982cf4SFabien Sanglard }
93*3f982cf4SFabien Sanglard 
TEST_F(RpcMessengerTest,TestProcessMessageFromRemoteUnregistered)94*3f982cf4SFabien Sanglard TEST_F(RpcMessengerTest, TestProcessMessageFromRemoteUnregistered) {
95*3f982cf4SFabien Sanglard   RpcMessage rpc;
96*3f982cf4SFabien Sanglard   rpc_messenger_->UnregisterMessageReceiverCallback(fake_messenger_->handle());
97*3f982cf4SFabien Sanglard   ProcessMessage(rpc);
98*3f982cf4SFabien Sanglard   ASSERT_EQ(0, fake_messenger_->received_count());
99*3f982cf4SFabien Sanglard }
100*3f982cf4SFabien Sanglard 
TEST_F(RpcMessengerTest,CanSendMultipleMessages)101*3f982cf4SFabien Sanglard TEST_F(RpcMessengerTest, CanSendMultipleMessages) {
102*3f982cf4SFabien Sanglard   for (int i = 0; i < 10; ++i) {
103*3f982cf4SFabien Sanglard     rpc_messenger_->SendMessageToRemote(RpcMessage{});
104*3f982cf4SFabien Sanglard   }
105*3f982cf4SFabien Sanglard   EXPECT_EQ(10, fake_messenger_->sent_count());
106*3f982cf4SFabien Sanglard }
107*3f982cf4SFabien Sanglard 
TEST_F(RpcMessengerTest,SendMessageCallback)108*3f982cf4SFabien Sanglard TEST_F(RpcMessengerTest, SendMessageCallback) {
109*3f982cf4SFabien Sanglard   // Send message for RPC messenger to process.
110*3f982cf4SFabien Sanglard   RpcMessage sent_rpc;
111*3f982cf4SFabien Sanglard   sent_rpc.set_handle(fake_messenger_->handle());
112*3f982cf4SFabien Sanglard   sent_rpc.set_proc(RpcMessage::RPC_R_SETVOLUME);
113*3f982cf4SFabien Sanglard   sent_rpc.set_double_value(2.3);
114*3f982cf4SFabien Sanglard   rpc_messenger_->SendMessageToRemote(sent_rpc);
115*3f982cf4SFabien Sanglard 
116*3f982cf4SFabien Sanglard   // Check if received message is identical to the one sent earlier.
117*3f982cf4SFabien Sanglard   ASSERT_EQ(1, fake_messenger_->sent_count());
118*3f982cf4SFabien Sanglard   const RpcMessage& message = fake_messenger_->sent_rpc();
119*3f982cf4SFabien Sanglard   ASSERT_EQ(fake_messenger_->handle(), message.handle());
120*3f982cf4SFabien Sanglard   ASSERT_EQ(RpcMessage::RPC_R_SETVOLUME, message.proc());
121*3f982cf4SFabien Sanglard   ASSERT_EQ(2.3, message.double_value());
122*3f982cf4SFabien Sanglard }
123*3f982cf4SFabien Sanglard 
TEST_F(RpcMessengerTest,ProcessMessageWithRegisteredHandle)124*3f982cf4SFabien Sanglard TEST_F(RpcMessengerTest, ProcessMessageWithRegisteredHandle) {
125*3f982cf4SFabien Sanglard   // Send message for RPC messenger to process.
126*3f982cf4SFabien Sanglard   RpcMessage sent_rpc;
127*3f982cf4SFabien Sanglard   sent_rpc.set_handle(fake_messenger_->handle());
128*3f982cf4SFabien Sanglard   sent_rpc.set_proc(RpcMessage::RPC_DS_INITIALIZE);
129*3f982cf4SFabien Sanglard   sent_rpc.set_integer_value(4004);
130*3f982cf4SFabien Sanglard   ProcessMessage(sent_rpc);
131*3f982cf4SFabien Sanglard 
132*3f982cf4SFabien Sanglard   // Checks if received message is identical to the one sent earlier.
133*3f982cf4SFabien Sanglard   ASSERT_EQ(1, fake_messenger_->received_count());
134*3f982cf4SFabien Sanglard   const RpcMessage& received_rpc = fake_messenger_->received_rpc();
135*3f982cf4SFabien Sanglard   ASSERT_EQ(fake_messenger_->handle(), received_rpc.handle());
136*3f982cf4SFabien Sanglard   ASSERT_EQ(RpcMessage::RPC_DS_INITIALIZE, received_rpc.proc());
137*3f982cf4SFabien Sanglard   ASSERT_EQ(4004, received_rpc.integer_value());
138*3f982cf4SFabien Sanglard }
139*3f982cf4SFabien Sanglard 
TEST_F(RpcMessengerTest,ProcessMessageWithUnregisteredHandle)140*3f982cf4SFabien Sanglard TEST_F(RpcMessengerTest, ProcessMessageWithUnregisteredHandle) {
141*3f982cf4SFabien Sanglard   // Send message for RPC messenger to process.
142*3f982cf4SFabien Sanglard   RpcMessage sent_rpc;
143*3f982cf4SFabien Sanglard   RpcMessenger::Handle different_handle = fake_messenger_->handle() + 1;
144*3f982cf4SFabien Sanglard   sent_rpc.set_handle(different_handle);
145*3f982cf4SFabien Sanglard   sent_rpc.set_proc(RpcMessage::RPC_R_SETVOLUME);
146*3f982cf4SFabien Sanglard   sent_rpc.set_double_value(4.5);
147*3f982cf4SFabien Sanglard   ProcessMessage(sent_rpc);
148*3f982cf4SFabien Sanglard 
149*3f982cf4SFabien Sanglard   // We shouldn't have gotten the message since the handle is different.
150*3f982cf4SFabien Sanglard   ASSERT_EQ(0, fake_messenger_->received_count());
151*3f982cf4SFabien Sanglard }
152*3f982cf4SFabien Sanglard 
TEST_F(RpcMessengerTest,Registration)153*3f982cf4SFabien Sanglard TEST_F(RpcMessengerTest, Registration) {
154*3f982cf4SFabien Sanglard   const auto handle = fake_messenger_->handle();
155*3f982cf4SFabien Sanglard   ASSERT_TRUE(rpc_messenger_->IsRegisteredForTesting(handle));
156*3f982cf4SFabien Sanglard 
157*3f982cf4SFabien Sanglard   rpc_messenger_->UnregisterMessageReceiverCallback(handle);
158*3f982cf4SFabien Sanglard   ASSERT_FALSE(rpc_messenger_->IsRegisteredForTesting(handle));
159*3f982cf4SFabien Sanglard }
160*3f982cf4SFabien Sanglard 
161*3f982cf4SFabien Sanglard }  // namespace cast
162*3f982cf4SFabien Sanglard }  // namespace openscreen
163