xref: /aosp_15_r20/external/openscreen/cast/streaming/session_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/session_messenger.h"
6*3f982cf4SFabien Sanglard 
7*3f982cf4SFabien Sanglard #include "cast/streaming/testing/message_pipe.h"
8*3f982cf4SFabien Sanglard #include "cast/streaming/testing/simple_message_port.h"
9*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
10*3f982cf4SFabien Sanglard #include "platform/test/fake_clock.h"
11*3f982cf4SFabien Sanglard #include "platform/test/fake_task_runner.h"
12*3f982cf4SFabien Sanglard 
13*3f982cf4SFabien Sanglard namespace openscreen {
14*3f982cf4SFabien Sanglard namespace cast {
15*3f982cf4SFabien Sanglard 
16*3f982cf4SFabien Sanglard using ::testing::ElementsAre;
17*3f982cf4SFabien Sanglard 
18*3f982cf4SFabien Sanglard namespace {
19*3f982cf4SFabien Sanglard 
20*3f982cf4SFabien Sanglard constexpr char kSenderId[] = "sender-12345";
21*3f982cf4SFabien Sanglard constexpr char kReceiverId[] = "receiver-12345";
22*3f982cf4SFabien Sanglard 
23*3f982cf4SFabien Sanglard // Generally the messages are inlined below, with the exception of the Offer,
24*3f982cf4SFabien Sanglard // simply because it is massive.
25*3f982cf4SFabien Sanglard Offer kExampleOffer{
26*3f982cf4SFabien Sanglard     CastMode::kMirroring,
27*3f982cf4SFabien Sanglard     {AudioStream{Stream{0,
28*3f982cf4SFabien Sanglard                         Stream::Type::kAudioSource,
29*3f982cf4SFabien Sanglard                         2,
30*3f982cf4SFabien Sanglard                         RtpPayloadType::kAudioOpus,
31*3f982cf4SFabien Sanglard                         12344442,
32*3f982cf4SFabien Sanglard                         std::chrono::milliseconds{2000},
33*3f982cf4SFabien Sanglard                         {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
34*3f982cf4SFabien Sanglard                         {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
35*3f982cf4SFabien Sanglard                         false,
36*3f982cf4SFabien Sanglard                         "",
37*3f982cf4SFabien Sanglard                         48000},
38*3f982cf4SFabien Sanglard                  AudioCodec::kOpus, 1400}},
39*3f982cf4SFabien Sanglard     {VideoStream{Stream{1,
40*3f982cf4SFabien Sanglard                         Stream::Type::kVideoSource,
41*3f982cf4SFabien Sanglard                         1,
42*3f982cf4SFabien Sanglard                         RtpPayloadType::kVideoVp8,
43*3f982cf4SFabien Sanglard                         12344444,
44*3f982cf4SFabien Sanglard                         std::chrono::milliseconds{2000},
45*3f982cf4SFabien Sanglard                         {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
46*3f982cf4SFabien Sanglard                         {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
47*3f982cf4SFabien Sanglard                         false,
48*3f982cf4SFabien Sanglard                         "",
49*3f982cf4SFabien Sanglard                         90000},
50*3f982cf4SFabien Sanglard                  VideoCodec::kVp8,
51*3f982cf4SFabien Sanglard                  SimpleFraction{30, 1},
52*3f982cf4SFabien Sanglard                  3000000,
53*3f982cf4SFabien Sanglard                  "",
54*3f982cf4SFabien Sanglard                  "",
55*3f982cf4SFabien Sanglard                  "",
56*3f982cf4SFabien Sanglard                  {Resolution{640, 480}},
57*3f982cf4SFabien Sanglard                  ""}}};
58*3f982cf4SFabien Sanglard 
59*3f982cf4SFabien Sanglard struct SessionMessageStore {
60*3f982cf4SFabien Sanglard  public:
GetReplyCallbackopenscreen::cast::__anon6e2d8e9a0111::SessionMessageStore61*3f982cf4SFabien Sanglard   SenderSessionMessenger::ReplyCallback GetReplyCallback() {
62*3f982cf4SFabien Sanglard     return [this](ReceiverMessage message) {
63*3f982cf4SFabien Sanglard       receiver_messages.push_back(std::move(message));
64*3f982cf4SFabien Sanglard     };
65*3f982cf4SFabien Sanglard   }
66*3f982cf4SFabien Sanglard 
GetRequestCallbackopenscreen::cast::__anon6e2d8e9a0111::SessionMessageStore67*3f982cf4SFabien Sanglard   ReceiverSessionMessenger::RequestCallback GetRequestCallback() {
68*3f982cf4SFabien Sanglard     return [this](SenderMessage message) {
69*3f982cf4SFabien Sanglard       sender_messages.push_back(std::move(message));
70*3f982cf4SFabien Sanglard     };
71*3f982cf4SFabien Sanglard   }
72*3f982cf4SFabien Sanglard 
GetErrorCallbackopenscreen::cast::__anon6e2d8e9a0111::SessionMessageStore73*3f982cf4SFabien Sanglard   SessionMessenger::ErrorCallback GetErrorCallback() {
74*3f982cf4SFabien Sanglard     return [this](Error error) { errors.push_back(std::move(error)); };
75*3f982cf4SFabien Sanglard   }
76*3f982cf4SFabien Sanglard 
77*3f982cf4SFabien Sanglard   std::vector<SenderMessage> sender_messages;
78*3f982cf4SFabien Sanglard   std::vector<ReceiverMessage> receiver_messages;
79*3f982cf4SFabien Sanglard   std::vector<Error> errors;
80*3f982cf4SFabien Sanglard };
81*3f982cf4SFabien Sanglard }  // namespace
82*3f982cf4SFabien Sanglard 
83*3f982cf4SFabien Sanglard class SessionMessengerTest : public ::testing::Test {
84*3f982cf4SFabien Sanglard  public:
SessionMessengerTest()85*3f982cf4SFabien Sanglard   SessionMessengerTest()
86*3f982cf4SFabien Sanglard       : clock_{Clock::now()},
87*3f982cf4SFabien Sanglard         task_runner_(&clock_),
88*3f982cf4SFabien Sanglard         message_store_(),
89*3f982cf4SFabien Sanglard         pipe_(kSenderId, kReceiverId),
90*3f982cf4SFabien Sanglard         receiver_messenger_(pipe_.right(),
91*3f982cf4SFabien Sanglard                             kReceiverId,
92*3f982cf4SFabien Sanglard                             message_store_.GetErrorCallback()),
93*3f982cf4SFabien Sanglard         sender_messenger_(pipe_.left(),
94*3f982cf4SFabien Sanglard                           kSenderId,
95*3f982cf4SFabien Sanglard                           kReceiverId,
96*3f982cf4SFabien Sanglard                           message_store_.GetErrorCallback(),
97*3f982cf4SFabien Sanglard                           &task_runner_)
98*3f982cf4SFabien Sanglard 
99*3f982cf4SFabien Sanglard   {}
100*3f982cf4SFabien Sanglard 
SetUp()101*3f982cf4SFabien Sanglard   void SetUp() override {
102*3f982cf4SFabien Sanglard     sender_messenger_.SetHandler(ReceiverMessage::Type::kRpc,
103*3f982cf4SFabien Sanglard                                  message_store_.GetReplyCallback());
104*3f982cf4SFabien Sanglard     receiver_messenger_.SetHandler(SenderMessage::Type::kOffer,
105*3f982cf4SFabien Sanglard                                    message_store_.GetRequestCallback());
106*3f982cf4SFabien Sanglard     receiver_messenger_.SetHandler(SenderMessage::Type::kGetCapabilities,
107*3f982cf4SFabien Sanglard                                    message_store_.GetRequestCallback());
108*3f982cf4SFabien Sanglard     receiver_messenger_.SetHandler(SenderMessage::Type::kRpc,
109*3f982cf4SFabien Sanglard                                    message_store_.GetRequestCallback());
110*3f982cf4SFabien Sanglard   }
111*3f982cf4SFabien Sanglard 
112*3f982cf4SFabien Sanglard  protected:
113*3f982cf4SFabien Sanglard   FakeClock clock_;
114*3f982cf4SFabien Sanglard   FakeTaskRunner task_runner_;
115*3f982cf4SFabien Sanglard   SessionMessageStore message_store_;
116*3f982cf4SFabien Sanglard   MessagePipe pipe_;
117*3f982cf4SFabien Sanglard   ReceiverSessionMessenger receiver_messenger_;
118*3f982cf4SFabien Sanglard   SenderSessionMessenger sender_messenger_;
119*3f982cf4SFabien Sanglard 
120*3f982cf4SFabien Sanglard   std::vector<Error> receiver_errors_;
121*3f982cf4SFabien Sanglard   std::vector<Error> sender_errors_;
122*3f982cf4SFabien Sanglard };
123*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,RpcMessaging)124*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, RpcMessaging) {
125*3f982cf4SFabien Sanglard   static const std::vector<uint8_t> kSenderMessage{1, 2, 3, 4, 5};
126*3f982cf4SFabien Sanglard   static const std::vector<uint8_t> kReceiverResponse{6, 7, 8, 9};
127*3f982cf4SFabien Sanglard   ASSERT_TRUE(
128*3f982cf4SFabien Sanglard       sender_messenger_
129*3f982cf4SFabien Sanglard           .SendOutboundMessage(SenderMessage{SenderMessage::Type::kRpc, 123,
130*3f982cf4SFabien Sanglard                                              true /* valid */, kSenderMessage})
131*3f982cf4SFabien Sanglard           .ok());
132*3f982cf4SFabien Sanglard 
133*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.sender_messages.size());
134*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
135*3f982cf4SFabien Sanglard   EXPECT_EQ(SenderMessage::Type::kRpc, message_store_.sender_messages[0].type);
136*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.sender_messages[0].valid);
137*3f982cf4SFabien Sanglard   EXPECT_EQ(kSenderMessage, absl::get<std::vector<uint8_t>>(
138*3f982cf4SFabien Sanglard                                 message_store_.sender_messages[0].body));
139*3f982cf4SFabien Sanglard 
140*3f982cf4SFabien Sanglard   message_store_.sender_messages.clear();
141*3f982cf4SFabien Sanglard   ASSERT_TRUE(
142*3f982cf4SFabien Sanglard       receiver_messenger_
143*3f982cf4SFabien Sanglard           .SendMessage(ReceiverMessage{ReceiverMessage::Type::kRpc, 123,
144*3f982cf4SFabien Sanglard                                        true /* valid */, kReceiverResponse})
145*3f982cf4SFabien Sanglard           .ok());
146*3f982cf4SFabien Sanglard 
147*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.sender_messages.empty());
148*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.receiver_messages.size());
149*3f982cf4SFabien Sanglard   EXPECT_EQ(ReceiverMessage::Type::kRpc,
150*3f982cf4SFabien Sanglard             message_store_.receiver_messages[0].type);
151*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.receiver_messages[0].valid);
152*3f982cf4SFabien Sanglard   EXPECT_EQ(kReceiverResponse, absl::get<std::vector<uint8_t>>(
153*3f982cf4SFabien Sanglard                                    message_store_.receiver_messages[0].body));
154*3f982cf4SFabien Sanglard }
155*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,CapabilitiesMessaging)156*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, CapabilitiesMessaging) {
157*3f982cf4SFabien Sanglard   ASSERT_TRUE(
158*3f982cf4SFabien Sanglard       sender_messenger_
159*3f982cf4SFabien Sanglard           .SendRequest(SenderMessage{SenderMessage::Type::kGetCapabilities,
160*3f982cf4SFabien Sanglard                                      1337, true /* valid */},
161*3f982cf4SFabien Sanglard                        ReceiverMessage::Type::kCapabilitiesResponse,
162*3f982cf4SFabien Sanglard                        message_store_.GetReplyCallback())
163*3f982cf4SFabien Sanglard           .ok());
164*3f982cf4SFabien Sanglard 
165*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.sender_messages.size());
166*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
167*3f982cf4SFabien Sanglard   EXPECT_EQ(SenderMessage::Type::kGetCapabilities,
168*3f982cf4SFabien Sanglard             message_store_.sender_messages[0].type);
169*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.sender_messages[0].valid);
170*3f982cf4SFabien Sanglard 
171*3f982cf4SFabien Sanglard   message_store_.sender_messages.clear();
172*3f982cf4SFabien Sanglard   ASSERT_TRUE(receiver_messenger_
173*3f982cf4SFabien Sanglard                   .SendMessage(ReceiverMessage{
174*3f982cf4SFabien Sanglard                       ReceiverMessage::Type::kCapabilitiesResponse, 1337,
175*3f982cf4SFabien Sanglard                       true /* valid */,
176*3f982cf4SFabien Sanglard                       ReceiverCapability{
177*3f982cf4SFabien Sanglard                           47, {MediaCapability::kAac, MediaCapability::k4k}}})
178*3f982cf4SFabien Sanglard                   .ok());
179*3f982cf4SFabien Sanglard 
180*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.sender_messages.empty());
181*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.receiver_messages.size());
182*3f982cf4SFabien Sanglard   EXPECT_EQ(ReceiverMessage::Type::kCapabilitiesResponse,
183*3f982cf4SFabien Sanglard             message_store_.receiver_messages[0].type);
184*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.receiver_messages[0].valid);
185*3f982cf4SFabien Sanglard 
186*3f982cf4SFabien Sanglard   const auto& capability =
187*3f982cf4SFabien Sanglard       absl::get<ReceiverCapability>(message_store_.receiver_messages[0].body);
188*3f982cf4SFabien Sanglard   EXPECT_EQ(47, capability.remoting_version);
189*3f982cf4SFabien Sanglard   EXPECT_THAT(capability.media_capabilities,
190*3f982cf4SFabien Sanglard               ElementsAre(MediaCapability::kAac, MediaCapability::k4k));
191*3f982cf4SFabien Sanglard }
192*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,OfferAnswerMessaging)193*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, OfferAnswerMessaging) {
194*3f982cf4SFabien Sanglard   ASSERT_TRUE(sender_messenger_
195*3f982cf4SFabien Sanglard                   .SendRequest(SenderMessage{SenderMessage::Type::kOffer, 42,
196*3f982cf4SFabien Sanglard                                              true /* valid */, kExampleOffer},
197*3f982cf4SFabien Sanglard                                ReceiverMessage::Type::kAnswer,
198*3f982cf4SFabien Sanglard                                message_store_.GetReplyCallback())
199*3f982cf4SFabien Sanglard                   .ok());
200*3f982cf4SFabien Sanglard 
201*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.sender_messages.size());
202*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
203*3f982cf4SFabien Sanglard   EXPECT_EQ(SenderMessage::Type::kOffer,
204*3f982cf4SFabien Sanglard             message_store_.sender_messages[0].type);
205*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.sender_messages[0].valid);
206*3f982cf4SFabien Sanglard   message_store_.sender_messages.clear();
207*3f982cf4SFabien Sanglard 
208*3f982cf4SFabien Sanglard   EXPECT_TRUE(receiver_messenger_
209*3f982cf4SFabien Sanglard                   .SendMessage(ReceiverMessage{
210*3f982cf4SFabien Sanglard                       ReceiverMessage::Type::kAnswer, 41, true /* valid */,
211*3f982cf4SFabien Sanglard                       Answer{1234, {0, 1}, {12344443, 12344445}}})
212*3f982cf4SFabien Sanglard                   .ok());
213*3f982cf4SFabien Sanglard   // A stale answer (for offer 41) should get ignored:
214*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.sender_messages.empty());
215*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
216*3f982cf4SFabien Sanglard 
217*3f982cf4SFabien Sanglard   ASSERT_TRUE(receiver_messenger_
218*3f982cf4SFabien Sanglard                   .SendMessage(ReceiverMessage{
219*3f982cf4SFabien Sanglard                       ReceiverMessage::Type::kAnswer, 42, true /* valid */,
220*3f982cf4SFabien Sanglard                       Answer{1234, {0, 1}, {12344443, 12344445}}})
221*3f982cf4SFabien Sanglard                   .ok());
222*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.sender_messages.empty());
223*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.receiver_messages.size());
224*3f982cf4SFabien Sanglard   EXPECT_EQ(ReceiverMessage::Type::kAnswer,
225*3f982cf4SFabien Sanglard             message_store_.receiver_messages[0].type);
226*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.receiver_messages[0].valid);
227*3f982cf4SFabien Sanglard 
228*3f982cf4SFabien Sanglard   const auto& answer =
229*3f982cf4SFabien Sanglard       absl::get<Answer>(message_store_.receiver_messages[0].body);
230*3f982cf4SFabien Sanglard   EXPECT_EQ(1234, answer.udp_port);
231*3f982cf4SFabien Sanglard 
232*3f982cf4SFabien Sanglard   EXPECT_THAT(answer.send_indexes, ElementsAre(0, 1));
233*3f982cf4SFabien Sanglard   EXPECT_THAT(answer.ssrcs, ElementsAre(12344443, 12344445));
234*3f982cf4SFabien Sanglard }
235*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,OfferAndReceiverError)236*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, OfferAndReceiverError) {
237*3f982cf4SFabien Sanglard   ASSERT_TRUE(sender_messenger_
238*3f982cf4SFabien Sanglard                   .SendRequest(SenderMessage{SenderMessage::Type::kOffer, 42,
239*3f982cf4SFabien Sanglard                                              true /* valid */, kExampleOffer},
240*3f982cf4SFabien Sanglard                                ReceiverMessage::Type::kAnswer,
241*3f982cf4SFabien Sanglard                                message_store_.GetReplyCallback())
242*3f982cf4SFabien Sanglard                   .ok());
243*3f982cf4SFabien Sanglard 
244*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.sender_messages.size());
245*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
246*3f982cf4SFabien Sanglard   EXPECT_EQ(SenderMessage::Type::kOffer,
247*3f982cf4SFabien Sanglard             message_store_.sender_messages[0].type);
248*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.sender_messages[0].valid);
249*3f982cf4SFabien Sanglard   message_store_.sender_messages.clear();
250*3f982cf4SFabien Sanglard 
251*3f982cf4SFabien Sanglard   EXPECT_TRUE(receiver_messenger_
252*3f982cf4SFabien Sanglard                   .SendMessage(ReceiverMessage{
253*3f982cf4SFabien Sanglard                       ReceiverMessage::Type::kAnswer, 42, false /* valid */,
254*3f982cf4SFabien Sanglard                       ReceiverError{123, "Something real bad happened"}})
255*3f982cf4SFabien Sanglard                   .ok());
256*3f982cf4SFabien Sanglard 
257*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.sender_messages.empty());
258*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.receiver_messages.size());
259*3f982cf4SFabien Sanglard   EXPECT_EQ(ReceiverMessage::Type::kAnswer,
260*3f982cf4SFabien Sanglard             message_store_.receiver_messages[0].type);
261*3f982cf4SFabien Sanglard   EXPECT_FALSE(message_store_.receiver_messages[0].valid);
262*3f982cf4SFabien Sanglard 
263*3f982cf4SFabien Sanglard   const auto& error =
264*3f982cf4SFabien Sanglard       absl::get<ReceiverError>(message_store_.receiver_messages[0].body);
265*3f982cf4SFabien Sanglard   EXPECT_EQ(123, error.code);
266*3f982cf4SFabien Sanglard   EXPECT_EQ("Something real bad happened", error.description);
267*3f982cf4SFabien Sanglard }
268*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,UnexpectedMessagesAreIgnored)269*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, UnexpectedMessagesAreIgnored) {
270*3f982cf4SFabien Sanglard   EXPECT_FALSE(receiver_messenger_
271*3f982cf4SFabien Sanglard                    .SendMessage(ReceiverMessage{
272*3f982cf4SFabien Sanglard                        ReceiverMessage::Type::kCapabilitiesResponse, 3123,
273*3f982cf4SFabien Sanglard                        true /* valid */,
274*3f982cf4SFabien Sanglard                        ReceiverCapability{2, {MediaCapability::kH264}}})
275*3f982cf4SFabien Sanglard                    .ok());
276*3f982cf4SFabien Sanglard 
277*3f982cf4SFabien Sanglard   // The message gets dropped and thus won't be in the store.
278*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.sender_messages.empty());
279*3f982cf4SFabien Sanglard   EXPECT_TRUE(message_store_.receiver_messages.empty());
280*3f982cf4SFabien Sanglard }
281*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,UnknownSenderMessageTypesDontGetSent)282*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, UnknownSenderMessageTypesDontGetSent) {
283*3f982cf4SFabien Sanglard   EXPECT_DEATH(sender_messenger_
284*3f982cf4SFabien Sanglard                    .SendOutboundMessage(SenderMessage{
285*3f982cf4SFabien Sanglard                        SenderMessage::Type::kUnknown, 123, true /* valid */})
286*3f982cf4SFabien Sanglard                    .ok(),
287*3f982cf4SFabien Sanglard                ".*Trying to send an unknown message is a developer error.*");
288*3f982cf4SFabien Sanglard }
289*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,UnknownReceiverMessageTypesDontGetSent)290*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, UnknownReceiverMessageTypesDontGetSent) {
291*3f982cf4SFabien Sanglard   ASSERT_TRUE(sender_messenger_
292*3f982cf4SFabien Sanglard                   .SendRequest(SenderMessage{SenderMessage::Type::kOffer, 42,
293*3f982cf4SFabien Sanglard                                              true /* valid */, kExampleOffer},
294*3f982cf4SFabien Sanglard                                ReceiverMessage::Type::kAnswer,
295*3f982cf4SFabien Sanglard                                message_store_.GetReplyCallback())
296*3f982cf4SFabien Sanglard                   .ok());
297*3f982cf4SFabien Sanglard 
298*3f982cf4SFabien Sanglard   EXPECT_DEATH(receiver_messenger_
299*3f982cf4SFabien Sanglard                    .SendMessage(ReceiverMessage{ReceiverMessage::Type::kUnknown,
300*3f982cf4SFabien Sanglard                                                 3123, true /* valid */})
301*3f982cf4SFabien Sanglard                    .ok(),
302*3f982cf4SFabien Sanglard                ".*Trying to send an unknown message is a developer error.*");
303*3f982cf4SFabien Sanglard }
304*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,ReceiverHandlesUnknownMessageType)305*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, ReceiverHandlesUnknownMessageType) {
306*3f982cf4SFabien Sanglard   pipe_.right()->ReceiveMessage(kCastWebrtcNamespace, R"({
307*3f982cf4SFabien Sanglard     "type": "GET_VIRTUAL_REALITY",
308*3f982cf4SFabien Sanglard     "seqNum": 31337
309*3f982cf4SFabien Sanglard   })");
310*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
311*3f982cf4SFabien Sanglard }
312*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,SenderHandlesUnknownMessageType)313*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, SenderHandlesUnknownMessageType) {
314*3f982cf4SFabien Sanglard   // The behavior on the sender side is a little more interesting: we
315*3f982cf4SFabien Sanglard   // test elsewhere that messages with the wrong sequence number are ignored,
316*3f982cf4SFabien Sanglard   // here if the type is unknown but the message contains a valid sequence
317*3f982cf4SFabien Sanglard   // number we just treat it as a bad response/same as a timeout.
318*3f982cf4SFabien Sanglard   ASSERT_TRUE(sender_messenger_
319*3f982cf4SFabien Sanglard                   .SendRequest(SenderMessage{SenderMessage::Type::kOffer, 42,
320*3f982cf4SFabien Sanglard                                              true /* valid */, kExampleOffer},
321*3f982cf4SFabien Sanglard                                ReceiverMessage::Type::kAnswer,
322*3f982cf4SFabien Sanglard                                message_store_.GetReplyCallback())
323*3f982cf4SFabien Sanglard                   .ok());
324*3f982cf4SFabien Sanglard   pipe_.left()->ReceiveMessage(kCastWebrtcNamespace, R"({
325*3f982cf4SFabien Sanglard     "type": "ANSWER_VERSION_2",
326*3f982cf4SFabien Sanglard     "seqNum": 42
327*3f982cf4SFabien Sanglard   })");
328*3f982cf4SFabien Sanglard 
329*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
330*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.receiver_messages.size());
331*3f982cf4SFabien Sanglard   ASSERT_EQ(ReceiverMessage::Type::kUnknown,
332*3f982cf4SFabien Sanglard             message_store_.receiver_messages[0].type);
333*3f982cf4SFabien Sanglard   ASSERT_EQ(false, message_store_.receiver_messages[0].valid);
334*3f982cf4SFabien Sanglard }
335*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,SenderHandlesMessageMissingSequenceNumber)336*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, SenderHandlesMessageMissingSequenceNumber) {
337*3f982cf4SFabien Sanglard   ASSERT_TRUE(
338*3f982cf4SFabien Sanglard       sender_messenger_
339*3f982cf4SFabien Sanglard           .SendRequest(SenderMessage{SenderMessage::Type::kGetCapabilities, 42,
340*3f982cf4SFabien Sanglard                                      true /* valid */},
341*3f982cf4SFabien Sanglard                        ReceiverMessage::Type::kCapabilitiesResponse,
342*3f982cf4SFabien Sanglard                        message_store_.GetReplyCallback())
343*3f982cf4SFabien Sanglard           .ok());
344*3f982cf4SFabien Sanglard   pipe_.left()->ReceiveMessage(kCastWebrtcNamespace, R"({
345*3f982cf4SFabien Sanglard     "capabilities": {
346*3f982cf4SFabien Sanglard       "keySystems": [],
347*3f982cf4SFabien Sanglard       "mediaCaps": ["video"]
348*3f982cf4SFabien Sanglard     },
349*3f982cf4SFabien Sanglard     "result": "ok",
350*3f982cf4SFabien Sanglard     "type": "CAPABILITIES_RESPONSE"
351*3f982cf4SFabien Sanglard   })");
352*3f982cf4SFabien Sanglard 
353*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
354*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
355*3f982cf4SFabien Sanglard }
356*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,ReceiverCannotSendFirst)357*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, ReceiverCannotSendFirst) {
358*3f982cf4SFabien Sanglard   const Error error = receiver_messenger_.SendMessage(ReceiverMessage{
359*3f982cf4SFabien Sanglard       ReceiverMessage::Type::kCapabilitiesResponse, 3123, true /* valid */,
360*3f982cf4SFabien Sanglard       ReceiverCapability{2, {MediaCapability::kAudio}}});
361*3f982cf4SFabien Sanglard 
362*3f982cf4SFabien Sanglard   EXPECT_EQ(Error::Code::kInitializationFailure, error.code());
363*3f982cf4SFabien Sanglard }
364*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,ErrorMessageLoggedIfTimeout)365*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, ErrorMessageLoggedIfTimeout) {
366*3f982cf4SFabien Sanglard   ASSERT_TRUE(
367*3f982cf4SFabien Sanglard       sender_messenger_
368*3f982cf4SFabien Sanglard           .SendRequest(SenderMessage{SenderMessage::Type::kGetCapabilities,
369*3f982cf4SFabien Sanglard                                      3123, true /* valid */},
370*3f982cf4SFabien Sanglard                        ReceiverMessage::Type::kCapabilitiesResponse,
371*3f982cf4SFabien Sanglard                        message_store_.GetReplyCallback())
372*3f982cf4SFabien Sanglard           .ok());
373*3f982cf4SFabien Sanglard 
374*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.sender_messages.size());
375*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
376*3f982cf4SFabien Sanglard 
377*3f982cf4SFabien Sanglard   clock_.Advance(std::chrono::seconds(10));
378*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.sender_messages.size());
379*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.receiver_messages.size());
380*3f982cf4SFabien Sanglard   EXPECT_EQ(3123, message_store_.receiver_messages[0].sequence_number);
381*3f982cf4SFabien Sanglard   EXPECT_EQ(ReceiverMessage::Type::kCapabilitiesResponse,
382*3f982cf4SFabien Sanglard             message_store_.receiver_messages[0].type);
383*3f982cf4SFabien Sanglard   EXPECT_FALSE(message_store_.receiver_messages[0].valid);
384*3f982cf4SFabien Sanglard }
385*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,ReceiverRejectsMessageFromWrongSender)386*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, ReceiverRejectsMessageFromWrongSender) {
387*3f982cf4SFabien Sanglard   SimpleMessagePort port(kReceiverId);
388*3f982cf4SFabien Sanglard   ReceiverSessionMessenger messenger(&port, kReceiverId,
389*3f982cf4SFabien Sanglard                                      message_store_.GetErrorCallback());
390*3f982cf4SFabien Sanglard   messenger.SetHandler(SenderMessage::Type::kGetCapabilities,
391*3f982cf4SFabien Sanglard                        message_store_.GetRequestCallback());
392*3f982cf4SFabien Sanglard 
393*3f982cf4SFabien Sanglard   // The first message should be accepted since we don't have a set sender_id
394*3f982cf4SFabien Sanglard   // yet.
395*3f982cf4SFabien Sanglard   port.ReceiveMessage("sender-31337", kCastWebrtcNamespace, R"({
396*3f982cf4SFabien Sanglard         "seqNum": 820263769,
397*3f982cf4SFabien Sanglard         "type": "GET_CAPABILITIES"
398*3f982cf4SFabien Sanglard       })");
399*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
400*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.sender_messages.size());
401*3f982cf4SFabien Sanglard   message_store_.sender_messages.clear();
402*3f982cf4SFabien Sanglard 
403*3f982cf4SFabien Sanglard   // The second message should just be ignored.
404*3f982cf4SFabien Sanglard   port.ReceiveMessage("sender-42", kCastWebrtcNamespace, R"({
405*3f982cf4SFabien Sanglard         "seqNum": 1234,
406*3f982cf4SFabien Sanglard         "type": "GET_CAPABILITIES"
407*3f982cf4SFabien Sanglard       })");
408*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
409*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.sender_messages.empty());
410*3f982cf4SFabien Sanglard 
411*3f982cf4SFabien Sanglard   // But the third message should be accepted again since it's from the
412*3f982cf4SFabien Sanglard   // first sender.
413*3f982cf4SFabien Sanglard   port.ReceiveMessage("sender-31337", kCastWebrtcNamespace, R"({
414*3f982cf4SFabien Sanglard         "seqNum": 820263769,
415*3f982cf4SFabien Sanglard         "type": "GET_CAPABILITIES"
416*3f982cf4SFabien Sanglard       })");
417*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
418*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.sender_messages.size());
419*3f982cf4SFabien Sanglard }
420*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,SenderRejectsMessageFromWrongSender)421*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, SenderRejectsMessageFromWrongSender) {
422*3f982cf4SFabien Sanglard   SimpleMessagePort port(kReceiverId);
423*3f982cf4SFabien Sanglard   SenderSessionMessenger messenger(&port, kSenderId, kReceiverId,
424*3f982cf4SFabien Sanglard                                    message_store_.GetErrorCallback(),
425*3f982cf4SFabien Sanglard                                    &task_runner_);
426*3f982cf4SFabien Sanglard 
427*3f982cf4SFabien Sanglard   port.ReceiveMessage("receiver-31337", kCastWebrtcNamespace, R"({
428*3f982cf4SFabien Sanglard         "seqNum": 12345,
429*3f982cf4SFabien Sanglard         "sessionId": 735189,
430*3f982cf4SFabien Sanglard         "type": "RPC",
431*3f982cf4SFabien Sanglard         "result": "ok",
432*3f982cf4SFabien Sanglard         "rpc": "SGVsbG8gZnJvbSB0aGUgQ2FzdCBSZWNlaXZlciE="
433*3f982cf4SFabien Sanglard       })");
434*3f982cf4SFabien Sanglard 
435*3f982cf4SFabien Sanglard   // The message should just be ignored.
436*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
437*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.sender_messages.empty());
438*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
439*3f982cf4SFabien Sanglard }
440*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,ReceiverRejectsMessagesWithoutHandler)441*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, ReceiverRejectsMessagesWithoutHandler) {
442*3f982cf4SFabien Sanglard   SimpleMessagePort port(kReceiverId);
443*3f982cf4SFabien Sanglard   ReceiverSessionMessenger messenger(&port, kReceiverId,
444*3f982cf4SFabien Sanglard                                      message_store_.GetErrorCallback());
445*3f982cf4SFabien Sanglard   messenger.SetHandler(SenderMessage::Type::kGetCapabilities,
446*3f982cf4SFabien Sanglard                        message_store_.GetRequestCallback());
447*3f982cf4SFabien Sanglard 
448*3f982cf4SFabien Sanglard   // The first message should be accepted since we don't have a set sender_id
449*3f982cf4SFabien Sanglard   // yet.
450*3f982cf4SFabien Sanglard   port.ReceiveMessage("sender-31337", kCastWebrtcNamespace, R"({
451*3f982cf4SFabien Sanglard         "seqNum": 820263769,
452*3f982cf4SFabien Sanglard         "type": "GET_CAPABILITIES"
453*3f982cf4SFabien Sanglard       })");
454*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
455*3f982cf4SFabien Sanglard   ASSERT_EQ(1u, message_store_.sender_messages.size());
456*3f982cf4SFabien Sanglard   message_store_.sender_messages.clear();
457*3f982cf4SFabien Sanglard 
458*3f982cf4SFabien Sanglard   // The second message should be rejected since it doesn't have a handler.
459*3f982cf4SFabien Sanglard   port.ReceiveMessage("sender-31337", kCastWebrtcNamespace, R"({
460*3f982cf4SFabien Sanglard         "seqNum": 820263770,
461*3f982cf4SFabien Sanglard         "type": "RPC"
462*3f982cf4SFabien Sanglard       })");
463*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
464*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.sender_messages.empty());
465*3f982cf4SFabien Sanglard }
466*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,SenderRejectsMessagesWithoutHandler)467*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, SenderRejectsMessagesWithoutHandler) {
468*3f982cf4SFabien Sanglard   SimpleMessagePort port(kReceiverId);
469*3f982cf4SFabien Sanglard   SenderSessionMessenger messenger(&port, kSenderId, kReceiverId,
470*3f982cf4SFabien Sanglard                                    message_store_.GetErrorCallback(),
471*3f982cf4SFabien Sanglard                                    &task_runner_);
472*3f982cf4SFabien Sanglard 
473*3f982cf4SFabien Sanglard   port.ReceiveMessage(kReceiverId, kCastWebrtcNamespace, R"({
474*3f982cf4SFabien Sanglard         "seqNum": 12345,
475*3f982cf4SFabien Sanglard         "sessionId": 735189,
476*3f982cf4SFabien Sanglard         "type": "RPC",
477*3f982cf4SFabien Sanglard         "result": "ok",
478*3f982cf4SFabien Sanglard         "rpc": "SGVsbG8gZnJvbSB0aGUgQ2FzdCBSZWNlaXZlciE="
479*3f982cf4SFabien Sanglard       })");
480*3f982cf4SFabien Sanglard 
481*3f982cf4SFabien Sanglard   // The message should just be ignored.
482*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
483*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.sender_messages.empty());
484*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
485*3f982cf4SFabien Sanglard }
486*3f982cf4SFabien Sanglard 
TEST_F(SessionMessengerTest,UnknownNamespaceMessagesGetDropped)487*3f982cf4SFabien Sanglard TEST_F(SessionMessengerTest, UnknownNamespaceMessagesGetDropped) {
488*3f982cf4SFabien Sanglard   pipe_.right()->ReceiveMessage("urn:x-cast:com.google.cast.virtualreality",
489*3f982cf4SFabien Sanglard                                 R"({
490*3f982cf4SFabien Sanglard         "seqNum": 12345,
491*3f982cf4SFabien Sanglard         "sessionId": 735190,
492*3f982cf4SFabien Sanglard         "type": "RPC",
493*3f982cf4SFabien Sanglard         "rpc": "SGVsbG8gZnJvbSB0aGUgQ2FzdCBSZWNlaXZlciE="
494*3f982cf4SFabien Sanglard       })");
495*3f982cf4SFabien Sanglard 
496*3f982cf4SFabien Sanglard   pipe_.left()->ReceiveMessage("urn:x-cast:com.google.cast.virtualreality", R"({
497*3f982cf4SFabien Sanglard         "seqNum": 12345,
498*3f982cf4SFabien Sanglard         "sessionId": 735190,
499*3f982cf4SFabien Sanglard         "type": "RPC",
500*3f982cf4SFabien Sanglard         "result": "ok",
501*3f982cf4SFabien Sanglard         "rpc": "SGVsbG8gZnJvbSB0aGUgQ2FzdCBTZW5kZXIh="
502*3f982cf4SFabien Sanglard       })");
503*3f982cf4SFabien Sanglard 
504*3f982cf4SFabien Sanglard   // The message should just be ignored.
505*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.errors.empty());
506*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.sender_messages.empty());
507*3f982cf4SFabien Sanglard   ASSERT_TRUE(message_store_.receiver_messages.empty());
508*3f982cf4SFabien Sanglard }
509*3f982cf4SFabien Sanglard 
510*3f982cf4SFabien Sanglard }  // namespace cast
511*3f982cf4SFabien Sanglard }  // namespace openscreen
512