• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2006-2008 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <string_view>
6 
7 #include "base/test/perf_time_logger.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "url/gurl.h"
10 #include "url/third_party/mozilla/url_parse.h"
11 #include "url/url_canon.h"
12 #include "url/url_canon_stdstring.h"
13 
14 namespace {
15 
TEST(URLParse,FullURL)16 TEST(URLParse, FullURL) {
17   constexpr std::string_view kUrl =
18       "http://me:pass@host/foo/bar.html;param?query=yes#ref";
19 
20   url::Parsed parsed;
21   base::PerfTimeLogger timer("Full_URL_Parse_AMillion");
22 
23   for (int i = 0; i < 1000000; i++)
24     parsed = url::ParseStandardURL(kUrl);
25   timer.Done();
26 }
27 
28 constexpr std::string_view kTypicalUrl1 =
29     "http://www.google.com/"
30     "search?q=url+parsing&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:"
31     "official&client=firefox-a";
32 
33 constexpr std::string_view kTypicalUrl2 =
34     "http://www.amazon.com/Stephen-King-Thrillers-Horror-People/dp/0766012336/"
35     "ref=sr_1_2/133-4144931-4505264?ie=UTF8&s=books&qid=2144880915&sr=8-2";
36 
37 constexpr std::string_view kTypicalUrl3 =
38     "http://store.apple.com/1-800-MY-APPLE/WebObjects/AppleStore.woa/wa/"
39     "RSLID?nnmm=browse&mco=578E9744&node=home/desktop/mac_pro";
40 
TEST(URLParse,TypicalURLParse)41 TEST(URLParse, TypicalURLParse) {
42   url::Parsed parsed1;
43   url::Parsed parsed2;
44   url::Parsed parsed3;
45 
46   // Do this 1/3 of a million times since we do 3 different URLs.
47   base::PerfTimeLogger parse_timer("Typical_URL_Parse_AMillion");
48   for (int i = 0; i < 333333; i++) {
49     parsed1 = url::ParseStandardURL(kTypicalUrl1);
50     parsed2 = url::ParseStandardURL(kTypicalUrl2);
51     parsed3 = url::ParseStandardURL(kTypicalUrl3);
52   }
53   parse_timer.Done();
54 }
55 
56 // Includes both parsing and canonicalization with no mallocs.
TEST(URLParse,TypicalURLParseCanon)57 TEST(URLParse, TypicalURLParseCanon) {
58   base::PerfTimeLogger canon_timer("Typical_Parse_Canon_AMillion");
59   url::Parsed out_parsed;
60   url::RawCanonOutput<1024> output;
61   for (int i = 0; i < 333333; i++) {  // divide by 3 so we get 1M
62     output.set_length(0);
63     url::CanonicalizeStandardURL(
64         kTypicalUrl1.data(), url::ParseStandardURL(kTypicalUrl1),
65         url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
66         &out_parsed);
67 
68     output.set_length(0);
69     url::CanonicalizeStandardURL(
70         kTypicalUrl2.data(), url::ParseStandardURL(kTypicalUrl2),
71         url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
72         &out_parsed);
73 
74     output.set_length(0);
75     url::CanonicalizeStandardURL(
76         kTypicalUrl3.data(), url::ParseStandardURL(kTypicalUrl3),
77         url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
78         &out_parsed);
79   }
80   canon_timer.Done();
81 }
82 
83 // Includes both parsing and canonicalization, and mallocs for the output.
TEST(URLParse,TypicalURLParseCanonStdString)84 TEST(URLParse, TypicalURLParseCanonStdString) {
85   base::PerfTimeLogger canon_timer("Typical_Parse_Canon_AMillion");
86   url::Parsed out_parsed;
87   for (int i = 0; i < 333333; i++) {  // divide by 3 so we get 1M
88     std::string out1;
89     url::StdStringCanonOutput output1(&out1);
90     url::CanonicalizeStandardURL(
91         kTypicalUrl1.data(), url::ParseStandardURL(kTypicalUrl1),
92         url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output1,
93         &out_parsed);
94 
95     std::string out2;
96     url::StdStringCanonOutput output2(&out2);
97     url::CanonicalizeStandardURL(
98         kTypicalUrl2.data(), url::ParseStandardURL(kTypicalUrl2),
99         url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output2,
100         &out_parsed);
101 
102     std::string out3;
103     url::StdStringCanonOutput output3(&out3);
104     url::CanonicalizeStandardURL(
105         kTypicalUrl3.data(), url::ParseStandardURL(kTypicalUrl3),
106         url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output3,
107         &out_parsed);
108   }
109   canon_timer.Done();
110 }
111 
TEST(URLParse,GURL)112 TEST(URLParse, GURL) {
113   base::PerfTimeLogger gurl_timer("Typical_GURL_AMillion");
114   for (int i = 0; i < 333333; i++) {  // divide by 3 so we get 1M
115     GURL gurl1(kTypicalUrl1);
116     GURL gurl2(kTypicalUrl2);
117     GURL gurl3(kTypicalUrl3);
118   }
119   gurl_timer.Done();
120 }
121 
122 }  // namespace
123