blob: 1e881c639092ef4cd6127d9ffd4e0ae2f31ea842 [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
Steve Antone78bcb92017-10-31 09:53:08 -070011#include <memory>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "api/audio_codecs/builtin_audio_decoder_factory.h"
14#include "api/audio_codecs/builtin_audio_encoder_factory.h"
15#include "media/engine/webrtcmediaengine.h"
16#include "test/gtest.h"
solenberg7e4e01a2015-12-02 08:05:01 -080017
isheriff6f8d6862016-05-26 11:24:55 -070018using webrtc::RtpExtension;
19
solenberg7e4e01a2015-12-02 08:05:01 -080020namespace cricket {
21namespace {
22
isheriff6f8d6862016-05-26 11:24:55 -070023std::vector<RtpExtension> MakeUniqueExtensions() {
24 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080025 char name[] = "a";
26 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070027 result.push_back(RtpExtension(name, 1 + i));
solenberg7e4e01a2015-12-02 08:05:01 -080028 name[0]++;
isheriff6f8d6862016-05-26 11:24:55 -070029 result.push_back(RtpExtension(name, 14 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080030 name[0]++;
31 }
32 return result;
33}
34
isheriff6f8d6862016-05-26 11:24:55 -070035std::vector<RtpExtension> MakeRedundantExtensions() {
36 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080037 char name[] = "a";
38 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070039 result.push_back(RtpExtension(name, 1 + i));
40 result.push_back(RtpExtension(name, 14 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080041 name[0]++;
42 }
43 return result;
44}
45
46bool SupportedExtensions1(const std::string& name) {
47 return name == "c" || name == "i";
48}
49
50bool SupportedExtensions2(const std::string& name) {
51 return name != "a" && name != "n";
52}
53
54bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
55 const std::string* last = nullptr;
56 for (const auto& extension : extensions) {
isheriff6f8d6862016-05-26 11:24:55 -070057 if (last && *last > extension.uri) {
solenberg7e4e01a2015-12-02 08:05:01 -080058 return false;
59 }
isheriff6f8d6862016-05-26 11:24:55 -070060 last = &extension.uri;
solenberg7e4e01a2015-12-02 08:05:01 -080061 }
62 return true;
63}
64} // namespace
65
66TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070067 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -080068 EXPECT_TRUE(ValidateRtpExtensions(extensions));
69}
70
71TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
isheriff6f8d6862016-05-26 11:24:55 -070072 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -080073 EXPECT_TRUE(ValidateRtpExtensions(extensions));
74}
75
76TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
isheriff6f8d6862016-05-26 11:24:55 -070077 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
78 extensions.push_back(RtpExtension("foo", 0));
solenberg7e4e01a2015-12-02 08:05:01 -080079 EXPECT_FALSE(ValidateRtpExtensions(extensions));
80}
81
82TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
isheriff6f8d6862016-05-26 11:24:55 -070083 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
84 extensions.push_back(RtpExtension("foo", 15));
solenberg7e4e01a2015-12-02 08:05:01 -080085 EXPECT_FALSE(ValidateRtpExtensions(extensions));
86}
87
88TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070089 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
90 extensions.push_back(RtpExtension("foo", 1));
solenberg7e4e01a2015-12-02 08:05:01 -080091 EXPECT_FALSE(ValidateRtpExtensions(extensions));
92}
93
94TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070095 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
96 extensions.push_back(RtpExtension("foo", 14));
solenberg7e4e01a2015-12-02 08:05:01 -080097 EXPECT_FALSE(ValidateRtpExtensions(extensions));
98}
99
100TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -0700101 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800102 std::vector<webrtc::RtpExtension> filtered =
103 FilterRtpExtensions(extensions, SupportedExtensions1, true);
104 EXPECT_EQ(0, filtered.size());
105}
106
107TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
isheriff6f8d6862016-05-26 11:24:55 -0700108 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800109 std::vector<webrtc::RtpExtension> filtered =
110 FilterRtpExtensions(extensions, SupportedExtensions1, false);
111 EXPECT_EQ(2, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700112 EXPECT_EQ("c", filtered[0].uri);
113 EXPECT_EQ("i", filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800114}
115
116TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700117 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800118 std::vector<webrtc::RtpExtension> filtered =
119 FilterRtpExtensions(extensions, SupportedExtensions2, false);
120 EXPECT_EQ(12, filtered.size());
121 EXPECT_TRUE(IsSorted(filtered));
122}
123
124TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700125 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800126 std::vector<webrtc::RtpExtension> filtered =
127 FilterRtpExtensions(extensions, SupportedExtensions2, true);
128 EXPECT_EQ(12, filtered.size());
129 EXPECT_TRUE(IsSorted(filtered));
130}
131
132TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700133 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800134 std::vector<webrtc::RtpExtension> filtered =
135 FilterRtpExtensions(extensions, SupportedExtensions2, false);
136 EXPECT_EQ(12, filtered.size());
137 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700138 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800139}
140
141TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700142 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800143 std::vector<webrtc::RtpExtension> filtered =
144 FilterRtpExtensions(extensions, SupportedExtensions2, true);
145 EXPECT_EQ(6, filtered.size());
146 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700147 EXPECT_NE(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800148}
149
jbauch5869f502017-06-29 12:31:36 -0700150TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_1) {
151 std::vector<RtpExtension> extensions;
152 extensions.push_back(webrtc::RtpExtension("b", 1));
153 extensions.push_back(webrtc::RtpExtension("b", 2, true));
154 extensions.push_back(webrtc::RtpExtension("c", 3));
155 extensions.push_back(webrtc::RtpExtension("b", 4));
156 std::vector<webrtc::RtpExtension> filtered =
157 FilterRtpExtensions(extensions, SupportedExtensions2, true);
158 EXPECT_EQ(3, filtered.size());
159 EXPECT_TRUE(IsSorted(filtered));
160 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
161 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
162 EXPECT_NE(filtered[0].uri, filtered[2].uri);
163 EXPECT_NE(filtered[1].uri, filtered[2].uri);
164}
165
166TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_2) {
167 std::vector<RtpExtension> extensions;
168 extensions.push_back(webrtc::RtpExtension("b", 1, true));
169 extensions.push_back(webrtc::RtpExtension("b", 2));
170 extensions.push_back(webrtc::RtpExtension("c", 3));
171 extensions.push_back(webrtc::RtpExtension("b", 4));
172 std::vector<webrtc::RtpExtension> filtered =
173 FilterRtpExtensions(extensions, SupportedExtensions2, true);
174 EXPECT_EQ(3, filtered.size());
175 EXPECT_TRUE(IsSorted(filtered));
176 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
177 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
178 EXPECT_NE(filtered[0].uri, filtered[2].uri);
179 EXPECT_NE(filtered[1].uri, filtered[2].uri);
180}
181
solenberg7e4e01a2015-12-02 08:05:01 -0800182TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700183 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800184 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700185 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
186 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
187 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
solenberg7e4e01a2015-12-02 08:05:01 -0800188 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700189 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
190 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800191 std::vector<webrtc::RtpExtension> filtered =
192 FilterRtpExtensions(extensions, SupportedExtensions2, true);
193 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700194 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800195}
196
jbauch5869f502017-06-29 12:31:36 -0700197TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
198 std::vector<RtpExtension> extensions;
199 extensions.push_back(
200 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
201 extensions.push_back(
202 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
203 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
204 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
205 extensions.push_back(
206 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
207 extensions.push_back(
208 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
209 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
210 std::vector<webrtc::RtpExtension> filtered =
211 FilterRtpExtensions(extensions, SupportedExtensions2, true);
212 EXPECT_EQ(2, filtered.size());
213 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
214 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
215 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
216}
217
solenberg7e4e01a2015-12-02 08:05:01 -0800218TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700219 std::vector<RtpExtension> extensions;
220 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
221 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
222 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
solenberg7e4e01a2015-12-02 08:05:01 -0800223 std::vector<webrtc::RtpExtension> filtered =
224 FilterRtpExtensions(extensions, SupportedExtensions2, true);
225 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700226 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800227}
228
229TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
isheriff6f8d6862016-05-26 11:24:55 -0700230 std::vector<RtpExtension> extensions;
231 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
232 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800233 std::vector<webrtc::RtpExtension> filtered =
234 FilterRtpExtensions(extensions, SupportedExtensions2, true);
235 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700236 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800237}
ossu111744e2016-06-15 02:22:32 -0700238
239TEST(WebRtcMediaEngineFactoryTest, CreateOldApi) {
240 std::unique_ptr<MediaEngineInterface> engine(
241 WebRtcMediaEngineFactory::Create(nullptr, nullptr, nullptr));
242 EXPECT_TRUE(engine);
243}
244
245TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) {
246 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
ossueb1fde42017-05-02 06:46:30 -0700247 nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
248 webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr));
ossu111744e2016-06-15 02:22:32 -0700249 EXPECT_TRUE(engine);
250}
251
solenberg7e4e01a2015-12-02 08:05:01 -0800252} // namespace cricket