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/field_trial.h"
18 #include "test/gtest.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,ValidateRtpExtensions_EmptyList)68 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
69 std::vector<RtpExtension> extensions;
70 EXPECT_TRUE(ValidateRtpExtensions(extensions));
71 }
72
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_AllGood)73 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
74 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
75 EXPECT_TRUE(ValidateRtpExtensions(extensions));
76 }
77
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_OutOfRangeId_Low)78 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
79 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
80 extensions.push_back(RtpExtension("foo", 0));
81 EXPECT_FALSE(ValidateRtpExtensions(extensions));
82 }
83
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_OutOfRangeId_High)84 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
85 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
86 extensions.push_back(RtpExtension("foo", 256));
87 EXPECT_FALSE(ValidateRtpExtensions(extensions));
88 }
89
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_OverlappingIds_StartOfSet)90 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
91 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
92 extensions.push_back(RtpExtension("foo", 1));
93 EXPECT_FALSE(ValidateRtpExtensions(extensions));
94 }
95
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_OverlappingIds_EndOfSet)96 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
97 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
98 extensions.push_back(RtpExtension("foo", 255));
99 EXPECT_FALSE(ValidateRtpExtensions(extensions));
100 }
101
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_EmptyList)102 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
103 std::vector<RtpExtension> extensions;
104 std::vector<webrtc::RtpExtension> filtered =
105 FilterRtpExtensions(extensions, SupportedExtensions1, true);
106 EXPECT_EQ(0u, filtered.size());
107 }
108
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_IncludeOnlySupported)109 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
110 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
111 std::vector<webrtc::RtpExtension> filtered =
112 FilterRtpExtensions(extensions, SupportedExtensions1, false);
113 EXPECT_EQ(2u, filtered.size());
114 EXPECT_EQ("c", filtered[0].uri);
115 EXPECT_EQ("i", filtered[1].uri);
116 }
117
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_SortedByName_1)118 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
119 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
120 std::vector<webrtc::RtpExtension> filtered =
121 FilterRtpExtensions(extensions, SupportedExtensions2, false);
122 EXPECT_EQ(12u, filtered.size());
123 EXPECT_TRUE(IsSorted(filtered));
124 }
125
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_SortedByName_2)126 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
127 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
128 std::vector<webrtc::RtpExtension> filtered =
129 FilterRtpExtensions(extensions, SupportedExtensions2, true);
130 EXPECT_EQ(12u, filtered.size());
131 EXPECT_TRUE(IsSorted(filtered));
132 }
133
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_DontRemoveRedundant)134 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
135 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
136 std::vector<webrtc::RtpExtension> filtered =
137 FilterRtpExtensions(extensions, SupportedExtensions2, false);
138 EXPECT_EQ(12u, filtered.size());
139 EXPECT_TRUE(IsSorted(filtered));
140 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
141 }
142
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundant)143 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
144 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
145 std::vector<webrtc::RtpExtension> filtered =
146 FilterRtpExtensions(extensions, SupportedExtensions2, true);
147 EXPECT_EQ(6u, filtered.size());
148 EXPECT_TRUE(IsSorted(filtered));
149 EXPECT_NE(filtered[0].uri, filtered[1].uri);
150 }
151
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantEncrypted_1)152 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_1) {
153 std::vector<RtpExtension> extensions;
154 extensions.push_back(webrtc::RtpExtension("b", 1));
155 extensions.push_back(webrtc::RtpExtension("b", 2, true));
156 extensions.push_back(webrtc::RtpExtension("c", 3));
157 extensions.push_back(webrtc::RtpExtension("b", 4));
158 std::vector<webrtc::RtpExtension> filtered =
159 FilterRtpExtensions(extensions, SupportedExtensions2, true);
160 EXPECT_EQ(3u, filtered.size());
161 EXPECT_TRUE(IsSorted(filtered));
162 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
163 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
164 EXPECT_NE(filtered[0].uri, filtered[2].uri);
165 EXPECT_NE(filtered[1].uri, filtered[2].uri);
166 }
167
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantEncrypted_2)168 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_2) {
169 std::vector<RtpExtension> extensions;
170 extensions.push_back(webrtc::RtpExtension("b", 1, true));
171 extensions.push_back(webrtc::RtpExtension("b", 2));
172 extensions.push_back(webrtc::RtpExtension("c", 3));
173 extensions.push_back(webrtc::RtpExtension("b", 4));
174 std::vector<webrtc::RtpExtension> filtered =
175 FilterRtpExtensions(extensions, SupportedExtensions2, true);
176 EXPECT_EQ(3u, filtered.size());
177 EXPECT_TRUE(IsSorted(filtered));
178 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
179 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
180 EXPECT_NE(filtered[0].uri, filtered[2].uri);
181 EXPECT_NE(filtered[1].uri, filtered[2].uri);
182 }
183
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBwe_1)184 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
185 webrtc::test::ScopedFieldTrials override_field_trials_(
186 "WebRTC-FilterAbsSendTimeExtension/Enabled/");
187 std::vector<RtpExtension> extensions;
188 extensions.push_back(
189 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
190 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
191 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
192 extensions.push_back(
193 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
194 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
195 std::vector<webrtc::RtpExtension> filtered =
196 FilterRtpExtensions(extensions, SupportedExtensions2, true);
197 EXPECT_EQ(1u, filtered.size());
198 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
199 }
200
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBwe_1_KeepAbsSendTime)201 TEST(WebRtcMediaEngineTest,
202 FilterRtpExtensions_RemoveRedundantBwe_1_KeepAbsSendTime) {
203 std::vector<RtpExtension> extensions;
204 extensions.push_back(
205 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
206 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
207 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
208 extensions.push_back(
209 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
210 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
211 std::vector<webrtc::RtpExtension> filtered =
212 FilterRtpExtensions(extensions, SupportedExtensions2, true);
213 EXPECT_EQ(2u, filtered.size());
214 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
215 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[1].uri);
216 }
217
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBweEncrypted_1)218 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
219 webrtc::test::ScopedFieldTrials override_field_trials_(
220 "WebRTC-FilterAbsSendTimeExtension/Enabled/");
221 std::vector<RtpExtension> extensions;
222 extensions.push_back(
223 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
224 extensions.push_back(
225 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
226 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
227 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
228 extensions.push_back(
229 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
230 extensions.push_back(
231 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
232 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
233 std::vector<webrtc::RtpExtension> filtered =
234 FilterRtpExtensions(extensions, SupportedExtensions2, true);
235 EXPECT_EQ(2u, filtered.size());
236 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
237 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
238 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
239 }
240
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBweEncrypted_1_KeepAbsSendTime)241 TEST(WebRtcMediaEngineTest,
242 FilterRtpExtensions_RemoveRedundantBweEncrypted_1_KeepAbsSendTime) {
243 std::vector<RtpExtension> extensions;
244 extensions.push_back(
245 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
246 extensions.push_back(
247 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
248 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
249 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
250 extensions.push_back(
251 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
252 extensions.push_back(
253 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
254 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
255 std::vector<webrtc::RtpExtension> filtered =
256 FilterRtpExtensions(extensions, SupportedExtensions2, true);
257 EXPECT_EQ(3u, filtered.size());
258 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
259 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
260 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[2].uri);
261 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
262 }
263
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBwe_2)264 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
265 std::vector<RtpExtension> extensions;
266 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
267 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
268 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
269 std::vector<webrtc::RtpExtension> filtered =
270 FilterRtpExtensions(extensions, SupportedExtensions2, true);
271 EXPECT_EQ(1u, filtered.size());
272 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
273 }
274
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBwe_3)275 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
276 std::vector<RtpExtension> extensions;
277 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
278 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
279 std::vector<webrtc::RtpExtension> filtered =
280 FilterRtpExtensions(extensions, SupportedExtensions2, true);
281 EXPECT_EQ(1u, filtered.size());
282 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
283 }
284
TEST(WebRtcMediaEngineTest,Create)285 TEST(WebRtcMediaEngineTest, Create) {
286 MediaEngineDependencies deps;
287 webrtc::SetMediaEngineDefaults(&deps);
288
289 std::unique_ptr<MediaEngineInterface> engine =
290 CreateMediaEngine(std::move(deps));
291
292 EXPECT_TRUE(engine);
293 }
294
295 } // namespace cricket
296