1 /*
2 * Copyright (c) 2015 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 "media/engine/webrtc_media_engine.h"
12
13 #include <memory>
14 #include <utility>
15
16 #include "media/engine/webrtc_media_engine_defaults.h"
17 #include "test/gtest.h"
18 #include "test/scoped_key_value_config.h"
19
20 using webrtc::RtpExtension;
21
22 namespace cricket {
23 namespace {
24
MakeUniqueExtensions()25 std::vector<RtpExtension> MakeUniqueExtensions() {
26 std::vector<RtpExtension> result;
27 char name[] = "a";
28 for (int i = 0; i < 7; ++i) {
29 result.push_back(RtpExtension(name, 1 + i));
30 name[0]++;
31 result.push_back(RtpExtension(name, 255 - i));
32 name[0]++;
33 }
34 return result;
35 }
36
MakeRedundantExtensions()37 std::vector<RtpExtension> MakeRedundantExtensions() {
38 std::vector<RtpExtension> result;
39 char name[] = "a";
40 for (int i = 0; i < 7; ++i) {
41 result.push_back(RtpExtension(name, 1 + i));
42 result.push_back(RtpExtension(name, 255 - i));
43 name[0]++;
44 }
45 return result;
46 }
47
SupportedExtensions1(absl::string_view name)48 bool SupportedExtensions1(absl::string_view name) {
49 return name == "c" || name == "i";
50 }
51
SupportedExtensions2(absl::string_view name)52 bool SupportedExtensions2(absl::string_view name) {
53 return name != "a" && name != "n";
54 }
55
IsSorted(const std::vector<webrtc::RtpExtension> & extensions)56 bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
57 const std::string* last = nullptr;
58 for (const auto& extension : extensions) {
59 if (last && *last > extension.uri) {
60 return false;
61 }
62 last = &extension.uri;
63 }
64 return true;
65 }
66 } // namespace
67
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsEmptyList)68 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsEmptyList) {
69 std::vector<RtpExtension> extensions;
70 EXPECT_TRUE(ValidateRtpExtensions(extensions, {}));
71 }
72
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsAllGood)73 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsAllGood) {
74 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
75 EXPECT_TRUE(ValidateRtpExtensions(extensions, {}));
76 }
77
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsOutOfRangeId_Low)78 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsOutOfRangeId_Low) {
79 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
80 extensions.push_back(RtpExtension("foo", 0));
81 EXPECT_FALSE(ValidateRtpExtensions(extensions, {}));
82 }
83
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsOutOfRangeIdHigh)84 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsOutOfRangeIdHigh) {
85 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
86 extensions.push_back(RtpExtension("foo", 256));
87 EXPECT_FALSE(ValidateRtpExtensions(extensions, {}));
88 }
89
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsOverlappingIdsStartOfSet)90 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsOverlappingIdsStartOfSet) {
91 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
92 extensions.push_back(RtpExtension("foo", 1));
93 EXPECT_FALSE(ValidateRtpExtensions(extensions, {}));
94 }
95
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsOverlappingIdsEndOfSet)96 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsOverlappingIdsEndOfSet) {
97 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
98 extensions.push_back(RtpExtension("foo", 255));
99 EXPECT_FALSE(ValidateRtpExtensions(extensions, {}));
100 }
101
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsEmptyToEmpty)102 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsEmptyToEmpty) {
103 std::vector<RtpExtension> extensions;
104 EXPECT_TRUE(ValidateRtpExtensions(extensions, extensions));
105 }
106
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsNoChange)107 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsNoChange) {
108 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
109 EXPECT_TRUE(ValidateRtpExtensions(extensions, extensions));
110 }
111
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsChangeIdNotUrl)112 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsChangeIdNotUrl) {
113 std::vector<RtpExtension> old_extensions = MakeUniqueExtensions();
114 std::vector<RtpExtension> new_extensions = old_extensions;
115 std::swap(new_extensions[0].id, new_extensions[1].id);
116
117 EXPECT_FALSE(ValidateRtpExtensions(new_extensions, old_extensions));
118 }
119
TEST(WebRtcMediaEngineTest,ValidateRtpExtensionsChangeIdForUrl)120 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsChangeIdForUrl) {
121 std::vector<RtpExtension> old_extensions = MakeUniqueExtensions();
122 std::vector<RtpExtension> new_extensions = old_extensions;
123 // Change first extension to something not generated by MakeUniqueExtensions
124 new_extensions[0].id = 123;
125
126 EXPECT_FALSE(ValidateRtpExtensions(new_extensions, old_extensions));
127 }
128
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsEmptyList)129 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsEmptyList) {
130 std::vector<RtpExtension> extensions;
131 webrtc::test::ScopedKeyValueConfig trials;
132 std::vector<webrtc::RtpExtension> filtered =
133 FilterRtpExtensions(extensions, SupportedExtensions1, true, trials);
134 EXPECT_EQ(0u, filtered.size());
135 }
136
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsIncludeOnlySupported)137 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsIncludeOnlySupported) {
138 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
139 webrtc::test::ScopedKeyValueConfig trials;
140 std::vector<webrtc::RtpExtension> filtered =
141 FilterRtpExtensions(extensions, SupportedExtensions1, false, trials);
142 EXPECT_EQ(2u, filtered.size());
143 EXPECT_EQ("c", filtered[0].uri);
144 EXPECT_EQ("i", filtered[1].uri);
145 }
146
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsSortedByName1)147 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsSortedByName1) {
148 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
149 webrtc::test::ScopedKeyValueConfig trials;
150 std::vector<webrtc::RtpExtension> filtered =
151 FilterRtpExtensions(extensions, SupportedExtensions2, false, trials);
152 EXPECT_EQ(12u, filtered.size());
153 EXPECT_TRUE(IsSorted(filtered));
154 }
155
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsSortedByName2)156 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsSortedByName2) {
157 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
158 webrtc::test::ScopedKeyValueConfig trials;
159 std::vector<webrtc::RtpExtension> filtered =
160 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
161 EXPECT_EQ(12u, filtered.size());
162 EXPECT_TRUE(IsSorted(filtered));
163 }
164
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsDontRemoveRedundant)165 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsDontRemoveRedundant) {
166 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
167 webrtc::test::ScopedKeyValueConfig trials;
168 std::vector<webrtc::RtpExtension> filtered =
169 FilterRtpExtensions(extensions, SupportedExtensions2, false, trials);
170 EXPECT_EQ(12u, filtered.size());
171 EXPECT_TRUE(IsSorted(filtered));
172 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
173 }
174
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsRemoveRedundant)175 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundant) {
176 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
177 webrtc::test::ScopedKeyValueConfig trials;
178 std::vector<webrtc::RtpExtension> filtered =
179 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
180 EXPECT_EQ(6u, filtered.size());
181 EXPECT_TRUE(IsSorted(filtered));
182 EXPECT_NE(filtered[0].uri, filtered[1].uri);
183 }
184
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsRemoveRedundantEncrypted1)185 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantEncrypted1) {
186 std::vector<RtpExtension> extensions;
187 extensions.push_back(webrtc::RtpExtension("b", 1));
188 extensions.push_back(webrtc::RtpExtension("b", 2, true));
189 extensions.push_back(webrtc::RtpExtension("c", 3));
190 extensions.push_back(webrtc::RtpExtension("b", 4));
191 webrtc::test::ScopedKeyValueConfig trials;
192 std::vector<webrtc::RtpExtension> filtered =
193 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
194 EXPECT_EQ(3u, filtered.size());
195 EXPECT_TRUE(IsSorted(filtered));
196 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
197 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
198 EXPECT_NE(filtered[0].uri, filtered[2].uri);
199 EXPECT_NE(filtered[1].uri, filtered[2].uri);
200 }
201
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsRemoveRedundantEncrypted2)202 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantEncrypted2) {
203 std::vector<RtpExtension> extensions;
204 extensions.push_back(webrtc::RtpExtension("b", 1, true));
205 extensions.push_back(webrtc::RtpExtension("b", 2));
206 extensions.push_back(webrtc::RtpExtension("c", 3));
207 extensions.push_back(webrtc::RtpExtension("b", 4));
208 webrtc::test::ScopedKeyValueConfig trials;
209 std::vector<webrtc::RtpExtension> filtered =
210 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
211 EXPECT_EQ(3u, filtered.size());
212 EXPECT_TRUE(IsSorted(filtered));
213 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
214 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
215 EXPECT_NE(filtered[0].uri, filtered[2].uri);
216 EXPECT_NE(filtered[1].uri, filtered[2].uri);
217 }
218
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsRemoveRedundantBwe1)219 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantBwe1) {
220 webrtc::test::ScopedKeyValueConfig trials(
221 "WebRTC-FilterAbsSendTimeExtension/Enabled/");
222 std::vector<RtpExtension> extensions;
223 extensions.push_back(
224 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
225 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
226 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
227 extensions.push_back(
228 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
229 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
230 std::vector<webrtc::RtpExtension> filtered =
231 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
232 EXPECT_EQ(1u, filtered.size());
233 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
234 }
235
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsRemoveRedundantBwe1KeepAbsSendTime)236 TEST(WebRtcMediaEngineTest,
237 FilterRtpExtensionsRemoveRedundantBwe1KeepAbsSendTime) {
238 std::vector<RtpExtension> extensions;
239 extensions.push_back(
240 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
241 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
242 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
243 extensions.push_back(
244 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
245 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
246 webrtc::test::ScopedKeyValueConfig trials;
247 std::vector<webrtc::RtpExtension> filtered =
248 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
249 EXPECT_EQ(2u, filtered.size());
250 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
251 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[1].uri);
252 }
253
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsRemoveRedundantBweEncrypted1)254 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantBweEncrypted1) {
255 webrtc::test::ScopedKeyValueConfig trials(
256 "WebRTC-FilterAbsSendTimeExtension/Enabled/");
257 std::vector<RtpExtension> extensions;
258 extensions.push_back(
259 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
260 extensions.push_back(
261 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
262 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
263 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
264 extensions.push_back(
265 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
266 extensions.push_back(
267 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
268 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
269 std::vector<webrtc::RtpExtension> filtered =
270 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
271 EXPECT_EQ(2u, filtered.size());
272 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
273 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
274 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
275 }
276
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsRemoveRedundantBweEncrypted1KeepAbsSendTime)277 TEST(WebRtcMediaEngineTest,
278 FilterRtpExtensionsRemoveRedundantBweEncrypted1KeepAbsSendTime) {
279 std::vector<RtpExtension> extensions;
280 extensions.push_back(
281 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
282 extensions.push_back(
283 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
284 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
285 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
286 extensions.push_back(
287 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
288 extensions.push_back(
289 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
290 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
291 webrtc::test::ScopedKeyValueConfig trials;
292 std::vector<webrtc::RtpExtension> filtered =
293 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
294 EXPECT_EQ(3u, filtered.size());
295 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
296 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
297 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[2].uri);
298 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
299 }
300
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsRemoveRedundantBwe2)301 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantBwe2) {
302 std::vector<RtpExtension> extensions;
303 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
304 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
305 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
306 webrtc::test::ScopedKeyValueConfig trials;
307 std::vector<webrtc::RtpExtension> filtered =
308 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
309 EXPECT_EQ(1u, filtered.size());
310 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
311 }
312
TEST(WebRtcMediaEngineTest,FilterRtpExtensionsRemoveRedundantBwe3)313 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantBwe3) {
314 std::vector<RtpExtension> extensions;
315 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
316 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
317 webrtc::test::ScopedKeyValueConfig trials;
318 std::vector<webrtc::RtpExtension> filtered =
319 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials);
320 EXPECT_EQ(1u, filtered.size());
321 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
322 }
323
TEST(WebRtcMediaEngineTest,Create)324 TEST(WebRtcMediaEngineTest, Create) {
325 MediaEngineDependencies deps;
326 webrtc::SetMediaEngineDefaults(&deps);
327 webrtc::test::ScopedKeyValueConfig trials;
328 deps.trials = &trials;
329
330 std::unique_ptr<MediaEngineInterface> engine =
331 CreateMediaEngine(std::move(deps));
332
333 EXPECT_TRUE(engine);
334 }
335
336 } // namespace cricket
337