blob: 525e0d1427bc3b0206ef406d95e3922e86cdf78a [file] [log] [blame]
solenberg7e4e01a2015-12-02 08:05:01 -08001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
solenberg7e4e01a2015-12-02 08:05:01 -08003 *
kjellander1afca732016-02-07 20:46:45 -08004 * 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.
solenberg7e4e01a2015-12-02 08:05:01 -08009 */
10
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "media/engine/webrtc_media_engine.h"
12
Steve Antone78bcb92017-10-31 09:53:08 -070013#include <memory>
Danil Chapovalov4844c5f2019-04-10 14:10:10 +020014#include <utility>
Steve Antone78bcb92017-10-31 09:53:08 -070015
Danil Chapovalov4844c5f2019-04-10 14:10:10 +020016#include "media/engine/webrtc_media_engine_defaults.h"
Konrad Hofbauerb0397d62019-01-23 09:46:58 +010017#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "test/gtest.h"
solenberg7e4e01a2015-12-02 08:05:01 -080019
isheriff6f8d6862016-05-26 11:24:55 -070020using webrtc::RtpExtension;
21
solenberg7e4e01a2015-12-02 08:05:01 -080022namespace cricket {
23namespace {
24
isheriff6f8d6862016-05-26 11:24:55 -070025std::vector<RtpExtension> MakeUniqueExtensions() {
26 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080027 char name[] = "a";
28 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070029 result.push_back(RtpExtension(name, 1 + i));
solenberg7e4e01a2015-12-02 08:05:01 -080030 name[0]++;
Johannes Kron07ba2b92018-09-26 13:33:35 +020031 result.push_back(RtpExtension(name, 255 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080032 name[0]++;
33 }
34 return result;
35}
36
isheriff6f8d6862016-05-26 11:24:55 -070037std::vector<RtpExtension> MakeRedundantExtensions() {
38 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080039 char name[] = "a";
40 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070041 result.push_back(RtpExtension(name, 1 + i));
Johannes Kron07ba2b92018-09-26 13:33:35 +020042 result.push_back(RtpExtension(name, 255 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080043 name[0]++;
44 }
45 return result;
46}
47
48bool SupportedExtensions1(const std::string& name) {
49 return name == "c" || name == "i";
50}
51
52bool SupportedExtensions2(const std::string& name) {
53 return name != "a" && name != "n";
54}
55
56bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
57 const std::string* last = nullptr;
58 for (const auto& extension : extensions) {
isheriff6f8d6862016-05-26 11:24:55 -070059 if (last && *last > extension.uri) {
solenberg7e4e01a2015-12-02 08:05:01 -080060 return false;
61 }
isheriff6f8d6862016-05-26 11:24:55 -070062 last = &extension.uri;
solenberg7e4e01a2015-12-02 08:05:01 -080063 }
64 return true;
65}
66} // namespace
67
68TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070069 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -080070 EXPECT_TRUE(ValidateRtpExtensions(extensions));
71}
72
73TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
isheriff6f8d6862016-05-26 11:24:55 -070074 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -080075 EXPECT_TRUE(ValidateRtpExtensions(extensions));
76}
77
78TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
isheriff6f8d6862016-05-26 11:24:55 -070079 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
80 extensions.push_back(RtpExtension("foo", 0));
solenberg7e4e01a2015-12-02 08:05:01 -080081 EXPECT_FALSE(ValidateRtpExtensions(extensions));
82}
83
84TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
isheriff6f8d6862016-05-26 11:24:55 -070085 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
Johannes Kron07ba2b92018-09-26 13:33:35 +020086 extensions.push_back(RtpExtension("foo", 256));
solenberg7e4e01a2015-12-02 08:05:01 -080087 EXPECT_FALSE(ValidateRtpExtensions(extensions));
88}
89
90TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070091 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
92 extensions.push_back(RtpExtension("foo", 1));
solenberg7e4e01a2015-12-02 08:05:01 -080093 EXPECT_FALSE(ValidateRtpExtensions(extensions));
94}
95
96TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070097 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
Johannes Kron07ba2b92018-09-26 13:33:35 +020098 extensions.push_back(RtpExtension("foo", 255));
solenberg7e4e01a2015-12-02 08:05:01 -080099 EXPECT_FALSE(ValidateRtpExtensions(extensions));
100}
101
102TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -0700103 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800104 std::vector<webrtc::RtpExtension> filtered =
105 FilterRtpExtensions(extensions, SupportedExtensions1, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200106 EXPECT_EQ(0u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800107}
108
109TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
isheriff6f8d6862016-05-26 11:24:55 -0700110 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800111 std::vector<webrtc::RtpExtension> filtered =
112 FilterRtpExtensions(extensions, SupportedExtensions1, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200113 EXPECT_EQ(2u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700114 EXPECT_EQ("c", filtered[0].uri);
115 EXPECT_EQ("i", filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800116}
117
118TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700119 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800120 std::vector<webrtc::RtpExtension> filtered =
121 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200122 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800123 EXPECT_TRUE(IsSorted(filtered));
124}
125
126TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700127 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800128 std::vector<webrtc::RtpExtension> filtered =
129 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200130 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800131 EXPECT_TRUE(IsSorted(filtered));
132}
133
134TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700135 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800136 std::vector<webrtc::RtpExtension> filtered =
137 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200138 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800139 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700140 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800141}
142
143TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700144 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800145 std::vector<webrtc::RtpExtension> filtered =
146 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200147 EXPECT_EQ(6u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800148 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700149 EXPECT_NE(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800150}
151
jbauch5869f502017-06-29 12:31:36 -0700152TEST(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);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200160 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700161 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
168TEST(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);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200176 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700177 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
solenberg7e4e01a2015-12-02 08:05:01 -0800184TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700185 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800186 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700187 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
188 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
189 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
solenberg7e4e01a2015-12-02 08:05:01 -0800190 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700191 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
192 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800193 std::vector<webrtc::RtpExtension> filtered =
194 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200195 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700196 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800197}
198
Konrad Hofbauerb0397d62019-01-23 09:46:58 +0100199TEST(WebRtcMediaEngineTest,
200 FilterRtpExtensions_RemoveRedundantBwe_1_KeepAbsSendTime) {
201 std::vector<RtpExtension> extensions;
202 webrtc::test::ScopedFieldTrials override_field_trials_(
203 "WebRTC-KeepAbsSendTimeExtension/Enabled/");
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
jbauch5869f502017-06-29 12:31:36 -0700218TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
219 std::vector<RtpExtension> extensions;
220 extensions.push_back(
221 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
222 extensions.push_back(
223 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
224 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
225 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
226 extensions.push_back(
227 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
228 extensions.push_back(
229 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
230 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
231 std::vector<webrtc::RtpExtension> filtered =
232 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200233 EXPECT_EQ(2u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700234 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
235 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
236 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
237}
238
Konrad Hofbauerb0397d62019-01-23 09:46:58 +0100239TEST(WebRtcMediaEngineTest,
240 FilterRtpExtensions_RemoveRedundantBweEncrypted_1_KeepAbsSendTime) {
241 std::vector<RtpExtension> extensions;
242 webrtc::test::ScopedFieldTrials override_field_trials_(
243 "WebRTC-KeepAbsSendTimeExtension/Enabled/");
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
solenberg7e4e01a2015-12-02 08:05:01 -0800264TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700265 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));
solenberg7e4e01a2015-12-02 08:05:01 -0800269 std::vector<webrtc::RtpExtension> filtered =
270 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200271 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700272 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800273}
274
275TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
isheriff6f8d6862016-05-26 11:24:55 -0700276 std::vector<RtpExtension> extensions;
277 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
278 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800279 std::vector<webrtc::RtpExtension> filtered =
280 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200281 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700282 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800283}
ossu111744e2016-06-15 02:22:32 -0700284
Danil Chapovalov495a1ae2019-07-08 18:19:58 +0200285TEST(WebRtcMediaEngineTest, Create) {
Danil Chapovalov4844c5f2019-04-10 14:10:10 +0200286 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
solenberg7e4e01a2015-12-02 08:05:01 -0800295} // namespace cricket