1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_feature_list.h"
12*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
13*6777b538SAndroid Build Coastguard Worker #include "url/gurl_abstract_tests.h"
14*6777b538SAndroid Build Coastguard Worker #include "url/origin.h"
15*6777b538SAndroid Build Coastguard Worker #include "url/url_canon.h"
16*6777b538SAndroid Build Coastguard Worker #include "url/url_features.h"
17*6777b538SAndroid Build Coastguard Worker #include "url/url_test_utils.h"
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker namespace url {
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker namespace {
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker // Returns the canonicalized string for the given URL string for the
24*6777b538SAndroid Build Coastguard Worker // GURLTest.Types test.
TypesTestCase(const char * src)25*6777b538SAndroid Build Coastguard Worker std::string TypesTestCase(const char* src) {
26*6777b538SAndroid Build Coastguard Worker GURL gurl(src);
27*6777b538SAndroid Build Coastguard Worker return gurl.possibly_invalid_spec();
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker } // namespace
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker // Different types of URLs should be handled differently, and handed off to
33*6777b538SAndroid Build Coastguard Worker // different canonicalizers.
TEST(GURLTest,Types)34*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, Types) {
35*6777b538SAndroid Build Coastguard Worker // URLs with unknown schemes should be treated as path URLs, even when they
36*6777b538SAndroid Build Coastguard Worker // have things like "://".
37*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("something:///HOSTNAME.com/",
38*6777b538SAndroid Build Coastguard Worker TypesTestCase("something:///HOSTNAME.com/"));
39*6777b538SAndroid Build Coastguard Worker
40*6777b538SAndroid Build Coastguard Worker // Conversely, URLs with known schemes should always trigger standard URL
41*6777b538SAndroid Build Coastguard Worker // handling.
42*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://hostname.com/", TypesTestCase("http:HOSTNAME.com"));
43*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://hostname.com/", TypesTestCase("http:/HOSTNAME.com"));
44*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://hostname.com/", TypesTestCase("http://HOSTNAME.com"));
45*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://hostname.com/", TypesTestCase("http:///HOSTNAME.com"));
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
48*6777b538SAndroid Build Coastguard Worker // URLs that look like Windows absolute path specs.
49*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("file:///C:/foo.txt", TypesTestCase("c:\\foo.txt"));
50*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("file:///Z:/foo.txt", TypesTestCase("Z|foo.txt"));
51*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("file://server/foo.txt", TypesTestCase("\\\\server\\foo.txt"));
52*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("file://server/foo.txt", TypesTestCase("//server/foo.txt"));
53*6777b538SAndroid Build Coastguard Worker #endif
54*6777b538SAndroid Build Coastguard Worker }
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker // Test the basic creation and querying of components in a GURL. We assume that
57*6777b538SAndroid Build Coastguard Worker // the parser is already tested and works, so we are mostly interested if the
58*6777b538SAndroid Build Coastguard Worker // object does the right thing with the results.
TEST(GURLTest,Components)59*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, Components) {
60*6777b538SAndroid Build Coastguard Worker GURL empty_url(u"");
61*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(empty_url.is_empty());
62*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(empty_url.is_valid());
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker GURL url(u"http://user:[email protected]:99/foo;bar?q=a#ref");
65*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url.is_empty());
66*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url.is_valid());
67*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url.SchemeIs("http"));
68*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url.SchemeIsFile());
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker // This is the narrow version of the URL, which should match the wide input.
71*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://user:[email protected]:99/foo;bar?q=a#ref", url.spec());
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http", url.scheme());
74*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("user", url.username());
75*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("pass", url.password());
76*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("google.com", url.host());
77*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("99", url.port());
78*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(99, url.IntPort());
79*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("/foo;bar", url.path());
80*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("q=a", url.query());
81*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("ref", url.ref());
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker // Test parsing userinfo with special characters.
84*6777b538SAndroid Build Coastguard Worker GURL url_special_pass("http://user:%40!$&'()*+,;=:@google.com:12345");
85*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_special_pass.is_valid());
86*6777b538SAndroid Build Coastguard Worker // GURL canonicalizes some delimiters.
87*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("%40!$&%27()*+,%3B%3D%3A", url_special_pass.password());
88*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("google.com", url_special_pass.host());
89*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("12345", url_special_pass.port());
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,Empty)92*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, Empty) {
93*6777b538SAndroid Build Coastguard Worker GURL url;
94*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url.is_valid());
95*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.spec());
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.scheme());
98*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.username());
99*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.password());
100*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.host());
101*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.port());
102*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(PORT_UNSPECIFIED, url.IntPort());
103*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.path());
104*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.query());
105*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.ref());
106*6777b538SAndroid Build Coastguard Worker }
107*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,Copy)108*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, Copy) {
109*6777b538SAndroid Build Coastguard Worker GURL url(u"http://user:[email protected]:99/foo;bar?q=a#ref");
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker GURL url2(url);
112*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url2.is_valid());
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://user:[email protected]:99/foo;bar?q=a#ref", url2.spec());
115*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http", url2.scheme());
116*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("user", url2.username());
117*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("pass", url2.password());
118*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("google.com", url2.host());
119*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("99", url2.port());
120*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(99, url2.IntPort());
121*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("/foo;bar", url2.path());
122*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("q=a", url2.query());
123*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("ref", url2.ref());
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker // Copying of invalid URL should be invalid
126*6777b538SAndroid Build Coastguard Worker GURL invalid;
127*6777b538SAndroid Build Coastguard Worker GURL invalid2(invalid);
128*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid2.is_valid());
129*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.spec());
130*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.scheme());
131*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.username());
132*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.password());
133*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.host());
134*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.port());
135*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(PORT_UNSPECIFIED, invalid2.IntPort());
136*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.path());
137*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.query());
138*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.ref());
139*6777b538SAndroid Build Coastguard Worker }
140*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,Assign)141*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, Assign) {
142*6777b538SAndroid Build Coastguard Worker GURL url(u"http://user:[email protected]:99/foo;bar?q=a#ref");
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker GURL url2;
145*6777b538SAndroid Build Coastguard Worker url2 = url;
146*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url2.is_valid());
147*6777b538SAndroid Build Coastguard Worker
148*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://user:[email protected]:99/foo;bar?q=a#ref", url2.spec());
149*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http", url2.scheme());
150*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("user", url2.username());
151*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("pass", url2.password());
152*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("google.com", url2.host());
153*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("99", url2.port());
154*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(99, url2.IntPort());
155*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("/foo;bar", url2.path());
156*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("q=a", url2.query());
157*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("ref", url2.ref());
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker // Assignment of invalid URL should be invalid
160*6777b538SAndroid Build Coastguard Worker GURL invalid;
161*6777b538SAndroid Build Coastguard Worker GURL invalid2;
162*6777b538SAndroid Build Coastguard Worker invalid2 = invalid;
163*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid2.is_valid());
164*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.spec());
165*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.scheme());
166*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.username());
167*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.password());
168*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.host());
169*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.port());
170*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(PORT_UNSPECIFIED, invalid2.IntPort());
171*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.path());
172*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.query());
173*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", invalid2.ref());
174*6777b538SAndroid Build Coastguard Worker }
175*6777b538SAndroid Build Coastguard Worker
176*6777b538SAndroid Build Coastguard Worker // This is a regression test for http://crbug.com/309975.
TEST(GURLTest,SelfAssign)177*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, SelfAssign) {
178*6777b538SAndroid Build Coastguard Worker GURL a("filesystem:http://example.com/temporary/");
179*6777b538SAndroid Build Coastguard Worker // This should not crash.
180*6777b538SAndroid Build Coastguard Worker a = *&a; // The *& defeats Clang's -Wself-assign warning.
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,CopyFileSystem)183*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, CopyFileSystem) {
184*6777b538SAndroid Build Coastguard Worker GURL url(u"filesystem:https://user:[email protected]:99/t/foo;bar?q=a#ref");
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker GURL url2(url);
187*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url2.is_valid());
188*6777b538SAndroid Build Coastguard Worker
189*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("filesystem:https://google.com:99/t/foo;bar?q=a#ref", url2.spec());
190*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("filesystem", url2.scheme());
191*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url2.username());
192*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url2.password());
193*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url2.host());
194*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url2.port());
195*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(PORT_UNSPECIFIED, url2.IntPort());
196*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("/foo;bar", url2.path());
197*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("q=a", url2.query());
198*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("ref", url2.ref());
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker const GURL* inner = url2.inner_url();
201*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(inner);
202*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("https", inner->scheme());
203*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", inner->username());
204*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", inner->password());
205*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("google.com", inner->host());
206*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("99", inner->port());
207*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(99, inner->IntPort());
208*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("/t", inner->path());
209*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", inner->query());
210*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", inner->ref());
211*6777b538SAndroid Build Coastguard Worker }
212*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,IsValid)213*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, IsValid) {
214*6777b538SAndroid Build Coastguard Worker const char* valid_cases[] = {
215*6777b538SAndroid Build Coastguard Worker "http://google.com",
216*6777b538SAndroid Build Coastguard Worker "unknown://google.com",
217*6777b538SAndroid Build Coastguard Worker "http://user:[email protected]",
218*6777b538SAndroid Build Coastguard Worker "http://google.com:12345",
219*6777b538SAndroid Build Coastguard Worker "http://google.com:0", // 0 is a valid port
220*6777b538SAndroid Build Coastguard Worker "http://google.com/path",
221*6777b538SAndroid Build Coastguard Worker "http://google.com//path",
222*6777b538SAndroid Build Coastguard Worker "http://google.com?k=v#fragment",
223*6777b538SAndroid Build Coastguard Worker "http://user:[email protected]:12345/path?k=v#fragment",
224*6777b538SAndroid Build Coastguard Worker "http:/path",
225*6777b538SAndroid Build Coastguard Worker "http:path",
226*6777b538SAndroid Build Coastguard Worker };
227*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(valid_cases); i++) {
228*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL(valid_cases[i]).is_valid())
229*6777b538SAndroid Build Coastguard Worker << "Case: " << valid_cases[i];
230*6777b538SAndroid Build Coastguard Worker }
231*6777b538SAndroid Build Coastguard Worker
232*6777b538SAndroid Build Coastguard Worker const char* invalid_cases[] = {
233*6777b538SAndroid Build Coastguard Worker "http://?k=v",
234*6777b538SAndroid Build Coastguard Worker "http:://google.com",
235*6777b538SAndroid Build Coastguard Worker "http//google.com",
236*6777b538SAndroid Build Coastguard Worker "http://google.com:12three45",
237*6777b538SAndroid Build Coastguard Worker "file://server:123", // file: URLs cannot have a port
238*6777b538SAndroid Build Coastguard Worker "file://server:0",
239*6777b538SAndroid Build Coastguard Worker "://google.com",
240*6777b538SAndroid Build Coastguard Worker "path",
241*6777b538SAndroid Build Coastguard Worker };
242*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(invalid_cases); i++) {
243*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL(invalid_cases[i]).is_valid())
244*6777b538SAndroid Build Coastguard Worker << "Case: " << invalid_cases[i];
245*6777b538SAndroid Build Coastguard Worker }
246*6777b538SAndroid Build Coastguard Worker }
247*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,ExtraSlashesBeforeAuthority)248*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, ExtraSlashesBeforeAuthority) {
249*6777b538SAndroid Build Coastguard Worker // According to RFC3986, the hierarchical part for URI with an authority
250*6777b538SAndroid Build Coastguard Worker // must use only two slashes; GURL intentionally just ignores extra slashes
251*6777b538SAndroid Build Coastguard Worker // if there are more than 2, and parses the following part as an authority.
252*6777b538SAndroid Build Coastguard Worker GURL url("http:///host");
253*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("host", url.host());
254*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("/", url.path());
255*6777b538SAndroid Build Coastguard Worker }
256*6777b538SAndroid Build Coastguard Worker
257*6777b538SAndroid Build Coastguard Worker // Given invalid URLs, we should still get most of the components.
TEST(GURLTest,ComponentGettersWorkEvenForInvalidURL)258*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, ComponentGettersWorkEvenForInvalidURL) {
259*6777b538SAndroid Build Coastguard Worker constexpr struct InvalidURLTestExpectations {
260*6777b538SAndroid Build Coastguard Worker const char* url;
261*6777b538SAndroid Build Coastguard Worker const char* spec;
262*6777b538SAndroid Build Coastguard Worker const char* scheme;
263*6777b538SAndroid Build Coastguard Worker const char* host;
264*6777b538SAndroid Build Coastguard Worker const char* port;
265*6777b538SAndroid Build Coastguard Worker const char* path;
266*6777b538SAndroid Build Coastguard Worker // Extend as needed...
267*6777b538SAndroid Build Coastguard Worker } expectations[] = {
268*6777b538SAndroid Build Coastguard Worker {
269*6777b538SAndroid Build Coastguard Worker "http:google.com:foo",
270*6777b538SAndroid Build Coastguard Worker "http://google.com:foo/",
271*6777b538SAndroid Build Coastguard Worker "http",
272*6777b538SAndroid Build Coastguard Worker "google.com",
273*6777b538SAndroid Build Coastguard Worker "foo",
274*6777b538SAndroid Build Coastguard Worker "/",
275*6777b538SAndroid Build Coastguard Worker },
276*6777b538SAndroid Build Coastguard Worker {
277*6777b538SAndroid Build Coastguard Worker "https:google.com:foo",
278*6777b538SAndroid Build Coastguard Worker "https://google.com:foo/",
279*6777b538SAndroid Build Coastguard Worker "https",
280*6777b538SAndroid Build Coastguard Worker "google.com",
281*6777b538SAndroid Build Coastguard Worker "foo",
282*6777b538SAndroid Build Coastguard Worker "/",
283*6777b538SAndroid Build Coastguard Worker },
284*6777b538SAndroid Build Coastguard Worker };
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Worker for (const auto& e : expectations) {
287*6777b538SAndroid Build Coastguard Worker const GURL url(e.url);
288*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url.is_valid());
289*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(e.spec, url.possibly_invalid_spec());
290*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(e.scheme, url.scheme());
291*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.username());
292*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.password());
293*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(e.host, url.host());
294*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(e.port, url.port());
295*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(PORT_INVALID, url.IntPort());
296*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(e.path, url.path());
297*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.query());
298*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", url.ref());
299*6777b538SAndroid Build Coastguard Worker }
300*6777b538SAndroid Build Coastguard Worker }
301*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,Resolve)302*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, Resolve) {
303*6777b538SAndroid Build Coastguard Worker // The tricky cases for relative URL resolving are tested in the
304*6777b538SAndroid Build Coastguard Worker // canonicalizer unit test. Here, we just test that the GURL integration
305*6777b538SAndroid Build Coastguard Worker // works properly.
306*6777b538SAndroid Build Coastguard Worker struct ResolveCase {
307*6777b538SAndroid Build Coastguard Worker const char* base;
308*6777b538SAndroid Build Coastguard Worker const char* relative;
309*6777b538SAndroid Build Coastguard Worker bool expected_valid;
310*6777b538SAndroid Build Coastguard Worker const char* expected;
311*6777b538SAndroid Build Coastguard Worker } resolve_cases[] = {
312*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/", "foo.html", true,
313*6777b538SAndroid Build Coastguard Worker "http://www.google.com/foo.html"},
314*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/foo/", "bar", true,
315*6777b538SAndroid Build Coastguard Worker "http://www.google.com/foo/bar"},
316*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/foo/", "/bar", true, "http://www.google.com/bar"},
317*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/foo", "bar", true, "http://www.google.com/bar"},
318*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/", "http://images.google.com/foo.html", true,
319*6777b538SAndroid Build Coastguard Worker "http://images.google.com/foo.html"},
320*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/", "http://images.\tgoogle.\ncom/\rfoo.html",
321*6777b538SAndroid Build Coastguard Worker true, "http://images.google.com/foo.html"},
322*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/blah/bloo?c#d", "../../../hello/./world.html?a#b",
323*6777b538SAndroid Build Coastguard Worker true, "http://www.google.com/hello/world.html?a#b"},
324*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/foo#bar", "#com", true,
325*6777b538SAndroid Build Coastguard Worker "http://www.google.com/foo#com"},
326*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/", "Https:images.google.com", true,
327*6777b538SAndroid Build Coastguard Worker "https://images.google.com/"},
328*6777b538SAndroid Build Coastguard Worker // An opaque path URL can be replaced with a special absolute URL.
329*6777b538SAndroid Build Coastguard Worker {"data:blahblah", "http://google.com/", true, "http://google.com/"},
330*6777b538SAndroid Build Coastguard Worker {"data:blahblah", "http:google.com", true, "http://google.com/"},
331*6777b538SAndroid Build Coastguard Worker {"data:blahblah", "https:google.com", true, "https://google.com/"},
332*6777b538SAndroid Build Coastguard Worker // An opaque path URL can not be replaced with a relative URL.
333*6777b538SAndroid Build Coastguard Worker {"git:opaque", "", false, ""},
334*6777b538SAndroid Build Coastguard Worker {"git:opaque", "path", false, ""},
335*6777b538SAndroid Build Coastguard Worker // A non-special URL which doesn't have a host can be replaced with a
336*6777b538SAndroid Build Coastguard Worker // relative URL.
337*6777b538SAndroid Build Coastguard Worker {"git:/a", "b", true, "git:/b"},
338*6777b538SAndroid Build Coastguard Worker // Filesystem URLs have different paths to test.
339*6777b538SAndroid Build Coastguard Worker {"filesystem:http://www.google.com/type/", "foo.html", true,
340*6777b538SAndroid Build Coastguard Worker "filesystem:http://www.google.com/type/foo.html"},
341*6777b538SAndroid Build Coastguard Worker {"filesystem:http://www.google.com/type/", "../foo.html", true,
342*6777b538SAndroid Build Coastguard Worker "filesystem:http://www.google.com/type/foo.html"},
343*6777b538SAndroid Build Coastguard Worker // https://crbug.com/530123 - scheme validation (e.g. are "10.0.0.7:"
344*6777b538SAndroid Build Coastguard Worker // or "x1:" valid schemes) when deciding if |relative| is an absolute url.
345*6777b538SAndroid Build Coastguard Worker {"file:///some/dir/ip-relative.html", "10.0.0.7:8080/foo.html", true,
346*6777b538SAndroid Build Coastguard Worker "file:///some/dir/10.0.0.7:8080/foo.html"},
347*6777b538SAndroid Build Coastguard Worker {"file:///some/dir/", "1://host", true, "file:///some/dir/1://host"},
348*6777b538SAndroid Build Coastguard Worker {"file:///some/dir/", "x1://host", true, "x1://host"},
349*6777b538SAndroid Build Coastguard Worker {"file:///some/dir/", "X1://host", true, "x1://host"},
350*6777b538SAndroid Build Coastguard Worker {"file:///some/dir/", "x.://host", true, "x.://host"},
351*6777b538SAndroid Build Coastguard Worker {"file:///some/dir/", "x+://host", true, "x+://host"},
352*6777b538SAndroid Build Coastguard Worker {"file:///some/dir/", "x-://host", true, "x-://host"},
353*6777b538SAndroid Build Coastguard Worker {"file:///some/dir/", "x!://host", true, "file:///some/dir/x!://host"},
354*6777b538SAndroid Build Coastguard Worker {"file:///some/dir/", "://host", true, "file:///some/dir/://host"},
355*6777b538SAndroid Build Coastguard Worker };
356*6777b538SAndroid Build Coastguard Worker
357*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(resolve_cases); i++) {
358*6777b538SAndroid Build Coastguard Worker // 8-bit code path.
359*6777b538SAndroid Build Coastguard Worker GURL input(resolve_cases[i].base);
360*6777b538SAndroid Build Coastguard Worker GURL output = input.Resolve(resolve_cases[i].relative);
361*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(resolve_cases[i].expected_valid, output.is_valid()) << i;
362*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(resolve_cases[i].expected, output.spec()) << i;
363*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(output.SchemeIsFileSystem(), output.inner_url() != NULL);
364*6777b538SAndroid Build Coastguard Worker
365*6777b538SAndroid Build Coastguard Worker // Wide code path.
366*6777b538SAndroid Build Coastguard Worker GURL inputw(base::UTF8ToUTF16(resolve_cases[i].base));
367*6777b538SAndroid Build Coastguard Worker GURL outputw =
368*6777b538SAndroid Build Coastguard Worker input.Resolve(base::UTF8ToUTF16(resolve_cases[i].relative));
369*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(resolve_cases[i].expected_valid, outputw.is_valid()) << i;
370*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(resolve_cases[i].expected, outputw.spec()) << i;
371*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(outputw.SchemeIsFileSystem(), outputw.inner_url() != NULL);
372*6777b538SAndroid Build Coastguard Worker }
373*6777b538SAndroid Build Coastguard Worker }
374*6777b538SAndroid Build Coastguard Worker
375*6777b538SAndroid Build Coastguard Worker class GURLTypedTest : public ::testing::TestWithParam<bool> {
376*6777b538SAndroid Build Coastguard Worker public:
GURLTypedTest()377*6777b538SAndroid Build Coastguard Worker GURLTypedTest()
378*6777b538SAndroid Build Coastguard Worker : use_standard_compliant_non_special_scheme_url_parsing_(GetParam()) {
379*6777b538SAndroid Build Coastguard Worker if (use_standard_compliant_non_special_scheme_url_parsing_) {
380*6777b538SAndroid Build Coastguard Worker scoped_feature_list_.InitAndEnableFeature(
381*6777b538SAndroid Build Coastguard Worker kStandardCompliantNonSpecialSchemeURLParsing);
382*6777b538SAndroid Build Coastguard Worker } else {
383*6777b538SAndroid Build Coastguard Worker scoped_feature_list_.InitAndDisableFeature(
384*6777b538SAndroid Build Coastguard Worker kStandardCompliantNonSpecialSchemeURLParsing);
385*6777b538SAndroid Build Coastguard Worker }
386*6777b538SAndroid Build Coastguard Worker }
387*6777b538SAndroid Build Coastguard Worker
388*6777b538SAndroid Build Coastguard Worker protected:
389*6777b538SAndroid Build Coastguard Worker struct ResolveCase {
390*6777b538SAndroid Build Coastguard Worker std::string_view base;
391*6777b538SAndroid Build Coastguard Worker std::string_view relative;
392*6777b538SAndroid Build Coastguard Worker std::optional<std::string_view> expected;
393*6777b538SAndroid Build Coastguard Worker };
394*6777b538SAndroid Build Coastguard Worker
395*6777b538SAndroid Build Coastguard Worker using ApplyReplacementsFunc = GURL(const GURL&);
396*6777b538SAndroid Build Coastguard Worker
397*6777b538SAndroid Build Coastguard Worker struct ReplaceCase {
398*6777b538SAndroid Build Coastguard Worker std::string_view base;
399*6777b538SAndroid Build Coastguard Worker ApplyReplacementsFunc* apply_replacements;
400*6777b538SAndroid Build Coastguard Worker std::string_view expected;
401*6777b538SAndroid Build Coastguard Worker };
402*6777b538SAndroid Build Coastguard Worker
403*6777b538SAndroid Build Coastguard Worker struct ReplaceHostCase {
404*6777b538SAndroid Build Coastguard Worker std::string_view base;
405*6777b538SAndroid Build Coastguard Worker std::string_view replacement_host;
406*6777b538SAndroid Build Coastguard Worker std::string_view expected;
407*6777b538SAndroid Build Coastguard Worker };
408*6777b538SAndroid Build Coastguard Worker
409*6777b538SAndroid Build Coastguard Worker struct ReplacePathCase {
410*6777b538SAndroid Build Coastguard Worker std::string_view base;
411*6777b538SAndroid Build Coastguard Worker std::string_view replacement_path;
412*6777b538SAndroid Build Coastguard Worker std::string_view expected;
413*6777b538SAndroid Build Coastguard Worker };
414*6777b538SAndroid Build Coastguard Worker
TestResolve(const ResolveCase & resolve_case)415*6777b538SAndroid Build Coastguard Worker void TestResolve(const ResolveCase& resolve_case) {
416*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message() << "base: " << resolve_case.base
417*6777b538SAndroid Build Coastguard Worker << ", relative: " << resolve_case.relative);
418*6777b538SAndroid Build Coastguard Worker GURL input(resolve_case.base);
419*6777b538SAndroid Build Coastguard Worker GURL output = input.Resolve(resolve_case.relative);
420*6777b538SAndroid Build Coastguard Worker if (resolve_case.expected) {
421*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(output.is_valid());
422*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(output.spec(), *resolve_case.expected);
423*6777b538SAndroid Build Coastguard Worker } else {
424*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(output.is_valid());
425*6777b538SAndroid Build Coastguard Worker }
426*6777b538SAndroid Build Coastguard Worker }
427*6777b538SAndroid Build Coastguard Worker
TestReplace(const ReplaceCase & replace)428*6777b538SAndroid Build Coastguard Worker void TestReplace(const ReplaceCase& replace) {
429*6777b538SAndroid Build Coastguard Worker GURL output = replace.apply_replacements(GURL(replace.base));
430*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(output.spec(), replace.expected);
431*6777b538SAndroid Build Coastguard Worker }
432*6777b538SAndroid Build Coastguard Worker
TestReplaceHost(const ReplaceHostCase & replace)433*6777b538SAndroid Build Coastguard Worker void TestReplaceHost(const ReplaceHostCase& replace) {
434*6777b538SAndroid Build Coastguard Worker GURL url(replace.base);
435*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
436*6777b538SAndroid Build Coastguard Worker replacements.SetHostStr(replace.replacement_host);
437*6777b538SAndroid Build Coastguard Worker GURL output = url.ReplaceComponents(replacements);
438*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(output.spec(), replace.expected);
439*6777b538SAndroid Build Coastguard Worker }
440*6777b538SAndroid Build Coastguard Worker
TestReplacePath(const ReplacePathCase & replace)441*6777b538SAndroid Build Coastguard Worker void TestReplacePath(const ReplacePathCase& replace) {
442*6777b538SAndroid Build Coastguard Worker GURL url(replace.base);
443*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
444*6777b538SAndroid Build Coastguard Worker replacements.SetPathStr(replace.replacement_path);
445*6777b538SAndroid Build Coastguard Worker GURL output = url.ReplaceComponents(replacements);
446*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(output.spec(), replace.expected);
447*6777b538SAndroid Build Coastguard Worker }
448*6777b538SAndroid Build Coastguard Worker
449*6777b538SAndroid Build Coastguard Worker bool use_standard_compliant_non_special_scheme_url_parsing_;
450*6777b538SAndroid Build Coastguard Worker
451*6777b538SAndroid Build Coastguard Worker private:
452*6777b538SAndroid Build Coastguard Worker base::test::ScopedFeatureList scoped_feature_list_;
453*6777b538SAndroid Build Coastguard Worker };
454*6777b538SAndroid Build Coastguard Worker
TEST_P(GURLTypedTest,Resolve)455*6777b538SAndroid Build Coastguard Worker TEST_P(GURLTypedTest, Resolve) {
456*6777b538SAndroid Build Coastguard Worker // Test flag-dependent behaviors.
457*6777b538SAndroid Build Coastguard Worker // Existing tests in GURLTest::Resolve cover common cases.
458*6777b538SAndroid Build Coastguard Worker if (use_standard_compliant_non_special_scheme_url_parsing_) {
459*6777b538SAndroid Build Coastguard Worker ResolveCase cases[] = {
460*6777b538SAndroid Build Coastguard Worker // Non-special base URLs whose paths are empty.
461*6777b538SAndroid Build Coastguard Worker {"git://host", "", "git://host"},
462*6777b538SAndroid Build Coastguard Worker {"git://host", ".", "git://host/"},
463*6777b538SAndroid Build Coastguard Worker {"git://host", "..", "git://host/"},
464*6777b538SAndroid Build Coastguard Worker {"git://host", "a", "git://host/a"},
465*6777b538SAndroid Build Coastguard Worker {"git://host", "/a", "git://host/a"},
466*6777b538SAndroid Build Coastguard Worker
467*6777b538SAndroid Build Coastguard Worker // Non-special base URLs whose paths are "/".
468*6777b538SAndroid Build Coastguard Worker {"git://host/", "", "git://host/"},
469*6777b538SAndroid Build Coastguard Worker {"git://host/", ".", "git://host/"},
470*6777b538SAndroid Build Coastguard Worker {"git://host/", "..", "git://host/"},
471*6777b538SAndroid Build Coastguard Worker {"git://host/", "a", "git://host/a"},
472*6777b538SAndroid Build Coastguard Worker {"git://host/", "/a", "git://host/a"},
473*6777b538SAndroid Build Coastguard Worker
474*6777b538SAndroid Build Coastguard Worker // Non-special base URLs whose hosts and paths are non-empty.
475*6777b538SAndroid Build Coastguard Worker {"git://host/b", "a", "git://host/a"},
476*6777b538SAndroid Build Coastguard Worker {"git://host/b/c", "a", "git://host/b/a"},
477*6777b538SAndroid Build Coastguard Worker {"git://host/b/c", "../a", "git://host/a"},
478*6777b538SAndroid Build Coastguard Worker
479*6777b538SAndroid Build Coastguard Worker // An opaque path can be specified.
480*6777b538SAndroid Build Coastguard Worker {"git://host", "git:opaque", "git:opaque"},
481*6777b538SAndroid Build Coastguard Worker {"git://host/path#ref", "git:opaque", "git:opaque"},
482*6777b538SAndroid Build Coastguard Worker {"git:/path", "git:opaque", "git:opaque"},
483*6777b538SAndroid Build Coastguard Worker {"https://host/path", "git:opaque", "git:opaque"},
484*6777b538SAndroid Build Coastguard Worker
485*6777b538SAndroid Build Coastguard Worker // Path-only base URLs should remain path-only URLs unless a host is
486*6777b538SAndroid Build Coastguard Worker // specified.
487*6777b538SAndroid Build Coastguard Worker {"git:/", "", "git:/"},
488*6777b538SAndroid Build Coastguard Worker {"git:/", ".", "git:/"},
489*6777b538SAndroid Build Coastguard Worker {"git:/", "..", "git:/"},
490*6777b538SAndroid Build Coastguard Worker {"git:/", "a", "git:/a"},
491*6777b538SAndroid Build Coastguard Worker {"git:/", "/a", "git:/a"},
492*6777b538SAndroid Build Coastguard Worker {"git:/#ref", "", "git:/"},
493*6777b538SAndroid Build Coastguard Worker {"git:/#ref", "a", "git:/a"},
494*6777b538SAndroid Build Coastguard Worker
495*6777b538SAndroid Build Coastguard Worker // Non-special base URLs whose hosts and path are both empty. The
496*6777b538SAndroid Build Coastguard Worker // result's host should remain empty unless a relative URL specify a
497*6777b538SAndroid Build Coastguard Worker // host.
498*6777b538SAndroid Build Coastguard Worker {"git://", "", "git://"},
499*6777b538SAndroid Build Coastguard Worker {"git://", ".", "git:///"},
500*6777b538SAndroid Build Coastguard Worker {"git://", "..", "git:///"},
501*6777b538SAndroid Build Coastguard Worker {"git://", "a", "git:///a"},
502*6777b538SAndroid Build Coastguard Worker {"git://", "/a", "git:///a"},
503*6777b538SAndroid Build Coastguard Worker
504*6777b538SAndroid Build Coastguard Worker // Non-special base URLs whose hosts are empty, but with non-empty path.
505*6777b538SAndroid Build Coastguard Worker {"git:///", "", "git:///"},
506*6777b538SAndroid Build Coastguard Worker {"git:///", ".", "git:///"},
507*6777b538SAndroid Build Coastguard Worker {"git:///", "..", "git:///"},
508*6777b538SAndroid Build Coastguard Worker {"git:///", "a", "git:///a"},
509*6777b538SAndroid Build Coastguard Worker {"git:///", "/a", "git:///a"},
510*6777b538SAndroid Build Coastguard Worker {"git:///#ref", "", "git:///"},
511*6777b538SAndroid Build Coastguard Worker {"git:///#ref", "a", "git:///a"},
512*6777b538SAndroid Build Coastguard Worker
513*6777b538SAndroid Build Coastguard Worker // Relative URLs can specify empty hosts for non-special base URLs.
514*6777b538SAndroid Build Coastguard Worker // e.g. "///path"
515*6777b538SAndroid Build Coastguard Worker {"git://host/", "//", "git://"},
516*6777b538SAndroid Build Coastguard Worker {"git://host/", "//a", "git://a"},
517*6777b538SAndroid Build Coastguard Worker {"git://host/", "///", "git:///"},
518*6777b538SAndroid Build Coastguard Worker {"git://host/", "////", "git:////"},
519*6777b538SAndroid Build Coastguard Worker {"git://host/", "////..", "git:///"},
520*6777b538SAndroid Build Coastguard Worker {"git://host/", "////../..", "git:///"},
521*6777b538SAndroid Build Coastguard Worker {"git://host/", "////../../..", "git:///"},
522*6777b538SAndroid Build Coastguard Worker };
523*6777b538SAndroid Build Coastguard Worker for (const auto& i : cases) {
524*6777b538SAndroid Build Coastguard Worker TestResolve(i);
525*6777b538SAndroid Build Coastguard Worker }
526*6777b538SAndroid Build Coastguard Worker } else {
527*6777b538SAndroid Build Coastguard Worker ResolveCase cases[] = {
528*6777b538SAndroid Build Coastguard Worker {"git:/", "", "git:/"},
529*6777b538SAndroid Build Coastguard Worker {"git:/", "a", "git:/a"},
530*6777b538SAndroid Build Coastguard Worker {"git:/path", "a", "git:/a"},
531*6777b538SAndroid Build Coastguard Worker // All non-special base URLs which don't start with a *single* slash
532*6777b538SAndroid Build Coastguard Worker // can not be resolved with a relative URL.
533*6777b538SAndroid Build Coastguard Worker {"git:", "", std::nullopt},
534*6777b538SAndroid Build Coastguard Worker {"git://host", "", std::nullopt},
535*6777b538SAndroid Build Coastguard Worker {"git://host", "a", std::nullopt},
536*6777b538SAndroid Build Coastguard Worker {"git://", "", std::nullopt},
537*6777b538SAndroid Build Coastguard Worker {"git:///", "", std::nullopt},
538*6777b538SAndroid Build Coastguard Worker };
539*6777b538SAndroid Build Coastguard Worker for (const auto& i : cases) {
540*6777b538SAndroid Build Coastguard Worker TestResolve(i);
541*6777b538SAndroid Build Coastguard Worker }
542*6777b538SAndroid Build Coastguard Worker }
543*6777b538SAndroid Build Coastguard Worker }
544*6777b538SAndroid Build Coastguard Worker
545*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(All, GURLTypedTest, ::testing::Bool());
546*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,GetOrigin)547*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, GetOrigin) {
548*6777b538SAndroid Build Coastguard Worker struct TestCase {
549*6777b538SAndroid Build Coastguard Worker const char* input;
550*6777b538SAndroid Build Coastguard Worker const char* expected;
551*6777b538SAndroid Build Coastguard Worker } cases[] = {
552*6777b538SAndroid Build Coastguard Worker {"http://www.google.com", "http://www.google.com/"},
553*6777b538SAndroid Build Coastguard Worker {"javascript:window.alert(\"hello,world\");", ""},
554*6777b538SAndroid Build Coastguard Worker {"http://user:[email protected]:21/blah#baz",
555*6777b538SAndroid Build Coastguard Worker "http://www.google.com:21/"},
556*6777b538SAndroid Build Coastguard Worker {"http://[email protected]", "http://www.google.com/"},
557*6777b538SAndroid Build Coastguard Worker {"http://:[email protected]", "http://www.google.com/"},
558*6777b538SAndroid Build Coastguard Worker {"http://:@www.google.com", "http://www.google.com/"},
559*6777b538SAndroid Build Coastguard Worker {"filesystem:http://www.google.com/temp/foo?q#b",
560*6777b538SAndroid Build Coastguard Worker "http://www.google.com/"},
561*6777b538SAndroid Build Coastguard Worker {"filesystem:http://user:[email protected]:21/blah#baz",
562*6777b538SAndroid Build Coastguard Worker "http://google.com:21/"},
563*6777b538SAndroid Build Coastguard Worker {"blob:null/guid-goes-here", ""},
564*6777b538SAndroid Build Coastguard Worker {"blob:http://origin/guid-goes-here", "" /* should be http://origin/ */},
565*6777b538SAndroid Build Coastguard Worker };
566*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(cases); i++) {
567*6777b538SAndroid Build Coastguard Worker GURL url(cases[i].input);
568*6777b538SAndroid Build Coastguard Worker GURL origin = url.DeprecatedGetOriginAsURL();
569*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected, origin.spec());
570*6777b538SAndroid Build Coastguard Worker }
571*6777b538SAndroid Build Coastguard Worker }
572*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,GetAsReferrer)573*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, GetAsReferrer) {
574*6777b538SAndroid Build Coastguard Worker struct TestCase {
575*6777b538SAndroid Build Coastguard Worker const char* input;
576*6777b538SAndroid Build Coastguard Worker const char* expected;
577*6777b538SAndroid Build Coastguard Worker } cases[] = {
578*6777b538SAndroid Build Coastguard Worker {"http://www.google.com", "http://www.google.com/"},
579*6777b538SAndroid Build Coastguard Worker {"http://user:[email protected]:21/blah#baz", "http://www.google.com:21/blah"},
580*6777b538SAndroid Build Coastguard Worker {"http://[email protected]", "http://www.google.com/"},
581*6777b538SAndroid Build Coastguard Worker {"http://:[email protected]", "http://www.google.com/"},
582*6777b538SAndroid Build Coastguard Worker {"http://:@www.google.com", "http://www.google.com/"},
583*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/temp/foo?q#b", "http://www.google.com/temp/foo?q"},
584*6777b538SAndroid Build Coastguard Worker {"not a url", ""},
585*6777b538SAndroid Build Coastguard Worker {"unknown-scheme://foo.html", ""},
586*6777b538SAndroid Build Coastguard Worker {"file:///tmp/test.html", ""},
587*6777b538SAndroid Build Coastguard Worker {"https://www.google.com", "https://www.google.com/"},
588*6777b538SAndroid Build Coastguard Worker };
589*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(cases); i++) {
590*6777b538SAndroid Build Coastguard Worker GURL url(cases[i].input);
591*6777b538SAndroid Build Coastguard Worker GURL origin = url.GetAsReferrer();
592*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected, origin.spec());
593*6777b538SAndroid Build Coastguard Worker }
594*6777b538SAndroid Build Coastguard Worker }
595*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,GetWithEmptyPath)596*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, GetWithEmptyPath) {
597*6777b538SAndroid Build Coastguard Worker struct TestCase {
598*6777b538SAndroid Build Coastguard Worker const char* input;
599*6777b538SAndroid Build Coastguard Worker const char* expected;
600*6777b538SAndroid Build Coastguard Worker } cases[] = {
601*6777b538SAndroid Build Coastguard Worker {"http://www.google.com", "http://www.google.com/"},
602*6777b538SAndroid Build Coastguard Worker {"javascript:window.alert(\"hello, world\");", ""},
603*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/foo/bar.html?baz=22", "http://www.google.com/"},
604*6777b538SAndroid Build Coastguard Worker {"filesystem:http://www.google.com/temporary/bar.html?baz=22", "filesystem:http://www.google.com/temporary/"},
605*6777b538SAndroid Build Coastguard Worker {"filesystem:file:///temporary/bar.html?baz=22", "filesystem:file:///temporary/"},
606*6777b538SAndroid Build Coastguard Worker };
607*6777b538SAndroid Build Coastguard Worker
608*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(cases); i++) {
609*6777b538SAndroid Build Coastguard Worker GURL url(cases[i].input);
610*6777b538SAndroid Build Coastguard Worker GURL empty_path = url.GetWithEmptyPath();
611*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected, empty_path.spec());
612*6777b538SAndroid Build Coastguard Worker }
613*6777b538SAndroid Build Coastguard Worker }
614*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,GetWithoutFilename)615*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, GetWithoutFilename) {
616*6777b538SAndroid Build Coastguard Worker struct TestCase {
617*6777b538SAndroid Build Coastguard Worker const char* input;
618*6777b538SAndroid Build Coastguard Worker const char* expected;
619*6777b538SAndroid Build Coastguard Worker } cases[] = {
620*6777b538SAndroid Build Coastguard Worker // Common Standard URLs.
621*6777b538SAndroid Build Coastguard Worker {"https://www.google.com", "https://www.google.com/"},
622*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/", "https://www.google.com/"},
623*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps.htm", "https://www.google.com/"},
624*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/", "https://www.google.com/maps/"},
625*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/index.html", "https://www.google.com/"},
626*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/index.html?q=maps", "https://www.google.com/"},
627*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/index.html#maps/", "https://www.google.com/"},
628*6777b538SAndroid Build Coastguard Worker {"https://foo:[email protected]/maps.htm", "https://foo:[email protected]/"},
629*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/index.html", "https://www.google.com/maps/au/"},
630*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/north", "https://www.google.com/maps/au/"},
631*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/north/", "https://www.google.com/maps/au/north/"},
632*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/index.html?q=maps#fragment/", "https://www.google.com/maps/au/"},
633*6777b538SAndroid Build Coastguard Worker {"http://www.google.com:8000/maps/au/index.html?q=maps#fragment/", "http://www.google.com:8000/maps/au/"},
634*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/north/?q=maps#fragment", "https://www.google.com/maps/au/north/"},
635*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/north?q=maps#fragment", "https://www.google.com/maps/au/"},
636*6777b538SAndroid Build Coastguard Worker // Less common standard URLs.
637*6777b538SAndroid Build Coastguard Worker {"filesystem:http://www.google.com/temporary/bar.html?baz=22", "filesystem:http://www.google.com/temporary/"},
638*6777b538SAndroid Build Coastguard Worker {"file:///temporary/bar.html?baz=22","file:///temporary/"},
639*6777b538SAndroid Build Coastguard Worker {"ftp://foo/test/index.html", "ftp://foo/test/"},
640*6777b538SAndroid Build Coastguard Worker {"gopher://foo/test/index.html", "gopher://foo/test/"},
641*6777b538SAndroid Build Coastguard Worker {"ws://foo/test/index.html", "ws://foo/test/"},
642*6777b538SAndroid Build Coastguard Worker // Non-standard, hierarchical URLs.
643*6777b538SAndroid Build Coastguard Worker {"chrome://foo/bar.html", "chrome://foo/"},
644*6777b538SAndroid Build Coastguard Worker {"httpa://foo/test/index.html", "httpa://foo/test/"},
645*6777b538SAndroid Build Coastguard Worker // Non-standard, non-hierarchical URLs.
646*6777b538SAndroid Build Coastguard Worker {"blob:https://foo.bar/test/index.html", ""},
647*6777b538SAndroid Build Coastguard Worker {"about:blank", ""},
648*6777b538SAndroid Build Coastguard Worker {"data:foobar", ""},
649*6777b538SAndroid Build Coastguard Worker {"scheme:opaque_data", ""},
650*6777b538SAndroid Build Coastguard Worker // Invalid URLs.
651*6777b538SAndroid Build Coastguard Worker {"foobar", ""},
652*6777b538SAndroid Build Coastguard Worker };
653*6777b538SAndroid Build Coastguard Worker
654*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(cases); i++) {
655*6777b538SAndroid Build Coastguard Worker GURL url(cases[i].input);
656*6777b538SAndroid Build Coastguard Worker GURL without_filename = url.GetWithoutFilename();
657*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected, without_filename.spec()) << i;
658*6777b538SAndroid Build Coastguard Worker }
659*6777b538SAndroid Build Coastguard Worker }
660*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,GetWithoutRef)661*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, GetWithoutRef) {
662*6777b538SAndroid Build Coastguard Worker struct TestCase {
663*6777b538SAndroid Build Coastguard Worker const char* input;
664*6777b538SAndroid Build Coastguard Worker const char* expected;
665*6777b538SAndroid Build Coastguard Worker } cases[] = {
666*6777b538SAndroid Build Coastguard Worker // Common Standard URLs.
667*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/index.html",
668*6777b538SAndroid Build Coastguard Worker "https://www.google.com/index.html"},
669*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/index.html#maps/",
670*6777b538SAndroid Build Coastguard Worker "https://www.google.com/index.html"},
671*6777b538SAndroid Build Coastguard Worker
672*6777b538SAndroid Build Coastguard Worker {"https://foo:[email protected]/maps.htm",
673*6777b538SAndroid Build Coastguard Worker "https://foo:[email protected]/maps.htm"},
674*6777b538SAndroid Build Coastguard Worker {"https://foo:[email protected]/maps.htm#fragment",
675*6777b538SAndroid Build Coastguard Worker "https://foo:[email protected]/maps.htm"},
676*6777b538SAndroid Build Coastguard Worker
677*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/index.html?q=maps",
678*6777b538SAndroid Build Coastguard Worker "https://www.google.com/maps/au/index.html?q=maps"},
679*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/index.html?q=maps#fragment/",
680*6777b538SAndroid Build Coastguard Worker "https://www.google.com/maps/au/index.html?q=maps"},
681*6777b538SAndroid Build Coastguard Worker
682*6777b538SAndroid Build Coastguard Worker {"http://www.google.com:8000/maps/au/index.html?q=maps",
683*6777b538SAndroid Build Coastguard Worker "http://www.google.com:8000/maps/au/index.html?q=maps"},
684*6777b538SAndroid Build Coastguard Worker {"http://www.google.com:8000/maps/au/index.html?q=maps#fragment/",
685*6777b538SAndroid Build Coastguard Worker "http://www.google.com:8000/maps/au/index.html?q=maps"},
686*6777b538SAndroid Build Coastguard Worker
687*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/north/?q=maps",
688*6777b538SAndroid Build Coastguard Worker "https://www.google.com/maps/au/north/?q=maps"},
689*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/maps/au/north?q=maps#fragment",
690*6777b538SAndroid Build Coastguard Worker "https://www.google.com/maps/au/north?q=maps"},
691*6777b538SAndroid Build Coastguard Worker
692*6777b538SAndroid Build Coastguard Worker // Less common standard URLs.
693*6777b538SAndroid Build Coastguard Worker {"filesystem:http://www.google.com/temporary/bar.html?baz=22",
694*6777b538SAndroid Build Coastguard Worker "filesystem:http://www.google.com/temporary/bar.html?baz=22"},
695*6777b538SAndroid Build Coastguard Worker {"file:///temporary/bar.html?baz=22#fragment",
696*6777b538SAndroid Build Coastguard Worker "file:///temporary/bar.html?baz=22"},
697*6777b538SAndroid Build Coastguard Worker
698*6777b538SAndroid Build Coastguard Worker {"ftp://foo/test/index.html", "ftp://foo/test/index.html"},
699*6777b538SAndroid Build Coastguard Worker {"ftp://foo/test/index.html#fragment", "ftp://foo/test/index.html"},
700*6777b538SAndroid Build Coastguard Worker
701*6777b538SAndroid Build Coastguard Worker {"gopher://foo/test/index.html", "gopher://foo/test/index.html"},
702*6777b538SAndroid Build Coastguard Worker {"gopher://foo/test/index.html#fragment", "gopher://foo/test/index.html"},
703*6777b538SAndroid Build Coastguard Worker
704*6777b538SAndroid Build Coastguard Worker {"ws://foo/test/index.html", "ws://foo/test/index.html"},
705*6777b538SAndroid Build Coastguard Worker {"ws://foo/test/index.html#fragment", "ws://foo/test/index.html"},
706*6777b538SAndroid Build Coastguard Worker
707*6777b538SAndroid Build Coastguard Worker // Non-standard, hierarchical URLs.
708*6777b538SAndroid Build Coastguard Worker {"chrome://foo/bar.html", "chrome://foo/bar.html"},
709*6777b538SAndroid Build Coastguard Worker {"chrome://foo/bar.html#fragment", "chrome://foo/bar.html"},
710*6777b538SAndroid Build Coastguard Worker
711*6777b538SAndroid Build Coastguard Worker {"httpa://foo/test/index.html", "httpa://foo/test/index.html"},
712*6777b538SAndroid Build Coastguard Worker {"httpa://foo/test/index.html#fragment", "httpa://foo/test/index.html"},
713*6777b538SAndroid Build Coastguard Worker
714*6777b538SAndroid Build Coastguard Worker // Non-standard, non-hierarchical URLs.
715*6777b538SAndroid Build Coastguard Worker {"blob:https://foo.bar/test/index.html",
716*6777b538SAndroid Build Coastguard Worker "blob:https://foo.bar/test/index.html"},
717*6777b538SAndroid Build Coastguard Worker {"blob:https://foo.bar/test/index.html#fragment",
718*6777b538SAndroid Build Coastguard Worker "blob:https://foo.bar/test/index.html"},
719*6777b538SAndroid Build Coastguard Worker
720*6777b538SAndroid Build Coastguard Worker {"about:blank", "about:blank"},
721*6777b538SAndroid Build Coastguard Worker {"about:blank#ref", "about:blank"},
722*6777b538SAndroid Build Coastguard Worker
723*6777b538SAndroid Build Coastguard Worker {"data:foobar", "data:foobar"},
724*6777b538SAndroid Build Coastguard Worker {"scheme:opaque_data", "scheme:opaque_data"},
725*6777b538SAndroid Build Coastguard Worker // Invalid URLs.
726*6777b538SAndroid Build Coastguard Worker {"foobar", ""},
727*6777b538SAndroid Build Coastguard Worker };
728*6777b538SAndroid Build Coastguard Worker
729*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(cases); i++) {
730*6777b538SAndroid Build Coastguard Worker GURL url(cases[i].input);
731*6777b538SAndroid Build Coastguard Worker GURL without_ref = url.GetWithoutRef();
732*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected, without_ref.spec());
733*6777b538SAndroid Build Coastguard Worker }
734*6777b538SAndroid Build Coastguard Worker }
735*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,Replacements)736*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, Replacements) {
737*6777b538SAndroid Build Coastguard Worker // The URL canonicalizer replacement test will handle most of these case.
738*6777b538SAndroid Build Coastguard Worker // The most important thing to do here is to check that the proper
739*6777b538SAndroid Build Coastguard Worker // canonicalizer gets called based on the scheme of the input.
740*6777b538SAndroid Build Coastguard Worker struct ReplaceCase {
741*6777b538SAndroid Build Coastguard Worker using ApplyReplacementsFunc = GURL(const GURL&);
742*6777b538SAndroid Build Coastguard Worker
743*6777b538SAndroid Build Coastguard Worker const char* base;
744*6777b538SAndroid Build Coastguard Worker ApplyReplacementsFunc* apply_replacements;
745*6777b538SAndroid Build Coastguard Worker const char* expected;
746*6777b538SAndroid Build Coastguard Worker } replace_cases[] = {
747*6777b538SAndroid Build Coastguard Worker {.base = "http://www.google.com/foo/bar.html?foo#bar",
748*6777b538SAndroid Build Coastguard Worker .apply_replacements =
749*6777b538SAndroid Build Coastguard Worker +[](const GURL& url) {
750*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
751*6777b538SAndroid Build Coastguard Worker replacements.SetPathStr("/");
752*6777b538SAndroid Build Coastguard Worker replacements.ClearQuery();
753*6777b538SAndroid Build Coastguard Worker replacements.ClearRef();
754*6777b538SAndroid Build Coastguard Worker return url.ReplaceComponents(replacements);
755*6777b538SAndroid Build Coastguard Worker },
756*6777b538SAndroid Build Coastguard Worker .expected = "http://www.google.com/"},
757*6777b538SAndroid Build Coastguard Worker {.base = "file:///C:/foo/bar.txt",
758*6777b538SAndroid Build Coastguard Worker .apply_replacements =
759*6777b538SAndroid Build Coastguard Worker +[](const GURL& url) {
760*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
761*6777b538SAndroid Build Coastguard Worker replacements.SetSchemeStr("http");
762*6777b538SAndroid Build Coastguard Worker replacements.SetHostStr("www.google.com");
763*6777b538SAndroid Build Coastguard Worker replacements.SetPortStr("99");
764*6777b538SAndroid Build Coastguard Worker replacements.SetPathStr("/foo");
765*6777b538SAndroid Build Coastguard Worker replacements.SetQueryStr("search");
766*6777b538SAndroid Build Coastguard Worker replacements.SetRefStr("ref");
767*6777b538SAndroid Build Coastguard Worker return url.ReplaceComponents(replacements);
768*6777b538SAndroid Build Coastguard Worker },
769*6777b538SAndroid Build Coastguard Worker .expected = "http://www.google.com:99/foo?search#ref"},
770*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
771*6777b538SAndroid Build Coastguard Worker {.base = "http://www.google.com/foo/bar.html?foo#bar",
772*6777b538SAndroid Build Coastguard Worker .apply_replacements =
773*6777b538SAndroid Build Coastguard Worker +[](const GURL& url) {
774*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
775*6777b538SAndroid Build Coastguard Worker replacements.SetSchemeStr("file");
776*6777b538SAndroid Build Coastguard Worker replacements.ClearUsername();
777*6777b538SAndroid Build Coastguard Worker replacements.ClearPassword();
778*6777b538SAndroid Build Coastguard Worker replacements.ClearHost();
779*6777b538SAndroid Build Coastguard Worker replacements.ClearPort();
780*6777b538SAndroid Build Coastguard Worker replacements.SetPathStr("c:\\");
781*6777b538SAndroid Build Coastguard Worker replacements.ClearQuery();
782*6777b538SAndroid Build Coastguard Worker replacements.ClearRef();
783*6777b538SAndroid Build Coastguard Worker return url.ReplaceComponents(replacements);
784*6777b538SAndroid Build Coastguard Worker },
785*6777b538SAndroid Build Coastguard Worker .expected = "file:///C:/"},
786*6777b538SAndroid Build Coastguard Worker #endif
787*6777b538SAndroid Build Coastguard Worker {.base = "filesystem:http://www.google.com/foo/bar.html?foo#bar",
788*6777b538SAndroid Build Coastguard Worker .apply_replacements =
789*6777b538SAndroid Build Coastguard Worker +[](const GURL& url) {
790*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
791*6777b538SAndroid Build Coastguard Worker replacements.SetPathStr("/");
792*6777b538SAndroid Build Coastguard Worker replacements.ClearQuery();
793*6777b538SAndroid Build Coastguard Worker replacements.ClearRef();
794*6777b538SAndroid Build Coastguard Worker return url.ReplaceComponents(replacements);
795*6777b538SAndroid Build Coastguard Worker },
796*6777b538SAndroid Build Coastguard Worker .expected = "filesystem:http://www.google.com/foo/"},
797*6777b538SAndroid Build Coastguard Worker // Lengthen the URL instead of shortening it, to test creation of
798*6777b538SAndroid Build Coastguard Worker // inner_url.
799*6777b538SAndroid Build Coastguard Worker {.base = "filesystem:http://www.google.com/foo/",
800*6777b538SAndroid Build Coastguard Worker .apply_replacements =
801*6777b538SAndroid Build Coastguard Worker +[](const GURL& url) {
802*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
803*6777b538SAndroid Build Coastguard Worker replacements.SetPathStr("bar.html");
804*6777b538SAndroid Build Coastguard Worker replacements.SetQueryStr("foo");
805*6777b538SAndroid Build Coastguard Worker replacements.SetRefStr("bar");
806*6777b538SAndroid Build Coastguard Worker return url.ReplaceComponents(replacements);
807*6777b538SAndroid Build Coastguard Worker },
808*6777b538SAndroid Build Coastguard Worker .expected = "filesystem:http://www.google.com/foo/bar.html?foo#bar"},
809*6777b538SAndroid Build Coastguard Worker };
810*6777b538SAndroid Build Coastguard Worker
811*6777b538SAndroid Build Coastguard Worker for (const ReplaceCase& c : replace_cases) {
812*6777b538SAndroid Build Coastguard Worker GURL output = c.apply_replacements(GURL(c.base));
813*6777b538SAndroid Build Coastguard Worker
814*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(c.expected, output.spec());
815*6777b538SAndroid Build Coastguard Worker
816*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(output.SchemeIsFileSystem(), output.inner_url() != NULL);
817*6777b538SAndroid Build Coastguard Worker if (output.SchemeIsFileSystem()) {
818*6777b538SAndroid Build Coastguard Worker // TODO(mmenke): inner_url()->spec() is currently the same as the spec()
819*6777b538SAndroid Build Coastguard Worker // for the GURL itself. This should be fixed.
820*6777b538SAndroid Build Coastguard Worker // See https://crbug.com/619596
821*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(c.expected, output.inner_url()->spec());
822*6777b538SAndroid Build Coastguard Worker }
823*6777b538SAndroid Build Coastguard Worker }
824*6777b538SAndroid Build Coastguard Worker }
825*6777b538SAndroid Build Coastguard Worker
TEST_P(GURLTypedTest,Replacements)826*6777b538SAndroid Build Coastguard Worker TEST_P(GURLTypedTest, Replacements) {
827*6777b538SAndroid Build Coastguard Worker // Test flag-dependent behavior.
828*6777b538SAndroid Build Coastguard Worker // Existing tests in GURLTest::Replacements cover common cases.
829*6777b538SAndroid Build Coastguard Worker
830*6777b538SAndroid Build Coastguard Worker if (use_standard_compliant_non_special_scheme_url_parsing_) {
831*6777b538SAndroid Build Coastguard Worker ReplaceCase replace_cases[] = {
832*6777b538SAndroid Build Coastguard Worker {.base = "git://a1/a2?a3=a4#a5",
833*6777b538SAndroid Build Coastguard Worker .apply_replacements =
834*6777b538SAndroid Build Coastguard Worker +[](const GURL& url) {
835*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
836*6777b538SAndroid Build Coastguard Worker replacements.SetHostStr("b1");
837*6777b538SAndroid Build Coastguard Worker replacements.SetPortStr("99");
838*6777b538SAndroid Build Coastguard Worker replacements.SetPathStr("b2");
839*6777b538SAndroid Build Coastguard Worker replacements.SetQueryStr("b3=b4");
840*6777b538SAndroid Build Coastguard Worker replacements.SetRefStr("b5");
841*6777b538SAndroid Build Coastguard Worker return url.ReplaceComponents(replacements);
842*6777b538SAndroid Build Coastguard Worker },
843*6777b538SAndroid Build Coastguard Worker .expected = "git://b1:99/b2?b3=b4#b5"},
844*6777b538SAndroid Build Coastguard Worker // URL Standard: https://url.spec.whatwg.org/#dom-url-username
845*6777b538SAndroid Build Coastguard Worker // > 1. If this’s URL cannot have a username/password/port, then return.
846*6777b538SAndroid Build Coastguard Worker {.base = "git:///",
847*6777b538SAndroid Build Coastguard Worker .apply_replacements =
848*6777b538SAndroid Build Coastguard Worker +[](const GURL& url) {
849*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
850*6777b538SAndroid Build Coastguard Worker replacements.SetUsernameStr("x");
851*6777b538SAndroid Build Coastguard Worker return url.ReplaceComponents(replacements);
852*6777b538SAndroid Build Coastguard Worker },
853*6777b538SAndroid Build Coastguard Worker .expected = "git:///"},
854*6777b538SAndroid Build Coastguard Worker // URL Standard: https://url.spec.whatwg.org/#dom-url-password
855*6777b538SAndroid Build Coastguard Worker // > 1. If this’s URL cannot have a username/password/port, then return.
856*6777b538SAndroid Build Coastguard Worker {.base = "git:///",
857*6777b538SAndroid Build Coastguard Worker .apply_replacements =
858*6777b538SAndroid Build Coastguard Worker +[](const GURL& url) {
859*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
860*6777b538SAndroid Build Coastguard Worker replacements.SetPasswordStr("x");
861*6777b538SAndroid Build Coastguard Worker return url.ReplaceComponents(replacements);
862*6777b538SAndroid Build Coastguard Worker },
863*6777b538SAndroid Build Coastguard Worker .expected = "git:///"},
864*6777b538SAndroid Build Coastguard Worker // URL Standard: https://url.spec.whatwg.org/#dom-url-port
865*6777b538SAndroid Build Coastguard Worker // > 1. If this’s URL cannot have a username/password/port, then return.
866*6777b538SAndroid Build Coastguard Worker {.base = "git:///",
867*6777b538SAndroid Build Coastguard Worker .apply_replacements =
868*6777b538SAndroid Build Coastguard Worker +[](const GURL& url) {
869*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements;
870*6777b538SAndroid Build Coastguard Worker replacements.SetPortStr("80");
871*6777b538SAndroid Build Coastguard Worker return url.ReplaceComponents(replacements);
872*6777b538SAndroid Build Coastguard Worker },
873*6777b538SAndroid Build Coastguard Worker .expected = "git:///"}};
874*6777b538SAndroid Build Coastguard Worker
875*6777b538SAndroid Build Coastguard Worker for (const ReplaceCase& c : replace_cases) {
876*6777b538SAndroid Build Coastguard Worker TestReplace(c);
877*6777b538SAndroid Build Coastguard Worker }
878*6777b538SAndroid Build Coastguard Worker
879*6777b538SAndroid Build Coastguard Worker ReplaceHostCase replace_host_cases[] = {
880*6777b538SAndroid Build Coastguard Worker {"git:/", "host", "git://host/"},
881*6777b538SAndroid Build Coastguard Worker {"git:/a", "host", "git://host/a"},
882*6777b538SAndroid Build Coastguard Worker {"git://", "host", "git://host"},
883*6777b538SAndroid Build Coastguard Worker {"git:///", "host", "git://host/"},
884*6777b538SAndroid Build Coastguard Worker {"git://h/a", "host", "git://host/a"},
885*6777b538SAndroid Build Coastguard Worker // The following behavior is different from Web-facing URL APIs
886*6777b538SAndroid Build Coastguard Worker // because DOMURLUtils::setHostname disallows setting an empty host.
887*6777b538SAndroid Build Coastguard Worker //
888*6777b538SAndroid Build Coastguard Worker // Web-facing URL API behavior is:
889*6777b538SAndroid Build Coastguard Worker // > const url = new URL("git://u:p@h:80/");
890*6777b538SAndroid Build Coastguard Worker // > url.hostname = "";
891*6777b538SAndroid Build Coastguard Worker // > assertEquals(url.href, "git://u:p@h:80/");
892*6777b538SAndroid Build Coastguard Worker {"git://u:p@h:80/", "", "git:///"}};
893*6777b538SAndroid Build Coastguard Worker for (const ReplaceHostCase& c : replace_host_cases) {
894*6777b538SAndroid Build Coastguard Worker TestReplaceHost(c);
895*6777b538SAndroid Build Coastguard Worker }
896*6777b538SAndroid Build Coastguard Worker
897*6777b538SAndroid Build Coastguard Worker ReplacePathCase replace_path_cases[] = {
898*6777b538SAndroid Build Coastguard Worker {"git:/", "a", "git:/a"},
899*6777b538SAndroid Build Coastguard Worker {"git:/", "", "git:/"},
900*6777b538SAndroid Build Coastguard Worker {"git:/", "//a", "git:/.//a"},
901*6777b538SAndroid Build Coastguard Worker {"git:/", "/.//a", "git:/.//a"},
902*6777b538SAndroid Build Coastguard Worker {"git://", "a", "git:///a"},
903*6777b538SAndroid Build Coastguard Worker {"git:///", "a", "git:///a"},
904*6777b538SAndroid Build Coastguard Worker {"git://host", "a", "git://host/a"},
905*6777b538SAndroid Build Coastguard Worker {"git://host/b", "a", "git://host/a"}};
906*6777b538SAndroid Build Coastguard Worker for (const ReplacePathCase& c : replace_path_cases) {
907*6777b538SAndroid Build Coastguard Worker TestReplacePath(c);
908*6777b538SAndroid Build Coastguard Worker }
909*6777b538SAndroid Build Coastguard Worker } else {
910*6777b538SAndroid Build Coastguard Worker // Non-compliant behaviors.
911*6777b538SAndroid Build Coastguard Worker ReplaceHostCase replace_host_cases[] = {
912*6777b538SAndroid Build Coastguard Worker {"git://host", "h2", "git://host"},
913*6777b538SAndroid Build Coastguard Worker };
914*6777b538SAndroid Build Coastguard Worker for (const ReplaceHostCase& c : replace_host_cases) {
915*6777b538SAndroid Build Coastguard Worker TestReplaceHost(c);
916*6777b538SAndroid Build Coastguard Worker }
917*6777b538SAndroid Build Coastguard Worker
918*6777b538SAndroid Build Coastguard Worker // Non-compliant behaviors.
919*6777b538SAndroid Build Coastguard Worker ReplacePathCase replace_path_cases[] = {{"git://host", "path", "git:path"}};
920*6777b538SAndroid Build Coastguard Worker for (const ReplacePathCase& c : replace_path_cases) {
921*6777b538SAndroid Build Coastguard Worker TestReplacePath(c);
922*6777b538SAndroid Build Coastguard Worker }
923*6777b538SAndroid Build Coastguard Worker }
924*6777b538SAndroid Build Coastguard Worker }
925*6777b538SAndroid Build Coastguard Worker
TEST(GURLTypedTest,ClearFragmentOnDataUrl)926*6777b538SAndroid Build Coastguard Worker TEST(GURLTypedTest, ClearFragmentOnDataUrl) {
927*6777b538SAndroid Build Coastguard Worker // http://crbug.com/291747 - a data URL may legitimately have trailing
928*6777b538SAndroid Build Coastguard Worker // whitespace in the spec after the ref is cleared. Test this does not trigger
929*6777b538SAndroid Build Coastguard Worker // the Parsed importing validation DCHECK in GURL.
930*6777b538SAndroid Build Coastguard Worker GURL url(" data: one # two ");
931*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url.is_valid());
932*6777b538SAndroid Build Coastguard Worker
933*6777b538SAndroid Build Coastguard Worker // By default the trailing whitespace will have been stripped.
934*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("data: one #%20two", url.spec());
935*6777b538SAndroid Build Coastguard Worker
936*6777b538SAndroid Build Coastguard Worker // Clear the URL's ref and observe the trailing whitespace.
937*6777b538SAndroid Build Coastguard Worker GURL::Replacements repl;
938*6777b538SAndroid Build Coastguard Worker repl.ClearRef();
939*6777b538SAndroid Build Coastguard Worker GURL url_no_ref = url.ReplaceComponents(repl);
940*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_no_ref.is_valid());
941*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("data: one ", url_no_ref.spec());
942*6777b538SAndroid Build Coastguard Worker
943*6777b538SAndroid Build Coastguard Worker // Importing a parsed URL via this constructor overload will retain trailing
944*6777b538SAndroid Build Coastguard Worker // whitespace.
945*6777b538SAndroid Build Coastguard Worker GURL import_url(url_no_ref.spec(),
946*6777b538SAndroid Build Coastguard Worker url_no_ref.parsed_for_possibly_invalid_spec(),
947*6777b538SAndroid Build Coastguard Worker url_no_ref.is_valid());
948*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(import_url.is_valid());
949*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url_no_ref, import_url);
950*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("data: one ", import_url.spec());
951*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(" one ", import_url.path());
952*6777b538SAndroid Build Coastguard Worker
953*6777b538SAndroid Build Coastguard Worker // For completeness, test that re-parsing the same URL rather than importing
954*6777b538SAndroid Build Coastguard Worker // it trims the trailing whitespace.
955*6777b538SAndroid Build Coastguard Worker GURL reparsed_url(url_no_ref.spec());
956*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(reparsed_url.is_valid());
957*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("data: one", reparsed_url.spec());
958*6777b538SAndroid Build Coastguard Worker }
959*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,PathForRequest)960*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, PathForRequest) {
961*6777b538SAndroid Build Coastguard Worker struct TestCase {
962*6777b538SAndroid Build Coastguard Worker const char* input;
963*6777b538SAndroid Build Coastguard Worker const char* expected;
964*6777b538SAndroid Build Coastguard Worker const char* inner_expected;
965*6777b538SAndroid Build Coastguard Worker } cases[] = {
966*6777b538SAndroid Build Coastguard Worker {"http://www.google.com", "/", nullptr},
967*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/", "/", nullptr},
968*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/foo/bar.html?baz=22", "/foo/bar.html?baz=22",
969*6777b538SAndroid Build Coastguard Worker nullptr},
970*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/foo/bar.html#ref", "/foo/bar.html", nullptr},
971*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/foo/bar.html?query#ref", "/foo/bar.html?query",
972*6777b538SAndroid Build Coastguard Worker nullptr},
973*6777b538SAndroid Build Coastguard Worker {"filesystem:http://www.google.com/temporary/foo/bar.html?query#ref",
974*6777b538SAndroid Build Coastguard Worker "/foo/bar.html?query", "/temporary"},
975*6777b538SAndroid Build Coastguard Worker {"filesystem:http://www.google.com/temporary/foo/bar.html?query",
976*6777b538SAndroid Build Coastguard Worker "/foo/bar.html?query", "/temporary"},
977*6777b538SAndroid Build Coastguard Worker };
978*6777b538SAndroid Build Coastguard Worker
979*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(cases); i++) {
980*6777b538SAndroid Build Coastguard Worker GURL url(cases[i].input);
981*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected, url.PathForRequest());
982*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected, url.PathForRequestPiece());
983*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].inner_expected == NULL, url.inner_url() == NULL);
984*6777b538SAndroid Build Coastguard Worker if (url.inner_url() && cases[i].inner_expected) {
985*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].inner_expected, url.inner_url()->PathForRequest());
986*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].inner_expected,
987*6777b538SAndroid Build Coastguard Worker url.inner_url()->PathForRequestPiece());
988*6777b538SAndroid Build Coastguard Worker }
989*6777b538SAndroid Build Coastguard Worker }
990*6777b538SAndroid Build Coastguard Worker }
991*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,EffectiveIntPort)992*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, EffectiveIntPort) {
993*6777b538SAndroid Build Coastguard Worker struct PortTest {
994*6777b538SAndroid Build Coastguard Worker const char* spec;
995*6777b538SAndroid Build Coastguard Worker int expected_int_port;
996*6777b538SAndroid Build Coastguard Worker } port_tests[] = {
997*6777b538SAndroid Build Coastguard Worker // http
998*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/", 80},
999*6777b538SAndroid Build Coastguard Worker {"http://www.google.com:80/", 80},
1000*6777b538SAndroid Build Coastguard Worker {"http://www.google.com:443/", 443},
1001*6777b538SAndroid Build Coastguard Worker
1002*6777b538SAndroid Build Coastguard Worker // https
1003*6777b538SAndroid Build Coastguard Worker {"https://www.google.com/", 443},
1004*6777b538SAndroid Build Coastguard Worker {"https://www.google.com:443/", 443},
1005*6777b538SAndroid Build Coastguard Worker {"https://www.google.com:80/", 80},
1006*6777b538SAndroid Build Coastguard Worker
1007*6777b538SAndroid Build Coastguard Worker // ftp
1008*6777b538SAndroid Build Coastguard Worker {"ftp://www.google.com/", 21},
1009*6777b538SAndroid Build Coastguard Worker {"ftp://www.google.com:21/", 21},
1010*6777b538SAndroid Build Coastguard Worker {"ftp://www.google.com:80/", 80},
1011*6777b538SAndroid Build Coastguard Worker
1012*6777b538SAndroid Build Coastguard Worker // file - no port
1013*6777b538SAndroid Build Coastguard Worker {"file://www.google.com/", PORT_UNSPECIFIED},
1014*6777b538SAndroid Build Coastguard Worker {"file://www.google.com:443/", PORT_UNSPECIFIED},
1015*6777b538SAndroid Build Coastguard Worker
1016*6777b538SAndroid Build Coastguard Worker // data - no port
1017*6777b538SAndroid Build Coastguard Worker {"data:www.google.com:90", PORT_UNSPECIFIED},
1018*6777b538SAndroid Build Coastguard Worker {"data:www.google.com", PORT_UNSPECIFIED},
1019*6777b538SAndroid Build Coastguard Worker
1020*6777b538SAndroid Build Coastguard Worker // filesystem - no port
1021*6777b538SAndroid Build Coastguard Worker {"filesystem:http://www.google.com:90/t/foo", PORT_UNSPECIFIED},
1022*6777b538SAndroid Build Coastguard Worker {"filesystem:file:///t/foo", PORT_UNSPECIFIED},
1023*6777b538SAndroid Build Coastguard Worker };
1024*6777b538SAndroid Build Coastguard Worker
1025*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(port_tests); i++) {
1026*6777b538SAndroid Build Coastguard Worker GURL url(port_tests[i].spec);
1027*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(port_tests[i].expected_int_port, url.EffectiveIntPort());
1028*6777b538SAndroid Build Coastguard Worker }
1029*6777b538SAndroid Build Coastguard Worker }
1030*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,IPAddress)1031*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, IPAddress) {
1032*6777b538SAndroid Build Coastguard Worker struct IPTest {
1033*6777b538SAndroid Build Coastguard Worker const char* spec;
1034*6777b538SAndroid Build Coastguard Worker bool expected_ip;
1035*6777b538SAndroid Build Coastguard Worker } ip_tests[] = {
1036*6777b538SAndroid Build Coastguard Worker {"http://www.google.com/", false},
1037*6777b538SAndroid Build Coastguard Worker {"http://192.168.9.1/", true},
1038*6777b538SAndroid Build Coastguard Worker {"http://192.168.9.1.2/", false},
1039*6777b538SAndroid Build Coastguard Worker {"http://192.168.m.1/", false},
1040*6777b538SAndroid Build Coastguard Worker {"http://2001:db8::1/", false},
1041*6777b538SAndroid Build Coastguard Worker {"http://[2001:db8::1]/", true},
1042*6777b538SAndroid Build Coastguard Worker {"", false},
1043*6777b538SAndroid Build Coastguard Worker {"some random input!", false},
1044*6777b538SAndroid Build Coastguard Worker };
1045*6777b538SAndroid Build Coastguard Worker
1046*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(ip_tests); i++) {
1047*6777b538SAndroid Build Coastguard Worker GURL url(ip_tests[i].spec);
1048*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ip_tests[i].expected_ip, url.HostIsIPAddress());
1049*6777b538SAndroid Build Coastguard Worker }
1050*6777b538SAndroid Build Coastguard Worker }
1051*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,HostNoBrackets)1052*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, HostNoBrackets) {
1053*6777b538SAndroid Build Coastguard Worker struct TestCase {
1054*6777b538SAndroid Build Coastguard Worker const char* input;
1055*6777b538SAndroid Build Coastguard Worker const char* expected_host;
1056*6777b538SAndroid Build Coastguard Worker const char* expected_plainhost;
1057*6777b538SAndroid Build Coastguard Worker } cases[] = {
1058*6777b538SAndroid Build Coastguard Worker {"http://www.google.com", "www.google.com", "www.google.com"},
1059*6777b538SAndroid Build Coastguard Worker {"http://[2001:db8::1]/", "[2001:db8::1]", "2001:db8::1"},
1060*6777b538SAndroid Build Coastguard Worker {"http://[::]/", "[::]", "::"},
1061*6777b538SAndroid Build Coastguard Worker
1062*6777b538SAndroid Build Coastguard Worker // Don't require a valid URL, but don't crash either.
1063*6777b538SAndroid Build Coastguard Worker {"http://[]/", "[]", ""},
1064*6777b538SAndroid Build Coastguard Worker {"http://[x]/", "[x]", "x"},
1065*6777b538SAndroid Build Coastguard Worker {"http://[x/", "[x", "[x"},
1066*6777b538SAndroid Build Coastguard Worker {"http://x]/", "x]", "x]"},
1067*6777b538SAndroid Build Coastguard Worker {"http://[/", "[", "["},
1068*6777b538SAndroid Build Coastguard Worker {"http://]/", "]", "]"},
1069*6777b538SAndroid Build Coastguard Worker {"", "", ""},
1070*6777b538SAndroid Build Coastguard Worker };
1071*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(cases); i++) {
1072*6777b538SAndroid Build Coastguard Worker GURL url(cases[i].input);
1073*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected_host, url.host());
1074*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected_plainhost, url.HostNoBrackets());
1075*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].expected_plainhost, url.HostNoBracketsPiece());
1076*6777b538SAndroid Build Coastguard Worker }
1077*6777b538SAndroid Build Coastguard Worker }
1078*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,DomainIs)1079*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, DomainIs) {
1080*6777b538SAndroid Build Coastguard Worker GURL url_1("http://google.com/foo");
1081*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_1.DomainIs("google.com"));
1082*6777b538SAndroid Build Coastguard Worker
1083*6777b538SAndroid Build Coastguard Worker // Subdomain and port are ignored.
1084*6777b538SAndroid Build Coastguard Worker GURL url_2("http://www.google.com:99/foo");
1085*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_2.DomainIs("google.com"));
1086*6777b538SAndroid Build Coastguard Worker
1087*6777b538SAndroid Build Coastguard Worker // Different top-level domain.
1088*6777b538SAndroid Build Coastguard Worker GURL url_3("http://www.google.com.cn/foo");
1089*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url_3.DomainIs("google.com"));
1090*6777b538SAndroid Build Coastguard Worker
1091*6777b538SAndroid Build Coastguard Worker // Different host name.
1092*6777b538SAndroid Build Coastguard Worker GURL url_4("http://www.iamnotgoogle.com/foo");
1093*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url_4.DomainIs("google.com"));
1094*6777b538SAndroid Build Coastguard Worker
1095*6777b538SAndroid Build Coastguard Worker // The input must be lower-cased otherwise DomainIs returns false.
1096*6777b538SAndroid Build Coastguard Worker GURL url_5("http://www.google.com/foo");
1097*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url_5.DomainIs("Google.com"));
1098*6777b538SAndroid Build Coastguard Worker
1099*6777b538SAndroid Build Coastguard Worker // If the URL is invalid, DomainIs returns false.
1100*6777b538SAndroid Build Coastguard Worker GURL invalid_url("google.com");
1101*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid_url.is_valid());
1102*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid_url.DomainIs("google.com"));
1103*6777b538SAndroid Build Coastguard Worker
1104*6777b538SAndroid Build Coastguard Worker GURL url_with_escape_chars("https://www.,.test");
1105*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_with_escape_chars.is_valid());
1106*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url_with_escape_chars.host(), "www.,.test");
1107*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_with_escape_chars.DomainIs(",.test"));
1108*6777b538SAndroid Build Coastguard Worker }
1109*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,DomainIsTerminatingDotBehavior)1110*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, DomainIsTerminatingDotBehavior) {
1111*6777b538SAndroid Build Coastguard Worker // If the host part ends with a dot, it matches input domains
1112*6777b538SAndroid Build Coastguard Worker // with or without a dot.
1113*6777b538SAndroid Build Coastguard Worker GURL url_with_dot("http://www.google.com./foo");
1114*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_with_dot.DomainIs("google.com"));
1115*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_with_dot.DomainIs("google.com."));
1116*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_with_dot.DomainIs(".com"));
1117*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_with_dot.DomainIs(".com."));
1118*6777b538SAndroid Build Coastguard Worker
1119*6777b538SAndroid Build Coastguard Worker // But, if the host name doesn't end with a dot and the input
1120*6777b538SAndroid Build Coastguard Worker // domain does, then it's considered to not match.
1121*6777b538SAndroid Build Coastguard Worker GURL url_without_dot("http://google.com/foo");
1122*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url_without_dot.DomainIs("google.com."));
1123*6777b538SAndroid Build Coastguard Worker
1124*6777b538SAndroid Build Coastguard Worker // If the URL ends with two dots, it doesn't match.
1125*6777b538SAndroid Build Coastguard Worker GURL url_with_two_dots("http://www.google.com../foo");
1126*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url_with_two_dots.DomainIs("google.com"));
1127*6777b538SAndroid Build Coastguard Worker }
1128*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,DomainIsWithFilesystemScheme)1129*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, DomainIsWithFilesystemScheme) {
1130*6777b538SAndroid Build Coastguard Worker GURL url_1("filesystem:http://www.google.com:99/foo/");
1131*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url_1.DomainIs("google.com"));
1132*6777b538SAndroid Build Coastguard Worker
1133*6777b538SAndroid Build Coastguard Worker GURL url_2("filesystem:http://www.iamnotgoogle.com/foo/");
1134*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url_2.DomainIs("google.com"));
1135*6777b538SAndroid Build Coastguard Worker }
1136*6777b538SAndroid Build Coastguard Worker
1137*6777b538SAndroid Build Coastguard Worker // Newlines should be stripped from inputs.
TEST(GURLTest,Newlines)1138*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, Newlines) {
1139*6777b538SAndroid Build Coastguard Worker // Constructor.
1140*6777b538SAndroid Build Coastguard Worker GURL url_1(" \t ht\ntp://\twww.goo\rgle.com/as\ndf \n ");
1141*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://www.google.com/asdf", url_1.spec());
1142*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
1143*6777b538SAndroid Build Coastguard Worker url_1.parsed_for_possibly_invalid_spec().potentially_dangling_markup);
1144*6777b538SAndroid Build Coastguard Worker
1145*6777b538SAndroid Build Coastguard Worker // Relative path resolver.
1146*6777b538SAndroid Build Coastguard Worker GURL url_2 = url_1.Resolve(" \n /fo\to\r ");
1147*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://www.google.com/foo", url_2.spec());
1148*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
1149*6777b538SAndroid Build Coastguard Worker url_2.parsed_for_possibly_invalid_spec().potentially_dangling_markup);
1150*6777b538SAndroid Build Coastguard Worker
1151*6777b538SAndroid Build Coastguard Worker // Constructor.
1152*6777b538SAndroid Build Coastguard Worker GURL url_3(" \t ht\ntp://\twww.goo\rgle.com/as\ndf< \n ");
1153*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://www.google.com/asdf%3C", url_3.spec());
1154*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
1155*6777b538SAndroid Build Coastguard Worker url_3.parsed_for_possibly_invalid_spec().potentially_dangling_markup);
1156*6777b538SAndroid Build Coastguard Worker
1157*6777b538SAndroid Build Coastguard Worker // Relative path resolver.
1158*6777b538SAndroid Build Coastguard Worker GURL url_4 = url_1.Resolve(" \n /fo\to<\r ");
1159*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http://www.google.com/foo%3C", url_4.spec());
1160*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
1161*6777b538SAndroid Build Coastguard Worker url_4.parsed_for_possibly_invalid_spec().potentially_dangling_markup);
1162*6777b538SAndroid Build Coastguard Worker
1163*6777b538SAndroid Build Coastguard Worker // Note that newlines are NOT stripped from ReplaceComponents.
1164*6777b538SAndroid Build Coastguard Worker }
1165*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,IsStandard)1166*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, IsStandard) {
1167*6777b538SAndroid Build Coastguard Worker GURL a("http:foo/bar");
1168*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(a.IsStandard());
1169*6777b538SAndroid Build Coastguard Worker
1170*6777b538SAndroid Build Coastguard Worker GURL b("foo:bar/baz");
1171*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(b.IsStandard());
1172*6777b538SAndroid Build Coastguard Worker
1173*6777b538SAndroid Build Coastguard Worker GURL c("foo://bar/baz");
1174*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(c.IsStandard());
1175*6777b538SAndroid Build Coastguard Worker
1176*6777b538SAndroid Build Coastguard Worker GURL d("cid:bar@baz");
1177*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(d.IsStandard());
1178*6777b538SAndroid Build Coastguard Worker }
1179*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,SchemeIsHTTPOrHTTPS)1180*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, SchemeIsHTTPOrHTTPS) {
1181*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("http://bar/").SchemeIsHTTPOrHTTPS());
1182*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("HTTPS://BAR").SchemeIsHTTPOrHTTPS());
1183*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL("ftp://bar/").SchemeIsHTTPOrHTTPS());
1184*6777b538SAndroid Build Coastguard Worker }
1185*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,SchemeIsWSOrWSS)1186*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, SchemeIsWSOrWSS) {
1187*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("WS://BAR/").SchemeIsWSOrWSS());
1188*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("wss://bar/").SchemeIsWSOrWSS());
1189*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL("http://bar/").SchemeIsWSOrWSS());
1190*6777b538SAndroid Build Coastguard Worker }
1191*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,SchemeIsCryptographic)1192*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, SchemeIsCryptographic) {
1193*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("https://foo.bar.com/").SchemeIsCryptographic());
1194*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("HTTPS://foo.bar.com/").SchemeIsCryptographic());
1195*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("HtTpS://foo.bar.com/").SchemeIsCryptographic());
1196*6777b538SAndroid Build Coastguard Worker
1197*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("wss://foo.bar.com/").SchemeIsCryptographic());
1198*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("WSS://foo.bar.com/").SchemeIsCryptographic());
1199*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("WsS://foo.bar.com/").SchemeIsCryptographic());
1200*6777b538SAndroid Build Coastguard Worker
1201*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL("http://foo.bar.com/").SchemeIsCryptographic());
1202*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL("ws://foo.bar.com/").SchemeIsCryptographic());
1203*6777b538SAndroid Build Coastguard Worker }
1204*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,SchemeIsCryptographicStatic)1205*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, SchemeIsCryptographicStatic) {
1206*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL::SchemeIsCryptographic("https"));
1207*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL::SchemeIsCryptographic("wss"));
1208*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL::SchemeIsCryptographic("http"));
1209*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL::SchemeIsCryptographic("ws"));
1210*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL::SchemeIsCryptographic("ftp"));
1211*6777b538SAndroid Build Coastguard Worker }
1212*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,SchemeIsBlob)1213*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, SchemeIsBlob) {
1214*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("BLOB://BAR/").SchemeIsBlob());
1215*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("blob://bar/").SchemeIsBlob());
1216*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL("http://bar/").SchemeIsBlob());
1217*6777b538SAndroid Build Coastguard Worker }
1218*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,SchemeIsLocal)1219*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, SchemeIsLocal) {
1220*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("BLOB://BAR/").SchemeIsLocal());
1221*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("blob://bar/").SchemeIsLocal());
1222*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("DATA:TEXT/HTML,BAR").SchemeIsLocal());
1223*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("data:text/html,bar").SchemeIsLocal());
1224*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("ABOUT:BAR").SchemeIsLocal());
1225*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("about:bar").SchemeIsLocal());
1226*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("FILESYSTEM:HTTP://FOO.EXAMPLE/BAR").SchemeIsLocal());
1227*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GURL("filesystem:http://foo.example/bar").SchemeIsLocal());
1228*6777b538SAndroid Build Coastguard Worker
1229*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL("http://bar/").SchemeIsLocal());
1230*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GURL("file:///bar").SchemeIsLocal());
1231*6777b538SAndroid Build Coastguard Worker }
1232*6777b538SAndroid Build Coastguard Worker
1233*6777b538SAndroid Build Coastguard Worker // Tests that the 'content' of the URL is properly extracted. This can be
1234*6777b538SAndroid Build Coastguard Worker // complex in cases such as multiple schemes (view-source:http:) or for
1235*6777b538SAndroid Build Coastguard Worker // javascript URLs. See GURL::GetContent for more details.
TEST(GURLTest,ContentForNonStandardURLs)1236*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, ContentForNonStandardURLs) {
1237*6777b538SAndroid Build Coastguard Worker struct TestCase {
1238*6777b538SAndroid Build Coastguard Worker const char* url;
1239*6777b538SAndroid Build Coastguard Worker const char* expected;
1240*6777b538SAndroid Build Coastguard Worker } cases[] = {
1241*6777b538SAndroid Build Coastguard Worker {"null", ""},
1242*6777b538SAndroid Build Coastguard Worker {"not-a-standard-scheme:this is arbitrary content",
1243*6777b538SAndroid Build Coastguard Worker "this is arbitrary content"},
1244*6777b538SAndroid Build Coastguard Worker
1245*6777b538SAndroid Build Coastguard Worker // When there are multiple schemes, only the first is excluded from the
1246*6777b538SAndroid Build Coastguard Worker // content. Note also that for e.g. 'http://', the '//' is part of the
1247*6777b538SAndroid Build Coastguard Worker // content not the scheme.
1248*6777b538SAndroid Build Coastguard Worker {"view-source:http://example.com/path", "http://example.com/path"},
1249*6777b538SAndroid Build Coastguard Worker {"blob:http://example.com/GUID", "http://example.com/GUID"},
1250*6777b538SAndroid Build Coastguard Worker {"blob:http://user:[email protected]/GUID",
1251*6777b538SAndroid Build Coastguard Worker "http://user:[email protected]/GUID"},
1252*6777b538SAndroid Build Coastguard Worker
1253*6777b538SAndroid Build Coastguard Worker // The octothorpe character ('#') marks the end of the URL content, and
1254*6777b538SAndroid Build Coastguard Worker // the start of the fragment. It should not be included in the content.
1255*6777b538SAndroid Build Coastguard Worker {"http://www.example.com/GUID#ref", "www.example.com/GUID"},
1256*6777b538SAndroid Build Coastguard Worker {"http://me:[email protected]/GUID/#ref", "me:[email protected]/GUID/"},
1257*6777b538SAndroid Build Coastguard Worker {"data:text/html,Question?<div style=\"color: #bad\">idea</div>",
1258*6777b538SAndroid Build Coastguard Worker "text/html,Question?%3Cdiv%20style=%22color:%20"},
1259*6777b538SAndroid Build Coastguard Worker
1260*6777b538SAndroid Build Coastguard Worker // TODO(mkwst): This seems like a bug. https://crbug.com/513600
1261*6777b538SAndroid Build Coastguard Worker {"filesystem:http://example.com/path", "/"},
1262*6777b538SAndroid Build Coastguard Worker
1263*6777b538SAndroid Build Coastguard Worker // Javascript URLs include '#' symbols in their content.
1264*6777b538SAndroid Build Coastguard Worker {"javascript:#", "#"},
1265*6777b538SAndroid Build Coastguard Worker {"javascript:alert('#');", "alert('#');"},
1266*6777b538SAndroid Build Coastguard Worker };
1267*6777b538SAndroid Build Coastguard Worker
1268*6777b538SAndroid Build Coastguard Worker for (const auto& test : cases) {
1269*6777b538SAndroid Build Coastguard Worker GURL url(test.url);
1270*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test.expected, url.GetContent()) << test.url;
1271*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test.expected, url.GetContentPiece()) << test.url;
1272*6777b538SAndroid Build Coastguard Worker }
1273*6777b538SAndroid Build Coastguard Worker }
1274*6777b538SAndroid Build Coastguard Worker
TEST_P(GURLTypedTest,ContentForNonStandardURLs)1275*6777b538SAndroid Build Coastguard Worker TEST_P(GURLTypedTest, ContentForNonStandardURLs) {
1276*6777b538SAndroid Build Coastguard Worker struct TestCase {
1277*6777b538SAndroid Build Coastguard Worker const std::string_view url;
1278*6777b538SAndroid Build Coastguard Worker const std::string_view expected;
1279*6777b538SAndroid Build Coastguard Worker };
1280*6777b538SAndroid Build Coastguard Worker
1281*6777b538SAndroid Build Coastguard Worker if (use_standard_compliant_non_special_scheme_url_parsing_) {
1282*6777b538SAndroid Build Coastguard Worker TestCase cases[] = {
1283*6777b538SAndroid Build Coastguard Worker {"blob://http://example.com/GUID", "http//example.com/GUID"},
1284*6777b538SAndroid Build Coastguard Worker {"git://host/path#fragment", "host/path"},
1285*6777b538SAndroid Build Coastguard Worker };
1286*6777b538SAndroid Build Coastguard Worker for (const auto& test : cases) {
1287*6777b538SAndroid Build Coastguard Worker GURL url(test.url);
1288*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url.GetContent(), test.expected) << test.url;
1289*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url.GetContentPiece(), test.expected) << test.url;
1290*6777b538SAndroid Build Coastguard Worker }
1291*6777b538SAndroid Build Coastguard Worker } else {
1292*6777b538SAndroid Build Coastguard Worker TestCase cases[] = {
1293*6777b538SAndroid Build Coastguard Worker {"blob://http://example.com/GUID", "//http://example.com/GUID"},
1294*6777b538SAndroid Build Coastguard Worker {"git://host/path#fragment", "//host/path"},
1295*6777b538SAndroid Build Coastguard Worker };
1296*6777b538SAndroid Build Coastguard Worker for (const auto& test : cases) {
1297*6777b538SAndroid Build Coastguard Worker GURL url(test.url);
1298*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url.GetContent(), test.expected) << test.url;
1299*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url.GetContentPiece(), test.expected) << test.url;
1300*6777b538SAndroid Build Coastguard Worker }
1301*6777b538SAndroid Build Coastguard Worker }
1302*6777b538SAndroid Build Coastguard Worker }
1303*6777b538SAndroid Build Coastguard Worker
1304*6777b538SAndroid Build Coastguard Worker // Tests that the URL path is properly extracted for unusual URLs. This can be
1305*6777b538SAndroid Build Coastguard Worker // complex in cases such as multiple schemes (view-source:http:) or when
1306*6777b538SAndroid Build Coastguard Worker // octothorpes ('#') are involved.
TEST(GURLTest,PathForNonStandardURLs)1307*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, PathForNonStandardURLs) {
1308*6777b538SAndroid Build Coastguard Worker struct TestCase {
1309*6777b538SAndroid Build Coastguard Worker const char* url;
1310*6777b538SAndroid Build Coastguard Worker const char* expected;
1311*6777b538SAndroid Build Coastguard Worker } cases[] = {
1312*6777b538SAndroid Build Coastguard Worker {"null", ""},
1313*6777b538SAndroid Build Coastguard Worker {"not-a-standard-scheme:this is arbitrary content",
1314*6777b538SAndroid Build Coastguard Worker "this is arbitrary content"},
1315*6777b538SAndroid Build Coastguard Worker {"view-source:http://example.com/path", "http://example.com/path"},
1316*6777b538SAndroid Build Coastguard Worker {"blob:http://example.com/GUID", "http://example.com/GUID"},
1317*6777b538SAndroid Build Coastguard Worker {"blob:http://user:[email protected]/GUID",
1318*6777b538SAndroid Build Coastguard Worker "http://user:[email protected]/GUID"},
1319*6777b538SAndroid Build Coastguard Worker
1320*6777b538SAndroid Build Coastguard Worker {"http://www.example.com/GUID#ref", "/GUID"},
1321*6777b538SAndroid Build Coastguard Worker {"http://me:[email protected]/GUID/#ref", "/GUID/"},
1322*6777b538SAndroid Build Coastguard Worker {"data:text/html,Question?<div style=\"color: #bad\">idea</div>",
1323*6777b538SAndroid Build Coastguard Worker "text/html,Question"},
1324*6777b538SAndroid Build Coastguard Worker
1325*6777b538SAndroid Build Coastguard Worker // TODO(mkwst): This seems like a bug. https://crbug.com/513600
1326*6777b538SAndroid Build Coastguard Worker {"filesystem:http://example.com/path", "/"},
1327*6777b538SAndroid Build Coastguard Worker };
1328*6777b538SAndroid Build Coastguard Worker
1329*6777b538SAndroid Build Coastguard Worker for (const auto& test : cases) {
1330*6777b538SAndroid Build Coastguard Worker GURL url(test.url);
1331*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test.expected, url.path()) << test.url;
1332*6777b538SAndroid Build Coastguard Worker }
1333*6777b538SAndroid Build Coastguard Worker }
1334*6777b538SAndroid Build Coastguard Worker
TEST_P(GURLTypedTest,PathForNonStandardURLs)1335*6777b538SAndroid Build Coastguard Worker TEST_P(GURLTypedTest, PathForNonStandardURLs) {
1336*6777b538SAndroid Build Coastguard Worker struct TestCase {
1337*6777b538SAndroid Build Coastguard Worker const std::string_view url;
1338*6777b538SAndroid Build Coastguard Worker const std::string_view expected;
1339*6777b538SAndroid Build Coastguard Worker };
1340*6777b538SAndroid Build Coastguard Worker
1341*6777b538SAndroid Build Coastguard Worker if (use_standard_compliant_non_special_scheme_url_parsing_) {
1342*6777b538SAndroid Build Coastguard Worker TestCase cases[] = {
1343*6777b538SAndroid Build Coastguard Worker {"blob://http://example.com/GUID", "//example.com/GUID"},
1344*6777b538SAndroid Build Coastguard Worker {"git://host/path#fragment", "/path"},
1345*6777b538SAndroid Build Coastguard Worker };
1346*6777b538SAndroid Build Coastguard Worker for (const auto& test : cases) {
1347*6777b538SAndroid Build Coastguard Worker GURL url(test.url);
1348*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url.path(), test.expected) << test.url;
1349*6777b538SAndroid Build Coastguard Worker }
1350*6777b538SAndroid Build Coastguard Worker } else {
1351*6777b538SAndroid Build Coastguard Worker TestCase cases[] = {
1352*6777b538SAndroid Build Coastguard Worker {"blob://http://example.com/GUID", "//http://example.com/GUID"},
1353*6777b538SAndroid Build Coastguard Worker {"git://host/path#fragment", "//host/path"},
1354*6777b538SAndroid Build Coastguard Worker };
1355*6777b538SAndroid Build Coastguard Worker for (const auto& test : cases) {
1356*6777b538SAndroid Build Coastguard Worker GURL url(test.url);
1357*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url.path(), test.expected) << test.url;
1358*6777b538SAndroid Build Coastguard Worker }
1359*6777b538SAndroid Build Coastguard Worker }
1360*6777b538SAndroid Build Coastguard Worker }
1361*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,EqualsIgnoringRef)1362*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, EqualsIgnoringRef) {
1363*6777b538SAndroid Build Coastguard Worker const struct {
1364*6777b538SAndroid Build Coastguard Worker const char* url_a;
1365*6777b538SAndroid Build Coastguard Worker const char* url_b;
1366*6777b538SAndroid Build Coastguard Worker bool are_equals;
1367*6777b538SAndroid Build Coastguard Worker } kTestCases[] = {
1368*6777b538SAndroid Build Coastguard Worker // No ref.
1369*6777b538SAndroid Build Coastguard Worker {"http://a.com", "http://a.com", true},
1370*6777b538SAndroid Build Coastguard Worker {"http://a.com", "http://b.com", false},
1371*6777b538SAndroid Build Coastguard Worker
1372*6777b538SAndroid Build Coastguard Worker // Same Ref.
1373*6777b538SAndroid Build Coastguard Worker {"http://a.com#foo", "http://a.com#foo", true},
1374*6777b538SAndroid Build Coastguard Worker {"http://a.com#foo", "http://b.com#foo", false},
1375*6777b538SAndroid Build Coastguard Worker
1376*6777b538SAndroid Build Coastguard Worker // Different Refs.
1377*6777b538SAndroid Build Coastguard Worker {"http://a.com#foo", "http://a.com#bar", true},
1378*6777b538SAndroid Build Coastguard Worker {"http://a.com#foo", "http://b.com#bar", false},
1379*6777b538SAndroid Build Coastguard Worker
1380*6777b538SAndroid Build Coastguard Worker // One has a ref, the other doesn't.
1381*6777b538SAndroid Build Coastguard Worker {"http://a.com#foo", "http://a.com", true},
1382*6777b538SAndroid Build Coastguard Worker {"http://a.com#foo", "http://b.com", false},
1383*6777b538SAndroid Build Coastguard Worker
1384*6777b538SAndroid Build Coastguard Worker // Empty refs.
1385*6777b538SAndroid Build Coastguard Worker {"http://a.com#", "http://a.com#", true},
1386*6777b538SAndroid Build Coastguard Worker {"http://a.com#", "http://a.com", true},
1387*6777b538SAndroid Build Coastguard Worker
1388*6777b538SAndroid Build Coastguard Worker // URLs that differ only by their last character.
1389*6777b538SAndroid Build Coastguard Worker {"http://aaa", "http://aab", false},
1390*6777b538SAndroid Build Coastguard Worker {"http://aaa#foo", "http://aab#foo", false},
1391*6777b538SAndroid Build Coastguard Worker
1392*6777b538SAndroid Build Coastguard Worker // Different size of the part before the ref.
1393*6777b538SAndroid Build Coastguard Worker {"http://123#a", "http://123456#a", false},
1394*6777b538SAndroid Build Coastguard Worker
1395*6777b538SAndroid Build Coastguard Worker // Blob URLs
1396*6777b538SAndroid Build Coastguard Worker {"blob:http://a.com#foo", "blob:http://a.com#foo", true},
1397*6777b538SAndroid Build Coastguard Worker {"blob:http://a.com#foo", "blob:http://a.com#bar", true},
1398*6777b538SAndroid Build Coastguard Worker {"blob:http://a.com#foo", "blob:http://b.com#bar", false},
1399*6777b538SAndroid Build Coastguard Worker
1400*6777b538SAndroid Build Coastguard Worker // Filesystem URLs
1401*6777b538SAndroid Build Coastguard Worker {"filesystem:http://a.com#foo", "filesystem:http://a.com#foo", true},
1402*6777b538SAndroid Build Coastguard Worker {"filesystem:http://a.com#foo", "filesystem:http://a.com#bar", true},
1403*6777b538SAndroid Build Coastguard Worker {"filesystem:http://a.com#foo", "filesystem:http://b.com#bar", false},
1404*6777b538SAndroid Build Coastguard Worker
1405*6777b538SAndroid Build Coastguard Worker // Data URLs
1406*6777b538SAndroid Build Coastguard Worker {"data:text/html,a#foo", "data:text/html,a#bar", true},
1407*6777b538SAndroid Build Coastguard Worker {"data:text/html,a#foo", "data:text/html,a#foo", true},
1408*6777b538SAndroid Build Coastguard Worker {"data:text/html,a#foo", "data:text/html,b#foo", false},
1409*6777b538SAndroid Build Coastguard Worker };
1410*6777b538SAndroid Build Coastguard Worker
1411*6777b538SAndroid Build Coastguard Worker for (const auto& test_case : kTestCases) {
1412*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message()
1413*6777b538SAndroid Build Coastguard Worker << std::endl
1414*6777b538SAndroid Build Coastguard Worker << "url_a = " << test_case.url_a << std::endl
1415*6777b538SAndroid Build Coastguard Worker << "url_b = " << test_case.url_b << std::endl);
1416*6777b538SAndroid Build Coastguard Worker // A versus B.
1417*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test_case.are_equals,
1418*6777b538SAndroid Build Coastguard Worker GURL(test_case.url_a).EqualsIgnoringRef(GURL(test_case.url_b)));
1419*6777b538SAndroid Build Coastguard Worker // B versus A.
1420*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test_case.are_equals,
1421*6777b538SAndroid Build Coastguard Worker GURL(test_case.url_b).EqualsIgnoringRef(GURL(test_case.url_a)));
1422*6777b538SAndroid Build Coastguard Worker }
1423*6777b538SAndroid Build Coastguard Worker }
1424*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,DebugAlias)1425*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, DebugAlias) {
1426*6777b538SAndroid Build Coastguard Worker GURL url("https://foo.com/bar");
1427*6777b538SAndroid Build Coastguard Worker DEBUG_ALIAS_FOR_GURL(url_debug_alias, url);
1428*6777b538SAndroid Build Coastguard Worker EXPECT_STREQ("https://foo.com/bar", url_debug_alias);
1429*6777b538SAndroid Build Coastguard Worker }
1430*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,InvalidHost)1431*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, InvalidHost) {
1432*6777b538SAndroid Build Coastguard Worker // This contains an invalid percent escape (%T%) and also a valid
1433*6777b538SAndroid Build Coastguard Worker // percent escape that's not 7-bit ascii (%ae), so that the unescaped
1434*6777b538SAndroid Build Coastguard Worker // host contains both an invalid percent escape and invalid UTF-8.
1435*6777b538SAndroid Build Coastguard Worker GURL url("http://%T%Ae");
1436*6777b538SAndroid Build Coastguard Worker
1437*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(url.is_valid());
1438*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(url.SchemeIs(url::kHttpScheme));
1439*6777b538SAndroid Build Coastguard Worker
1440*6777b538SAndroid Build Coastguard Worker // The invalid percent escape becomes an escaped percent sign (%25), and the
1441*6777b538SAndroid Build Coastguard Worker // invalid UTF-8 character becomes REPLACEMENT CHARACTER' (U+FFFD) encoded as
1442*6777b538SAndroid Build Coastguard Worker // UTF-8.
1443*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url.host_piece(), "%25t%EF%BF%BD");
1444*6777b538SAndroid Build Coastguard Worker }
1445*6777b538SAndroid Build Coastguard Worker
TEST(GURLTest,PortZero)1446*6777b538SAndroid Build Coastguard Worker TEST(GURLTest, PortZero) {
1447*6777b538SAndroid Build Coastguard Worker GURL port_zero_url("http://127.0.0.1:0/blah");
1448*6777b538SAndroid Build Coastguard Worker
1449*6777b538SAndroid Build Coastguard Worker // https://url.spec.whatwg.org/#port-state says that the port 1) consists of
1450*6777b538SAndroid Build Coastguard Worker // ASCII digits (this excludes negative numbers) and 2) cannot be greater than
1451*6777b538SAndroid Build Coastguard Worker // 2^16-1. This means that port=0 should be valid.
1452*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(port_zero_url.is_valid());
1453*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("0", port_zero_url.port());
1454*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("127.0.0.1", port_zero_url.host());
1455*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("http", port_zero_url.scheme());
1456*6777b538SAndroid Build Coastguard Worker
1457*6777b538SAndroid Build Coastguard Worker // https://crbug.com/1065532: SchemeHostPort would previously incorrectly
1458*6777b538SAndroid Build Coastguard Worker // consider port=0 to be invalid.
1459*6777b538SAndroid Build Coastguard Worker SchemeHostPort scheme_host_port(port_zero_url);
1460*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(scheme_host_port.IsValid());
1461*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(port_zero_url.scheme(), scheme_host_port.scheme());
1462*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(port_zero_url.host(), scheme_host_port.host());
1463*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(port_zero_url.port(),
1464*6777b538SAndroid Build Coastguard Worker base::NumberToString(scheme_host_port.port()));
1465*6777b538SAndroid Build Coastguard Worker
1466*6777b538SAndroid Build Coastguard Worker // https://crbug.com/1065532: The SchemeHostPort problem above would lead to
1467*6777b538SAndroid Build Coastguard Worker // bizarre results below - resolved origin would incorrectly be returned as an
1468*6777b538SAndroid Build Coastguard Worker // opaque origin derived from |another_origin|.
1469*6777b538SAndroid Build Coastguard Worker url::Origin another_origin = url::Origin::Create(GURL("http://other.com"));
1470*6777b538SAndroid Build Coastguard Worker url::Origin resolved_origin =
1471*6777b538SAndroid Build Coastguard Worker url::Origin::Resolve(port_zero_url, another_origin);
1472*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(resolved_origin.opaque());
1473*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(port_zero_url.scheme(), resolved_origin.scheme());
1474*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(port_zero_url.host(), resolved_origin.host());
1475*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(port_zero_url.port(), base::NumberToString(resolved_origin.port()));
1476*6777b538SAndroid Build Coastguard Worker
1477*6777b538SAndroid Build Coastguard Worker // port=0 and default HTTP port are different.
1478*6777b538SAndroid Build Coastguard Worker GURL default_port("http://127.0.0.1/foo");
1479*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, SchemeHostPort(port_zero_url).port());
1480*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(80, SchemeHostPort(default_port).port());
1481*6777b538SAndroid Build Coastguard Worker url::Origin default_port_origin = url::Origin::Create(default_port);
1482*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(default_port_origin.IsSameOriginWith(resolved_origin));
1483*6777b538SAndroid Build Coastguard Worker }
1484*6777b538SAndroid Build Coastguard Worker
1485*6777b538SAndroid Build Coastguard Worker class GURLTestTraits {
1486*6777b538SAndroid Build Coastguard Worker public:
1487*6777b538SAndroid Build Coastguard Worker using UrlType = GURL;
1488*6777b538SAndroid Build Coastguard Worker
CreateUrlFromString(std::string_view s)1489*6777b538SAndroid Build Coastguard Worker static UrlType CreateUrlFromString(std::string_view s) { return GURL(s); }
IsAboutBlank(const UrlType & url)1490*6777b538SAndroid Build Coastguard Worker static bool IsAboutBlank(const UrlType& url) { return url.IsAboutBlank(); }
IsAboutSrcdoc(const UrlType & url)1491*6777b538SAndroid Build Coastguard Worker static bool IsAboutSrcdoc(const UrlType& url) { return url.IsAboutSrcdoc(); }
1492*6777b538SAndroid Build Coastguard Worker
1493*6777b538SAndroid Build Coastguard Worker // Only static members.
1494*6777b538SAndroid Build Coastguard Worker GURLTestTraits() = delete;
1495*6777b538SAndroid Build Coastguard Worker };
1496*6777b538SAndroid Build Coastguard Worker
1497*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(GURL, AbstractUrlTest, GURLTestTraits);
1498*6777b538SAndroid Build Coastguard Worker
1499*6777b538SAndroid Build Coastguard Worker } // namespace url
1500