tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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