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