blob: 372621734b63b1ce792506c1585d451a651394a7 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "api/audio_codecs/builtin_audio_decoder_factory.h"
12#include "api/audio_codecs/builtin_audio_encoder_factory.h"
13#include "media/engine/webrtcmediaengine.h"
14#include "test/gtest.h"
solenberg7e4e01a2015-12-02 08:05:01 -080015
isheriff6f8d6862016-05-26 11:24:55 -070016using webrtc::RtpExtension;
17
solenberg7e4e01a2015-12-02 08:05:01 -080018namespace cricket {
19namespace {
20
isheriff6f8d6862016-05-26 11:24:55 -070021std::vector<RtpExtension> MakeUniqueExtensions() {
22 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080023 char name[] = "a";
24 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070025 result.push_back(RtpExtension(name, 1 + i));
solenberg7e4e01a2015-12-02 08:05:01 -080026 name[0]++;
isheriff6f8d6862016-05-26 11:24:55 -070027 result.push_back(RtpExtension(name, 14 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080028 name[0]++;
29 }
30 return result;
31}
32
isheriff6f8d6862016-05-26 11:24:55 -070033std::vector<RtpExtension> MakeRedundantExtensions() {
34 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080035 char name[] = "a";
36 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070037 result.push_back(RtpExtension(name, 1 + i));
38 result.push_back(RtpExtension(name, 14 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080039 name[0]++;
40 }
41 return result;
42}
43
44bool SupportedExtensions1(const std::string& name) {
45 return name == "c" || name == "i";
46}
47
48bool SupportedExtensions2(const std::string& name) {
49 return name != "a" && name != "n";
50}
51
52bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
53 const std::string* last = nullptr;
54 for (const auto& extension : extensions) {
isheriff6f8d6862016-05-26 11:24:55 -070055 if (last && *last > extension.uri) {
solenberg7e4e01a2015-12-02 08:05:01 -080056 return false;
57 }
isheriff6f8d6862016-05-26 11:24:55 -070058 last = &extension.uri;
solenberg7e4e01a2015-12-02 08:05:01 -080059 }
60 return true;
61}
62} // namespace
63
64TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070065 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -080066 EXPECT_TRUE(ValidateRtpExtensions(extensions));
67}
68
69TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
isheriff6f8d6862016-05-26 11:24:55 -070070 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -080071 EXPECT_TRUE(ValidateRtpExtensions(extensions));
72}
73
74TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
isheriff6f8d6862016-05-26 11:24:55 -070075 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
76 extensions.push_back(RtpExtension("foo", 0));
solenberg7e4e01a2015-12-02 08:05:01 -080077 EXPECT_FALSE(ValidateRtpExtensions(extensions));
78}
79
80TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
isheriff6f8d6862016-05-26 11:24:55 -070081 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
82 extensions.push_back(RtpExtension("foo", 15));
solenberg7e4e01a2015-12-02 08:05:01 -080083 EXPECT_FALSE(ValidateRtpExtensions(extensions));
84}
85
86TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070087 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
88 extensions.push_back(RtpExtension("foo", 1));
solenberg7e4e01a2015-12-02 08:05:01 -080089 EXPECT_FALSE(ValidateRtpExtensions(extensions));
90}
91
92TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070093 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
94 extensions.push_back(RtpExtension("foo", 14));
solenberg7e4e01a2015-12-02 08:05:01 -080095 EXPECT_FALSE(ValidateRtpExtensions(extensions));
96}
97
98TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070099 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800100 std::vector<webrtc::RtpExtension> filtered =
101 FilterRtpExtensions(extensions, SupportedExtensions1, true);
102 EXPECT_EQ(0, filtered.size());
103}
104
105TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
isheriff6f8d6862016-05-26 11:24:55 -0700106 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800107 std::vector<webrtc::RtpExtension> filtered =
108 FilterRtpExtensions(extensions, SupportedExtensions1, false);
109 EXPECT_EQ(2, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700110 EXPECT_EQ("c", filtered[0].uri);
111 EXPECT_EQ("i", filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800112}
113
114TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700115 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800116 std::vector<webrtc::RtpExtension> filtered =
117 FilterRtpExtensions(extensions, SupportedExtensions2, false);
118 EXPECT_EQ(12, filtered.size());
119 EXPECT_TRUE(IsSorted(filtered));
120}
121
122TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700123 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800124 std::vector<webrtc::RtpExtension> filtered =
125 FilterRtpExtensions(extensions, SupportedExtensions2, true);
126 EXPECT_EQ(12, filtered.size());
127 EXPECT_TRUE(IsSorted(filtered));
128}
129
130TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700131 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800132 std::vector<webrtc::RtpExtension> filtered =
133 FilterRtpExtensions(extensions, SupportedExtensions2, false);
134 EXPECT_EQ(12, filtered.size());
135 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700136 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800137}
138
139TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700140 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800141 std::vector<webrtc::RtpExtension> filtered =
142 FilterRtpExtensions(extensions, SupportedExtensions2, true);
143 EXPECT_EQ(6, filtered.size());
144 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700145 EXPECT_NE(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800146}
147
jbauch5869f502017-06-29 12:31:36 -0700148TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_1) {
149 std::vector<RtpExtension> extensions;
150 extensions.push_back(webrtc::RtpExtension("b", 1));
151 extensions.push_back(webrtc::RtpExtension("b", 2, true));
152 extensions.push_back(webrtc::RtpExtension("c", 3));
153 extensions.push_back(webrtc::RtpExtension("b", 4));
154 std::vector<webrtc::RtpExtension> filtered =
155 FilterRtpExtensions(extensions, SupportedExtensions2, true);
156 EXPECT_EQ(3, filtered.size());
157 EXPECT_TRUE(IsSorted(filtered));
158 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
159 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
160 EXPECT_NE(filtered[0].uri, filtered[2].uri);
161 EXPECT_NE(filtered[1].uri, filtered[2].uri);
162}
163
164TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_2) {
165 std::vector<RtpExtension> extensions;
166 extensions.push_back(webrtc::RtpExtension("b", 1, true));
167 extensions.push_back(webrtc::RtpExtension("b", 2));
168 extensions.push_back(webrtc::RtpExtension("c", 3));
169 extensions.push_back(webrtc::RtpExtension("b", 4));
170 std::vector<webrtc::RtpExtension> filtered =
171 FilterRtpExtensions(extensions, SupportedExtensions2, true);
172 EXPECT_EQ(3, filtered.size());
173 EXPECT_TRUE(IsSorted(filtered));
174 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
175 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
176 EXPECT_NE(filtered[0].uri, filtered[2].uri);
177 EXPECT_NE(filtered[1].uri, filtered[2].uri);
178}
179
solenberg7e4e01a2015-12-02 08:05:01 -0800180TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700181 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800182 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700183 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
184 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
185 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
solenberg7e4e01a2015-12-02 08:05:01 -0800186 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700187 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
188 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800189 std::vector<webrtc::RtpExtension> filtered =
190 FilterRtpExtensions(extensions, SupportedExtensions2, true);
191 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700192 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800193}
194
jbauch5869f502017-06-29 12:31:36 -0700195TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
196 std::vector<RtpExtension> extensions;
197 extensions.push_back(
198 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
199 extensions.push_back(
200 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
201 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
202 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
203 extensions.push_back(
204 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
205 extensions.push_back(
206 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
207 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
208 std::vector<webrtc::RtpExtension> filtered =
209 FilterRtpExtensions(extensions, SupportedExtensions2, true);
210 EXPECT_EQ(2, filtered.size());
211 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
212 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
213 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
214}
215
solenberg7e4e01a2015-12-02 08:05:01 -0800216TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700217 std::vector<RtpExtension> extensions;
218 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
219 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
220 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
solenberg7e4e01a2015-12-02 08:05:01 -0800221 std::vector<webrtc::RtpExtension> filtered =
222 FilterRtpExtensions(extensions, SupportedExtensions2, true);
223 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700224 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800225}
226
227TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
isheriff6f8d6862016-05-26 11:24:55 -0700228 std::vector<RtpExtension> extensions;
229 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
230 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800231 std::vector<webrtc::RtpExtension> filtered =
232 FilterRtpExtensions(extensions, SupportedExtensions2, true);
233 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700234 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800235}
ossu111744e2016-06-15 02:22:32 -0700236
237TEST(WebRtcMediaEngineFactoryTest, CreateOldApi) {
238 std::unique_ptr<MediaEngineInterface> engine(
239 WebRtcMediaEngineFactory::Create(nullptr, nullptr, nullptr));
240 EXPECT_TRUE(engine);
241}
242
243TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) {
244 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
ossueb1fde42017-05-02 06:46:30 -0700245 nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
246 webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr));
ossu111744e2016-06-15 02:22:32 -0700247 EXPECT_TRUE(engine);
248}
249
solenberg7e4e01a2015-12-02 08:05:01 -0800250} // namespace cricket