blob: b7239997cb62f065e4b0c673cebb2163aaaac821 [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// 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.
initial.commit586acc5fe2008-07-26 22:42:524
5#include "googleurl/src/gurl.h"
6#include "net/base/registry_controlled_domain.h"
7#include "testing/gtest/include/gtest/gtest.h"
8
9namespace {
10
initial.commit586acc5fe2008-07-26 22:42:5211class TestRegistryControlledDomainService :
[email protected]8ac1a752008-07-31 19:40:3712 public net::RegistryControlledDomainService {
initial.commit586acc5fe2008-07-26 22:42:5213 public:
initial.commit586acc5fe2008-07-26 22:42:5214 // Sets and parses the given data.
15 static void UseDomainData(const std::string& data) {
[email protected]8ac1a752008-07-31 19:40:3716 net::RegistryControlledDomainService::UseDomainData(data);
initial.commit586acc5fe2008-07-26 22:42:5217 }
18
[email protected]d862fd92008-08-21 18:15:3519 // Creates a new dedicated instance to be used for testing, deleting any
20 // previously-set one.
21 static void UseDedicatedInstance() {
22 delete static_cast<TestRegistryControlledDomainService*>(
23 SetInstance(new TestRegistryControlledDomainService()));
24 }
25
26 // Restores RegistryControlledDomainService to using its default instance,
27 // deleting any previously-set test instance.
28 static void UseDefaultInstance() {
29 delete static_cast<TestRegistryControlledDomainService*>(SetInstance(NULL));
initial.commit586acc5fe2008-07-26 22:42:5230 }
31};
32
33class RegistryControlledDomainTest : public testing::Test {
34 protected:
35 virtual void SetUp() {
[email protected]d862fd92008-08-21 18:15:3536 TestRegistryControlledDomainService::UseDedicatedInstance();
37 }
38
39 virtual void TearDown() {
40 TestRegistryControlledDomainService::UseDefaultInstance();
initial.commit586acc5fe2008-07-26 22:42:5241 }
42};
43
44// Convenience functions to shorten the names for repeated use below.
45void SetTestData(const std::string& data) {
46 TestRegistryControlledDomainService::UseDomainData(data);
47}
48
49std::string GetDomainFromURL(const std::string& url) {
50 return TestRegistryControlledDomainService::GetDomainAndRegistry(GURL(url));
51}
52
53std::string GetDomainFromHost(const std::wstring& host) {
54 return TestRegistryControlledDomainService::GetDomainAndRegistry(host);
55}
56
57size_t GetRegistryLengthFromURL(const std::string& url,
58 bool allow_unknown_registries) {
59 return TestRegistryControlledDomainService::GetRegistryLength(GURL(url),
60 allow_unknown_registries);
61}
62
63size_t GetRegistryLengthFromHost(const std::wstring& host,
64 bool allow_unknown_registries) {
65 return TestRegistryControlledDomainService::GetRegistryLength(host,
66 allow_unknown_registries);
67}
68
69bool CompareDomains(const std::string& url1, const std::string& url2) {
70 GURL g1 = GURL(url1);
71 GURL g2 = GURL(url2);
72 return TestRegistryControlledDomainService::SameDomainOrHost(g1, g2);
73}
74
initial.commit586acc5fe2008-07-26 22:42:5275TEST_F(RegistryControlledDomainTest, TestParsing) {
76 // Ensure that various simple and pathological cases parse without hanging or
77 // crashing. Testing the correctness of the parsing directly would require
78 // opening the singleton class up more.
79 SetTestData("com");
80 SetTestData("abc.com\n");
81 SetTestData("abc.com\ndef.com\n*.abc.com\n!foo.abc.com");
82 SetTestData("abc.com.\n");
83 SetTestData("");
84 SetTestData("*.");
85 SetTestData("!");
86 SetTestData(".");
87}
88
89static const char kTestData[] = "jp\n" // 1
90 "ac.jp\n" // 2
91 "*.bar.jp\n" // 3
92 "*.baz.bar.jp\n" // 4
93 "*.foo.bar.jp\n" // 5
94 "!foo.bar.jp\n" // 6
95 "!pref.bar.jp\n" // 7
96 "bar.baz.com\n" // 8
97 "*.c\n" // 9
98 "!b.c"; // 10
99
100TEST_F(RegistryControlledDomainTest, TestGetDomainAndRegistry) {
101 SetTestData(kTestData);
102
103 // Test GURL version of GetDomainAndRegistry().
104 EXPECT_EQ("baz.jp", GetDomainFromURL("http://a.baz.jp/file.html")); // 1
105 EXPECT_EQ("baz.jp.", GetDomainFromURL("http://a.baz.jp./file.html")); // 1
106 EXPECT_EQ("", GetDomainFromURL("http://ac.jp")); // 2
107 EXPECT_EQ("", GetDomainFromURL("http://a.bar.jp")); // 3
108 EXPECT_EQ("", GetDomainFromURL("http://bar.jp")); // 3
109 EXPECT_EQ("", GetDomainFromURL("http://baz.bar.jp")); // 3 4
110 EXPECT_EQ("a.b.baz.bar.jp", GetDomainFromURL("http://a.b.baz.bar.jp"));
111 // 4
112 EXPECT_EQ("foo.bar.jp", GetDomainFromURL("http://foo.bar.jp")); // 3 5 6
113 EXPECT_EQ("pref.bar.jp", GetDomainFromURL("http://baz.pref.bar.jp")); // 7
114 EXPECT_EQ("b.bar.baz.com.", GetDomainFromURL("http://a.b.bar.baz.com."));
115 // 8
116 EXPECT_EQ("a.d.c", GetDomainFromURL("http://a.d.c")); // 9
117 EXPECT_EQ("a.d.c", GetDomainFromURL("http://.a.d.c")); // 9
118 EXPECT_EQ("a.d.c", GetDomainFromURL("http://..a.d.c")); // 9
119 EXPECT_EQ("b.c", GetDomainFromURL("http://a.b.c")); // 9 10
120 EXPECT_EQ("baz.com", GetDomainFromURL("http://baz.com")); // none
121 EXPECT_EQ("baz.com.", GetDomainFromURL("http://baz.com.")); // none
122
123 EXPECT_EQ("", GetDomainFromURL(""));
124 EXPECT_EQ("", GetDomainFromURL("http://"));
125 EXPECT_EQ("", GetDomainFromURL("file:///C:/file.html"));
126 EXPECT_EQ("", GetDomainFromURL("http://foo.com.."));
127 EXPECT_EQ("", GetDomainFromURL("http://..."));
128 EXPECT_EQ("", GetDomainFromURL("http://192.168.0.1"));
129 EXPECT_EQ("", GetDomainFromURL("http://localhost"));
130 EXPECT_EQ("", GetDomainFromURL("http://localhost."));
131 EXPECT_EQ("", GetDomainFromURL("http:////Comment"));
132
133 // Test std::wstring version of GetDomainAndRegistry(). Uses the same
134 // underpinnings as the GURL version, so this is really more of a check of
135 // CanonicalizeHost().
136 EXPECT_EQ("baz.jp", GetDomainFromHost(L"a.baz.jp")); // 1
137 EXPECT_EQ("baz.jp.", GetDomainFromHost(L"a.baz.jp.")); // 1
138 EXPECT_EQ("", GetDomainFromHost(L"ac.jp")); // 2
139 EXPECT_EQ("", GetDomainFromHost(L"a.bar.jp")); // 3
140 EXPECT_EQ("", GetDomainFromHost(L"bar.jp")); // 3
141 EXPECT_EQ("", GetDomainFromHost(L"baz.bar.jp")); // 3 4
142 EXPECT_EQ("a.b.baz.bar.jp", GetDomainFromHost(L"a.b.baz.bar.jp")); // 3 4
143 EXPECT_EQ("foo.bar.jp", GetDomainFromHost(L"foo.bar.jp")); // 3 5 6
144 EXPECT_EQ("pref.bar.jp", GetDomainFromHost(L"baz.pref.bar.jp")); // 7
145 EXPECT_EQ("b.bar.baz.com.", GetDomainFromHost(L"a.b.bar.baz.com.")); // 8
146 EXPECT_EQ("a.d.c", GetDomainFromHost(L"a.d.c")); // 9
147 EXPECT_EQ("a.d.c", GetDomainFromHost(L".a.d.c")); // 9
148 EXPECT_EQ("a.d.c", GetDomainFromHost(L"..a.d.c")); // 9
149 EXPECT_EQ("b.c", GetDomainFromHost(L"a.b.c")); // 9 10
150 EXPECT_EQ("baz.com", GetDomainFromHost(L"baz.com")); // none
151 EXPECT_EQ("baz.com.", GetDomainFromHost(L"baz.com.")); // none
152
153 EXPECT_EQ("", GetDomainFromHost(L""));
154 EXPECT_EQ("", GetDomainFromHost(L"foo.com.."));
155 EXPECT_EQ("", GetDomainFromHost(L"..."));
156 EXPECT_EQ("", GetDomainFromHost(L"192.168.0.1"));
157 EXPECT_EQ("", GetDomainFromHost(L"localhost."));
158 EXPECT_EQ("", GetDomainFromHost(L".localhost."));
159}
160
161TEST_F(RegistryControlledDomainTest, TestGetRegistryLength) {
162 SetTestData(kTestData);
163
164 // Test GURL version of GetRegistryLength().
[email protected]d862fd92008-08-21 18:15:35165 EXPECT_EQ(2U, GetRegistryLengthFromURL("http://a.baz.jp/file.html", false));
initial.commit586acc5fe2008-07-26 22:42:52166 // 1
[email protected]d862fd92008-08-21 18:15:35167 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://a.baz.jp./file.html", false));
initial.commit586acc5fe2008-07-26 22:42:52168 // 1
[email protected]d862fd92008-08-21 18:15:35169 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://ac.jp", false)); // 2
170 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://a.bar.jp", false)); // 3
171 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://bar.jp", false)); // 3
172 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.bar.jp", false)); // 3 4
173 EXPECT_EQ(12U, GetRegistryLengthFromURL("http://a.b.baz.bar.jp", false));
initial.commit586acc5fe2008-07-26 22:42:52174 // 4
[email protected]d862fd92008-08-21 18:15:35175 EXPECT_EQ(6U, GetRegistryLengthFromURL("http://foo.bar.jp", false)); // 3 5 6
176 EXPECT_EQ(6U, GetRegistryLengthFromURL("http://baz.pref.bar.jp", false));
initial.commit586acc5fe2008-07-26 22:42:52177 // 7
[email protected]d862fd92008-08-21 18:15:35178 EXPECT_EQ(11U, GetRegistryLengthFromURL("http://a.b.bar.baz.com", false));
initial.commit586acc5fe2008-07-26 22:42:52179 // 8
[email protected]d862fd92008-08-21 18:15:35180 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://a.d.c", false)); // 9
181 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://.a.d.c", false)); // 9
182 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://..a.d.c", false)); // 9
183 EXPECT_EQ(1U, GetRegistryLengthFromURL("http://a.b.c", false)); // 9 10
184 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.com", false)); // none
185 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://baz.com.", false)); // none
186 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://baz.com", true)); // none
187 EXPECT_EQ(4U, GetRegistryLengthFromURL("http://baz.com.", true)); // none
initial.commit586acc5fe2008-07-26 22:42:52188
189 EXPECT_EQ(std::string::npos, GetRegistryLengthFromURL("", false));
190 EXPECT_EQ(std::string::npos, GetRegistryLengthFromURL("http://", false));
191 EXPECT_EQ(std::string::npos,
192 GetRegistryLengthFromURL("file:///C:/file.html", false));
[email protected]d862fd92008-08-21 18:15:35193 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://foo.com..", false));
194 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://...", false));
195 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://192.168.0.1", false));
196 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost", false));
197 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost", true));
198 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost.", false));
199 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://localhost.", true));
200 EXPECT_EQ(0U, GetRegistryLengthFromURL("http:////Comment", false));
initial.commit586acc5fe2008-07-26 22:42:52201
202 // Test std::wstring version of GetRegistryLength(). Uses the same
203 // underpinnings as the GURL version, so this is really more of a check of
204 // CanonicalizeHost().
[email protected]d862fd92008-08-21 18:15:35205 EXPECT_EQ(2U, GetRegistryLengthFromHost(L"a.baz.jp", false)); // 1
206 EXPECT_EQ(3U, GetRegistryLengthFromHost(L"a.baz.jp.", false)); // 1
207 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"ac.jp", false)); // 2
208 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"a.bar.jp", false)); // 3
209 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"bar.jp", false)); // 3
210 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"baz.bar.jp", false)); // 3 4
211 EXPECT_EQ(12U, GetRegistryLengthFromHost(L"a.b.baz.bar.jp", false)); // 4
212 EXPECT_EQ(6U, GetRegistryLengthFromHost(L"foo.bar.jp", false)); // 3 5 6
213 EXPECT_EQ(6U, GetRegistryLengthFromHost(L"baz.pref.bar.jp", false)); // 7
214 EXPECT_EQ(11U, GetRegistryLengthFromHost(L"a.b.bar.baz.com", false));
215 // 8
216 EXPECT_EQ(3U, GetRegistryLengthFromHost(L"a.d.c", false)); // 9
217 EXPECT_EQ(3U, GetRegistryLengthFromHost(L".a.d.c", false)); // 9
218 EXPECT_EQ(3U, GetRegistryLengthFromHost(L"..a.d.c", false)); // 9
219 EXPECT_EQ(1U, GetRegistryLengthFromHost(L"a.b.c", false)); // 9 10
220 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"baz.com", false)); // none
221 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"baz.com.", false)); // none
222 EXPECT_EQ(3U, GetRegistryLengthFromHost(L"baz.com", true)); // none
223 EXPECT_EQ(4U, GetRegistryLengthFromHost(L"baz.com.", true)); // none
initial.commit586acc5fe2008-07-26 22:42:52224
225 EXPECT_EQ(std::string::npos, GetRegistryLengthFromHost(L"", false));
[email protected]d862fd92008-08-21 18:15:35226 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"foo.com..", false));
227 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"..", false));
228 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"192.168.0.1", false));
229 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"localhost", false));
230 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"localhost", true));
231 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"localhost.", false));
232 EXPECT_EQ(0U, GetRegistryLengthFromHost(L"localhost.", true));
initial.commit586acc5fe2008-07-26 22:42:52233}
234
235TEST_F(RegistryControlledDomainTest, TestSameDomainOrHost) {
236 SetTestData("jp\nbar.jp");
237
238 EXPECT_EQ(true, CompareDomains("http://a.b.bar.jp/file.html",
239 "http://a.b.bar.jp/file.html")); // b.bar.jp
240 EXPECT_EQ(true, CompareDomains("http://a.b.bar.jp/file.html",
241 "http://b.b.bar.jp/file.html")); // b.bar.jp
242 EXPECT_EQ(false, CompareDomains("http://a.foo.jp/file.html", // foo.jp
243 "http://a.not.jp/file.html")); // not.jp
244 EXPECT_EQ(false, CompareDomains("http://a.foo.jp/file.html", // foo.jp
245 "http://a.foo.jp./file.html")); // foo.jp.
246 EXPECT_EQ(false, CompareDomains("http://a.com/file.html", // a.com
247 "http://b.com/file.html")); // b.com
248 EXPECT_EQ(true, CompareDomains("http://a.x.com/file.html",
249 "http://b.x.com/file.html")); // x.com
250 EXPECT_EQ(true, CompareDomains("http://a.x.com/file.html",
251 "http://.x.com/file.html")); // x.com
252 EXPECT_EQ(true, CompareDomains("http://a.x.com/file.html",
253 "http://..b.x.com/file.html")); // x.com
254 EXPECT_EQ(true, CompareDomains("http://intranet/file.html",
255 "http://intranet/file.html")); // intranet
256 EXPECT_EQ(true, CompareDomains("http://127.0.0.1/file.html",
257 "http://127.0.0.1/file.html")); // 127.0.0.1
258 EXPECT_EQ(false, CompareDomains("http://192.168.0.1/file.html", // 192.168.0.1
259 "http://127.0.0.1/file.html")); // 127.0.0.1
260 EXPECT_EQ(false, CompareDomains("file:///C:/file.html",
261 "file:///C:/file.html")); // no host
262}
263
264TEST_F(RegistryControlledDomainTest, TestDefaultData) {
[email protected]d862fd92008-08-21 18:15:35265 TestRegistryControlledDomainService::UseDefaultInstance();
266
initial.commit586acc5fe2008-07-26 22:42:52267 // Note that no data is set: we're using the default rules.
[email protected]d862fd92008-08-21 18:15:35268 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://google.com", false));
269 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://stanford.edu", false));
270 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://ustreas.gov", false));
271 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://icann.net", false));
272 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://ferretcentral.org", false));
273 EXPECT_EQ(0U, GetRegistryLengthFromURL("http://nowhere.foo", false));
274 EXPECT_EQ(3U, GetRegistryLengthFromURL("http://nowhere.foo", true));
initial.commit586acc5fe2008-07-26 22:42:52275}
license.botbf09a502008-08-24 00:55:55276
[email protected]11b901ee2008-09-10 00:16:28277} // namespace