OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/macros.h" | 5 #include "base/macros.h" |
6 #include "testing/gtest/include/gtest/gtest.h" | 6 #include "testing/gtest/include/gtest/gtest.h" |
7 #include "url/gurl.h" | 7 #include "url/gurl.h" |
8 #include "url/url_canon.h" | 8 #include "url/url_canon.h" |
9 #include "url/url_test_utils.h" | 9 #include "url/url_test_utils.h" |
10 | 10 |
(...skipping 27 matching lines...) Expand all Loading... |
38 } // namespace | 38 } // namespace |
39 | 39 |
40 // Different types of URLs should be handled differently, and handed off to | 40 // Different types of URLs should be handled differently, and handed off to |
41 // different canonicalizers. | 41 // different canonicalizers. |
42 TEST(GURLTest, Types) { | 42 TEST(GURLTest, Types) { |
43 // URLs with unknown schemes should be treated as path URLs, even when they | 43 // URLs with unknown schemes should be treated as path URLs, even when they |
44 // have things like "://". | 44 // have things like "://". |
45 EXPECT_EQ("something:///HOSTNAME.com/", | 45 EXPECT_EQ("something:///HOSTNAME.com/", |
46 TypesTestCase("something:///HOSTNAME.com/")); | 46 TypesTestCase("something:///HOSTNAME.com/")); |
47 | 47 |
48 // In the reverse, known schemes should always trigger standard URL handling. | 48 // Conversely, URLs with known schemes should always trigger standard URL |
| 49 // handling. |
49 EXPECT_EQ("http://hostname.com/", TypesTestCase("http:HOSTNAME.com")); | 50 EXPECT_EQ("http://hostname.com/", TypesTestCase("http:HOSTNAME.com")); |
50 EXPECT_EQ("http://hostname.com/", TypesTestCase("http:/HOSTNAME.com")); | 51 EXPECT_EQ("http://hostname.com/", TypesTestCase("http:/HOSTNAME.com")); |
51 EXPECT_EQ("http://hostname.com/", TypesTestCase("http://HOSTNAME.com")); | 52 EXPECT_EQ("http://hostname.com/", TypesTestCase("http://HOSTNAME.com")); |
52 EXPECT_EQ("http://hostname.com/", TypesTestCase("http:///HOSTNAME.com")); | 53 EXPECT_EQ("http://hostname.com/", TypesTestCase("http:///HOSTNAME.com")); |
53 | 54 |
54 #ifdef WIN32 | 55 #ifdef WIN32 |
55 // URLs that look like absolute Windows drive specs. | 56 // URLs that look like Windows absolute path specs. |
56 EXPECT_EQ("file:///C:/foo.txt", TypesTestCase("c:\\foo.txt")); | 57 EXPECT_EQ("file:///C:/foo.txt", TypesTestCase("c:\\foo.txt")); |
57 EXPECT_EQ("file:///Z:/foo.txt", TypesTestCase("Z|foo.txt")); | 58 EXPECT_EQ("file:///Z:/foo.txt", TypesTestCase("Z|foo.txt")); |
58 EXPECT_EQ("file://server/foo.txt", TypesTestCase("\\\\server\\foo.txt")); | 59 EXPECT_EQ("file://server/foo.txt", TypesTestCase("\\\\server\\foo.txt")); |
59 EXPECT_EQ("file://server/foo.txt", TypesTestCase("//server/foo.txt")); | 60 EXPECT_EQ("file://server/foo.txt", TypesTestCase("//server/foo.txt")); |
60 #endif | 61 #endif |
61 } | 62 } |
62 | 63 |
63 // Test the basic creation and querying of components in a GURL. We assume | 64 // Test the basic creation and querying of components in a GURL. We assume that |
64 // the parser is already tested and works, so we are mostly interested if the | 65 // the parser is already tested and works, so we are mostly interested if the |
65 // object does the right thing with the results. | 66 // object does the right thing with the results. |
66 TEST(GURLTest, Components) { | 67 TEST(GURLTest, Components) { |
67 GURL url(WStringToUTF16(L"http://user:pass@google.com:99/foo;bar?q=a#ref")); | 68 GURL url(WStringToUTF16(L"http://user:pass@google.com:99/foo;bar?q=a#ref")); |
68 EXPECT_TRUE(url.is_valid()); | 69 EXPECT_TRUE(url.is_valid()); |
69 EXPECT_TRUE(url.SchemeIs("http")); | 70 EXPECT_TRUE(url.SchemeIs("http")); |
70 EXPECT_FALSE(url.SchemeIsFile()); | 71 EXPECT_FALSE(url.SchemeIsFile()); |
71 | 72 |
72 // This is the narrow version of the URL, which should match the wide input. | 73 // This is the narrow version of the URL, which should match the wide input. |
73 EXPECT_EQ("http://user:pass@google.com:99/foo;bar?q=a#ref", url.spec()); | 74 EXPECT_EQ("http://user:pass@google.com:99/foo;bar?q=a#ref", url.spec()); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 EXPECT_EQ("", invalid2.username()); | 169 EXPECT_EQ("", invalid2.username()); |
169 EXPECT_EQ("", invalid2.password()); | 170 EXPECT_EQ("", invalid2.password()); |
170 EXPECT_EQ("", invalid2.host()); | 171 EXPECT_EQ("", invalid2.host()); |
171 EXPECT_EQ("", invalid2.port()); | 172 EXPECT_EQ("", invalid2.port()); |
172 EXPECT_EQ(PORT_UNSPECIFIED, invalid2.IntPort()); | 173 EXPECT_EQ(PORT_UNSPECIFIED, invalid2.IntPort()); |
173 EXPECT_EQ("", invalid2.path()); | 174 EXPECT_EQ("", invalid2.path()); |
174 EXPECT_EQ("", invalid2.query()); | 175 EXPECT_EQ("", invalid2.query()); |
175 EXPECT_EQ("", invalid2.ref()); | 176 EXPECT_EQ("", invalid2.ref()); |
176 } | 177 } |
177 | 178 |
178 // This is a regression test for http://crbug.com/309975 . | 179 // This is a regression test for http://crbug.com/309975. |
179 TEST(GURLTest, SelfAssign) { | 180 TEST(GURLTest, SelfAssign) { |
180 GURL a("filesystem:http://example.com/temporary/"); | 181 GURL a("filesystem:http://example.com/temporary/"); |
181 // This should not crash. | 182 // This should not crash. |
182 a = a; | 183 a = a; |
183 } | 184 } |
184 | 185 |
185 TEST(GURLTest, CopyFileSystem) { | 186 TEST(GURLTest, CopyFileSystem) { |
186 GURL url(WStringToUTF16(L"filesystem:https://user:pass@google.com:99/t/foo;bar
?q=a#ref")); | 187 GURL url(WStringToUTF16(L"filesystem:https://user:pass@google.com:99/t/foo;bar
?q=a#ref")); |
187 | 188 |
188 GURL url2(url); | 189 GURL url2(url); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 "http://google.com:12three45", | 239 "http://google.com:12three45", |
239 "path", | 240 "path", |
240 }; | 241 }; |
241 for (size_t i = 0; i < arraysize(invalid_cases); i++) { | 242 for (size_t i = 0; i < arraysize(invalid_cases); i++) { |
242 EXPECT_FALSE(GURL(invalid_cases[i]).is_valid()) | 243 EXPECT_FALSE(GURL(invalid_cases[i]).is_valid()) |
243 << "Case: " << invalid_cases[i]; | 244 << "Case: " << invalid_cases[i]; |
244 } | 245 } |
245 } | 246 } |
246 | 247 |
247 TEST(GURLTest, ExtraSlashesBeforeAuthority) { | 248 TEST(GURLTest, ExtraSlashesBeforeAuthority) { |
248 // According to RFC3986, the hier-part for URI with an authority must use only | 249 // According to RFC3986, the hierarchical part for URI with an authority |
249 // two slashes, GURL intentionally just ignores slashes more than 2 and parses | 250 // must use only two slashes; GURL intentionally just ignores extra slashes |
250 // the following part as an authority. | 251 // if there are more than 2, and parses the following part as an authority. |
251 GURL url("http:///host"); | 252 GURL url("http:///host"); |
252 EXPECT_EQ("host", url.host()); | 253 EXPECT_EQ("host", url.host()); |
253 EXPECT_EQ("/", url.path()); | 254 EXPECT_EQ("/", url.path()); |
254 } | 255 } |
255 | 256 |
256 // Given an invalid URL, we should still get most of the components. | 257 // Given an invalid URL, we should still get most of the components. |
257 TEST(GURLTest, ComponentGettersWorkEvenForInvalidURL) { | 258 TEST(GURLTest, ComponentGettersWorkEvenForInvalidURL) { |
258 GURL url("http:google.com:foo"); | 259 GURL url("http:google.com:foo"); |
259 EXPECT_FALSE(url.is_valid()); | 260 EXPECT_FALSE(url.is_valid()); |
260 EXPECT_EQ("http://google.com:foo/", url.possibly_invalid_spec()); | 261 EXPECT_EQ("http://google.com:foo/", url.possibly_invalid_spec()); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 }; | 372 }; |
372 | 373 |
373 for (size_t i = 0; i < arraysize(cases); i++) { | 374 for (size_t i = 0; i < arraysize(cases); i++) { |
374 GURL url(cases[i].input); | 375 GURL url(cases[i].input); |
375 GURL empty_path = url.GetWithEmptyPath(); | 376 GURL empty_path = url.GetWithEmptyPath(); |
376 EXPECT_EQ(cases[i].expected, empty_path.spec()); | 377 EXPECT_EQ(cases[i].expected, empty_path.spec()); |
377 } | 378 } |
378 } | 379 } |
379 | 380 |
380 TEST(GURLTest, Replacements) { | 381 TEST(GURLTest, Replacements) { |
381 // The url canonicalizer replacement test will handle most of these case. | 382 // The URL canonicalizer replacement test will handle most of these case. |
382 // The most important thing to do here is to check that the proper | 383 // The most important thing to do here is to check that the proper |
383 // canonicalizer gets called based on the scheme of the input. | 384 // canonicalizer gets called based on the scheme of the input. |
384 struct ReplaceCase { | 385 struct ReplaceCase { |
385 const char* base; | 386 const char* base; |
386 const char* scheme; | 387 const char* scheme; |
387 const char* username; | 388 const char* username; |
388 const char* password; | 389 const char* password; |
389 const char* host; | 390 const char* host; |
390 const char* port; | 391 const char* port; |
391 const char* path; | 392 const char* path; |
392 const char* query; | 393 const char* query; |
393 const char* ref; | 394 const char* ref; |
394 const char* expected; | 395 const char* expected; |
395 } replace_cases[] = { | 396 } replace_cases[] = { |
396 {"http://www.google.com/foo/bar.html?foo#bar", NULL, NULL, NULL, NULL, NULL,
"/", "", "", "http://www.google.com/"}, | 397 {"http://www.google.com/foo/bar.html?foo#bar", NULL, NULL, NULL, NULL, NULL,
"/", "", "", "http://www.google.com/"}, |
397 {"http://www.google.com/foo/bar.html?foo#bar", "javascript", "", "", "", "",
"window.open('foo');", "", "", "javascript:window.open('foo');"}, | 398 {"http://www.google.com/foo/bar.html?foo#bar", "javascript", "", "", "", "",
"window.open('foo');", "", "", "javascript:window.open('foo');"}, |
398 {"file:///C:/foo/bar.txt", "http", NULL, NULL, "www.google.com", "99", "/foo
","search", "ref", "http://www.google.com:99/foo?search#ref"}, | 399 {"file:///C:/foo/bar.txt", "http", NULL, NULL, "www.google.com", "99", "/foo
", "search", "ref", "http://www.google.com:99/foo?search#ref"}, |
399 #ifdef WIN32 | 400 #ifdef WIN32 |
400 {"http://www.google.com/foo/bar.html?foo#bar", "file", "", "", "", "", "c:\\
", "", "", "file:///C:/"}, | 401 {"http://www.google.com/foo/bar.html?foo#bar", "file", "", "", "", "", "c:\\
", "", "", "file:///C:/"}, |
401 #endif | 402 #endif |
402 {"filesystem:http://www.google.com/foo/bar.html?foo#bar", NULL, NULL, NULL,
NULL, NULL, "/", "", "", "filesystem:http://www.google.com/foo/"}, | 403 {"filesystem:http://www.google.com/foo/bar.html?foo#bar", NULL, NULL, NULL,
NULL, NULL, "/", "", "", "filesystem:http://www.google.com/foo/"}, |
403 }; | 404 }; |
404 | 405 |
405 for (size_t i = 0; i < arraysize(replace_cases); i++) { | 406 for (size_t i = 0; i < arraysize(replace_cases); i++) { |
406 const ReplaceCase& cur = replace_cases[i]; | 407 const ReplaceCase& cur = replace_cases[i]; |
407 GURL url(cur.base); | 408 GURL url(cur.base); |
408 GURL::Replacements repl; | 409 GURL::Replacements repl; |
(...skipping 19 matching lines...) Expand all Loading... |
428 GURL url(" data: one ? two # three "); | 429 GURL url(" data: one ? two # three "); |
429 | 430 |
430 // By default the trailing whitespace will have been stripped. | 431 // By default the trailing whitespace will have been stripped. |
431 EXPECT_EQ("data: one ? two # three", url.spec()); | 432 EXPECT_EQ("data: one ? two # three", url.spec()); |
432 GURL::Replacements repl; | 433 GURL::Replacements repl; |
433 repl.ClearRef(); | 434 repl.ClearRef(); |
434 GURL url_no_ref = url.ReplaceComponents(repl); | 435 GURL url_no_ref = url.ReplaceComponents(repl); |
435 | 436 |
436 EXPECT_EQ("data: one ? two ", url_no_ref.spec()); | 437 EXPECT_EQ("data: one ? two ", url_no_ref.spec()); |
437 | 438 |
438 // Importing a parsed url via this constructor overload will retain trailing | 439 // Importing a parsed URL via this constructor overload will retain trailing |
439 // whitespace. | 440 // whitespace. |
440 GURL import_url(url_no_ref.spec(), | 441 GURL import_url(url_no_ref.spec(), |
441 url_no_ref.parsed_for_possibly_invalid_spec(), | 442 url_no_ref.parsed_for_possibly_invalid_spec(), |
442 url_no_ref.is_valid()); | 443 url_no_ref.is_valid()); |
443 EXPECT_EQ(url_no_ref, import_url); | 444 EXPECT_EQ(url_no_ref, import_url); |
444 EXPECT_EQ(import_url.query(), " two "); | 445 EXPECT_EQ(import_url.query(), " two "); |
445 } | 446 } |
446 | 447 |
447 TEST(GURLTest, PathForRequest) { | 448 TEST(GURLTest, PathForRequest) { |
448 struct TestCase { | 449 struct TestCase { |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 }; | 675 }; |
675 | 676 |
676 for (const auto& test : cases) { | 677 for (const auto& test : cases) { |
677 GURL url(test.url); | 678 GURL url(test.url); |
678 EXPECT_EQ(test.expected, url.path()) << test.url; | 679 EXPECT_EQ(test.expected, url.path()) << test.url; |
679 EXPECT_EQ(test.expected, url.GetContent()) << test.url; | 680 EXPECT_EQ(test.expected, url.GetContent()) << test.url; |
680 } | 681 } |
681 } | 682 } |
682 | 683 |
683 } // namespace url | 684 } // namespace url |
OLD | NEW |