gurl_abstract_tests.h 5.2 KB

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