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 #include "effective_tld_names_unittest1.cc" 10 static const char* const Perfect_Hash_Test1_stringpool = stringpool1; 11 #undef TOTAL_KEYWORDS 12 #undef MIN_WORD_LENGTH 13 #undef MAX_WORD_LENGTH 14 #undef MIN_HASH_VALUE 15 #undef MAX_HASH_VALUE 16 #include "effective_tld_names_unittest2.cc" 17 static const char* const Perfect_Hash_Test2_stringpool = stringpool2; 18 19 namespace net { 20 namespace registry_controlled_domains { 21 namespace { 22 23 std::string GetDomainFromURL(const std::string& url) { 24 return GetDomainAndRegistry(GURL(url), EXCLUDE_PRIVATE_REGISTRIES); 25 } 26 27 std::string GetDomainFromHost(const std::string& host) { 28 return GetDomainAndRegistry(host, EXCLUDE_PRIVATE_REGISTRIES); 29 } 30 31 size_t GetRegistryLengthFromURL( 32 const std::string& url, 33 UnknownRegistryFilter unknown_filter) { 34 return GetRegistryLength(GURL(url), 35 unknown_filter, 36 EXCLUDE_PRIVATE_REGISTRIES); 37 } 38 39 size_t GetRegistryLengthFromURLIncludingPrivate( 40 const std::string& url, 41 UnknownRegistryFilter unknown_filter) { 42 return GetRegistryLength(GURL(url), 43 unknown_filter, 44 INCLUDE_PRIVATE_REGISTRIES); 45 } 46 47 size_t GetRegistryLengthFromHost( 48 const std::string& host, 49 UnknownRegistryFilter unknown_filter) { 50 return GetRegistryLength(host, unknown_filter, EXCLUDE_PRIVATE_REGISTRIES); 51 } 52 53 bool CompareDomains(const std::string& url1, const std::string& url2) { 54 GURL g1 = GURL(url1); 55 GURL g2 = GURL(url2); 56 return SameDomainOrHost(g1, g2, EXCLUDE_PRIVATE_REGISTRIES); 57 } 58 59 } // namespace 60 61 class RegistryControlledDomainTest : public testing::Test { 62 protected: 63 void UseDomainData(FindDomainPtr function, const char* const stringpool) { 64 SetFindDomainFunctionAndStringPoolForTesting(function, stringpool); 65 } 66 67 virtual void TearDown() { 68 SetFindDomainFunctionAndStringPoolForTesting(NULL, NULL); 69 } 70 }; 71 72 TEST_F(RegistryControlledDomainTest, TestGetDomainAndRegistry) { 73 UseDomainData(Perfect_Hash_Test1::FindDomain, Perfect_Hash_Test1_stringpool); 74 75 // Test GURL version of GetDomainAndRegistry(). 76 EXPECT_EQ("baz.jp", GetDomainFromURL("http://a.baz.jp/file.html")); // 1 77 EXPECT_EQ("baz.jp.", GetDomainFromURL("http://a.baz.jp./file.html")); // 1 78 EXPECT_EQ("", GetDomainFromURL("http://ac.jp")); // 2 79 EXPECT_EQ("", GetDomainFromURL("http://a.bar.jp")); // 3 80 EXPECT_EQ("", GetDomainFromURL("http://bar.jp")); // 3 81 EXPECT_EQ("", GetDomainFromURL("http://baz.bar.jp")); // 3 4 82 EXPECT_EQ("a.b.baz.bar.jp", GetDomainFromURL("http://a.b.baz.bar.jp")); 83 // 4 84 EXPECT_EQ("pref.bar.jp", GetDomainFromURL("http://baz.pref.bar.jp")); // 5 85 EXPECT_EQ("b.bar.baz.com.", GetDomainFromURL("http://a.b.bar.baz.com.")); 86 // 6 87 EXPECT_EQ("a.d.c", GetDomainFromURL("http://a.d.c")); // 7 88 EXPECT_EQ("a.d.c", GetDomainFromURL("http://.a.d.c")); // 7 89 EXPECT_EQ("a.d.c", GetDomainFromURL("http://..a.d.c")); // 7 90 EXPECT_EQ("b.c", GetDomainFromURL("http://a.b.c")); // 7 8 91 EXPECT_EQ("baz.com", GetDomainFromURL("http://baz.com")); // none 92 EXPECT_EQ("baz.com.", GetDomainFromURL("http://baz.com.")); // none 93 94 EXPECT_EQ("", GetDomainFromURL(std::string())); 95 EXPECT_EQ("", GetDomainFromURL("http://")); 96 EXPECT_EQ("", GetDomainFromURL("file:///C:/file.html")); 97 EXPECT_EQ("", GetDomainFromURL("http://foo.com..")); 98 EXPECT_EQ("", GetDomainFromURL("http://...")); 99 EXPECT_EQ("", GetDomainFromURL("http://192.168.0.1")); 100 EXPECT_EQ("", GetDomainFromURL("http://localhost")); 101 EXPECT_EQ("", GetDomainFromURL("http://localhost.")); 102 EXPECT_EQ("", GetDomainFromURL("http:////Comment")); 103 104 // Test std::string version of GetDomainAndRegistry(). Uses the same 105 // underpinnings as the GURL version, so this is really more of a check of 106 // CanonicalizeHost(). 107 EXPECT_EQ("baz.jp", GetDomainFromHost("a.baz.jp")); // 1 108 EXPECT_EQ("baz.jp.", GetDomainFromHost("a.baz.jp.")); // 1 109 EXPECT_EQ("", GetDomainFromHost("ac.jp")); // 2 110 EXPECT_EQ("", GetDomainFromHost("a.bar.jp")); // 3 111 EXPECT_EQ("", GetDomainFromHost("bar.jp")); // 3 112 EXPECT_EQ("", GetDomainFromHost("baz.bar.jp")); // 3 4 113 EXPECT_EQ("a.b.baz.bar.jp", GetDomainFromHost("a.b.baz.bar.jp")); // 3 4 114 EXPECT_EQ("pref.bar.jp", GetDomainFromHost("baz.pref.bar.jp")); // 5 115 EXPECT_EQ("b.bar.baz.com.", GetDomainFromHost("a.b.bar.baz.com.")); // 6 116 EXPECT_EQ("a.d.c", GetDomainFromHost("a.d.c")); // 7 117 EXPECT_EQ("a.d.c", GetDomainFromHost(".a.d.c")); // 7 118 EXPECT_EQ("a.d.c", GetDomainFromHost("..a.d.c")); // 7 119 EXPECT_EQ("b.c", GetDomainFromHost("a.b.c")); // 7 8 120 EXPECT_EQ("baz.com", GetDomainFromHost("baz.com")); // none 121 EXPECT_EQ("baz.com.", GetDomainFromHost("baz.com.")); // none 122 123 EXPECT_EQ("", GetDomainFromHost(std::string())); 124 EXPECT_EQ("", GetDomainFromHost("foo.com..")); 125 EXPECT_EQ("", GetDomainFromHost("...")); 126 EXPECT_EQ("", GetDomainFromHost("192.168.0.1")); 127 EXPECT_EQ("", GetDomainFromHost("localhost.")); 128 EXPECT_EQ("", GetDomainFromHost(".localhost.")); 129 } 130 131 TEST_F(RegistryControlledDomainTest, TestGetRegistryLength) { 132 UseDomainData(Perfect_Hash_Test1::FindDomain, Perfect_Hash_Test1_stringpool); 133 134 // Test GURL version of GetRegistryLength(). 135 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://a.baz.jp/file.html", 136 EXCLUDE_UNKNOWN_REGISTRIES)); // 1 137 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://a.baz.jp./file.html", 138 EXCLUDE_UNKNOWN_REGISTRIES)); // 1 139 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://ac.jp", 140 EXCLUDE_UNKNOWN_REGISTRIES)); // 2 141 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://a.bar.jp", 142 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 143 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://bar.jp", 144 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 145 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.bar.jp", 146 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 4 147 EXPECT_EQ(12U, GetRegistryLengthFromURL("http://a.b.baz.bar.jp", 148 EXCLUDE_UNKNOWN_REGISTRIES)); // 4 149 EXPECT_EQ(6U, GetRegistryLengthFromURL("http://baz.pref.bar.jp", 150 EXCLUDE_UNKNOWN_REGISTRIES)); // 5 151 EXPECT_EQ(11U, GetRegistryLengthFromURL("http://a.b.bar.baz.com", 152 EXCLUDE_UNKNOWN_REGISTRIES)); // 6 153 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://a.d.c", 154 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 155 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://.a.d.c", 156 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 157 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://..a.d.c", 158 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 159 EXPECT_EQ(1U, GetRegistryLengthFromURL("http://a.b.c", 160 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 8 161 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.com", 162 EXCLUDE_UNKNOWN_REGISTRIES)); // none 163 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.com.", 164 EXCLUDE_UNKNOWN_REGISTRIES)); // none 165 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://baz.com", 166 INCLUDE_UNKNOWN_REGISTRIES)); // none 167 EXPECT_EQ(4U, GetRegistryLengthFromURL("http://baz.com.", 168 INCLUDE_UNKNOWN_REGISTRIES)); // none 169 170 EXPECT_EQ(std::string::npos, 171 GetRegistryLengthFromURL(std::string(), EXCLUDE_UNKNOWN_REGISTRIES)); 172 EXPECT_EQ(std::string::npos, 173 GetRegistryLengthFromURL("http://", EXCLUDE_UNKNOWN_REGISTRIES)); 174 EXPECT_EQ(std::string::npos, 175 GetRegistryLengthFromURL("file:///C:/file.html", 176 EXCLUDE_UNKNOWN_REGISTRIES)); 177 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://foo.com..", 178 EXCLUDE_UNKNOWN_REGISTRIES)); 179 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://...", 180 EXCLUDE_UNKNOWN_REGISTRIES)); 181 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://192.168.0.1", 182 EXCLUDE_UNKNOWN_REGISTRIES)); 183 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost", 184 EXCLUDE_UNKNOWN_REGISTRIES)); 185 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost", 186 INCLUDE_UNKNOWN_REGISTRIES)); 187 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost.", 188 EXCLUDE_UNKNOWN_REGISTRIES)); 189 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost.", 190 INCLUDE_UNKNOWN_REGISTRIES)); 191 EXPECT_EQ(0U, GetRegistryLengthFromURL("http:////Comment", 192 EXCLUDE_UNKNOWN_REGISTRIES)); 193 194 // Test std::string version of GetRegistryLength(). Uses the same 195 // underpinnings as the GURL version, so this is really more of a check of 196 // CanonicalizeHost(). 197 EXPECT_EQ(2U, GetRegistryLengthFromHost("a.baz.jp", 198 EXCLUDE_UNKNOWN_REGISTRIES)); // 1 199 EXPECT_EQ(3U, GetRegistryLengthFromHost("a.baz.jp.", 200 EXCLUDE_UNKNOWN_REGISTRIES)); // 1 201 EXPECT_EQ(0U, GetRegistryLengthFromHost("ac.jp", 202 EXCLUDE_UNKNOWN_REGISTRIES)); // 2 203 EXPECT_EQ(0U, GetRegistryLengthFromHost("a.bar.jp", 204 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 205 EXPECT_EQ(0U, GetRegistryLengthFromHost("bar.jp", 206 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 207 EXPECT_EQ(0U, GetRegistryLengthFromHost("baz.bar.jp", 208 EXCLUDE_UNKNOWN_REGISTRIES)); // 3 4 209 EXPECT_EQ(12U, GetRegistryLengthFromHost("a.b.baz.bar.jp", 210 EXCLUDE_UNKNOWN_REGISTRIES)); // 4 211 EXPECT_EQ(6U, GetRegistryLengthFromHost("baz.pref.bar.jp", 212 EXCLUDE_UNKNOWN_REGISTRIES)); // 5 213 EXPECT_EQ(11U, GetRegistryLengthFromHost("a.b.bar.baz.com", 214 EXCLUDE_UNKNOWN_REGISTRIES)); // 6 215 EXPECT_EQ(3U, GetRegistryLengthFromHost("a.d.c", 216 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 217 EXPECT_EQ(3U, GetRegistryLengthFromHost(".a.d.c", 218 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 219 EXPECT_EQ(3U, GetRegistryLengthFromHost("..a.d.c", 220 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 221 EXPECT_EQ(1U, GetRegistryLengthFromHost("a.b.c", 222 EXCLUDE_UNKNOWN_REGISTRIES)); // 7 8 223 EXPECT_EQ(0U, GetRegistryLengthFromHost("baz.com", 224 EXCLUDE_UNKNOWN_REGISTRIES)); // none 225 EXPECT_EQ(0U, GetRegistryLengthFromHost("baz.com.", 226 EXCLUDE_UNKNOWN_REGISTRIES)); // none 227 EXPECT_EQ(3U, GetRegistryLengthFromHost("baz.com", 228 INCLUDE_UNKNOWN_REGISTRIES)); // none 229 EXPECT_EQ(4U, GetRegistryLengthFromHost("baz.com.", 230 INCLUDE_UNKNOWN_REGISTRIES)); // none 231 232 EXPECT_EQ(std::string::npos, 233 GetRegistryLengthFromHost(std::string(), EXCLUDE_UNKNOWN_REGISTRIES)); 234 EXPECT_EQ(0U, GetRegistryLengthFromHost("foo.com..", 235 EXCLUDE_UNKNOWN_REGISTRIES)); 236 EXPECT_EQ(0U, GetRegistryLengthFromHost("..", 237 EXCLUDE_UNKNOWN_REGISTRIES)); 238 EXPECT_EQ(0U, GetRegistryLengthFromHost("192.168.0.1", 239 EXCLUDE_UNKNOWN_REGISTRIES)); 240 EXPECT_EQ(0U, GetRegistryLengthFromHost("localhost", 241 EXCLUDE_UNKNOWN_REGISTRIES)); 242 EXPECT_EQ(0U, GetRegistryLengthFromHost("localhost", 243 INCLUDE_UNKNOWN_REGISTRIES)); 244 EXPECT_EQ(0U, GetRegistryLengthFromHost("localhost.", 245 EXCLUDE_UNKNOWN_REGISTRIES)); 246 EXPECT_EQ(0U, GetRegistryLengthFromHost("localhost.", 247 INCLUDE_UNKNOWN_REGISTRIES)); 248 } 249 250 TEST_F(RegistryControlledDomainTest, TestSameDomainOrHost) { 251 UseDomainData(Perfect_Hash_Test2::FindDomain, Perfect_Hash_Test2_stringpool); 252 253 EXPECT_TRUE(CompareDomains("http://a.b.bar.jp/file.html", 254 "http://a.b.bar.jp/file.html")); // b.bar.jp 255 EXPECT_TRUE(CompareDomains("http://a.b.bar.jp/file.html", 256 "http://b.b.bar.jp/file.html")); // b.bar.jp 257 EXPECT_FALSE(CompareDomains("http://a.foo.jp/file.html", // foo.jp 258 "http://a.not.jp/file.html")); // not.jp 259 EXPECT_FALSE(CompareDomains("http://a.foo.jp/file.html", // foo.jp 260 "http://a.foo.jp./file.html")); // foo.jp. 261 EXPECT_FALSE(CompareDomains("http://a.com/file.html", // a.com 262 "http://b.com/file.html")); // b.com 263 EXPECT_TRUE(CompareDomains("http://a.x.com/file.html", 264 "http://b.x.com/file.html")); // x.com 265 EXPECT_TRUE(CompareDomains("http://a.x.com/file.html", 266 "http://.x.com/file.html")); // x.com 267 EXPECT_TRUE(CompareDomains("http://a.x.com/file.html", 268 "http://..b.x.com/file.html")); // x.com 269 EXPECT_TRUE(CompareDomains("http://intranet/file.html", 270 "http://intranet/file.html")); // intranet 271 EXPECT_TRUE(CompareDomains("http://127.0.0.1/file.html", 272 "http://127.0.0.1/file.html")); // 127.0.0.1 273 EXPECT_FALSE(CompareDomains("http://192.168.0.1/file.html", // 192.168.0.1 274 "http://127.0.0.1/file.html")); // 127.0.0.1 275 EXPECT_FALSE(CompareDomains("file:///C:/file.html", 276 "file:///C:/file.html")); // no host 277 } 278 279 TEST_F(RegistryControlledDomainTest, TestDefaultData) { 280 // Note that no data is set: we're using the default rules. 281 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://google.com", 282 EXCLUDE_UNKNOWN_REGISTRIES)); 283 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://stanford.edu", 284 EXCLUDE_UNKNOWN_REGISTRIES)); 285 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://ustreas.gov", 286 EXCLUDE_UNKNOWN_REGISTRIES)); 287 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://icann.net", 288 EXCLUDE_UNKNOWN_REGISTRIES)); 289 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://ferretcentral.org", 290 EXCLUDE_UNKNOWN_REGISTRIES)); 291 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://nowhere.foo", 292 EXCLUDE_UNKNOWN_REGISTRIES)); 293 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://nowhere.foo", 294 INCLUDE_UNKNOWN_REGISTRIES)); 295 } 296 297 TEST_F(RegistryControlledDomainTest, TestPrivateRegistryHandling) { 298 UseDomainData(Perfect_Hash_Test1::FindDomain, Perfect_Hash_Test1_stringpool); 299 300 // Testing the same dataset for INCLUDE_PRIVATE_REGISTRIES and 301 // EXCLUDE_PRIVATE_REGISTRIES arguments. 302 // For the domain data used for this test, the private registries are 303 // 'priv.no' and 'private'. 304 305 // Non-private registries. 306 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://priv.no", 307 EXCLUDE_UNKNOWN_REGISTRIES)); 308 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://foo.priv.no", 309 EXCLUDE_UNKNOWN_REGISTRIES)); 310 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://foo.jp", 311 EXCLUDE_UNKNOWN_REGISTRIES)); 312 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://www.foo.jp", 313 EXCLUDE_UNKNOWN_REGISTRIES)); 314 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://private", 315 EXCLUDE_UNKNOWN_REGISTRIES)); 316 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://foo.private", 317 EXCLUDE_UNKNOWN_REGISTRIES)); 318 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://private", 319 INCLUDE_UNKNOWN_REGISTRIES)); 320 EXPECT_EQ(7U, GetRegistryLengthFromURL("http://foo.private", 321 INCLUDE_UNKNOWN_REGISTRIES)); 322 323 // Private registries. 324 EXPECT_EQ(0U, 325 GetRegistryLengthFromURLIncludingPrivate("http://priv.no", 326 EXCLUDE_UNKNOWN_REGISTRIES)); 327 EXPECT_EQ(7U, 328 GetRegistryLengthFromURLIncludingPrivate("http://foo.priv.no", 329 EXCLUDE_UNKNOWN_REGISTRIES)); 330 EXPECT_EQ(2U, 331 GetRegistryLengthFromURLIncludingPrivate("http://foo.jp", 332 EXCLUDE_UNKNOWN_REGISTRIES)); 333 EXPECT_EQ(2U, 334 GetRegistryLengthFromURLIncludingPrivate("http://www.foo.jp", 335 EXCLUDE_UNKNOWN_REGISTRIES)); 336 EXPECT_EQ(0U, 337 GetRegistryLengthFromURLIncludingPrivate("http://private", 338 EXCLUDE_UNKNOWN_REGISTRIES)); 339 EXPECT_EQ(7U, 340 GetRegistryLengthFromURLIncludingPrivate("http://foo.private", 341 EXCLUDE_UNKNOWN_REGISTRIES)); 342 EXPECT_EQ(0U, 343 GetRegistryLengthFromURLIncludingPrivate("http://private", 344 INCLUDE_UNKNOWN_REGISTRIES)); 345 EXPECT_EQ(7U, 346 GetRegistryLengthFromURLIncludingPrivate("http://foo.private", 347 INCLUDE_UNKNOWN_REGISTRIES)); 348 } 349 350 351 } // namespace registry_controlled_domains 352 } // namespace net 353