xref: /aosp_15_r20/external/cronet/url/gurl_abstract_tests.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 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 #ifndef URL_GURL_ABSTRACT_TESTS_H_
6*6777b538SAndroid Build Coastguard Worker #define URL_GURL_ABSTRACT_TESTS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker // Test suite for tests that cover both url::Url and blink::SecurityUrl.
9*6777b538SAndroid Build Coastguard Worker //
10*6777b538SAndroid Build Coastguard Worker // AbstractUrlTest below abstracts away differences between GURL and blink::KURL
11*6777b538SAndroid Build Coastguard Worker // by parametrizing the tests with a class that has to expose the following
12*6777b538SAndroid Build Coastguard Worker // members:
13*6777b538SAndroid Build Coastguard Worker //   using UrlType = ...;
14*6777b538SAndroid Build Coastguard Worker //   static UrlType CreateUrlFromString(std::string_view s);
15*6777b538SAndroid Build Coastguard Worker //   static bool IsAboutBlank(const UrlType& url);
16*6777b538SAndroid Build Coastguard Worker //   static bool IsAboutSrcdoc(const UrlType& url);
17*6777b538SAndroid Build Coastguard Worker template <typename TUrlTraits>
18*6777b538SAndroid Build Coastguard Worker class AbstractUrlTest : public testing::Test {
19*6777b538SAndroid Build Coastguard Worker  protected:
20*6777b538SAndroid Build Coastguard Worker   // Wrappers that help ellide away TUrlTraits.
21*6777b538SAndroid Build Coastguard Worker   //
22*6777b538SAndroid Build Coastguard Worker   // Note that calling the wrappers needs to be prefixed with `this->...` to
23*6777b538SAndroid Build Coastguard Worker   // avoid hitting: explicit qualification required to use member 'IsAboutBlank'
24*6777b538SAndroid Build Coastguard Worker   // from dependent base class.
25*6777b538SAndroid Build Coastguard Worker   using UrlType = typename TUrlTraits::UrlType;
CreateUrlFromString(std::string_view s)26*6777b538SAndroid Build Coastguard Worker   UrlType CreateUrlFromString(std::string_view s) {
27*6777b538SAndroid Build Coastguard Worker     return TUrlTraits::CreateUrlFromString(s);
28*6777b538SAndroid Build Coastguard Worker   }
IsAboutBlank(const UrlType & url)29*6777b538SAndroid Build Coastguard Worker   bool IsAboutBlank(const UrlType& url) {
30*6777b538SAndroid Build Coastguard Worker     return TUrlTraits::IsAboutBlank(url);
31*6777b538SAndroid Build Coastguard Worker   }
IsAboutSrcdoc(const UrlType & url)32*6777b538SAndroid Build Coastguard Worker   bool IsAboutSrcdoc(const UrlType& url) {
33*6777b538SAndroid Build Coastguard Worker     return TUrlTraits::IsAboutSrcdoc(url);
34*6777b538SAndroid Build Coastguard Worker   }
35*6777b538SAndroid Build Coastguard Worker };
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(AbstractUrlTest);
38*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST_P(AbstractUrlTest,IsAboutBlankTest)39*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(AbstractUrlTest, IsAboutBlankTest) {
40*6777b538SAndroid Build Coastguard Worker   // See https://tools.ietf.org/html/rfc6694 which explicitly allows
41*6777b538SAndroid Build Coastguard Worker   // `about-query` and `about-fragment` parts in about: URLs.
42*6777b538SAndroid Build Coastguard Worker   const std::string kAboutBlankUrls[] = {"about:blank", "about:blank?foo",
43*6777b538SAndroid Build Coastguard Worker                                          "about:blank/#foo",
44*6777b538SAndroid Build Coastguard Worker                                          "about:blank?foo#foo"};
45*6777b538SAndroid Build Coastguard Worker   for (const auto& input : kAboutBlankUrls) {
46*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(testing::Message() << "Test input: " << input);
47*6777b538SAndroid Build Coastguard Worker     auto url = this->CreateUrlFromString(input);
48*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(this->IsAboutBlank(url));
49*6777b538SAndroid Build Coastguard Worker   }
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker   const std::string kNotAboutBlankUrls[] = {"",
52*6777b538SAndroid Build Coastguard Worker                                             "about",
53*6777b538SAndroid Build Coastguard Worker                                             "about:",
54*6777b538SAndroid Build Coastguard Worker                                             "about:blanky",
55*6777b538SAndroid Build Coastguard Worker                                             "about:blan",
56*6777b538SAndroid Build Coastguard Worker                                             "about:about:blank:",
57*6777b538SAndroid Build Coastguard Worker                                             "data:blank",
58*6777b538SAndroid Build Coastguard Worker                                             "http:blank",
59*6777b538SAndroid Build Coastguard Worker                                             "about://blank",
60*6777b538SAndroid Build Coastguard Worker                                             "about:blank/foo",
61*6777b538SAndroid Build Coastguard Worker                                             "about://:8000/blank",
62*6777b538SAndroid Build Coastguard Worker                                             "about://foo:foo@/blank",
63*6777b538SAndroid Build Coastguard Worker                                             "foo@about:blank",
64*6777b538SAndroid Build Coastguard Worker                                             "foo:bar@about:blank",
65*6777b538SAndroid Build Coastguard Worker                                             "about:blank:8000",
66*6777b538SAndroid Build Coastguard Worker                                             "about:blANk"};
67*6777b538SAndroid Build Coastguard Worker   for (const auto& input : kNotAboutBlankUrls) {
68*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(testing::Message() << "Test input: " << input);
69*6777b538SAndroid Build Coastguard Worker     auto url = this->CreateUrlFromString(input);
70*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(this->IsAboutBlank(url));
71*6777b538SAndroid Build Coastguard Worker   }
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST_P(AbstractUrlTest,IsAboutSrcdocTest)74*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(AbstractUrlTest, IsAboutSrcdocTest) {
75*6777b538SAndroid Build Coastguard Worker   // See https://tools.ietf.org/html/rfc6694 which explicitly allows
76*6777b538SAndroid Build Coastguard Worker   // `about-query` and `about-fragment` parts in about: URLs.
77*6777b538SAndroid Build Coastguard Worker   //
78*6777b538SAndroid Build Coastguard Worker   // `about:srcdoc` is defined in
79*6777b538SAndroid Build Coastguard Worker   // https://html.spec.whatwg.org/multipage/urls-and-fetching.html#about:srcdoc
80*6777b538SAndroid Build Coastguard Worker   // which refers to rfc6694 for details.
81*6777b538SAndroid Build Coastguard Worker   const std::string kAboutSrcdocUrls[] = {
82*6777b538SAndroid Build Coastguard Worker       "about:srcdoc", "about:srcdoc/", "about:srcdoc?foo", "about:srcdoc/#foo",
83*6777b538SAndroid Build Coastguard Worker       "about:srcdoc?foo#foo"};
84*6777b538SAndroid Build Coastguard Worker   for (const auto& input : kAboutSrcdocUrls) {
85*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(testing::Message() << "Test input: " << input);
86*6777b538SAndroid Build Coastguard Worker     auto url = this->CreateUrlFromString(input);
87*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(this->IsAboutSrcdoc(url));
88*6777b538SAndroid Build Coastguard Worker   }
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker   const std::string kNotAboutSrcdocUrls[] = {"",
91*6777b538SAndroid Build Coastguard Worker                                              "about",
92*6777b538SAndroid Build Coastguard Worker                                              "about:",
93*6777b538SAndroid Build Coastguard Worker                                              "about:srcdocx",
94*6777b538SAndroid Build Coastguard Worker                                              "about:srcdo",
95*6777b538SAndroid Build Coastguard Worker                                              "about:about:srcdoc:",
96*6777b538SAndroid Build Coastguard Worker                                              "data:srcdoc",
97*6777b538SAndroid Build Coastguard Worker                                              "http:srcdoc",
98*6777b538SAndroid Build Coastguard Worker                                              "about:srcdo",
99*6777b538SAndroid Build Coastguard Worker                                              "about://srcdoc",
100*6777b538SAndroid Build Coastguard Worker                                              "about://srcdoc\\",
101*6777b538SAndroid Build Coastguard Worker                                              "about:srcdoc/foo",
102*6777b538SAndroid Build Coastguard Worker                                              "about://:8000/srcdoc",
103*6777b538SAndroid Build Coastguard Worker                                              "about://foo:foo@/srcdoc",
104*6777b538SAndroid Build Coastguard Worker                                              "foo@about:srcdoc",
105*6777b538SAndroid Build Coastguard Worker                                              "foo:bar@about:srcdoc",
106*6777b538SAndroid Build Coastguard Worker                                              "about:srcdoc:8000",
107*6777b538SAndroid Build Coastguard Worker                                              "about:srCDOc"};
108*6777b538SAndroid Build Coastguard Worker   for (const auto& input : kNotAboutSrcdocUrls) {
109*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(testing::Message() << "Test input: " << input);
110*6777b538SAndroid Build Coastguard Worker     auto url = this->CreateUrlFromString(input);
111*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(this->IsAboutSrcdoc(url));
112*6777b538SAndroid Build Coastguard Worker   }
113*6777b538SAndroid Build Coastguard Worker }
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(AbstractUrlTest,
116*6777b538SAndroid Build Coastguard Worker                             IsAboutBlankTest,
117*6777b538SAndroid Build Coastguard Worker                             IsAboutSrcdocTest);
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker #endif  // URL_GURL_ABSTRACT_TESTS_H_
120