1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 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 "net/base/schemeful_site.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/test/metrics/histogram_tester.h"
8*6777b538SAndroid Build Coastguard Worker #include "net/base/url_util.h"
9*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock-matchers.h"
10*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
11*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
12*6777b538SAndroid Build Coastguard Worker #include "url/origin.h"
13*6777b538SAndroid Build Coastguard Worker #include "url/url_util.h"
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker namespace net {
16*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,DifferentOriginSameRegisterableDomain)17*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, DifferentOriginSameRegisterableDomain) {
18*6777b538SAndroid Build Coastguard Worker // List of origins which should all share a schemeful site.
19*6777b538SAndroid Build Coastguard Worker url::Origin kTestOrigins[] = {
20*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://a.foo.test")),
21*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://b.foo.test")),
22*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://foo.test")),
23*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://a.b.foo.test"))};
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker for (const auto& origin_a : kTestOrigins) {
26*6777b538SAndroid Build Coastguard Worker for (const auto& origin_b : kTestOrigins) {
27*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SchemefulSite(origin_a), SchemefulSite(origin_b));
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker }
31*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,Operators)32*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, Operators) {
33*6777b538SAndroid Build Coastguard Worker // Create a list of origins that should all have different schemeful sites.
34*6777b538SAndroid Build Coastguard Worker // These are in ascending order.
35*6777b538SAndroid Build Coastguard Worker url::Origin kTestOrigins[] = {
36*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("data:text/html,<body>Hello World</body>")),
37*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("file://foo")),
38*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://a.bar.test")),
39*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://c.test")),
40*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://d.test")),
41*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://a.foo.test")),
42*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://a.bar.test")),
43*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://c.test")),
44*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://d.test")),
45*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://a.foo.test"))};
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker // Compare each origin to every other origin and ensure the operators work as
48*6777b538SAndroid Build Coastguard Worker // expected.
49*6777b538SAndroid Build Coastguard Worker for (size_t first = 0; first < std::size(kTestOrigins); ++first) {
50*6777b538SAndroid Build Coastguard Worker SchemefulSite site1 = SchemefulSite(kTestOrigins[first]);
51*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(site1.GetDebugString());
52*6777b538SAndroid Build Coastguard Worker
53*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(site1, site1);
54*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(site1 < site1);
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker // Check the operators work on copies.
57*6777b538SAndroid Build Coastguard Worker SchemefulSite site1_copy = site1;
58*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(site1, site1_copy);
59*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(site1 < site1_copy);
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker for (size_t second = first + 1; second < std::size(kTestOrigins);
62*6777b538SAndroid Build Coastguard Worker ++second) {
63*6777b538SAndroid Build Coastguard Worker SchemefulSite site2 = SchemefulSite(kTestOrigins[second]);
64*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(site2.GetDebugString());
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(site1 < site2);
67*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(site2 < site1);
68*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(site1 == site2);
69*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(site2 == site1);
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,SchemeUsed)74*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, SchemeUsed) {
75*6777b538SAndroid Build Coastguard Worker url::Origin origin_a = url::Origin::Create(GURL("https://foo.test"));
76*6777b538SAndroid Build Coastguard Worker url::Origin origin_b = url::Origin::Create(GURL("http://foo.test"));
77*6777b538SAndroid Build Coastguard Worker EXPECT_NE(SchemefulSite(origin_a), SchemefulSite(origin_b));
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,PortIgnored)80*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, PortIgnored) {
81*6777b538SAndroid Build Coastguard Worker // Both origins are non-opaque.
82*6777b538SAndroid Build Coastguard Worker url::Origin origin_a = url::Origin::Create(GURL("https://foo.test:80"));
83*6777b538SAndroid Build Coastguard Worker url::Origin origin_b = url::Origin::Create(GURL("https://foo.test:2395"));
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SchemefulSite(origin_a), SchemefulSite(origin_b));
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,TopLevelDomainsNotModified)88*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, TopLevelDomainsNotModified) {
89*6777b538SAndroid Build Coastguard Worker url::Origin origin_tld = url::Origin::Create(GURL("https://com"));
90*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("https://com")),
91*6777b538SAndroid Build Coastguard Worker SchemefulSite(origin_tld).GetInternalOriginForTesting());
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker // Unknown TLD's should not be modified.
94*6777b538SAndroid Build Coastguard Worker url::Origin origin_tld_unknown =
95*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://bar:1234"));
96*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("https://bar")),
97*6777b538SAndroid Build Coastguard Worker SchemefulSite(origin_tld_unknown).GetInternalOriginForTesting());
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker // Check for two-part TLDs.
100*6777b538SAndroid Build Coastguard Worker url::Origin origin_two_part_tld = url::Origin::Create(GURL("http://a.co.uk"));
101*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("http://a.co.uk")),
102*6777b538SAndroid Build Coastguard Worker SchemefulSite(origin_two_part_tld).GetInternalOriginForTesting());
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,NonStandardScheme)105*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, NonStandardScheme) {
106*6777b538SAndroid Build Coastguard Worker url::ScopedSchemeRegistryForTests scoped_registry;
107*6777b538SAndroid Build Coastguard Worker url::AddStandardScheme("foo", url::SCHEME_WITH_HOST);
108*6777b538SAndroid Build Coastguard Worker url::Origin origin = url::Origin::Create(GURL("foo://a.b.test"));
109*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(origin.opaque());
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker // We should not use registerable domains for non-standard schemes, even if
112*6777b538SAndroid Build Coastguard Worker // one exists for the host.
113*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("foo://a.b.test")),
114*6777b538SAndroid Build Coastguard Worker SchemefulSite(origin).GetInternalOriginForTesting());
115*6777b538SAndroid Build Coastguard Worker }
116*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,IPBasedOriginsRemovePort)117*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, IPBasedOriginsRemovePort) {
118*6777b538SAndroid Build Coastguard Worker // IPv4 and IPv6 origins should not be modified, except for removing their
119*6777b538SAndroid Build Coastguard Worker // ports.
120*6777b538SAndroid Build Coastguard Worker url::Origin origin_ipv4_a =
121*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://127.0.0.1:1234"));
122*6777b538SAndroid Build Coastguard Worker url::Origin origin_ipv4_b = url::Origin::Create(GURL("http://127.0.0.1"));
123*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("http://127.0.0.1")),
124*6777b538SAndroid Build Coastguard Worker SchemefulSite(origin_ipv4_a).GetInternalOriginForTesting());
125*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SchemefulSite(origin_ipv4_a), SchemefulSite(origin_ipv4_b));
126*6777b538SAndroid Build Coastguard Worker
127*6777b538SAndroid Build Coastguard Worker url::Origin origin_ipv6 = url::Origin::Create(GURL("https://[::1]"));
128*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("https://[::1]")),
129*6777b538SAndroid Build Coastguard Worker SchemefulSite(origin_ipv6).GetInternalOriginForTesting());
130*6777b538SAndroid Build Coastguard Worker }
131*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,LocalhostOriginsRemovePort)132*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, LocalhostOriginsRemovePort) {
133*6777b538SAndroid Build Coastguard Worker // Localhost origins should not be modified, except for removing their ports.
134*6777b538SAndroid Build Coastguard Worker url::Origin localhost_http =
135*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://localhost:1234"));
136*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("http://localhost")),
137*6777b538SAndroid Build Coastguard Worker SchemefulSite(localhost_http).GetInternalOriginForTesting());
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker url::Origin localhost_https =
140*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://localhost:1234"));
141*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("https://localhost")),
142*6777b538SAndroid Build Coastguard Worker SchemefulSite(localhost_https).GetInternalOriginForTesting());
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,OpaqueOrigins)145*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, OpaqueOrigins) {
146*6777b538SAndroid Build Coastguard Worker url::Origin opaque_origin_a =
147*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("data:text/html,<body>Hello World</body>"));
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker // The schemeful site of an opaque origin should always equal other schemeful
150*6777b538SAndroid Build Coastguard Worker // site instances of the same origin.
151*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SchemefulSite(opaque_origin_a), SchemefulSite(opaque_origin_a));
152*6777b538SAndroid Build Coastguard Worker
153*6777b538SAndroid Build Coastguard Worker url::Origin opaque_origin_b =
154*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("data:text/html,<body>Hello World</body>"));
155*6777b538SAndroid Build Coastguard Worker
156*6777b538SAndroid Build Coastguard Worker // Two different opaque origins should never have the same SchemefulSite.
157*6777b538SAndroid Build Coastguard Worker EXPECT_NE(SchemefulSite(opaque_origin_a), SchemefulSite(opaque_origin_b));
158*6777b538SAndroid Build Coastguard Worker }
159*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,FileOriginWithoutHostname)160*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, FileOriginWithoutHostname) {
161*6777b538SAndroid Build Coastguard Worker SchemefulSite site1(url::Origin::Create(GURL("file:///")));
162*6777b538SAndroid Build Coastguard Worker SchemefulSite site2(url::Origin::Create(GURL("file:///path/")));
163*6777b538SAndroid Build Coastguard Worker
164*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(site1, site2);
165*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(site1.GetInternalOriginForTesting().host().empty());
166*6777b538SAndroid Build Coastguard Worker }
167*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,SchemeWithNetworkHost)168*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, SchemeWithNetworkHost) {
169*6777b538SAndroid Build Coastguard Worker url::ScopedSchemeRegistryForTests scheme_registry;
170*6777b538SAndroid Build Coastguard Worker AddStandardScheme("network", url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION);
171*6777b538SAndroid Build Coastguard Worker AddStandardScheme("non-network", url::SCHEME_WITH_HOST);
172*6777b538SAndroid Build Coastguard Worker
173*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(IsStandardSchemeWithNetworkHost("network"));
174*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(IsStandardSchemeWithNetworkHost("non-network"));
175*6777b538SAndroid Build Coastguard Worker
176*6777b538SAndroid Build Coastguard Worker std::optional<SchemefulSite> network_host_site =
177*6777b538SAndroid Build Coastguard Worker SchemefulSite::CreateIfHasRegisterableDomain(
178*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("network://site.example.test:1337")));
179*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(network_host_site.has_value());
180*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("network",
181*6777b538SAndroid Build Coastguard Worker network_host_site->GetInternalOriginForTesting().scheme());
182*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("example.test",
183*6777b538SAndroid Build Coastguard Worker network_host_site->GetInternalOriginForTesting().host());
184*6777b538SAndroid Build Coastguard Worker
185*6777b538SAndroid Build Coastguard Worker std::optional<SchemefulSite> non_network_host_site_null =
186*6777b538SAndroid Build Coastguard Worker SchemefulSite::CreateIfHasRegisterableDomain(
187*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("non-network://site.example.test")));
188*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(non_network_host_site_null.has_value());
189*6777b538SAndroid Build Coastguard Worker SchemefulSite non_network_host_site(GURL("non-network://site.example.test"));
190*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("non-network",
191*6777b538SAndroid Build Coastguard Worker non_network_host_site.GetInternalOriginForTesting().scheme());
192*6777b538SAndroid Build Coastguard Worker // The host is used as-is, without attempting to get a registrable domain.
193*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("site.example.test",
194*6777b538SAndroid Build Coastguard Worker non_network_host_site.GetInternalOriginForTesting().host());
195*6777b538SAndroid Build Coastguard Worker }
196*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,FileSchemeHasRegistrableDomain)197*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, FileSchemeHasRegistrableDomain) {
198*6777b538SAndroid Build Coastguard Worker // Test file origin without host.
199*6777b538SAndroid Build Coastguard Worker url::Origin origin_file =
200*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("file:///dir1/dir2/file.txt"));
201*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(origin_file.host().empty());
202*6777b538SAndroid Build Coastguard Worker SchemefulSite site_file(origin_file);
203*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("file:///")),
204*6777b538SAndroid Build Coastguard Worker site_file.GetInternalOriginForTesting());
205*6777b538SAndroid Build Coastguard Worker
206*6777b538SAndroid Build Coastguard Worker // Test file origin with host (with registrable domain).
207*6777b538SAndroid Build Coastguard Worker url::Origin origin_file_with_host =
208*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("file://host.example.test/file"));
209*6777b538SAndroid Build Coastguard Worker ASSERT_EQ("host.example.test", origin_file_with_host.host());
210*6777b538SAndroid Build Coastguard Worker SchemefulSite site_file_with_host(origin_file_with_host);
211*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("file://example.test")),
212*6777b538SAndroid Build Coastguard Worker site_file_with_host.GetInternalOriginForTesting());
213*6777b538SAndroid Build Coastguard Worker
214*6777b538SAndroid Build Coastguard Worker // Test file origin with host same as registrable domain.
215*6777b538SAndroid Build Coastguard Worker url::Origin origin_file_registrable_domain =
216*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("file://example.test/file"));
217*6777b538SAndroid Build Coastguard Worker ASSERT_EQ("example.test", origin_file_registrable_domain.host());
218*6777b538SAndroid Build Coastguard Worker SchemefulSite site_file_registrable_domain(origin_file_registrable_domain);
219*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::Origin::Create(GURL("file://example.test")),
220*6777b538SAndroid Build Coastguard Worker site_file_registrable_domain.GetInternalOriginForTesting());
221*6777b538SAndroid Build Coastguard Worker
222*6777b538SAndroid Build Coastguard Worker EXPECT_NE(site_file, site_file_with_host);
223*6777b538SAndroid Build Coastguard Worker EXPECT_NE(site_file, site_file_registrable_domain);
224*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(site_file_with_host, site_file_registrable_domain);
225*6777b538SAndroid Build Coastguard Worker }
226*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,SerializationConsistent)227*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, SerializationConsistent) {
228*6777b538SAndroid Build Coastguard Worker url::ScopedSchemeRegistryForTests scoped_registry;
229*6777b538SAndroid Build Coastguard Worker url::AddStandardScheme("chrome", url::SCHEME_WITH_HOST);
230*6777b538SAndroid Build Coastguard Worker
231*6777b538SAndroid Build Coastguard Worker // List of origins which should all share a schemeful site.
232*6777b538SAndroid Build Coastguard Worker SchemefulSite kTestSites[] = {
233*6777b538SAndroid Build Coastguard Worker SchemefulSite(url::Origin::Create(GURL("http://a.foo.test"))),
234*6777b538SAndroid Build Coastguard Worker SchemefulSite(url::Origin::Create(GURL("https://b.foo.test"))),
235*6777b538SAndroid Build Coastguard Worker SchemefulSite(url::Origin::Create(GURL("http://b.foo.test"))),
236*6777b538SAndroid Build Coastguard Worker SchemefulSite(url::Origin::Create(GURL("http://a.b.foo.test"))),
237*6777b538SAndroid Build Coastguard Worker SchemefulSite(url::Origin::Create(GURL("chrome://a.b.test")))};
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker for (const auto& site : kTestSites) {
240*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(site.GetDebugString());
241*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(site.GetInternalOriginForTesting().opaque());
242*6777b538SAndroid Build Coastguard Worker
243*6777b538SAndroid Build Coastguard Worker std::optional<SchemefulSite> deserialized_site =
244*6777b538SAndroid Build Coastguard Worker SchemefulSite::Deserialize(site.Serialize());
245*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized_site);
246*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(site, deserialized_site);
247*6777b538SAndroid Build Coastguard Worker }
248*6777b538SAndroid Build Coastguard Worker }
249*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,SerializationFileSiteWithHost)250*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, SerializationFileSiteWithHost) {
251*6777b538SAndroid Build Coastguard Worker const struct {
252*6777b538SAndroid Build Coastguard Worker SchemefulSite site;
253*6777b538SAndroid Build Coastguard Worker std::string expected;
254*6777b538SAndroid Build Coastguard Worker } kTestCases[] = {
255*6777b538SAndroid Build Coastguard Worker {SchemefulSite(GURL("file:///etc/passwd")), "file://"},
256*6777b538SAndroid Build Coastguard Worker {SchemefulSite(GURL("file://example.com/etc/passwd")),
257*6777b538SAndroid Build Coastguard Worker "file://example.com"},
258*6777b538SAndroid Build Coastguard Worker {SchemefulSite(GURL("file://example.com")), "file://example.com"},
259*6777b538SAndroid Build Coastguard Worker };
260*6777b538SAndroid Build Coastguard Worker
261*6777b538SAndroid Build Coastguard Worker for (const auto& test_case : kTestCases) {
262*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(test_case.site.GetDebugString());
263*6777b538SAndroid Build Coastguard Worker std::string serialized_site = test_case.site.SerializeFileSiteWithHost();
264*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test_case.expected, serialized_site);
265*6777b538SAndroid Build Coastguard Worker std::optional<SchemefulSite> deserialized_site =
266*6777b538SAndroid Build Coastguard Worker SchemefulSite::Deserialize(serialized_site);
267*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized_site);
268*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test_case.site, deserialized_site);
269*6777b538SAndroid Build Coastguard Worker }
270*6777b538SAndroid Build Coastguard Worker }
271*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,FileURLWithHostEquality)272*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, FileURLWithHostEquality) {
273*6777b538SAndroid Build Coastguard Worker // Two file URLs with different hosts should result in unequal SchemefulSites.
274*6777b538SAndroid Build Coastguard Worker SchemefulSite site1(GURL("file://foo/some/path.txt"));
275*6777b538SAndroid Build Coastguard Worker SchemefulSite site2(GURL("file://bar/some/path.txt"));
276*6777b538SAndroid Build Coastguard Worker EXPECT_NE(site1, site2);
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker // Two file URLs with the same host should result in equal SchemefulSites.
279*6777b538SAndroid Build Coastguard Worker SchemefulSite site3(GURL("file://foo/another/path.pdf"));
280*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(site1, site3);
281*6777b538SAndroid Build Coastguard Worker }
282*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,OpaqueSerialization)283*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, OpaqueSerialization) {
284*6777b538SAndroid Build Coastguard Worker // List of origins which should all share a schemeful site.
285*6777b538SAndroid Build Coastguard Worker SchemefulSite kTestSites[] = {
286*6777b538SAndroid Build Coastguard Worker SchemefulSite(), SchemefulSite(url::Origin()),
287*6777b538SAndroid Build Coastguard Worker SchemefulSite(GURL("data:text/html,<body>Hello World</body>"))};
288*6777b538SAndroid Build Coastguard Worker
289*6777b538SAndroid Build Coastguard Worker for (auto& site : kTestSites) {
290*6777b538SAndroid Build Coastguard Worker std::optional<SchemefulSite> deserialized_site =
291*6777b538SAndroid Build Coastguard Worker SchemefulSite::DeserializeWithNonce(*site.SerializeWithNonce());
292*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized_site);
293*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(site, *deserialized_site);
294*6777b538SAndroid Build Coastguard Worker }
295*6777b538SAndroid Build Coastguard Worker }
296*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,FromWire)297*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, FromWire) {
298*6777b538SAndroid Build Coastguard Worker SchemefulSite out;
299*6777b538SAndroid Build Coastguard Worker
300*6777b538SAndroid Build Coastguard Worker // Opaque origin.
301*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SchemefulSite::FromWire(url::Origin(), &out));
302*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(out.opaque());
303*6777b538SAndroid Build Coastguard Worker
304*6777b538SAndroid Build Coastguard Worker // Valid origin.
305*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SchemefulSite::FromWire(
306*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://example.test")), &out));
307*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SchemefulSite(url::Origin::Create(GURL("https://example.test"))),
308*6777b538SAndroid Build Coastguard Worker out);
309*6777b538SAndroid Build Coastguard Worker
310*6777b538SAndroid Build Coastguard Worker // Invalid origin (not a registrable domain).
311*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(SchemefulSite::FromWire(
312*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://sub.example.test")), &out));
313*6777b538SAndroid Build Coastguard Worker
314*6777b538SAndroid Build Coastguard Worker // Invalid origin (non-default port).
315*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(SchemefulSite::FromWire(
316*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://example.test:1337")), &out));
317*6777b538SAndroid Build Coastguard Worker }
318*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,CreateIfHasRegisterableDomain)319*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, CreateIfHasRegisterableDomain) {
320*6777b538SAndroid Build Coastguard Worker for (const auto& site : std::initializer_list<std::string>{
321*6777b538SAndroid Build Coastguard Worker "http://a.bar.test",
322*6777b538SAndroid Build Coastguard Worker "http://c.test",
323*6777b538SAndroid Build Coastguard Worker "http://a.foo.test",
324*6777b538SAndroid Build Coastguard Worker "https://a.bar.test",
325*6777b538SAndroid Build Coastguard Worker "https://c.test",
326*6777b538SAndroid Build Coastguard Worker "https://a.foo.test",
327*6777b538SAndroid Build Coastguard Worker }) {
328*6777b538SAndroid Build Coastguard Worker url::Origin origin = url::Origin::Create(GURL(site));
329*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(SchemefulSite::CreateIfHasRegisterableDomain(origin),
330*6777b538SAndroid Build Coastguard Worker testing::Optional(SchemefulSite(origin)))
331*6777b538SAndroid Build Coastguard Worker << "site = \"" << site << "\"";
332*6777b538SAndroid Build Coastguard Worker }
333*6777b538SAndroid Build Coastguard Worker
334*6777b538SAndroid Build Coastguard Worker for (const auto& site : std::initializer_list<std::string>{
335*6777b538SAndroid Build Coastguard Worker "data:text/html,<body>Hello World</body>",
336*6777b538SAndroid Build Coastguard Worker "file:///",
337*6777b538SAndroid Build Coastguard Worker "file://foo",
338*6777b538SAndroid Build Coastguard Worker "http://127.0.0.1:1234",
339*6777b538SAndroid Build Coastguard Worker "https://127.0.0.1:1234",
340*6777b538SAndroid Build Coastguard Worker }) {
341*6777b538SAndroid Build Coastguard Worker url::Origin origin = url::Origin::Create(GURL(site));
342*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SchemefulSite::CreateIfHasRegisterableDomain(origin),
343*6777b538SAndroid Build Coastguard Worker std::nullopt)
344*6777b538SAndroid Build Coastguard Worker << "site = \"" << site << "\"";
345*6777b538SAndroid Build Coastguard Worker }
346*6777b538SAndroid Build Coastguard Worker }
347*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,ConvertWebSocketToHttp)348*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, ConvertWebSocketToHttp) {
349*6777b538SAndroid Build Coastguard Worker SchemefulSite ws_site(url::Origin::Create(GURL("ws://site.example.test")));
350*6777b538SAndroid Build Coastguard Worker SchemefulSite http_site(
351*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("http://site.example.test")));
352*6777b538SAndroid Build Coastguard Worker SchemefulSite wss_site(url::Origin::Create(GURL("wss://site.example.test")));
353*6777b538SAndroid Build Coastguard Worker SchemefulSite https_site(
354*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://site.example.test")));
355*6777b538SAndroid Build Coastguard Worker
356*6777b538SAndroid Build Coastguard Worker ASSERT_NE(ws_site, wss_site);
357*6777b538SAndroid Build Coastguard Worker ASSERT_NE(ws_site, http_site);
358*6777b538SAndroid Build Coastguard Worker ASSERT_NE(ws_site, https_site);
359*6777b538SAndroid Build Coastguard Worker ASSERT_NE(wss_site, http_site);
360*6777b538SAndroid Build Coastguard Worker ASSERT_NE(wss_site, https_site);
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard Worker ws_site.ConvertWebSocketToHttp();
363*6777b538SAndroid Build Coastguard Worker wss_site.ConvertWebSocketToHttp();
364*6777b538SAndroid Build Coastguard Worker
365*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ws_site, http_site);
366*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(wss_site, https_site);
367*6777b538SAndroid Build Coastguard Worker
368*6777b538SAndroid Build Coastguard Worker // Does not change non-WebSocket sites.
369*6777b538SAndroid Build Coastguard Worker SchemefulSite http_site_copy(http_site);
370*6777b538SAndroid Build Coastguard Worker http_site_copy.ConvertWebSocketToHttp();
371*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(http_site, http_site_copy);
372*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::kHttpScheme,
373*6777b538SAndroid Build Coastguard Worker http_site_copy.GetInternalOriginForTesting().scheme());
374*6777b538SAndroid Build Coastguard Worker
375*6777b538SAndroid Build Coastguard Worker SchemefulSite file_site(url::Origin::Create(GURL("file:///")));
376*6777b538SAndroid Build Coastguard Worker file_site.ConvertWebSocketToHttp();
377*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url::kFileScheme, file_site.GetInternalOriginForTesting().scheme());
378*6777b538SAndroid Build Coastguard Worker }
379*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,GetGURL)380*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, GetGURL) {
381*6777b538SAndroid Build Coastguard Worker struct {
382*6777b538SAndroid Build Coastguard Worker url::Origin origin;
383*6777b538SAndroid Build Coastguard Worker GURL wantGURL;
384*6777b538SAndroid Build Coastguard Worker } kTestCases[] = {
385*6777b538SAndroid Build Coastguard Worker {
386*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("data:text/html,<body>Hello World</body>")),
387*6777b538SAndroid Build Coastguard Worker GURL(),
388*6777b538SAndroid Build Coastguard Worker },
389*6777b538SAndroid Build Coastguard Worker {url::Origin::Create(GURL("file://foo")), GURL("file:///")},
390*6777b538SAndroid Build Coastguard Worker {url::Origin::Create(GURL("http://a.bar.test")), GURL("http://bar.test")},
391*6777b538SAndroid Build Coastguard Worker {url::Origin::Create(GURL("http://c.test")), GURL("http://c.test")},
392*6777b538SAndroid Build Coastguard Worker {url::Origin::Create(GURL("http://c.test:8000")), GURL("http://c.test")},
393*6777b538SAndroid Build Coastguard Worker {
394*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://a.bar.test")),
395*6777b538SAndroid Build Coastguard Worker GURL("https://bar.test"),
396*6777b538SAndroid Build Coastguard Worker },
397*6777b538SAndroid Build Coastguard Worker {
398*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://c.test")),
399*6777b538SAndroid Build Coastguard Worker GURL("https://c.test"),
400*6777b538SAndroid Build Coastguard Worker },
401*6777b538SAndroid Build Coastguard Worker {
402*6777b538SAndroid Build Coastguard Worker url::Origin::Create(GURL("https://c.test:1337")),
403*6777b538SAndroid Build Coastguard Worker GURL("https://c.test"),
404*6777b538SAndroid Build Coastguard Worker },
405*6777b538SAndroid Build Coastguard Worker };
406*6777b538SAndroid Build Coastguard Worker
407*6777b538SAndroid Build Coastguard Worker for (const auto& testcase : kTestCases) {
408*6777b538SAndroid Build Coastguard Worker SchemefulSite site(testcase.origin);
409*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(site.GetURL(), testcase.wantGURL);
410*6777b538SAndroid Build Coastguard Worker }
411*6777b538SAndroid Build Coastguard Worker }
412*6777b538SAndroid Build Coastguard Worker
TEST(SchemefulSiteTest,InternalValue)413*6777b538SAndroid Build Coastguard Worker TEST(SchemefulSiteTest, InternalValue) {
414*6777b538SAndroid Build Coastguard Worker url::Origin origin = url::Origin::Create(GURL("https://example.com"));
415*6777b538SAndroid Build Coastguard Worker SchemefulSite site(origin);
416*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(site.internal_value(), origin);
417*6777b538SAndroid Build Coastguard Worker url::Origin opaque_origin;
418*6777b538SAndroid Build Coastguard Worker SchemefulSite opaque_site(opaque_origin);
419*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(opaque_site.internal_value(), opaque_origin);
420*6777b538SAndroid Build Coastguard Worker }
421*6777b538SAndroid Build Coastguard Worker
422*6777b538SAndroid Build Coastguard Worker } // namespace net
423