1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" 6 #include "testing/gtest/include/gtest/gtest.h" 7 #include "url/gurl.h" 8 9 namespace { 10 namespace test1 { 11 #include "net/base/registry_controlled_domains/effective_tld_names_unittest1-inc.cc" 12 } 13 namespace test2 { 14 #include "net/base/registry_controlled_domains/effective_tld_names_unittest2-inc.cc" 15 } 16 namespace test3 { 17 #include "net/base/registry_controlled_domains/effective_tld_names_unittest3-inc.cc" 18 } 19 namespace test4 { 20 #include "net/base/registry_controlled_domains/effective_tld_names_unittest4-inc.cc" 21 } 22 namespace test5 { 23 #include "net/base/registry_controlled_domains/effective_tld_names_unittest5-inc.cc" 24 } 25 namespace test6 { 26 #include "net/base/registry_controlled_domains/effective_tld_names_unittest6-inc.cc" 27 } 28 } // namespace 29 30 namespace net { 31 namespace registry_controlled_domains { 32 namespace { 33 34 std::string GetDomainFromURL(const std::string& url) { 35 return GetDomainAndRegistry(GURL(url), EXCLUDE_PRIVATE_REGISTRIES); 36 } 37 38 std::string GetDomainFromHost(const std::string& host) { 39 return GetDomainAndRegistry(host, EXCLUDE_PRIVATE_REGISTRIES); 40 } 41 42 size_t GetRegistryLengthFromURL( 43 const std::string& url, 44 UnknownRegistryFilter unknown_filter) { 45 return GetRegistryLength(GURL(url), 46 unknown_filter, 47 EXCLUDE_PRIVATE_REGISTRIES); 48 } 49 50 size_t GetRegistryLengthFromURLIncludingPrivate( 51 const std::string& url, 52 UnknownRegistryFilter unknown_filter) { 53 return GetRegistryLength(GURL(url), 54 unknown_filter, 55 INCLUDE_PRIVATE_REGISTRIES); 56 } 57 58 size_t GetRegistryLengthFromHost( 59 const std::string& host, 60 UnknownRegistryFilter unknown_filter) { 61 return GetRegistryLength(host, unknown_filter, EXCLUDE_PRIVATE_REGISTRIES); 62 } 63 64 size_t GetRegistryLengthFromHostIncludingPrivate( 65 const std::string& host, 66 UnknownRegistryFilter unknown_filter) { 67 return GetRegistryLength(host, unknown_filter, INCLUDE_PRIVATE_REGISTRIES); 68 } 69 70 bool CompareDomains(const std::string& url1, const std::string& url2) { 71 GURL g1 = GURL(url1); 72 GURL g2 = GURL(url2); 73 return SameDomainOrHost(g1, g2, EXCLUDE_PRIVATE_REGISTRIES); 74 } 75 76 } // namespace 77 78 class RegistryControlledDomainTest : public testing::Test { 79 protected: 80 template <typename Graph> 81 void UseDomainData(const Graph& graph) { 82 SetFindDomainGraph(graph, sizeof(Graph)); 83 } 84 85 virtual void TearDown() { SetFindDomainGraph(); } 86 }; 87 88 TEST_F(RegistryControlledDomainTest, TestGetDomainAndRegistry) { 89 UseDomainData(test1::kDafsa); 90 91 // Test GURL version of GetDomainAndRegistry(). 92 EXPECT_EQ("baz.jp", GetDomainFromURL("http://a.baz.jp/file.html")); // 1 93 EXPECT_EQ("baz.jp.", GetDomainFromURL("http://a.baz.jp./file.html")); // 1 94 EXPECT_EQ("", GetDomainFromURL("http://ac.jp")); // 2 95 EXPECT_EQ("", GetDomainFromURL("http://a.bar.jp")); // 3 96 EXPECT_EQ("", GetDomainFromURL("http://bar.jp")); // 3 97 EXPECT_EQ("", GetDomainFromURL("http://baz.bar.jp")); // 3 4 98 EXPECT_EQ("a.b.baz.bar.jp", GetDomainFromURL("http://a.b.baz.bar.jp")); 99 // 4 100 EXPECT_EQ("pref.bar.jp", GetDomainFromURL("http://baz.pref.bar.jp")); // 5 101 EXPECT_EQ("b.bar.baz.com.", GetDomainFromURL("http://a.b.bar.baz.com.")); 102 // 6 103 EXPECT_EQ("a.d.c", GetDomainFromURL("http://a.d.c")); // 7 104 EXPECT_EQ("a.d.c", GetDomainFromURL("http://.a.d.c")); // 7 105 EXPECT_EQ("a.d.c", GetDomainFromURL("http://..a.d.c")); // 7 106 EXPECT_EQ("b.c", GetDomainFromURL("http://a.b.c")); // 7 8 107 EXPECT_EQ("baz.com", GetDomainFromURL("http://baz.com")); // none 108 EXPECT_EQ("baz.com.", GetDomainFromURL("http://baz.com.")); // none 109 110 EXPECT_EQ("", GetDomainFromURL(std::string())); 111 EXPECT_EQ("", GetDomainFromURL("http://")); 112 EXPECT_EQ("", GetDomainFromURL("file:///C:/file.html")); 113 EXPECT_EQ("", GetDomainFromURL("http://foo.com..")); 114 EXPECT_EQ("", GetDomainFromURL("http://...")); 115 EXPECT_EQ("", GetDomainFromURL("http://192.168.0.1")); 116 EXPECT_EQ("", GetDomainFromURL("http://localhost")); 117 EXPECT_EQ("", GetDomainFromURL("http://localhost.")); 118 EXPECT_EQ("", GetDomainFromURL("http:////Comment")); 119 120 // Test std::string version of GetDomainAndRegistry(). Uses the same 121 // underpinnings as the GURL version, so this is really more of a check of 122 // CanonicalizeHost(). 123 EXPECT_EQ("baz.jp", GetDomainFromHost("a.baz.jp")); // 1 124 EXPECT_EQ("baz.jp.", GetDomainFromHost("a.baz.jp.")); // 1 125 EXPECT_EQ("", GetDomainFromHost("ac.jp")); // 2 126 EXPECT_EQ("", GetDomainFromHost("a.bar.jp")); // 3 127 EXPECT_EQ("", GetDomainFromHost("bar.jp")); // 3 128 EXPECT_EQ("", GetDomainFromHost("baz.bar.jp")); // 3 4 129 EXPECT_EQ("a.b.baz.bar.jp", GetDomainFromHost("a.b.baz.bar.jp")); // 3 4 130 EXPECT_EQ("pref.bar.jp", GetDomainFromHost("baz.pref.bar.jp")); // 5 131 EXPECT_EQ("b.bar.baz.com.", GetDomainFromHost("a.b.bar.baz.com.")); // 6 132 EXPECT_EQ("a.d.c", GetDomainFromHost("a.d.c")); // 7 133 EXPECT_EQ("a.d.c", GetDomainFromHost(".a.d.c")); // 7 134 EXPECT_EQ("a.d.c", GetDomainFromHost("..a.d.c")); // 7 135 EXPECT_EQ("b.c", GetDomainFromHost("a.b.c")); // 7 8 136 EXPECT_EQ("baz.com", GetDomainFromHost("baz.com")); // none 137 EXPECT_EQ("baz.com.", GetDomainFromHost("baz.com.")); // none 138 139 EXPECT_EQ("", GetDomainFromHost(std::string())); 140 EXPECT_EQ("", GetDomainFromHost("foo.com..")); 141 EXPECT_EQ("", GetDomainFromHost("...")); 142 EXPECT_EQ("", GetDomainFromHost("192.168.0.1")); 143 EXPECT_EQ("", GetDomainFromHost("localhost.")); 144 EXPECT_EQ("", GetDomainFromHost(".localhost.")); 145 } 146 147 TEST_F(RegistryControlledDomainTest, TestGetRegistryLength) { 148 UseDomainData(test1::kDafsa); 149 150 // Test GURL version of GetRegistryLength(). 151 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://a.baz.jp/file.html", 152 EXCLUDE_UNKNOWN_REGISTRIES)); // 1 153 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://a.baz.jp./file.html", 154 EXCLUDE_UNKNOWN_REGISTRIES)); // 1 155 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://ac.jp", 156 EXCLUDE_UNKNOWN_REGISTRIES)); // 2 157 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://a.bar.jp", 158 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 159 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://bar.jp", 160 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 161 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.bar.jp", 162 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 4 163 EXPECT_EQ(12U, GetRegistryLengthFromURL("http://a.b.baz.bar.jp", 164 EXCLUDE_UNKNOWN_REGISTRIES)); // 4 165 EXPECT_EQ(6U, GetRegistryLengthFromURL("http://baz.pref.bar.jp", 166 EXCLUDE_UNKNOWN_REGISTRIES)); // 5 167 EXPECT_EQ(11U, GetRegistryLengthFromURL("http://a.b.bar.baz.com", 168 EXCLUDE_UNKNOWN_REGISTRIES)); // 6 169 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://a.d.c", 170 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 171 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://.a.d.c", 172 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 173 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://..a.d.c", 174 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 175 EXPECT_EQ(1U, GetRegistryLengthFromURL("http://a.b.c", 176 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 8 177 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.com", 178 EXCLUDE_UNKNOWN_REGISTRIES)); // none 179 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.com.", 180 EXCLUDE_UNKNOWN_REGISTRIES)); // none 181 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://baz.com", 182 INCLUDE_UNKNOWN_REGISTRIES)); // none 183 EXPECT_EQ(4U, GetRegistryLengthFromURL("http://baz.com.", 184 INCLUDE_UNKNOWN_REGISTRIES)); // none 185 186 EXPECT_EQ(std::string::npos, 187 GetRegistryLengthFromURL(std::string(), EXCLUDE_UNKNOWN_REGISTRIES)); 188 EXPECT_EQ(std::string::npos, 189 GetRegistryLengthFromURL("http://", EXCLUDE_UNKNOWN_REGISTRIES)); 190 EXPECT_EQ(std::string::npos, 191 GetRegistryLengthFromURL("file:///C:/file.html", 192 EXCLUDE_UNKNOWN_REGISTRIES)); 193 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://foo.com..", 194 EXCLUDE_UNKNOWN_REGISTRIES)); 195 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://...", 196 EXCLUDE_UNKNOWN_REGISTRIES)); 197 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://192.168.0.1", 198 EXCLUDE_UNKNOWN_REGISTRIES)); 199 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost", 200 EXCLUDE_UNKNOWN_REGISTRIES)); 201 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost", 202 INCLUDE_UNKNOWN_REGISTRIES)); 203 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost.", 204 EXCLUDE_UNKNOWN_REGISTRIES)); 205 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost.", 206 INCLUDE_UNKNOWN_REGISTRIES)); 207 EXPECT_EQ(0U, GetRegistryLengthFromURL("http:////Comment", 208 EXCLUDE_UNKNOWN_REGISTRIES)); 209 210 // Test std::string version of GetRegistryLength(). Uses the same 211 // underpinnings as the GURL version, so this is really more of a check of 212 // CanonicalizeHost(). 213 EXPECT_EQ(2U, GetRegistryLengthFromHost("a.baz.jp", 214 EXCLUDE_UNKNOWN_REGISTRIES)); // 1 215 EXPECT_EQ(3U, GetRegistryLengthFromHost("a.baz.jp.", 216 EXCLUDE_UNKNOWN_REGISTRIES)); // 1 217 EXPECT_EQ(0U, GetRegistryLengthFromHost("ac.jp", 218 EXCLUDE_UNKNOWN_REGISTRIES)); // 2 219 EXPECT_EQ(0U, GetRegistryLengthFromHost("a.bar.jp", 220 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 221 EXPECT_EQ(0U, GetRegistryLengthFromHost("bar.jp", 222 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 223 EXPECT_EQ(0U, GetRegistryLengthFromHost("baz.bar.jp", 224 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 4 225 EXPECT_EQ(12U, GetRegistryLengthFromHost("a.b.baz.bar.jp", 226 EXCLUDE_UNKNOWN_REGISTRIES)); // 4 227 EXPECT_EQ(6U, GetRegistryLengthFromHost("baz.pref.bar.jp", 228 EXCLUDE_UNKNOWN_REGISTRIES)); // 5 229 EXPECT_EQ(11U, GetRegistryLengthFromHost("a.b.bar.baz.com", 230 EXCLUDE_UNKNOWN_REGISTRIES)); // 6 231 EXPECT_EQ(3U, GetRegistryLengthFromHost("a.d.c", 232 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 233 EXPECT_EQ(3U, GetRegistryLengthFromHost(".a.d.c", 234 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 235 EXPECT_EQ(3U, GetRegistryLengthFromHost("..a.d.c", 236 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 237 EXPECT_EQ(1U, GetRegistryLengthFromHost("a.b.c", 238 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 8 239 EXPECT_EQ(0U, GetRegistryLengthFromHost("baz.com", 240 EXCLUDE_UNKNOWN_REGISTRIES)); // none 241 EXPECT_EQ(0U, GetRegistryLengthFromHost("baz.com.", 242 EXCLUDE_UNKNOWN_REGISTRIES)); // none 243 EXPECT_EQ(3U, GetRegistryLengthFromHost("baz.com", 244 INCLUDE_UNKNOWN_REGISTRIES)); // none 245 EXPECT_EQ(4U, GetRegistryLengthFromHost("baz.com.", 246 INCLUDE_UNKNOWN_REGISTRIES)); // none 247 248 EXPECT_EQ(std::string::npos, 249 GetRegistryLengthFromHost(std::string(), EXCLUDE_UNKNOWN_REGISTRIES)); 250 EXPECT_EQ(0U, GetRegistryLengthFromHost("foo.com..", 251 EXCLUDE_UNKNOWN_REGISTRIES)); 252 EXPECT_EQ(0U, GetRegistryLengthFromHost("..", 253 EXCLUDE_UNKNOWN_REGISTRIES)); 254 EXPECT_EQ(0U, GetRegistryLengthFromHost("192.168.0.1", 255 EXCLUDE_UNKNOWN_REGISTRIES)); 256 EXPECT_EQ(0U, GetRegistryLengthFromHost("localhost", 257 EXCLUDE_UNKNOWN_REGISTRIES)); 258 EXPECT_EQ(0U, GetRegistryLengthFromHost("localhost", 259 INCLUDE_UNKNOWN_REGISTRIES)); 260 EXPECT_EQ(0U, GetRegistryLengthFromHost("localhost.", 261 EXCLUDE_UNKNOWN_REGISTRIES)); 262 EXPECT_EQ(0U, GetRegistryLengthFromHost("localhost.", 263 INCLUDE_UNKNOWN_REGISTRIES)); 264 } 265 266 TEST_F(RegistryControlledDomainTest, TestSameDomainOrHost) { 267 UseDomainData(test2::kDafsa); 268 269 EXPECT_TRUE(CompareDomains("http://a.b.bar.jp/file.html", 270 "http://a.b.bar.jp/file.html")); // b.bar.jp 271 EXPECT_TRUE(CompareDomains("http://a.b.bar.jp/file.html", 272 "http://b.b.bar.jp/file.html")); // b.bar.jp 273 EXPECT_FALSE(CompareDomains("http://a.foo.jp/file.html", // foo.jp 274 "http://a.not.jp/file.html")); // not.jp 275 EXPECT_FALSE(CompareDomains("http://a.foo.jp/file.html", // foo.jp 276 "http://a.foo.jp./file.html")); // foo.jp. 277 EXPECT_FALSE(CompareDomains("http://a.com/file.html", // a.com 278 "http://b.com/file.html")); // b.com 279 EXPECT_TRUE(CompareDomains("http://a.x.com/file.html", 280 "http://b.x.com/file.html")); // x.com 281 EXPECT_TRUE(CompareDomains("http://a.x.com/file.html", 282 "http://.x.com/file.html")); // x.com 283 EXPECT_TRUE(CompareDomains("http://a.x.com/file.html", 284 "http://..b.x.com/file.html")); // x.com 285 EXPECT_TRUE(CompareDomains("http://intranet/file.html", 286 "http://intranet/file.html")); // intranet 287 EXPECT_TRUE(CompareDomains("http://127.0.0.1/file.html", 288 "http://127.0.0.1/file.html")); // 127.0.0.1 289 EXPECT_FALSE(CompareDomains("http://192.168.0.1/file.html", // 192.168.0.1 290 "http://127.0.0.1/file.html")); // 127.0.0.1 291 EXPECT_FALSE(CompareDomains("file:///C:/file.html", 292 "file:///C:/file.html")); // no host 293 } 294 295 TEST_F(RegistryControlledDomainTest, TestDefaultData) { 296 // Note that no data is set: we're using the default rules. 297 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://google.com", 298 EXCLUDE_UNKNOWN_REGISTRIES)); 299 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://stanford.edu", 300 EXCLUDE_UNKNOWN_REGISTRIES)); 301 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://ustreas.gov", 302 EXCLUDE_UNKNOWN_REGISTRIES)); 303 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://icann.net", 304 EXCLUDE_UNKNOWN_REGISTRIES)); 305 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://ferretcentral.org", 306 EXCLUDE_UNKNOWN_REGISTRIES)); 307 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://nowhere.notavaliddomain", 308 EXCLUDE_UNKNOWN_REGISTRIES)); 309 EXPECT_EQ(15U, GetRegistryLengthFromURL("http://nowhere.notavaliddomain", 310 INCLUDE_UNKNOWN_REGISTRIES)); 311 } 312 313 TEST_F(RegistryControlledDomainTest, TestPrivateRegistryHandling) { 314 UseDomainData(test1::kDafsa); 315 316 // Testing the same dataset for INCLUDE_PRIVATE_REGISTRIES and 317 // EXCLUDE_PRIVATE_REGISTRIES arguments. 318 // For the domain data used for this test, the private registries are 319 // 'priv.no' and 'private'. 320 321 // Non-private registries. 322 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://priv.no", 323 EXCLUDE_UNKNOWN_REGISTRIES)); 324 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://foo.priv.no", 325 EXCLUDE_UNKNOWN_REGISTRIES)); 326 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://foo.jp", 327 EXCLUDE_UNKNOWN_REGISTRIES)); 328 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://www.foo.jp", 329 EXCLUDE_UNKNOWN_REGISTRIES)); 330 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://private", 331 EXCLUDE_UNKNOWN_REGISTRIES)); 332 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://foo.private", 333 EXCLUDE_UNKNOWN_REGISTRIES)); 334 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://private", 335 INCLUDE_UNKNOWN_REGISTRIES)); 336 EXPECT_EQ(7U, GetRegistryLengthFromURL("http://foo.private", 337 INCLUDE_UNKNOWN_REGISTRIES)); 338 339 // Private registries. 340 EXPECT_EQ(0U, 341 GetRegistryLengthFromURLIncludingPrivate("http://priv.no", 342 EXCLUDE_UNKNOWN_REGISTRIES)); 343 EXPECT_EQ(7U, 344 GetRegistryLengthFromURLIncludingPrivate("http://foo.priv.no", 345 EXCLUDE_UNKNOWN_REGISTRIES)); 346 EXPECT_EQ(2U, 347 GetRegistryLengthFromURLIncludingPrivate("http://foo.jp", 348 EXCLUDE_UNKNOWN_REGISTRIES)); 349 EXPECT_EQ(2U, 350 GetRegistryLengthFromURLIncludingPrivate("http://www.foo.jp", 351 EXCLUDE_UNKNOWN_REGISTRIES)); 352 EXPECT_EQ(0U, 353 GetRegistryLengthFromURLIncludingPrivate("http://private", 354 EXCLUDE_UNKNOWN_REGISTRIES)); 355 EXPECT_EQ(7U, 356 GetRegistryLengthFromURLIncludingPrivate("http://foo.private", 357 EXCLUDE_UNKNOWN_REGISTRIES)); 358 EXPECT_EQ(0U, 359 GetRegistryLengthFromURLIncludingPrivate("http://private", 360 INCLUDE_UNKNOWN_REGISTRIES)); 361 EXPECT_EQ(7U, 362 GetRegistryLengthFromURLIncludingPrivate("http://foo.private", 363 INCLUDE_UNKNOWN_REGISTRIES)); 364 } 365 366 TEST_F(RegistryControlledDomainTest, TestDafsaTwoByteOffsets) { 367 UseDomainData(test3::kDafsa); 368 369 // Testing to lookup keys in a DAFSA with two byte offsets. 370 // This DAFSA is constructed so that labels begin and end with unique 371 // characters, which makes it impossible to merge labels. Each inner node 372 // is about 100 bytes and a one byte offset can at most add 64 bytes to 373 // previous offset. Thus the paths must go over two byte offsets. 374 375 const char* key0 = 376 "a.b.6____________________________________________________" 377 "________________________________________________6"; 378 const char* key1 = 379 "a.b.7____________________________________________________" 380 "________________________________________________7"; 381 const char* key2 = 382 "a.b.a____________________________________________________" 383 "________________________________________________8"; 384 385 EXPECT_EQ(102U, GetRegistryLengthFromHost(key0, EXCLUDE_UNKNOWN_REGISTRIES)); 386 EXPECT_EQ(0U, GetRegistryLengthFromHost(key1, EXCLUDE_UNKNOWN_REGISTRIES)); 387 EXPECT_EQ(102U, 388 GetRegistryLengthFromHostIncludingPrivate( 389 key1, EXCLUDE_UNKNOWN_REGISTRIES)); 390 EXPECT_EQ(0U, GetRegistryLengthFromHost(key2, EXCLUDE_UNKNOWN_REGISTRIES)); 391 } 392 393 TEST_F(RegistryControlledDomainTest, TestDafsaThreeByteOffsets) { 394 UseDomainData(test4::kDafsa); 395 396 // Testing to lookup keys in a DAFSA with three byte offsets. 397 // This DAFSA is constructed so that labels begin and end with unique 398 // characters, which makes it impossible to merge labels. The byte array 399 // has a size of ~54k. A two byte offset can add at most add 8k to the 400 // previous offset. Since we can skip only forward in memory, the nodes 401 // representing the return values must be located near the end of the byte 402 // array. The probability that we can reach from an arbitrary inner node to 403 // a return value without using a three byte offset is small (but not zero). 404 // The test is repeated with some different keys and with a reasonable 405 // probability at least one of the tested paths has go over a three byte 406 // offset. 407 408 const char* key0 = 409 "a.b.Z6___________________________________________________" 410 "_________________________________________________Z6"; 411 const char* key1 = 412 "a.b.Z7___________________________________________________" 413 "_________________________________________________Z7"; 414 const char* key2 = 415 "a.b.Za___________________________________________________" 416 "_________________________________________________Z8"; 417 418 EXPECT_EQ(104U, GetRegistryLengthFromHost(key0, EXCLUDE_UNKNOWN_REGISTRIES)); 419 EXPECT_EQ(0U, GetRegistryLengthFromHost(key1, EXCLUDE_UNKNOWN_REGISTRIES)); 420 EXPECT_EQ(104U, 421 GetRegistryLengthFromHostIncludingPrivate( 422 key1, EXCLUDE_UNKNOWN_REGISTRIES)); 423 EXPECT_EQ(0U, GetRegistryLengthFromHost(key2, EXCLUDE_UNKNOWN_REGISTRIES)); 424 } 425 426 TEST_F(RegistryControlledDomainTest, TestDafsaJoinedPrefixes) { 427 UseDomainData(test5::kDafsa); 428 429 // Testing to lookup keys in a DAFSA with compressed prefixes. 430 // This DAFSA is constructed from words with similar prefixes but distinct 431 // suffixes. The DAFSA will then form a trie with the implicit source node 432 // as root. 433 434 const char* key0 = "a.b.ai"; 435 const char* key1 = "a.b.bj"; 436 const char* key2 = "a.b.aak"; 437 const char* key3 = "a.b.bbl"; 438 const char* key4 = "a.b.aaa"; 439 const char* key5 = "a.b.bbb"; 440 const char* key6 = "a.b.aaaam"; 441 const char* key7 = "a.b.bbbbn"; 442 443 EXPECT_EQ(2U, GetRegistryLengthFromHost(key0, EXCLUDE_UNKNOWN_REGISTRIES)); 444 EXPECT_EQ(0U, GetRegistryLengthFromHost(key1, EXCLUDE_UNKNOWN_REGISTRIES)); 445 EXPECT_EQ(2U, 446 GetRegistryLengthFromHostIncludingPrivate( 447 key1, EXCLUDE_UNKNOWN_REGISTRIES)); 448 EXPECT_EQ(3U, GetRegistryLengthFromHost(key2, EXCLUDE_UNKNOWN_REGISTRIES)); 449 EXPECT_EQ(0U, GetRegistryLengthFromHost(key3, EXCLUDE_UNKNOWN_REGISTRIES)); 450 EXPECT_EQ(3U, 451 GetRegistryLengthFromHostIncludingPrivate( 452 key3, EXCLUDE_UNKNOWN_REGISTRIES)); 453 EXPECT_EQ(0U, 454 GetRegistryLengthFromHostIncludingPrivate( 455 key4, EXCLUDE_UNKNOWN_REGISTRIES)); 456 EXPECT_EQ(0U, 457 GetRegistryLengthFromHostIncludingPrivate( 458 key5, EXCLUDE_UNKNOWN_REGISTRIES)); 459 EXPECT_EQ(5U, GetRegistryLengthFromHost(key6, EXCLUDE_UNKNOWN_REGISTRIES)); 460 EXPECT_EQ(5U, GetRegistryLengthFromHost(key7, EXCLUDE_UNKNOWN_REGISTRIES)); 461 } 462 463 TEST_F(RegistryControlledDomainTest, TestDafsaJoinedSuffixes) { 464 UseDomainData(test6::kDafsa); 465 466 // Testing to lookup keys in a DAFSA with compressed suffixes. 467 // This DAFSA is constructed from words with similar suffixes but distinct 468 // prefixes. The DAFSA will then form a trie with the implicit sink node as 469 // root. 470 471 const char* key0 = "a.b.ia"; 472 const char* key1 = "a.b.jb"; 473 const char* key2 = "a.b.kaa"; 474 const char* key3 = "a.b.lbb"; 475 const char* key4 = "a.b.aaa"; 476 const char* key5 = "a.b.bbb"; 477 const char* key6 = "a.b.maaaa"; 478 const char* key7 = "a.b.nbbbb"; 479 480 EXPECT_EQ(2U, GetRegistryLengthFromHost(key0, EXCLUDE_UNKNOWN_REGISTRIES)); 481 EXPECT_EQ(0U, GetRegistryLengthFromHost(key1, EXCLUDE_UNKNOWN_REGISTRIES)); 482 EXPECT_EQ(2U, 483 GetRegistryLengthFromHostIncludingPrivate( 484 key1, EXCLUDE_UNKNOWN_REGISTRIES)); 485 EXPECT_EQ(3U, GetRegistryLengthFromHost(key2, EXCLUDE_UNKNOWN_REGISTRIES)); 486 EXPECT_EQ(0U, GetRegistryLengthFromHost(key3, EXCLUDE_UNKNOWN_REGISTRIES)); 487 EXPECT_EQ(3U, 488 GetRegistryLengthFromHostIncludingPrivate( 489 key3, EXCLUDE_UNKNOWN_REGISTRIES)); 490 EXPECT_EQ(0U, 491 GetRegistryLengthFromHostIncludingPrivate( 492 key4, EXCLUDE_UNKNOWN_REGISTRIES)); 493 EXPECT_EQ(0U, 494 GetRegistryLengthFromHostIncludingPrivate( 495 key5, EXCLUDE_UNKNOWN_REGISTRIES)); 496 EXPECT_EQ(5U, GetRegistryLengthFromHost(key6, EXCLUDE_UNKNOWN_REGISTRIES)); 497 EXPECT_EQ(5U, GetRegistryLengthFromHost(key7, EXCLUDE_UNKNOWN_REGISTRIES)); 498 } 499 } // namespace registry_controlled_domains 500 } // namespace net 501