1 // Copyright (c) 2006-2008 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 "googleurl/src/gurl.h" 6 #include "net/base/registry_controlled_domain.h" 7 #include "testing/gtest/include/gtest/gtest.h" 8 9 #include "effective_tld_names_unittest1.cc" 10 #undef TOTAL_KEYWORDS 11 #undef MIN_WORD_LENGTH 12 #undef MAX_WORD_LENGTH 13 #undef MIN_HASH_VALUE 14 #undef MAX_HASH_VALUE 15 #include "effective_tld_names_unittest2.cc" 16 17 namespace { 18 19 class TestRegistryControlledDomainService : 20 public net::RegistryControlledDomainService { 21 public: 22 // Sets the given data. 23 static void UseDomainData(FindDomainPtr function) { 24 net::RegistryControlledDomainService::UseFindDomainFunction(function); 25 } 26 27 // Creates a new dedicated instance to be used for testing, deleting any 28 // previously-set one. 29 static void UseDedicatedInstance() { 30 delete static_cast<TestRegistryControlledDomainService*>( 31 SetInstance(new TestRegistryControlledDomainService())); 32 } 33 34 // Restores RegistryControlledDomainService to using its default instance, 35 // deleting any previously-set test instance. 36 static void UseDefaultInstance() { 37 delete static_cast<TestRegistryControlledDomainService*>(SetInstance(NULL)); 38 } 39 }; 40 41 class RegistryControlledDomainTest : public testing::Test { 42 protected: 43 virtual void SetUp() { 44 TestRegistryControlledDomainService::UseDedicatedInstance(); 45 } 46 47 virtual void TearDown() { 48 TestRegistryControlledDomainService::UseDefaultInstance(); 49 } 50 }; 51 52 53 std::string GetDomainFromURL(const std::string& url) { 54 return TestRegistryControlledDomainService::GetDomainAndRegistry(GURL(url)); 55 } 56 57 std::string GetDomainFromHost(const std::wstring& host) { 58 return TestRegistryControlledDomainService::GetDomainAndRegistry(host); 59 } 60 61 size_t GetRegistryLengthFromURL(const std::string& url, 62 bool allow_unknown_registries) { 63 return TestRegistryControlledDomainService::GetRegistryLength(GURL(url), 64 allow_unknown_registries); 65 } 66 67 size_t GetRegistryLengthFromHost(const std::wstring& host, 68 bool allow_unknown_registries) { 69 return TestRegistryControlledDomainService::GetRegistryLength(host, 70 allow_unknown_registries); 71 } 72 73 bool CompareDomains(const std::string& url1, const std::string& url2) { 74 GURL g1 = GURL(url1); 75 GURL g2 = GURL(url2); 76 return TestRegistryControlledDomainService::SameDomainOrHost(g1, g2); 77 } 78 79 TEST_F(RegistryControlledDomainTest, TestGetDomainAndRegistry) { 80 TestRegistryControlledDomainService::UseDomainData( 81 Perfect_Hash_Test1::FindDomain); 82 83 // Test GURL version of GetDomainAndRegistry(). 84 EXPECT_EQ("baz.jp", GetDomainFromURL("http://a.baz.jp/file.html")); // 1 85 EXPECT_EQ("baz.jp.", GetDomainFromURL("http://a.baz.jp./file.html")); // 1 86 EXPECT_EQ("", GetDomainFromURL("http://ac.jp")); // 2 87 EXPECT_EQ("", GetDomainFromURL("http://a.bar.jp")); // 3 88 EXPECT_EQ("", GetDomainFromURL("http://bar.jp")); // 3 89 EXPECT_EQ("", GetDomainFromURL("http://baz.bar.jp")); // 3 4 90 EXPECT_EQ("a.b.baz.bar.jp", GetDomainFromURL("http://a.b.baz.bar.jp")); 91 // 4 92 EXPECT_EQ("pref.bar.jp", GetDomainFromURL("http://baz.pref.bar.jp")); // 5 93 EXPECT_EQ("b.bar.baz.com.", GetDomainFromURL("http://a.b.bar.baz.com.")); 94 // 6 95 EXPECT_EQ("a.d.c", GetDomainFromURL("http://a.d.c")); // 7 96 EXPECT_EQ("a.d.c", GetDomainFromURL("http://.a.d.c")); // 7 97 EXPECT_EQ("a.d.c", GetDomainFromURL("http://..a.d.c")); // 7 98 EXPECT_EQ("b.c", GetDomainFromURL("http://a.b.c")); // 7 8 99 EXPECT_EQ("baz.com", GetDomainFromURL("http://baz.com")); // none 100 EXPECT_EQ("baz.com.", GetDomainFromURL("http://baz.com.")); // none 101 102 EXPECT_EQ("", GetDomainFromURL("")); 103 EXPECT_EQ("", GetDomainFromURL("http://")); 104 EXPECT_EQ("", GetDomainFromURL("file:///C:/file.html")); 105 EXPECT_EQ("", GetDomainFromURL("http://foo.com..")); 106 EXPECT_EQ("", GetDomainFromURL("http://...")); 107 EXPECT_EQ("", GetDomainFromURL("http://192.168.0.1")); 108 EXPECT_EQ("", GetDomainFromURL("http://localhost")); 109 EXPECT_EQ("", GetDomainFromURL("http://localhost.")); 110 EXPECT_EQ("", GetDomainFromURL("http:////Comment")); 111 112 // Test std::wstring version of GetDomainAndRegistry(). Uses the same 113 // underpinnings as the GURL version, so this is really more of a check of 114 // CanonicalizeHost(). 115 EXPECT_EQ("baz.jp", GetDomainFromHost(L"a.baz.jp")); // 1 116 EXPECT_EQ("baz.jp.", GetDomainFromHost(L"a.baz.jp.")); // 1 117 EXPECT_EQ("", GetDomainFromHost(L"ac.jp")); // 2 118 EXPECT_EQ("", GetDomainFromHost(L"a.bar.jp")); // 3 119 EXPECT_EQ("", GetDomainFromHost(L"bar.jp")); // 3 120 EXPECT_EQ("", GetDomainFromHost(L"baz.bar.jp")); // 3 4 121 EXPECT_EQ("a.b.baz.bar.jp", GetDomainFromHost(L"a.b.baz.bar.jp")); // 3 4 122 EXPECT_EQ("pref.bar.jp", GetDomainFromHost(L"baz.pref.bar.jp")); // 5 123 EXPECT_EQ("b.bar.baz.com.", GetDomainFromHost(L"a.b.bar.baz.com.")); // 6 124 EXPECT_EQ("a.d.c", GetDomainFromHost(L"a.d.c")); // 7 125 EXPECT_EQ("a.d.c", GetDomainFromHost(L".a.d.c")); // 7 126 EXPECT_EQ("a.d.c", GetDomainFromHost(L"..a.d.c")); // 7 127 EXPECT_EQ("b.c", GetDomainFromHost(L"a.b.c")); // 7 8 128 EXPECT_EQ("baz.com", GetDomainFromHost(L"baz.com")); // none 129 EXPECT_EQ("baz.com.", GetDomainFromHost(L"baz.com.")); // none 130 131 EXPECT_EQ("", GetDomainFromHost(L"")); 132 EXPECT_EQ("", GetDomainFromHost(L"foo.com..")); 133 EXPECT_EQ("", GetDomainFromHost(L"...")); 134 EXPECT_EQ("", GetDomainFromHost(L"192.168.0.1")); 135 EXPECT_EQ("", GetDomainFromHost(L"localhost.")); 136 EXPECT_EQ("", GetDomainFromHost(L".localhost.")); 137 } 138 139 TEST_F(RegistryControlledDomainTest, TestGetRegistryLength) { 140 TestRegistryControlledDomainService::UseDomainData( 141 Perfect_Hash_Test1::FindDomain); 142 143 // Test GURL version of GetRegistryLength(). 144 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://a.baz.jp/file.html", false)); 145 // 1 146 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://a.baz.jp./file.html", false)); 147 // 1 148 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://ac.jp", false)); // 2 149 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://a.bar.jp", false)); // 3 150 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://bar.jp", false)); // 3 151 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.bar.jp", false)); // 3 4 152 EXPECT_EQ(12U, GetRegistryLengthFromURL("http://a.b.baz.bar.jp", false)); 153 // 4 154 EXPECT_EQ(6U, GetRegistryLengthFromURL("http://baz.pref.bar.jp", false)); 155 // 5 156 EXPECT_EQ(11U, GetRegistryLengthFromURL("http://a.b.bar.baz.com", false)); 157 // 6 158 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://a.d.c", false)); // 7 159 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://.a.d.c", false)); // 7 160 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://..a.d.c", false)); // 7 161 EXPECT_EQ(1U, GetRegistryLengthFromURL("http://a.b.c", false)); // 7 8 162 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.com", false)); // none 163 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.com.", false)); // none 164 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://baz.com", true)); // none 165 EXPECT_EQ(4U, GetRegistryLengthFromURL("http://baz.com.", true)); // none 166 167 EXPECT_EQ(std::string::npos, GetRegistryLengthFromURL("", false)); 168 EXPECT_EQ(std::string::npos, GetRegistryLengthFromURL("http://", false)); 169 EXPECT_EQ(std::string::npos, 170 GetRegistryLengthFromURL("file:///C:/file.html", false)); 171 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://foo.com..", false)); 172 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://...", false)); 173 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://192.168.0.1", false)); 174 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost", false)); 175 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost", true)); 176 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost.", false)); 177 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost.", true)); 178 EXPECT_EQ(0U, GetRegistryLengthFromURL("http:////Comment", false)); 179 180 // Test std::wstring version of GetRegistryLength(). Uses the same 181 // underpinnings as the GURL version, so this is really more of a check of 182 // CanonicalizeHost(). 183 EXPECT_EQ(2U, GetRegistryLengthFromHost(L"a.baz.jp", false)); // 1 184 EXPECT_EQ(3U, GetRegistryLengthFromHost(L"a.baz.jp.", false)); // 1 185 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"ac.jp", false)); // 2 186 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"a.bar.jp", false)); // 3 187 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"bar.jp", false)); // 3 188 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"baz.bar.jp", false)); // 3 4 189 EXPECT_EQ(12U, GetRegistryLengthFromHost(L"a.b.baz.bar.jp", false)); // 4 190 EXPECT_EQ(6U, GetRegistryLengthFromHost(L"baz.pref.bar.jp", false)); // 5 191 EXPECT_EQ(11U, GetRegistryLengthFromHost(L"a.b.bar.baz.com", false)); 192 // 6 193 EXPECT_EQ(3U, GetRegistryLengthFromHost(L"a.d.c", false)); // 7 194 EXPECT_EQ(3U, GetRegistryLengthFromHost(L".a.d.c", false)); // 7 195 EXPECT_EQ(3U, GetRegistryLengthFromHost(L"..a.d.c", false)); // 7 196 EXPECT_EQ(1U, GetRegistryLengthFromHost(L"a.b.c", false)); // 7 8 197 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"baz.com", false)); // none 198 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"baz.com.", false)); // none 199 EXPECT_EQ(3U, GetRegistryLengthFromHost(L"baz.com", true)); // none 200 EXPECT_EQ(4U, GetRegistryLengthFromHost(L"baz.com.", true)); // none 201 202 EXPECT_EQ(std::string::npos, GetRegistryLengthFromHost(L"", false)); 203 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"foo.com..", false)); 204 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"..", false)); 205 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"192.168.0.1", false)); 206 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"localhost", false)); 207 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"localhost", true)); 208 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"localhost.", false)); 209 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"localhost.", true)); 210 } 211 212 TEST_F(RegistryControlledDomainTest, TestSameDomainOrHost) { 213 TestRegistryControlledDomainService::UseDomainData( 214 Perfect_Hash_Test2::FindDomain); 215 216 EXPECT_EQ(true, CompareDomains("http://a.b.bar.jp/file.html", 217 "http://a.b.bar.jp/file.html")); // b.bar.jp 218 EXPECT_EQ(true, CompareDomains("http://a.b.bar.jp/file.html", 219 "http://b.b.bar.jp/file.html")); // b.bar.jp 220 EXPECT_EQ(false, CompareDomains("http://a.foo.jp/file.html", // foo.jp 221 "http://a.not.jp/file.html")); // not.jp 222 EXPECT_EQ(false, CompareDomains("http://a.foo.jp/file.html", // foo.jp 223 "http://a.foo.jp./file.html")); // foo.jp. 224 EXPECT_EQ(false, CompareDomains("http://a.com/file.html", // a.com 225 "http://b.com/file.html")); // b.com 226 EXPECT_EQ(true, CompareDomains("http://a.x.com/file.html", 227 "http://b.x.com/file.html")); // x.com 228 EXPECT_EQ(true, CompareDomains("http://a.x.com/file.html", 229 "http://.x.com/file.html")); // x.com 230 EXPECT_EQ(true, CompareDomains("http://a.x.com/file.html", 231 "http://..b.x.com/file.html")); // x.com 232 EXPECT_EQ(true, CompareDomains("http://intranet/file.html", 233 "http://intranet/file.html")); // intranet 234 EXPECT_EQ(true, CompareDomains("http://127.0.0.1/file.html", 235 "http://127.0.0.1/file.html")); // 127.0.0.1 236 EXPECT_EQ(false, CompareDomains("http://192.168.0.1/file.html", // 192.168.0.1 237 "http://127.0.0.1/file.html")); // 127.0.0.1 238 EXPECT_EQ(false, CompareDomains("file:///C:/file.html", 239 "file:///C:/file.html")); // no host 240 } 241 242 TEST_F(RegistryControlledDomainTest, TestDefaultData) { 243 TestRegistryControlledDomainService::UseDefaultInstance(); 244 245 // Note that no data is set: we're using the default rules. 246 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://google.com", false)); 247 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://stanford.edu", false)); 248 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://ustreas.gov", false)); 249 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://icann.net", false)); 250 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://ferretcentral.org", false)); 251 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://nowhere.foo", false)); 252 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://nowhere.foo", true)); 253 } 254 255 } // namespace 256