xref: /aosp_15_r20/external/openscreen/osp/msgs/messages_unittest.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2018 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 "gtest/gtest.h"
6*3f982cf4SFabien Sanglard #include "osp/msgs/osp_messages.h"
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard using openscreen::msgs::CborEncodeBuffer;
9*3f982cf4SFabien Sanglard using openscreen::msgs::HttpHeader;
10*3f982cf4SFabien Sanglard using openscreen::msgs::PresentationConnectionMessage;
11*3f982cf4SFabien Sanglard using openscreen::msgs::PresentationStartRequest;
12*3f982cf4SFabien Sanglard using openscreen::msgs::PresentationUrlAvailabilityRequest;
13*3f982cf4SFabien Sanglard 
14*3f982cf4SFabien Sanglard namespace openscreen {
15*3f982cf4SFabien Sanglard namespace osp {
16*3f982cf4SFabien Sanglard 
17*3f982cf4SFabien Sanglard // TODO(btolsch): This is in the current (draft) spec, but should we actually
18*3f982cf4SFabien Sanglard // allow this?
TEST(PresentationMessagesTest,EncodeRequestZeroUrls)19*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, EncodeRequestZeroUrls) {
20*3f982cf4SFabien Sanglard   uint8_t buffer[256];
21*3f982cf4SFabien Sanglard   std::vector<std::string> urls;
22*3f982cf4SFabien Sanglard   ssize_t bytes_out = EncodePresentationUrlAvailabilityRequest(
23*3f982cf4SFabien Sanglard       PresentationUrlAvailabilityRequest{3, urls}, buffer, sizeof(buffer));
24*3f982cf4SFabien Sanglard   ASSERT_LE(bytes_out, static_cast<ssize_t>(sizeof(buffer)));
25*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_out, 0);
26*3f982cf4SFabien Sanglard 
27*3f982cf4SFabien Sanglard   PresentationUrlAvailabilityRequest decoded_request;
28*3f982cf4SFabien Sanglard   ssize_t bytes_read = DecodePresentationUrlAvailabilityRequest(
29*3f982cf4SFabien Sanglard       buffer, bytes_out, &decoded_request);
30*3f982cf4SFabien Sanglard   ASSERT_EQ(bytes_read, bytes_out);
31*3f982cf4SFabien Sanglard   EXPECT_EQ(3u, decoded_request.request_id);
32*3f982cf4SFabien Sanglard   EXPECT_EQ(urls, decoded_request.urls);
33*3f982cf4SFabien Sanglard }
34*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,EncodeRequestOneUrl)35*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, EncodeRequestOneUrl) {
36*3f982cf4SFabien Sanglard   uint8_t buffer[256];
37*3f982cf4SFabien Sanglard   std::vector<std::string> urls{"https://example.com/receiver.html"};
38*3f982cf4SFabien Sanglard   ssize_t bytes_out = EncodePresentationUrlAvailabilityRequest(
39*3f982cf4SFabien Sanglard       PresentationUrlAvailabilityRequest{7, urls}, buffer, sizeof(buffer));
40*3f982cf4SFabien Sanglard   ASSERT_LE(bytes_out, static_cast<ssize_t>(sizeof(buffer)));
41*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_out, 0);
42*3f982cf4SFabien Sanglard 
43*3f982cf4SFabien Sanglard   PresentationUrlAvailabilityRequest decoded_request;
44*3f982cf4SFabien Sanglard   ssize_t bytes_read = DecodePresentationUrlAvailabilityRequest(
45*3f982cf4SFabien Sanglard       buffer, bytes_out, &decoded_request);
46*3f982cf4SFabien Sanglard   ASSERT_EQ(bytes_read, bytes_out);
47*3f982cf4SFabien Sanglard   EXPECT_EQ(7u, decoded_request.request_id);
48*3f982cf4SFabien Sanglard   EXPECT_EQ(urls, decoded_request.urls);
49*3f982cf4SFabien Sanglard }
50*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,EncodeRequestMultipleUrls)51*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, EncodeRequestMultipleUrls) {
52*3f982cf4SFabien Sanglard   uint8_t buffer[256];
53*3f982cf4SFabien Sanglard   std::vector<std::string> urls{"https://example.com/receiver.html",
54*3f982cf4SFabien Sanglard                                 "https://openscreen.org/demo_receiver.html",
55*3f982cf4SFabien Sanglard                                 "https://turt.le/asdfXCV"};
56*3f982cf4SFabien Sanglard   ssize_t bytes_out = EncodePresentationUrlAvailabilityRequest(
57*3f982cf4SFabien Sanglard       PresentationUrlAvailabilityRequest{7, urls}, buffer, sizeof(buffer));
58*3f982cf4SFabien Sanglard   ASSERT_LE(bytes_out, static_cast<ssize_t>(sizeof(buffer)));
59*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_out, 0);
60*3f982cf4SFabien Sanglard 
61*3f982cf4SFabien Sanglard   PresentationUrlAvailabilityRequest decoded_request;
62*3f982cf4SFabien Sanglard   ssize_t bytes_read = DecodePresentationUrlAvailabilityRequest(
63*3f982cf4SFabien Sanglard       buffer, bytes_out, &decoded_request);
64*3f982cf4SFabien Sanglard   ASSERT_EQ(bytes_read, bytes_out);
65*3f982cf4SFabien Sanglard   EXPECT_EQ(7u, decoded_request.request_id);
66*3f982cf4SFabien Sanglard   EXPECT_EQ(urls, decoded_request.urls);
67*3f982cf4SFabien Sanglard }
68*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,EncodeWouldOverflow)69*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, EncodeWouldOverflow) {
70*3f982cf4SFabien Sanglard   uint8_t buffer[40];
71*3f982cf4SFabien Sanglard   std::vector<std::string> urls{"https://example.com/receiver.html"};
72*3f982cf4SFabien Sanglard   ssize_t bytes_out = EncodePresentationUrlAvailabilityRequest(
73*3f982cf4SFabien Sanglard       PresentationUrlAvailabilityRequest{7, urls}, buffer, sizeof(buffer));
74*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_out, static_cast<ssize_t>(sizeof(buffer)));
75*3f982cf4SFabien Sanglard }
76*3f982cf4SFabien Sanglard 
77*3f982cf4SFabien Sanglard // TODO(btolsch): Expand invalid utf8 testing to good/bad files and fuzzing.
TEST(PresentationMessagesTest,EncodeInvalidUtf8)78*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, EncodeInvalidUtf8) {
79*3f982cf4SFabien Sanglard   uint8_t buffer[256];
80*3f982cf4SFabien Sanglard   std::vector<std::string> urls{"\xc0"};
81*3f982cf4SFabien Sanglard   ssize_t bytes_out = EncodePresentationUrlAvailabilityRequest(
82*3f982cf4SFabien Sanglard       PresentationUrlAvailabilityRequest{7, urls}, buffer, sizeof(buffer));
83*3f982cf4SFabien Sanglard   ASSERT_GT(0, bytes_out);
84*3f982cf4SFabien Sanglard }
85*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,DecodeInvalidUtf8)86*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, DecodeInvalidUtf8) {
87*3f982cf4SFabien Sanglard   uint8_t buffer[256];
88*3f982cf4SFabien Sanglard   std::vector<std::string> urls{"https://example.com/receiver.html"};
89*3f982cf4SFabien Sanglard   ssize_t bytes_out = EncodePresentationUrlAvailabilityRequest(
90*3f982cf4SFabien Sanglard       PresentationUrlAvailabilityRequest{7, urls}, buffer, sizeof(buffer));
91*3f982cf4SFabien Sanglard   ASSERT_LE(bytes_out, static_cast<ssize_t>(sizeof(buffer)));
92*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_out, 0);
93*3f982cf4SFabien Sanglard   // Manually change a character in the url string to be non-utf8.
94*3f982cf4SFabien Sanglard   buffer[30] = 0xc0;
95*3f982cf4SFabien Sanglard 
96*3f982cf4SFabien Sanglard   PresentationUrlAvailabilityRequest decoded_request;
97*3f982cf4SFabien Sanglard   ssize_t bytes_read = DecodePresentationUrlAvailabilityRequest(
98*3f982cf4SFabien Sanglard       buffer, bytes_out, &decoded_request);
99*3f982cf4SFabien Sanglard   ASSERT_GT(0, bytes_read);
100*3f982cf4SFabien Sanglard }
101*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,InitiationRequest)102*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, InitiationRequest) {
103*3f982cf4SFabien Sanglard   uint8_t buffer[256];
104*3f982cf4SFabien Sanglard   const std::string kPresentationId = "lksdjfloiqwerlkjasdlfq";
105*3f982cf4SFabien Sanglard   const std::string kPresentationUrl = "https://example.com/receiver.html";
106*3f982cf4SFabien Sanglard   std::vector<HttpHeader> headers;
107*3f982cf4SFabien Sanglard   ssize_t bytes_out = EncodePresentationStartRequest(
108*3f982cf4SFabien Sanglard       PresentationStartRequest{13, kPresentationId, kPresentationUrl, headers},
109*3f982cf4SFabien Sanglard       buffer, sizeof(buffer));
110*3f982cf4SFabien Sanglard   ASSERT_LE(bytes_out, static_cast<ssize_t>(sizeof(buffer)));
111*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_out, 0);
112*3f982cf4SFabien Sanglard 
113*3f982cf4SFabien Sanglard   PresentationStartRequest decoded_request;
114*3f982cf4SFabien Sanglard   ssize_t bytes_read =
115*3f982cf4SFabien Sanglard       DecodePresentationStartRequest(buffer, bytes_out, &decoded_request);
116*3f982cf4SFabien Sanglard   ASSERT_EQ(bytes_read, bytes_out);
117*3f982cf4SFabien Sanglard   EXPECT_EQ(13u, decoded_request.request_id);
118*3f982cf4SFabien Sanglard   EXPECT_EQ(kPresentationId, decoded_request.presentation_id);
119*3f982cf4SFabien Sanglard   EXPECT_EQ(kPresentationUrl, decoded_request.url);
120*3f982cf4SFabien Sanglard   EXPECT_EQ(0, (int)decoded_request.headers.size());
121*3f982cf4SFabien Sanglard }
122*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,InitiationRequestWithoutOptional)123*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, InitiationRequestWithoutOptional) {
124*3f982cf4SFabien Sanglard   uint8_t buffer[256];
125*3f982cf4SFabien Sanglard   const std::string kPresentationId = "lksdjfloiqwerlkjasdlfq";
126*3f982cf4SFabien Sanglard   const std::string kPresentationUrl = "https://example.com/receiver.html";
127*3f982cf4SFabien Sanglard   std::vector<HttpHeader> headers;
128*3f982cf4SFabien Sanglard   ssize_t bytes_out = EncodePresentationStartRequest(
129*3f982cf4SFabien Sanglard       PresentationStartRequest{13, kPresentationId, kPresentationUrl, headers},
130*3f982cf4SFabien Sanglard       buffer, sizeof(buffer));
131*3f982cf4SFabien Sanglard   ASSERT_LE(bytes_out, static_cast<ssize_t>(sizeof(buffer)));
132*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_out, 0);
133*3f982cf4SFabien Sanglard 
134*3f982cf4SFabien Sanglard   PresentationStartRequest decoded_request;
135*3f982cf4SFabien Sanglard   ssize_t bytes_read =
136*3f982cf4SFabien Sanglard       DecodePresentationStartRequest(buffer, bytes_out, &decoded_request);
137*3f982cf4SFabien Sanglard   ASSERT_EQ(bytes_read, bytes_out);
138*3f982cf4SFabien Sanglard   EXPECT_EQ(13u, decoded_request.request_id);
139*3f982cf4SFabien Sanglard   EXPECT_EQ(kPresentationId, decoded_request.presentation_id);
140*3f982cf4SFabien Sanglard   EXPECT_EQ(kPresentationUrl, decoded_request.url);
141*3f982cf4SFabien Sanglard   EXPECT_EQ(0, (int)decoded_request.headers.size());
142*3f982cf4SFabien Sanglard }
143*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,EncodeConnectionMessageString)144*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, EncodeConnectionMessageString) {
145*3f982cf4SFabien Sanglard   uint8_t buffer[256];
146*3f982cf4SFabien Sanglard   PresentationConnectionMessage message;
147*3f982cf4SFabien Sanglard   message.connection_id = 1234;
148*3f982cf4SFabien Sanglard   message.message.which =
149*3f982cf4SFabien Sanglard       PresentationConnectionMessage::Message::Which::kString;
150*3f982cf4SFabien Sanglard   new (&message.message.str) std::string("test message as a string");
151*3f982cf4SFabien Sanglard   ssize_t bytes_out =
152*3f982cf4SFabien Sanglard       EncodePresentationConnectionMessage(message, buffer, sizeof(buffer));
153*3f982cf4SFabien Sanglard   ASSERT_LE(bytes_out, static_cast<ssize_t>(sizeof(buffer)));
154*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_out, 0);
155*3f982cf4SFabien Sanglard 
156*3f982cf4SFabien Sanglard   PresentationConnectionMessage decoded_message;
157*3f982cf4SFabien Sanglard   ssize_t bytes_read =
158*3f982cf4SFabien Sanglard       DecodePresentationConnectionMessage(buffer, bytes_out, &decoded_message);
159*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_read, 0);
160*3f982cf4SFabien Sanglard   EXPECT_EQ(bytes_read, bytes_out);
161*3f982cf4SFabien Sanglard   EXPECT_EQ(message.connection_id, decoded_message.connection_id);
162*3f982cf4SFabien Sanglard   ASSERT_EQ(message.message.which, decoded_message.message.which);
163*3f982cf4SFabien Sanglard   EXPECT_EQ(message.message.str, decoded_message.message.str);
164*3f982cf4SFabien Sanglard }
165*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,EncodeConnectionMessageBytes)166*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, EncodeConnectionMessageBytes) {
167*3f982cf4SFabien Sanglard   uint8_t buffer[256];
168*3f982cf4SFabien Sanglard   PresentationConnectionMessage message;
169*3f982cf4SFabien Sanglard   message.connection_id = 1234;
170*3f982cf4SFabien Sanglard   message.message.which = PresentationConnectionMessage::Message::Which::kBytes;
171*3f982cf4SFabien Sanglard   new (&message.message.bytes)
172*3f982cf4SFabien Sanglard       std::vector<uint8_t>{0, 1, 2, 3, 255, 254, 253, 86, 71, 0, 0, 1, 0, 2};
173*3f982cf4SFabien Sanglard   ssize_t bytes_out =
174*3f982cf4SFabien Sanglard       EncodePresentationConnectionMessage(message, buffer, sizeof(buffer));
175*3f982cf4SFabien Sanglard   ASSERT_LE(bytes_out, static_cast<ssize_t>(sizeof(buffer)));
176*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_out, 0);
177*3f982cf4SFabien Sanglard 
178*3f982cf4SFabien Sanglard   PresentationConnectionMessage decoded_message;
179*3f982cf4SFabien Sanglard   ssize_t bytes_read =
180*3f982cf4SFabien Sanglard       DecodePresentationConnectionMessage(buffer, bytes_out, &decoded_message);
181*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_read, 0);
182*3f982cf4SFabien Sanglard   EXPECT_EQ(bytes_read, bytes_out);
183*3f982cf4SFabien Sanglard   EXPECT_EQ(message.connection_id, decoded_message.connection_id);
184*3f982cf4SFabien Sanglard   ASSERT_EQ(message.message.which, decoded_message.message.which);
185*3f982cf4SFabien Sanglard   EXPECT_EQ(message.message.bytes, decoded_message.message.bytes);
186*3f982cf4SFabien Sanglard }
187*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,CborEncodeBufferSmall)188*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, CborEncodeBufferSmall) {
189*3f982cf4SFabien Sanglard   std::vector<std::string> urls{"https://example.com/receiver.html"};
190*3f982cf4SFabien Sanglard   PresentationUrlAvailabilityRequest request{7, urls};
191*3f982cf4SFabien Sanglard   CborEncodeBuffer buffer;
192*3f982cf4SFabien Sanglard   ASSERT_TRUE(EncodePresentationUrlAvailabilityRequest(request, &buffer));
193*3f982cf4SFabien Sanglard   EXPECT_LT(buffer.size(), CborEncodeBuffer::kDefaultInitialEncodeBufferSize);
194*3f982cf4SFabien Sanglard 
195*3f982cf4SFabien Sanglard   PresentationUrlAvailabilityRequest decoded_request;
196*3f982cf4SFabien Sanglard   size_t bytes_read = DecodePresentationUrlAvailabilityRequest(
197*3f982cf4SFabien Sanglard       buffer.data() + 1, buffer.size() - 1, &decoded_request);
198*3f982cf4SFabien Sanglard   EXPECT_EQ(bytes_read, buffer.size() - 1);
199*3f982cf4SFabien Sanglard   EXPECT_EQ(request.request_id, decoded_request.request_id);
200*3f982cf4SFabien Sanglard   EXPECT_EQ(request.urls, decoded_request.urls);
201*3f982cf4SFabien Sanglard }
202*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,CborEncodeBufferMedium)203*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, CborEncodeBufferMedium) {
204*3f982cf4SFabien Sanglard   std::string url = "https://example.com/receiver.html";
205*3f982cf4SFabien Sanglard   std::vector<std::string> urls{};
206*3f982cf4SFabien Sanglard   for (int i = 0; i < 100; ++i) {
207*3f982cf4SFabien Sanglard     urls.push_back(url);
208*3f982cf4SFabien Sanglard   }
209*3f982cf4SFabien Sanglard   PresentationUrlAvailabilityRequest request{7, urls};
210*3f982cf4SFabien Sanglard   CborEncodeBuffer buffer;
211*3f982cf4SFabien Sanglard   ASSERT_TRUE(EncodePresentationUrlAvailabilityRequest(request, &buffer));
212*3f982cf4SFabien Sanglard   EXPECT_GT(buffer.size(), CborEncodeBuffer::kDefaultInitialEncodeBufferSize);
213*3f982cf4SFabien Sanglard 
214*3f982cf4SFabien Sanglard   PresentationUrlAvailabilityRequest decoded_request;
215*3f982cf4SFabien Sanglard   ssize_t bytes_read = DecodePresentationUrlAvailabilityRequest(
216*3f982cf4SFabien Sanglard       buffer.data() + 1, buffer.size() - 1, &decoded_request);
217*3f982cf4SFabien Sanglard   ASSERT_GT(bytes_read, 0);
218*3f982cf4SFabien Sanglard   EXPECT_EQ(static_cast<size_t>(bytes_read), buffer.size() - 1);
219*3f982cf4SFabien Sanglard   EXPECT_EQ(request.request_id, decoded_request.request_id);
220*3f982cf4SFabien Sanglard   EXPECT_EQ(request.urls, decoded_request.urls);
221*3f982cf4SFabien Sanglard }
222*3f982cf4SFabien Sanglard 
TEST(PresentationMessagesTest,CborEncodeBufferTooLarge)223*3f982cf4SFabien Sanglard TEST(PresentationMessagesTest, CborEncodeBufferTooLarge) {
224*3f982cf4SFabien Sanglard   std::vector<std::string> urls{"https://example.com/receiver.html"};
225*3f982cf4SFabien Sanglard   PresentationUrlAvailabilityRequest request{7, urls};
226*3f982cf4SFabien Sanglard   CborEncodeBuffer buffer{10, 30};
227*3f982cf4SFabien Sanglard   ASSERT_FALSE(EncodePresentationUrlAvailabilityRequest(request, &buffer));
228*3f982cf4SFabien Sanglard }
229*3f982cf4SFabien Sanglard 
230*3f982cf4SFabien Sanglard }  // namespace osp
231*3f982cf4SFabien Sanglard }  // namespace openscreen
232