xref: /aosp_15_r20/external/webrtc/media/engine/webrtc_media_engine_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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