rtp_parameters_unittest.cc (13983B)
1 /* 2 * Copyright (c) 2017 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 "api/rtp_parameters.h" 12 13 #include <vector> 14 15 #include "test/gtest.h" 16 17 namespace webrtc { 18 19 20 static const char kExtensionUri1[] = "extension-uri1"; 21 static const char kExtensionUri2[] = "extension-uri2"; 22 23 static const RtpExtension kExtension1(kExtensionUri1, 1); 24 static const RtpExtension kExtension1Encrypted(kExtensionUri1, 10, true); 25 static const RtpExtension kExtension2(kExtensionUri2, 2); 26 27 TEST(RtpExtensionTest, DeduplicateHeaderExtensions) { 28 std::vector<RtpExtension> extensions; 29 std::vector<RtpExtension> filtered; 30 31 extensions.clear(); 32 extensions.push_back(kExtension1); 33 extensions.push_back(kExtension1Encrypted); 34 filtered = RtpExtension::DeduplicateHeaderExtensions( 35 extensions, RtpExtension::Filter::kDiscardEncryptedExtension); 36 EXPECT_EQ(1u, filtered.size()); 37 EXPECT_EQ(std::vector<RtpExtension>{kExtension1}, filtered); 38 39 extensions.clear(); 40 extensions.push_back(kExtension1); 41 extensions.push_back(kExtension1Encrypted); 42 filtered = RtpExtension::DeduplicateHeaderExtensions( 43 extensions, RtpExtension::Filter::kPreferEncryptedExtension); 44 EXPECT_EQ(1u, filtered.size()); 45 EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered); 46 47 extensions.clear(); 48 extensions.push_back(kExtension1); 49 extensions.push_back(kExtension1Encrypted); 50 filtered = RtpExtension::DeduplicateHeaderExtensions( 51 extensions, RtpExtension::Filter::kRequireEncryptedExtension); 52 EXPECT_EQ(1u, filtered.size()); 53 EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered); 54 55 extensions.clear(); 56 extensions.push_back(kExtension1Encrypted); 57 extensions.push_back(kExtension1); 58 filtered = RtpExtension::DeduplicateHeaderExtensions( 59 extensions, RtpExtension::Filter::kDiscardEncryptedExtension); 60 EXPECT_EQ(1u, filtered.size()); 61 EXPECT_EQ(std::vector<RtpExtension>{kExtension1}, filtered); 62 63 extensions.clear(); 64 extensions.push_back(kExtension1Encrypted); 65 extensions.push_back(kExtension1); 66 filtered = RtpExtension::DeduplicateHeaderExtensions( 67 extensions, RtpExtension::Filter::kPreferEncryptedExtension); 68 EXPECT_EQ(1u, filtered.size()); 69 EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered); 70 71 extensions.clear(); 72 extensions.push_back(kExtension1Encrypted); 73 extensions.push_back(kExtension1); 74 filtered = RtpExtension::DeduplicateHeaderExtensions( 75 extensions, RtpExtension::Filter::kRequireEncryptedExtension); 76 EXPECT_EQ(1u, filtered.size()); 77 EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered); 78 79 extensions.clear(); 80 extensions.push_back(kExtension1); 81 extensions.push_back(kExtension2); 82 filtered = RtpExtension::DeduplicateHeaderExtensions( 83 extensions, RtpExtension::Filter::kDiscardEncryptedExtension); 84 EXPECT_EQ(2u, filtered.size()); 85 EXPECT_EQ(extensions, filtered); 86 filtered = RtpExtension::DeduplicateHeaderExtensions( 87 extensions, RtpExtension::Filter::kPreferEncryptedExtension); 88 EXPECT_EQ(2u, filtered.size()); 89 EXPECT_EQ(extensions, filtered); 90 filtered = RtpExtension::DeduplicateHeaderExtensions( 91 extensions, RtpExtension::Filter::kRequireEncryptedExtension); 92 EXPECT_EQ(0u, filtered.size()); 93 94 extensions.clear(); 95 extensions.push_back(kExtension1); 96 extensions.push_back(kExtension2); 97 extensions.push_back(kExtension1Encrypted); 98 filtered = RtpExtension::DeduplicateHeaderExtensions( 99 extensions, RtpExtension::Filter::kDiscardEncryptedExtension); 100 EXPECT_EQ(2u, filtered.size()); 101 EXPECT_EQ((std::vector<RtpExtension>{kExtension1, kExtension2}), filtered); 102 filtered = RtpExtension::DeduplicateHeaderExtensions( 103 extensions, RtpExtension::Filter::kPreferEncryptedExtension); 104 EXPECT_EQ(2u, filtered.size()); 105 EXPECT_EQ((std::vector<RtpExtension>{kExtension1Encrypted, kExtension2}), 106 filtered); 107 filtered = RtpExtension::DeduplicateHeaderExtensions( 108 extensions, RtpExtension::Filter::kRequireEncryptedExtension); 109 EXPECT_EQ(1u, filtered.size()); 110 EXPECT_EQ((std::vector<RtpExtension>{kExtension1Encrypted}), filtered); 111 } 112 113 // Test that the filtered vector is sorted so that for a given unsorted array of 114 // extensions, the filtered vector will always be laied out the same (for easy 115 // comparison). 116 TEST(RtpExtensionTest, DeduplicateHeaderExtensionsSorted) { 117 const std::vector<RtpExtension> extensions = { 118 RtpExtension("cde1", 11, false), RtpExtension("cde2", 12, true), 119 RtpExtension("abc1", 3, false), RtpExtension("abc2", 4, true), 120 RtpExtension("cde3", 9, true), RtpExtension("cde4", 10, false), 121 RtpExtension("abc3", 1, true), RtpExtension("abc4", 2, false), 122 RtpExtension("bcd3", 7, false), RtpExtension("bcd1", 8, true), 123 RtpExtension("bcd2", 5, true), RtpExtension("bcd4", 6, false), 124 }; 125 126 auto encrypted = RtpExtension::DeduplicateHeaderExtensions( 127 extensions, RtpExtension::Filter::kRequireEncryptedExtension); 128 129 const std::vector<RtpExtension> expected_sorted_encrypted = { 130 RtpExtension("abc2", 4, true), RtpExtension("abc3", 1, true), 131 RtpExtension("bcd1", 8, true), RtpExtension("bcd2", 5, true), 132 RtpExtension("cde2", 12, true), RtpExtension("cde3", 9, true)}; 133 EXPECT_EQ(expected_sorted_encrypted, encrypted); 134 135 auto unencypted = RtpExtension::DeduplicateHeaderExtensions( 136 extensions, RtpExtension::Filter::kDiscardEncryptedExtension); 137 138 const std::vector<RtpExtension> expected_sorted_unencrypted = { 139 RtpExtension("abc1", 3, false), RtpExtension("abc4", 2, false), 140 RtpExtension("bcd3", 7, false), RtpExtension("bcd4", 6, false), 141 RtpExtension("cde1", 11, false), RtpExtension("cde4", 10, false)}; 142 EXPECT_EQ(expected_sorted_unencrypted, unencypted); 143 } 144 145 TEST(RtpExtensionTest, FindHeaderExtensionByUriAndEncryption) { 146 std::vector<RtpExtension> extensions; 147 148 extensions.clear(); 149 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUriAndEncryption( 150 extensions, kExtensionUri1, false)); 151 152 extensions.clear(); 153 extensions.push_back(kExtension1); 154 EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUriAndEncryption( 155 extensions, kExtensionUri1, false)); 156 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUriAndEncryption( 157 extensions, kExtensionUri1, true)); 158 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUriAndEncryption( 159 extensions, kExtensionUri2, false)); 160 161 extensions.clear(); 162 extensions.push_back(kExtension1); 163 extensions.push_back(kExtension2); 164 extensions.push_back(kExtension1Encrypted); 165 EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUriAndEncryption( 166 extensions, kExtensionUri1, false)); 167 EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUriAndEncryption( 168 extensions, kExtensionUri2, false)); 169 EXPECT_EQ(kExtension1Encrypted, 170 *RtpExtension::FindHeaderExtensionByUriAndEncryption( 171 extensions, kExtensionUri1, true)); 172 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUriAndEncryption( 173 extensions, kExtensionUri2, true)); 174 } 175 176 TEST(RtpExtensionTest, FindHeaderExtensionByUri) { 177 std::vector<RtpExtension> extensions; 178 179 extensions.clear(); 180 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 181 extensions, kExtensionUri1, 182 RtpExtension::Filter::kDiscardEncryptedExtension)); 183 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 184 extensions, kExtensionUri1, 185 RtpExtension::Filter::kPreferEncryptedExtension)); 186 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 187 extensions, kExtensionUri1, 188 RtpExtension::Filter::kRequireEncryptedExtension)); 189 190 extensions.clear(); 191 extensions.push_back(kExtension1); 192 EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri( 193 extensions, kExtensionUri1, 194 RtpExtension::Filter::kDiscardEncryptedExtension)); 195 EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri( 196 extensions, kExtensionUri1, 197 RtpExtension::Filter::kPreferEncryptedExtension)); 198 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 199 extensions, kExtensionUri1, 200 RtpExtension::Filter::kRequireEncryptedExtension)); 201 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 202 extensions, kExtensionUri2, 203 RtpExtension::Filter::kDiscardEncryptedExtension)); 204 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 205 extensions, kExtensionUri2, 206 RtpExtension::Filter::kPreferEncryptedExtension)); 207 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 208 extensions, kExtensionUri2, 209 RtpExtension::Filter::kRequireEncryptedExtension)); 210 211 extensions.clear(); 212 extensions.push_back(kExtension1); 213 extensions.push_back(kExtension1Encrypted); 214 EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri( 215 extensions, kExtensionUri1, 216 RtpExtension::Filter::kDiscardEncryptedExtension)); 217 218 extensions.clear(); 219 extensions.push_back(kExtension1); 220 extensions.push_back(kExtension1Encrypted); 221 EXPECT_EQ(kExtension1Encrypted, 222 *RtpExtension::FindHeaderExtensionByUri( 223 extensions, kExtensionUri1, 224 RtpExtension::Filter::kPreferEncryptedExtension)); 225 226 extensions.clear(); 227 extensions.push_back(kExtension1); 228 extensions.push_back(kExtension1Encrypted); 229 EXPECT_EQ(kExtension1Encrypted, 230 *RtpExtension::FindHeaderExtensionByUri( 231 extensions, kExtensionUri1, 232 RtpExtension::Filter::kRequireEncryptedExtension)); 233 234 extensions.clear(); 235 extensions.push_back(kExtension1Encrypted); 236 extensions.push_back(kExtension1); 237 EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri( 238 extensions, kExtensionUri1, 239 RtpExtension::Filter::kDiscardEncryptedExtension)); 240 241 extensions.clear(); 242 extensions.push_back(kExtension1Encrypted); 243 extensions.push_back(kExtension1); 244 EXPECT_EQ(kExtension1Encrypted, 245 *RtpExtension::FindHeaderExtensionByUri( 246 extensions, kExtensionUri1, 247 RtpExtension::Filter::kPreferEncryptedExtension)); 248 249 extensions.clear(); 250 extensions.push_back(kExtension1Encrypted); 251 extensions.push_back(kExtension1); 252 EXPECT_EQ(kExtension1Encrypted, 253 *RtpExtension::FindHeaderExtensionByUri( 254 extensions, kExtensionUri1, 255 RtpExtension::Filter::kRequireEncryptedExtension)); 256 257 extensions.clear(); 258 extensions.push_back(kExtension1); 259 extensions.push_back(kExtension2); 260 EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri( 261 extensions, kExtensionUri1, 262 RtpExtension::Filter::kDiscardEncryptedExtension)); 263 EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri( 264 extensions, kExtensionUri1, 265 RtpExtension::Filter::kPreferEncryptedExtension)); 266 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 267 extensions, kExtensionUri1, 268 RtpExtension::Filter::kRequireEncryptedExtension)); 269 EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUri( 270 extensions, kExtensionUri2, 271 RtpExtension::Filter::kDiscardEncryptedExtension)); 272 EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUri( 273 extensions, kExtensionUri2, 274 RtpExtension::Filter::kPreferEncryptedExtension)); 275 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 276 extensions, kExtensionUri2, 277 RtpExtension::Filter::kRequireEncryptedExtension)); 278 279 extensions.clear(); 280 extensions.push_back(kExtension1); 281 extensions.push_back(kExtension2); 282 extensions.push_back(kExtension1Encrypted); 283 EXPECT_EQ(kExtension1, *RtpExtension::FindHeaderExtensionByUri( 284 extensions, kExtensionUri1, 285 RtpExtension::Filter::kDiscardEncryptedExtension)); 286 EXPECT_EQ(kExtension1Encrypted, 287 *RtpExtension::FindHeaderExtensionByUri( 288 extensions, kExtensionUri1, 289 RtpExtension::Filter::kPreferEncryptedExtension)); 290 EXPECT_EQ(kExtension1Encrypted, 291 *RtpExtension::FindHeaderExtensionByUri( 292 extensions, kExtensionUri1, 293 RtpExtension::Filter::kRequireEncryptedExtension)); 294 EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUri( 295 extensions, kExtensionUri2, 296 RtpExtension::Filter::kDiscardEncryptedExtension)); 297 EXPECT_EQ(kExtension2, *RtpExtension::FindHeaderExtensionByUri( 298 extensions, kExtensionUri2, 299 RtpExtension::Filter::kPreferEncryptedExtension)); 300 EXPECT_EQ(nullptr, RtpExtension::FindHeaderExtensionByUri( 301 extensions, kExtensionUri2, 302 RtpExtension::Filter::kRequireEncryptedExtension)); 303 } 304 } // namespace webrtc