xref: /aosp_15_r20/external/webrtc/api/rtp_parameters_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "api/rtp_parameters.h"
12 
13 #include "test/gtest.h"
14 
15 namespace webrtc {
16 
17 using webrtc::RtpExtension;
18 
19 static const char kExtensionUri1[] = "extension-uri1";
20 static const char kExtensionUri2[] = "extension-uri2";
21 
22 static const RtpExtension kExtension1(kExtensionUri1, 1);
23 static const RtpExtension kExtension1Encrypted(kExtensionUri1, 10, true);
24 static const RtpExtension kExtension2(kExtensionUri2, 2);
25 
TEST(RtpExtensionTest,DeduplicateHeaderExtensions)26 TEST(RtpExtensionTest, DeduplicateHeaderExtensions) {
27   std::vector<RtpExtension> extensions;
28   std::vector<RtpExtension> filtered;
29 
30   extensions.clear();
31   extensions.push_back(kExtension1);
32   extensions.push_back(kExtension1Encrypted);
33   filtered = RtpExtension::DeduplicateHeaderExtensions(
34       extensions, RtpExtension::Filter::kDiscardEncryptedExtension);
35   EXPECT_EQ(1u, filtered.size());
36   EXPECT_EQ(std::vector<RtpExtension>{kExtension1}, filtered);
37 
38   extensions.clear();
39   extensions.push_back(kExtension1);
40   extensions.push_back(kExtension1Encrypted);
41   filtered = RtpExtension::DeduplicateHeaderExtensions(
42       extensions, RtpExtension::Filter::kPreferEncryptedExtension);
43   EXPECT_EQ(1u, filtered.size());
44   EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered);
45 
46   extensions.clear();
47   extensions.push_back(kExtension1);
48   extensions.push_back(kExtension1Encrypted);
49   filtered = RtpExtension::DeduplicateHeaderExtensions(
50       extensions, RtpExtension::Filter::kRequireEncryptedExtension);
51   EXPECT_EQ(1u, filtered.size());
52   EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered);
53 
54   extensions.clear();
55   extensions.push_back(kExtension1Encrypted);
56   extensions.push_back(kExtension1);
57   filtered = RtpExtension::DeduplicateHeaderExtensions(
58       extensions, RtpExtension::Filter::kDiscardEncryptedExtension);
59   EXPECT_EQ(1u, filtered.size());
60   EXPECT_EQ(std::vector<RtpExtension>{kExtension1}, filtered);
61 
62   extensions.clear();
63   extensions.push_back(kExtension1Encrypted);
64   extensions.push_back(kExtension1);
65   filtered = RtpExtension::DeduplicateHeaderExtensions(
66       extensions, RtpExtension::Filter::kPreferEncryptedExtension);
67   EXPECT_EQ(1u, filtered.size());
68   EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered);
69 
70   extensions.clear();
71   extensions.push_back(kExtension1Encrypted);
72   extensions.push_back(kExtension1);
73   filtered = RtpExtension::DeduplicateHeaderExtensions(
74       extensions, RtpExtension::Filter::kRequireEncryptedExtension);
75   EXPECT_EQ(1u, filtered.size());
76   EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered);
77 
78   extensions.clear();
79   extensions.push_back(kExtension1);
80   extensions.push_back(kExtension2);
81   filtered = RtpExtension::DeduplicateHeaderExtensions(
82       extensions, RtpExtension::Filter::kDiscardEncryptedExtension);
83   EXPECT_EQ(2u, filtered.size());
84   EXPECT_EQ(extensions, filtered);
85   filtered = RtpExtension::DeduplicateHeaderExtensions(
86       extensions, RtpExtension::Filter::kPreferEncryptedExtension);
87   EXPECT_EQ(2u, filtered.size());
88   EXPECT_EQ(extensions, filtered);
89   filtered = RtpExtension::DeduplicateHeaderExtensions(
90       extensions, RtpExtension::Filter::kRequireEncryptedExtension);
91   EXPECT_EQ(0u, filtered.size());
92 
93   extensions.clear();
94   extensions.push_back(kExtension1);
95   extensions.push_back(kExtension2);
96   extensions.push_back(kExtension1Encrypted);
97   filtered = RtpExtension::DeduplicateHeaderExtensions(
98       extensions, RtpExtension::Filter::kDiscardEncryptedExtension);
99   EXPECT_EQ(2u, filtered.size());
100   EXPECT_EQ((std::vector<RtpExtension>{kExtension1, kExtension2}), filtered);
101   filtered = RtpExtension::DeduplicateHeaderExtensions(
102       extensions, RtpExtension::Filter::kPreferEncryptedExtension);
103   EXPECT_EQ(2u, filtered.size());
104   EXPECT_EQ((std::vector<RtpExtension>{kExtension1Encrypted, kExtension2}),
105             filtered);
106   filtered = RtpExtension::DeduplicateHeaderExtensions(
107       extensions, RtpExtension::Filter::kRequireEncryptedExtension);
108   EXPECT_EQ(1u, filtered.size());
109   EXPECT_EQ((std::vector<RtpExtension>{kExtension1Encrypted}), filtered);
110 }
111 
112 // Test that the filtered vector is sorted so that for a given unsorted array of
113 // extensions, the filtered vector will always be laied out the same (for easy
114 // comparison).
TEST(RtpExtensionTest,DeduplicateHeaderExtensionsSorted)115 TEST(RtpExtensionTest, DeduplicateHeaderExtensionsSorted) {
116   const std::vector<RtpExtension> extensions = {
117       RtpExtension("cde1", 11, false), RtpExtension("cde2", 12, true),
118       RtpExtension("abc1", 3, false),  RtpExtension("abc2", 4, true),
119       RtpExtension("cde3", 9, true),   RtpExtension("cde4", 10, false),
120       RtpExtension("abc3", 1, true),   RtpExtension("abc4", 2, false),
121       RtpExtension("bcd3", 7, false),  RtpExtension("bcd1", 8, true),
122       RtpExtension("bcd2", 5, true),   RtpExtension("bcd4", 6, false),
123   };
124 
125   auto encrypted = RtpExtension::DeduplicateHeaderExtensions(
126       extensions, RtpExtension::Filter::kRequireEncryptedExtension);
127 
128   const std::vector<RtpExtension> expected_sorted_encrypted = {
129       RtpExtension("abc2", 4, true),  RtpExtension("abc3", 1, true),
130       RtpExtension("bcd1", 8, true),  RtpExtension("bcd2", 5, true),
131       RtpExtension("cde2", 12, true), RtpExtension("cde3", 9, true)};
132   EXPECT_EQ(expected_sorted_encrypted, encrypted);
133 
134   auto unencypted = RtpExtension::DeduplicateHeaderExtensions(
135       extensions, RtpExtension::Filter::kDiscardEncryptedExtension);
136 
137   const std::vector<RtpExtension> expected_sorted_unencrypted = {
138       RtpExtension("abc1", 3, false),  RtpExtension("abc4", 2, false),
139       RtpExtension("bcd3", 7, false),  RtpExtension("bcd4", 6, false),
140       RtpExtension("cde1", 11, false), RtpExtension("cde4", 10, false)};
141   EXPECT_EQ(expected_sorted_unencrypted, unencypted);
142 }
143 
TEST(RtpExtensionTest,FindHeaderExtensionByUriAndEncryption)144 TEST(RtpExtensionTest, FindHeaderExtensionByUriAndEncryption) {
145   std::vector<RtpExtension> extensions;
146 
147   extensions.clear();
148   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUriAndEncryption(
149                          extensions, kExtensionUri1, false));
150 
151   extensions.clear();
152   extensions.push_back(kExtension1);
153   EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUriAndEncryption(
154                              extensions, kExtensionUri1, false));
155   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUriAndEncryption(
156                          extensions, kExtensionUri1, true));
157   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUriAndEncryption(
158                          extensions, kExtensionUri2, false));
159 
160   extensions.clear();
161   extensions.push_back(kExtension1);
162   extensions.push_back(kExtension2);
163   extensions.push_back(kExtension1Encrypted);
164   EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUriAndEncryption(
165                              extensions, kExtensionUri1, false));
166   EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUriAndEncryption(
167                              extensions, kExtensionUri2, false));
168   EXPECT_EQ(kExtension1Encrypted,
169             *RtpExtension::FindHeaderExtensionByUriAndEncryption(
170                 extensions, kExtensionUri1, true));
171   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUriAndEncryption(
172                          extensions, kExtensionUri2, true));
173 }
174 
TEST(RtpExtensionTest,FindHeaderExtensionByUri)175 TEST(RtpExtensionTest, FindHeaderExtensionByUri) {
176   std::vector<RtpExtension> extensions;
177 
178   extensions.clear();
179   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
180                          extensions, kExtensionUri1,
181                          RtpExtension::Filter::kDiscardEncryptedExtension));
182   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
183                          extensions, kExtensionUri1,
184                          RtpExtension::Filter::kPreferEncryptedExtension));
185   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
186                          extensions, kExtensionUri1,
187                          RtpExtension::Filter::kRequireEncryptedExtension));
188 
189   extensions.clear();
190   extensions.push_back(kExtension1);
191   EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri(
192                              extensions, kExtensionUri1,
193                              RtpExtension::Filter::kDiscardEncryptedExtension));
194   EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri(
195                              extensions, kExtensionUri1,
196                              RtpExtension::Filter::kPreferEncryptedExtension));
197   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
198                          extensions, kExtensionUri1,
199                          RtpExtension::Filter::kRequireEncryptedExtension));
200   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
201                          extensions, kExtensionUri2,
202                          RtpExtension::Filter::kDiscardEncryptedExtension));
203   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
204                          extensions, kExtensionUri2,
205                          RtpExtension::Filter::kPreferEncryptedExtension));
206   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
207                          extensions, kExtensionUri2,
208                          RtpExtension::Filter::kRequireEncryptedExtension));
209 
210   extensions.clear();
211   extensions.push_back(kExtension1);
212   extensions.push_back(kExtension1Encrypted);
213   EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri(
214                              extensions, kExtensionUri1,
215                              RtpExtension::Filter::kDiscardEncryptedExtension));
216 
217   extensions.clear();
218   extensions.push_back(kExtension1);
219   extensions.push_back(kExtension1Encrypted);
220   EXPECT_EQ(kExtension1Encrypted,
221             *RtpExtension::FindHeaderExtensionByUri(
222                 extensions, kExtensionUri1,
223                 RtpExtension::Filter::kPreferEncryptedExtension));
224 
225   extensions.clear();
226   extensions.push_back(kExtension1);
227   extensions.push_back(kExtension1Encrypted);
228   EXPECT_EQ(kExtension1Encrypted,
229             *RtpExtension::FindHeaderExtensionByUri(
230                 extensions, kExtensionUri1,
231                 RtpExtension::Filter::kRequireEncryptedExtension));
232 
233   extensions.clear();
234   extensions.push_back(kExtension1Encrypted);
235   extensions.push_back(kExtension1);
236   EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri(
237                              extensions, kExtensionUri1,
238                              RtpExtension::Filter::kDiscardEncryptedExtension));
239 
240   extensions.clear();
241   extensions.push_back(kExtension1Encrypted);
242   extensions.push_back(kExtension1);
243   EXPECT_EQ(kExtension1Encrypted,
244             *RtpExtension::FindHeaderExtensionByUri(
245                 extensions, kExtensionUri1,
246                 RtpExtension::Filter::kPreferEncryptedExtension));
247 
248   extensions.clear();
249   extensions.push_back(kExtension1Encrypted);
250   extensions.push_back(kExtension1);
251   EXPECT_EQ(kExtension1Encrypted,
252             *RtpExtension::FindHeaderExtensionByUri(
253                 extensions, kExtensionUri1,
254                 RtpExtension::Filter::kRequireEncryptedExtension));
255 
256   extensions.clear();
257   extensions.push_back(kExtension1);
258   extensions.push_back(kExtension2);
259   EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri(
260                              extensions, kExtensionUri1,
261                              RtpExtension::Filter::kDiscardEncryptedExtension));
262   EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri(
263                              extensions, kExtensionUri1,
264                              RtpExtension::Filter::kPreferEncryptedExtension));
265   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
266                          extensions, kExtensionUri1,
267                          RtpExtension::Filter::kRequireEncryptedExtension));
268   EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUri(
269                              extensions, kExtensionUri2,
270                              RtpExtension::Filter::kDiscardEncryptedExtension));
271   EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUri(
272                              extensions, kExtensionUri2,
273                              RtpExtension::Filter::kPreferEncryptedExtension));
274   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
275                          extensions, kExtensionUri2,
276                          RtpExtension::Filter::kRequireEncryptedExtension));
277 
278   extensions.clear();
279   extensions.push_back(kExtension1);
280   extensions.push_back(kExtension2);
281   extensions.push_back(kExtension1Encrypted);
282   EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri(
283                              extensions, kExtensionUri1,
284                              RtpExtension::Filter::kDiscardEncryptedExtension));
285   EXPECT_EQ(kExtension1Encrypted,
286             *RtpExtension::FindHeaderExtensionByUri(
287                 extensions, kExtensionUri1,
288                 RtpExtension::Filter::kPreferEncryptedExtension));
289   EXPECT_EQ(kExtension1Encrypted,
290             *RtpExtension::FindHeaderExtensionByUri(
291                 extensions, kExtensionUri1,
292                 RtpExtension::Filter::kRequireEncryptedExtension));
293   EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUri(
294                              extensions, kExtensionUri2,
295                              RtpExtension::Filter::kDiscardEncryptedExtension));
296   EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUri(
297                              extensions, kExtensionUri2,
298                              RtpExtension::Filter::kPreferEncryptedExtension));
299   EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri(
300                          extensions, kExtensionUri2,
301                          RtpExtension::Filter::kRequireEncryptedExtension));
302 }
303 }  // namespace webrtc
304