blob: 141632414683b63e6e61b32de7762a6234b7928c [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
kwiberg77eab702016-09-28 17:42:01 -070011#include "webrtc/test/gtest.h"
solenberg7e4e01a2015-12-02 08:05:01 -080012
ossu111744e2016-06-15 02:22:32 -070013#include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010014#include "webrtc/media/engine/webrtcmediaengine.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
148TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700149 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800150 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700151 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
152 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
153 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
solenberg7e4e01a2015-12-02 08:05:01 -0800154 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700155 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
156 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800157 std::vector<webrtc::RtpExtension> filtered =
158 FilterRtpExtensions(extensions, SupportedExtensions2, true);
159 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700160 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800161}
162
163TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700164 std::vector<RtpExtension> extensions;
165 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
166 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
167 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
solenberg7e4e01a2015-12-02 08:05:01 -0800168 std::vector<webrtc::RtpExtension> filtered =
169 FilterRtpExtensions(extensions, SupportedExtensions2, true);
170 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700171 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800172}
173
174TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
isheriff6f8d6862016-05-26 11:24:55 -0700175 std::vector<RtpExtension> extensions;
176 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
177 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800178 std::vector<webrtc::RtpExtension> filtered =
179 FilterRtpExtensions(extensions, SupportedExtensions2, true);
180 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700181 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800182}
ossu111744e2016-06-15 02:22:32 -0700183
184TEST(WebRtcMediaEngineFactoryTest, CreateOldApi) {
185 std::unique_ptr<MediaEngineInterface> engine(
186 WebRtcMediaEngineFactory::Create(nullptr, nullptr, nullptr));
187 EXPECT_TRUE(engine);
188}
189
190TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) {
191 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
192 nullptr, webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr));
193 EXPECT_TRUE(engine);
194}
195
solenberg7e4e01a2015-12-02 08:05:01 -0800196} // namespace cricket