blob: c58c75b0c3a81a15e3089b3b29748565f44758e2 [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
kwiberg087bd342017-02-10 08:15:44 -080011#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010012#include "webrtc/media/engine/webrtcmediaengine.h"
kwibergac9f8762016-09-30 22:29:43 -070013#include "webrtc/test/gtest.h"
solenberg7e4e01a2015-12-02 08:05:01 -080014
isheriff6f8d6862016-05-26 11:24:55 -070015using webrtc::RtpExtension;
16
solenberg7e4e01a2015-12-02 08:05:01 -080017namespace cricket {
18namespace {
19
isheriff6f8d6862016-05-26 11:24:55 -070020std::vector<RtpExtension> MakeUniqueExtensions() {
21 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080022 char name[] = "a";
23 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070024 result.push_back(RtpExtension(name, 1 + i));
solenberg7e4e01a2015-12-02 08:05:01 -080025 name[0]++;
isheriff6f8d6862016-05-26 11:24:55 -070026 result.push_back(RtpExtension(name, 14 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080027 name[0]++;
28 }
29 return result;
30}
31
isheriff6f8d6862016-05-26 11:24:55 -070032std::vector<RtpExtension> MakeRedundantExtensions() {
33 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080034 char name[] = "a";
35 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070036 result.push_back(RtpExtension(name, 1 + i));
37 result.push_back(RtpExtension(name, 14 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080038 name[0]++;
39 }
40 return result;
41}
42
43bool SupportedExtensions1(const std::string& name) {
44 return name == "c" || name == "i";
45}
46
47bool SupportedExtensions2(const std::string& name) {
48 return name != "a" && name != "n";
49}
50
51bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
52 const std::string* last = nullptr;
53 for (const auto& extension : extensions) {
isheriff6f8d6862016-05-26 11:24:55 -070054 if (last && *last > extension.uri) {
solenberg7e4e01a2015-12-02 08:05:01 -080055 return false;
56 }
isheriff6f8d6862016-05-26 11:24:55 -070057 last = &extension.uri;
solenberg7e4e01a2015-12-02 08:05:01 -080058 }
59 return true;
60}
61} // namespace
62
63TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070064 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -080065 EXPECT_TRUE(ValidateRtpExtensions(extensions));
66}
67
68TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
isheriff6f8d6862016-05-26 11:24:55 -070069 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -080070 EXPECT_TRUE(ValidateRtpExtensions(extensions));
71}
72
73TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
isheriff6f8d6862016-05-26 11:24:55 -070074 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
75 extensions.push_back(RtpExtension("foo", 0));
solenberg7e4e01a2015-12-02 08:05:01 -080076 EXPECT_FALSE(ValidateRtpExtensions(extensions));
77}
78
79TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
isheriff6f8d6862016-05-26 11:24:55 -070080 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
81 extensions.push_back(RtpExtension("foo", 15));
solenberg7e4e01a2015-12-02 08:05:01 -080082 EXPECT_FALSE(ValidateRtpExtensions(extensions));
83}
84
85TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070086 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
87 extensions.push_back(RtpExtension("foo", 1));
solenberg7e4e01a2015-12-02 08:05:01 -080088 EXPECT_FALSE(ValidateRtpExtensions(extensions));
89}
90
91TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070092 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
93 extensions.push_back(RtpExtension("foo", 14));
solenberg7e4e01a2015-12-02 08:05:01 -080094 EXPECT_FALSE(ValidateRtpExtensions(extensions));
95}
96
97TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070098 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -080099 std::vector<webrtc::RtpExtension> filtered =
100 FilterRtpExtensions(extensions, SupportedExtensions1, true);
101 EXPECT_EQ(0, filtered.size());
102}
103
104TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
isheriff6f8d6862016-05-26 11:24:55 -0700105 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800106 std::vector<webrtc::RtpExtension> filtered =
107 FilterRtpExtensions(extensions, SupportedExtensions1, false);
108 EXPECT_EQ(2, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700109 EXPECT_EQ("c", filtered[0].uri);
110 EXPECT_EQ("i", filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800111}
112
113TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700114 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800115 std::vector<webrtc::RtpExtension> filtered =
116 FilterRtpExtensions(extensions, SupportedExtensions2, false);
117 EXPECT_EQ(12, filtered.size());
118 EXPECT_TRUE(IsSorted(filtered));
119}
120
121TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700122 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800123 std::vector<webrtc::RtpExtension> filtered =
124 FilterRtpExtensions(extensions, SupportedExtensions2, true);
125 EXPECT_EQ(12, filtered.size());
126 EXPECT_TRUE(IsSorted(filtered));
127}
128
129TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700130 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800131 std::vector<webrtc::RtpExtension> filtered =
132 FilterRtpExtensions(extensions, SupportedExtensions2, false);
133 EXPECT_EQ(12, filtered.size());
134 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700135 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800136}
137
138TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700139 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800140 std::vector<webrtc::RtpExtension> filtered =
141 FilterRtpExtensions(extensions, SupportedExtensions2, true);
142 EXPECT_EQ(6, filtered.size());
143 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700144 EXPECT_NE(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800145}
146
147TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700148 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800149 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700150 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
151 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
152 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
solenberg7e4e01a2015-12-02 08:05:01 -0800153 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700154 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
155 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800156 std::vector<webrtc::RtpExtension> filtered =
157 FilterRtpExtensions(extensions, SupportedExtensions2, true);
158 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700159 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800160}
161
162TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700163 std::vector<RtpExtension> extensions;
164 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
165 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
166 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
solenberg7e4e01a2015-12-02 08:05:01 -0800167 std::vector<webrtc::RtpExtension> filtered =
168 FilterRtpExtensions(extensions, SupportedExtensions2, true);
169 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700170 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800171}
172
173TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
isheriff6f8d6862016-05-26 11:24:55 -0700174 std::vector<RtpExtension> extensions;
175 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
176 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800177 std::vector<webrtc::RtpExtension> filtered =
178 FilterRtpExtensions(extensions, SupportedExtensions2, true);
179 EXPECT_EQ(1, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700180 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800181}
ossu111744e2016-06-15 02:22:32 -0700182
183TEST(WebRtcMediaEngineFactoryTest, CreateOldApi) {
184 std::unique_ptr<MediaEngineInterface> engine(
185 WebRtcMediaEngineFactory::Create(nullptr, nullptr, nullptr));
186 EXPECT_TRUE(engine);
187}
188
189TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) {
190 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
gyzhou39ce11f2016-12-12 17:06:49 -0800191 nullptr, webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr));
ossu111744e2016-06-15 02:22:32 -0700192 EXPECT_TRUE(engine);
193}
194
solenberg7e4e01a2015-12-02 08:05:01 -0800195} // namespace cricket