• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3  *
4  *  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.
9  */
10 
11 #include "media/engine/webrtc_media_engine.h"
12 
13 #include <memory>
14 #include <utility>
15 
16 #include "media/engine/webrtc_media_engine_defaults.h"
17 #include "test/field_trial.h"
18 #include "test/gtest.h"
19 
20 using webrtc::RtpExtension;
21 
22 namespace cricket {
23 namespace {
24 
MakeUniqueExtensions()25 std::vector<RtpExtension> MakeUniqueExtensions() {
26   std::vector<RtpExtension> result;
27   char name[] = "a";
28   for (int i = 0; i < 7; ++i) {
29     result.push_back(RtpExtension(name, 1 + i));
30     name[0]++;
31     result.push_back(RtpExtension(name, 255 - i));
32     name[0]++;
33   }
34   return result;
35 }
36 
MakeRedundantExtensions()37 std::vector<RtpExtension> MakeRedundantExtensions() {
38   std::vector<RtpExtension> result;
39   char name[] = "a";
40   for (int i = 0; i < 7; ++i) {
41     result.push_back(RtpExtension(name, 1 + i));
42     result.push_back(RtpExtension(name, 255 - i));
43     name[0]++;
44   }
45   return result;
46 }
47 
SupportedExtensions1(absl::string_view name)48 bool SupportedExtensions1(absl::string_view name) {
49   return name == "c" || name == "i";
50 }
51 
SupportedExtensions2(absl::string_view name)52 bool SupportedExtensions2(absl::string_view name) {
53   return name != "a" && name != "n";
54 }
55 
IsSorted(const std::vector<webrtc::RtpExtension> & extensions)56 bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
57   const std::string* last = nullptr;
58   for (const auto& extension : extensions) {
59     if (last && *last > extension.uri) {
60       return false;
61     }
62     last = &extension.uri;
63   }
64   return true;
65 }
66 }  // namespace
67 
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_EmptyList)68 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
69   std::vector<RtpExtension> extensions;
70   EXPECT_TRUE(ValidateRtpExtensions(extensions));
71 }
72 
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_AllGood)73 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
74   std::vector<RtpExtension> extensions = MakeUniqueExtensions();
75   EXPECT_TRUE(ValidateRtpExtensions(extensions));
76 }
77 
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_OutOfRangeId_Low)78 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
79   std::vector<RtpExtension> extensions = MakeUniqueExtensions();
80   extensions.push_back(RtpExtension("foo", 0));
81   EXPECT_FALSE(ValidateRtpExtensions(extensions));
82 }
83 
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_OutOfRangeId_High)84 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
85   std::vector<RtpExtension> extensions = MakeUniqueExtensions();
86   extensions.push_back(RtpExtension("foo", 256));
87   EXPECT_FALSE(ValidateRtpExtensions(extensions));
88 }
89 
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_OverlappingIds_StartOfSet)90 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
91   std::vector<RtpExtension> extensions = MakeUniqueExtensions();
92   extensions.push_back(RtpExtension("foo", 1));
93   EXPECT_FALSE(ValidateRtpExtensions(extensions));
94 }
95 
TEST(WebRtcMediaEngineTest,ValidateRtpExtensions_OverlappingIds_EndOfSet)96 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
97   std::vector<RtpExtension> extensions = MakeUniqueExtensions();
98   extensions.push_back(RtpExtension("foo", 255));
99   EXPECT_FALSE(ValidateRtpExtensions(extensions));
100 }
101 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_EmptyList)102 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
103   std::vector<RtpExtension> extensions;
104   std::vector<webrtc::RtpExtension> filtered =
105       FilterRtpExtensions(extensions, SupportedExtensions1, true);
106   EXPECT_EQ(0u, filtered.size());
107 }
108 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_IncludeOnlySupported)109 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
110   std::vector<RtpExtension> extensions = MakeUniqueExtensions();
111   std::vector<webrtc::RtpExtension> filtered =
112       FilterRtpExtensions(extensions, SupportedExtensions1, false);
113   EXPECT_EQ(2u, filtered.size());
114   EXPECT_EQ("c", filtered[0].uri);
115   EXPECT_EQ("i", filtered[1].uri);
116 }
117 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_SortedByName_1)118 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
119   std::vector<RtpExtension> extensions = MakeUniqueExtensions();
120   std::vector<webrtc::RtpExtension> filtered =
121       FilterRtpExtensions(extensions, SupportedExtensions2, false);
122   EXPECT_EQ(12u, filtered.size());
123   EXPECT_TRUE(IsSorted(filtered));
124 }
125 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_SortedByName_2)126 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
127   std::vector<RtpExtension> extensions = MakeUniqueExtensions();
128   std::vector<webrtc::RtpExtension> filtered =
129       FilterRtpExtensions(extensions, SupportedExtensions2, true);
130   EXPECT_EQ(12u, filtered.size());
131   EXPECT_TRUE(IsSorted(filtered));
132 }
133 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_DontRemoveRedundant)134 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
135   std::vector<RtpExtension> extensions = MakeRedundantExtensions();
136   std::vector<webrtc::RtpExtension> filtered =
137       FilterRtpExtensions(extensions, SupportedExtensions2, false);
138   EXPECT_EQ(12u, filtered.size());
139   EXPECT_TRUE(IsSorted(filtered));
140   EXPECT_EQ(filtered[0].uri, filtered[1].uri);
141 }
142 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundant)143 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
144   std::vector<RtpExtension> extensions = MakeRedundantExtensions();
145   std::vector<webrtc::RtpExtension> filtered =
146       FilterRtpExtensions(extensions, SupportedExtensions2, true);
147   EXPECT_EQ(6u, filtered.size());
148   EXPECT_TRUE(IsSorted(filtered));
149   EXPECT_NE(filtered[0].uri, filtered[1].uri);
150 }
151 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantEncrypted_1)152 TEST(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);
160   EXPECT_EQ(3u, filtered.size());
161   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 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantEncrypted_2)168 TEST(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);
176   EXPECT_EQ(3u, filtered.size());
177   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 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBwe_1)184 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
185   webrtc::test::ScopedFieldTrials override_field_trials_(
186       "WebRTC-FilterAbsSendTimeExtension/Enabled/");
187   std::vector<RtpExtension> extensions;
188   extensions.push_back(
189       RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
190   extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
191   extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
192   extensions.push_back(
193       RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
194   extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
195   std::vector<webrtc::RtpExtension> filtered =
196       FilterRtpExtensions(extensions, SupportedExtensions2, true);
197   EXPECT_EQ(1u, filtered.size());
198   EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
199 }
200 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBwe_1_KeepAbsSendTime)201 TEST(WebRtcMediaEngineTest,
202      FilterRtpExtensions_RemoveRedundantBwe_1_KeepAbsSendTime) {
203   std::vector<RtpExtension> extensions;
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 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBweEncrypted_1)218 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
219   webrtc::test::ScopedFieldTrials override_field_trials_(
220       "WebRTC-FilterAbsSendTimeExtension/Enabled/");
221   std::vector<RtpExtension> extensions;
222   extensions.push_back(
223       RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
224   extensions.push_back(
225       RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
226   extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
227   extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
228   extensions.push_back(
229       RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
230   extensions.push_back(
231       RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
232   extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
233   std::vector<webrtc::RtpExtension> filtered =
234       FilterRtpExtensions(extensions, SupportedExtensions2, true);
235   EXPECT_EQ(2u, filtered.size());
236   EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
237   EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
238   EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
239 }
240 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBweEncrypted_1_KeepAbsSendTime)241 TEST(WebRtcMediaEngineTest,
242      FilterRtpExtensions_RemoveRedundantBweEncrypted_1_KeepAbsSendTime) {
243   std::vector<RtpExtension> extensions;
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 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBwe_2)264 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
265   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));
269   std::vector<webrtc::RtpExtension> filtered =
270       FilterRtpExtensions(extensions, SupportedExtensions2, true);
271   EXPECT_EQ(1u, filtered.size());
272   EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
273 }
274 
TEST(WebRtcMediaEngineTest,FilterRtpExtensions_RemoveRedundantBwe_3)275 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
276   std::vector<RtpExtension> extensions;
277   extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
278   extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
279   std::vector<webrtc::RtpExtension> filtered =
280       FilterRtpExtensions(extensions, SupportedExtensions2, true);
281   EXPECT_EQ(1u, filtered.size());
282   EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
283 }
284 
TEST(WebRtcMediaEngineTest,Create)285 TEST(WebRtcMediaEngineTest, Create) {
286   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 
295 }  // namespace cricket
296