webrtc_media_engine_unittest.cc (13109B)
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 <string> 14 #include <utility> 15 #include <vector> 16 17 #include "absl/strings/string_view.h" 18 #include "api/field_trials.h" 19 #include "api/rtp_parameters.h" 20 #include "test/create_test_field_trials.h" 21 #include "test/gtest.h" 22 23 namespace webrtc { 24 namespace { 25 26 std::vector<RtpExtension> MakeUniqueExtensions() { 27 std::vector<RtpExtension> result; 28 char name[] = "a"; 29 for (int i = 0; i < 7; ++i) { 30 result.push_back(RtpExtension(name, 1 + i)); 31 name[0]++; 32 result.push_back(RtpExtension(name, 255 - i)); 33 name[0]++; 34 } 35 return result; 36 } 37 38 std::vector<RtpExtension> MakeRedundantExtensions() { 39 std::vector<RtpExtension> result; 40 char name[] = "a"; 41 for (int i = 0; i < 7; ++i) { 42 result.push_back(RtpExtension(name, 1 + i)); 43 result.push_back(RtpExtension(name, 255 - i)); 44 name[0]++; 45 } 46 return result; 47 } 48 49 bool SupportedExtensions1(absl::string_view name) { 50 return name == "c" || name == "i"; 51 } 52 53 bool SupportedExtensions2(absl::string_view name) { 54 return name != "a" && name != "n"; 55 } 56 57 bool IsSorted(const std::vector<RtpExtension>& extensions) { 58 const std::string* last = nullptr; 59 for (const auto& extension : extensions) { 60 if (last && *last > extension.uri) { 61 return false; 62 } 63 last = &extension.uri; 64 } 65 return true; 66 } 67 } // namespace 68 69 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsEmptyList) { 70 std::vector<RtpExtension> extensions; 71 EXPECT_TRUE(ValidateRtpExtensions(extensions, {})); 72 } 73 74 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsAllGood) { 75 std::vector<RtpExtension> extensions = MakeUniqueExtensions(); 76 EXPECT_TRUE(ValidateRtpExtensions(extensions, {})); 77 } 78 79 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsOutOfRangeId_Low) { 80 std::vector<RtpExtension> extensions = MakeUniqueExtensions(); 81 extensions.push_back(RtpExtension("foo", 0)); 82 EXPECT_FALSE(ValidateRtpExtensions(extensions, {})); 83 } 84 85 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsOutOfRangeIdHigh) { 86 std::vector<RtpExtension> extensions = MakeUniqueExtensions(); 87 extensions.push_back(RtpExtension("foo", 256)); 88 EXPECT_FALSE(ValidateRtpExtensions(extensions, {})); 89 } 90 91 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsOverlappingIdsStartOfSet) { 92 std::vector<RtpExtension> extensions = MakeUniqueExtensions(); 93 extensions.push_back(RtpExtension("foo", 1)); 94 EXPECT_FALSE(ValidateRtpExtensions(extensions, {})); 95 } 96 97 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsOverlappingIdsEndOfSet) { 98 std::vector<RtpExtension> extensions = MakeUniqueExtensions(); 99 extensions.push_back(RtpExtension("foo", 255)); 100 EXPECT_FALSE(ValidateRtpExtensions(extensions, {})); 101 } 102 103 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsEmptyToEmpty) { 104 std::vector<RtpExtension> extensions; 105 EXPECT_TRUE(ValidateRtpExtensions(extensions, extensions)); 106 } 107 108 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsNoChange) { 109 std::vector<RtpExtension> extensions = MakeUniqueExtensions(); 110 EXPECT_TRUE(ValidateRtpExtensions(extensions, extensions)); 111 } 112 113 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsChangeIdNotUrl) { 114 std::vector<RtpExtension> old_extensions = MakeUniqueExtensions(); 115 std::vector<RtpExtension> new_extensions = old_extensions; 116 std::swap(new_extensions[0].id, new_extensions[1].id); 117 118 EXPECT_FALSE(ValidateRtpExtensions(new_extensions, old_extensions)); 119 } 120 121 TEST(WebRtcMediaEngineTest, ValidateRtpExtensionsChangeIdForUrl) { 122 std::vector<RtpExtension> old_extensions = MakeUniqueExtensions(); 123 std::vector<RtpExtension> new_extensions = old_extensions; 124 // Change first extension to something not generated by MakeUniqueExtensions 125 new_extensions[0].id = 123; 126 127 EXPECT_FALSE(ValidateRtpExtensions(new_extensions, old_extensions)); 128 } 129 130 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsEmptyList) { 131 std::vector<RtpExtension> extensions; 132 FieldTrials trials = CreateTestFieldTrials(); 133 std::vector<RtpExtension> filtered = 134 FilterRtpExtensions(extensions, SupportedExtensions1, true, trials); 135 EXPECT_EQ(0u, filtered.size()); 136 } 137 138 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsIncludeOnlySupported) { 139 std::vector<RtpExtension> extensions = MakeUniqueExtensions(); 140 FieldTrials trials = CreateTestFieldTrials(); 141 std::vector<RtpExtension> filtered = 142 FilterRtpExtensions(extensions, SupportedExtensions1, false, trials); 143 EXPECT_EQ(2u, filtered.size()); 144 EXPECT_EQ("c", filtered[0].uri); 145 EXPECT_EQ("i", filtered[1].uri); 146 } 147 148 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsSortedByName1) { 149 std::vector<RtpExtension> extensions = MakeUniqueExtensions(); 150 FieldTrials trials = CreateTestFieldTrials(); 151 std::vector<RtpExtension> filtered = 152 FilterRtpExtensions(extensions, SupportedExtensions2, false, trials); 153 EXPECT_EQ(12u, filtered.size()); 154 EXPECT_TRUE(IsSorted(filtered)); 155 } 156 157 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsSortedByName2) { 158 std::vector<RtpExtension> extensions = MakeUniqueExtensions(); 159 FieldTrials trials = CreateTestFieldTrials(); 160 std::vector<RtpExtension> filtered = 161 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 162 EXPECT_EQ(12u, filtered.size()); 163 EXPECT_TRUE(IsSorted(filtered)); 164 } 165 166 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsDontRemoveRedundant) { 167 std::vector<RtpExtension> extensions = MakeRedundantExtensions(); 168 FieldTrials trials = CreateTestFieldTrials(); 169 std::vector<RtpExtension> filtered = 170 FilterRtpExtensions(extensions, SupportedExtensions2, false, trials); 171 EXPECT_EQ(12u, filtered.size()); 172 EXPECT_TRUE(IsSorted(filtered)); 173 EXPECT_EQ(filtered[0].uri, filtered[1].uri); 174 } 175 176 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundant) { 177 std::vector<RtpExtension> extensions = MakeRedundantExtensions(); 178 FieldTrials trials = CreateTestFieldTrials(); 179 std::vector<RtpExtension> filtered = 180 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 181 EXPECT_EQ(6u, filtered.size()); 182 EXPECT_TRUE(IsSorted(filtered)); 183 EXPECT_NE(filtered[0].uri, filtered[1].uri); 184 } 185 186 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantEncrypted1) { 187 std::vector<RtpExtension> extensions; 188 extensions.push_back(RtpExtension("b", 1)); 189 extensions.push_back(RtpExtension("b", 2, true)); 190 extensions.push_back(RtpExtension("c", 3)); 191 extensions.push_back(RtpExtension("b", 4)); 192 FieldTrials trials = CreateTestFieldTrials(); 193 std::vector<RtpExtension> filtered = 194 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 195 EXPECT_EQ(3u, filtered.size()); 196 EXPECT_TRUE(IsSorted(filtered)); 197 EXPECT_EQ(filtered[0].uri, filtered[1].uri); 198 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt); 199 EXPECT_NE(filtered[0].uri, filtered[2].uri); 200 EXPECT_NE(filtered[1].uri, filtered[2].uri); 201 } 202 203 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantEncrypted2) { 204 std::vector<RtpExtension> extensions; 205 extensions.push_back(RtpExtension("b", 1, true)); 206 extensions.push_back(RtpExtension("b", 2)); 207 extensions.push_back(RtpExtension("c", 3)); 208 extensions.push_back(RtpExtension("b", 4)); 209 FieldTrials trials = CreateTestFieldTrials(); 210 std::vector<RtpExtension> filtered = 211 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 212 EXPECT_EQ(3u, filtered.size()); 213 EXPECT_TRUE(IsSorted(filtered)); 214 EXPECT_EQ(filtered[0].uri, filtered[1].uri); 215 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt); 216 EXPECT_NE(filtered[0].uri, filtered[2].uri); 217 EXPECT_NE(filtered[1].uri, filtered[2].uri); 218 } 219 220 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantBwe1) { 221 FieldTrials trials = 222 CreateTestFieldTrials("WebRTC-FilterAbsSendTimeExtension/Enabled/"); 223 std::vector<RtpExtension> extensions; 224 extensions.push_back( 225 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3)); 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(RtpExtension(RtpExtension::kTimestampOffsetUri, 14)); 231 std::vector<RtpExtension> filtered = 232 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 233 EXPECT_EQ(1u, filtered.size()); 234 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri); 235 } 236 237 TEST(WebRtcMediaEngineTest, 238 FilterRtpExtensionsRemoveRedundantBwe1KeepAbsSendTime) { 239 std::vector<RtpExtension> extensions; 240 extensions.push_back( 241 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3)); 242 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9)); 243 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6)); 244 extensions.push_back( 245 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1)); 246 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14)); 247 FieldTrials trials = CreateTestFieldTrials(); 248 std::vector<RtpExtension> filtered = 249 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 250 EXPECT_EQ(2u, filtered.size()); 251 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri); 252 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[1].uri); 253 } 254 255 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantBweEncrypted1) { 256 FieldTrials trials = 257 CreateTestFieldTrials("WebRTC-FilterAbsSendTimeExtension/Enabled/"); 258 std::vector<RtpExtension> extensions; 259 extensions.push_back( 260 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3)); 261 extensions.push_back( 262 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true)); 263 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9)); 264 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6)); 265 extensions.push_back( 266 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1)); 267 extensions.push_back( 268 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true)); 269 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14)); 270 std::vector<RtpExtension> filtered = 271 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 272 EXPECT_EQ(2u, filtered.size()); 273 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri); 274 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri); 275 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt); 276 } 277 278 TEST(WebRtcMediaEngineTest, 279 FilterRtpExtensionsRemoveRedundantBweEncrypted1KeepAbsSendTime) { 280 std::vector<RtpExtension> extensions; 281 extensions.push_back( 282 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3)); 283 extensions.push_back( 284 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true)); 285 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9)); 286 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6)); 287 extensions.push_back( 288 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1)); 289 extensions.push_back( 290 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true)); 291 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14)); 292 FieldTrials trials = CreateTestFieldTrials(); 293 std::vector<RtpExtension> filtered = 294 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 295 EXPECT_EQ(3u, filtered.size()); 296 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri); 297 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri); 298 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[2].uri); 299 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt); 300 } 301 302 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantBwe2) { 303 std::vector<RtpExtension> extensions; 304 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1)); 305 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14)); 306 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7)); 307 FieldTrials trials = CreateTestFieldTrials(); 308 std::vector<RtpExtension> filtered = 309 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 310 EXPECT_EQ(1u, filtered.size()); 311 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri); 312 } 313 314 TEST(WebRtcMediaEngineTest, FilterRtpExtensionsRemoveRedundantBwe3) { 315 std::vector<RtpExtension> extensions; 316 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2)); 317 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14)); 318 FieldTrials trials = CreateTestFieldTrials(); 319 std::vector<RtpExtension> filtered = 320 FilterRtpExtensions(extensions, SupportedExtensions2, true, trials); 321 EXPECT_EQ(1u, filtered.size()); 322 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri); 323 } 324 325 } // namespace webrtc