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 url::ParseStandardURL(kUrl.data(), kUrl.size(), &parsed);
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 url::ParseStandardURL(kTypicalUrl1.data(), kTypicalUrl1.size(), &parsed1);
50 url::ParseStandardURL(kTypicalUrl2.data(), kTypicalUrl2.size(), &parsed2);
51 url::ParseStandardURL(kTypicalUrl3.data(), kTypicalUrl3.size(), &parsed3);
52 }
53 parse_timer.Done();
54 }
55
56 // Includes both parsing and canonicalization with no mallocs.
TEST(URLParse,TypicalURLParseCanon)57 TEST(URLParse, TypicalURLParseCanon) {
58 url::Parsed parsed1;
59 url::Parsed parsed2;
60 url::Parsed parsed3;
61
62 base::PerfTimeLogger canon_timer("Typical_Parse_Canon_AMillion");
63 url::Parsed out_parsed;
64 url::RawCanonOutput<1024> output;
65 for (int i = 0; i < 333333; i++) { // divide by 3 so we get 1M
66 url::ParseStandardURL(kTypicalUrl1.data(), kTypicalUrl1.size(), &parsed1);
67 output.set_length(0);
68 url::CanonicalizeStandardURL(
69 kTypicalUrl1.data(), parsed1,
70 url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
71 &out_parsed);
72
73 url::ParseStandardURL(kTypicalUrl2.data(), kTypicalUrl2.size(), &parsed2);
74 output.set_length(0);
75 url::CanonicalizeStandardURL(
76 kTypicalUrl2.data(), parsed2,
77 url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
78 &out_parsed);
79
80 url::ParseStandardURL(kTypicalUrl3.data(), kTypicalUrl3.size(), &parsed3);
81 output.set_length(0);
82 url::CanonicalizeStandardURL(
83 kTypicalUrl3.data(), parsed3,
84 url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
85 &out_parsed);
86 }
87 canon_timer.Done();
88 }
89
90 // Includes both parsing and canonicalization, and mallocs for the output.
TEST(URLParse,TypicalURLParseCanonStdString)91 TEST(URLParse, TypicalURLParseCanonStdString) {
92 url::Parsed parsed1;
93 url::Parsed parsed2;
94 url::Parsed parsed3;
95
96 base::PerfTimeLogger canon_timer("Typical_Parse_Canon_AMillion");
97 url::Parsed out_parsed;
98 for (int i = 0; i < 333333; i++) { // divide by 3 so we get 1M
99 url::ParseStandardURL(kTypicalUrl1.data(), kTypicalUrl1.size(), &parsed1);
100 std::string out1;
101 url::StdStringCanonOutput output1(&out1);
102 url::CanonicalizeStandardURL(
103 kTypicalUrl1.data(), parsed1,
104 url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output1,
105 &out_parsed);
106
107 url::ParseStandardURL(kTypicalUrl2.data(), kTypicalUrl2.size(), &parsed2);
108 std::string out2;
109 url::StdStringCanonOutput output2(&out2);
110 url::CanonicalizeStandardURL(
111 kTypicalUrl2.data(), parsed2,
112 url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output2,
113 &out_parsed);
114
115 url::ParseStandardURL(kTypicalUrl3.data(), kTypicalUrl3.size(), &parsed3);
116 std::string out3;
117 url::StdStringCanonOutput output3(&out3);
118 url::CanonicalizeStandardURL(
119 kTypicalUrl3.data(), parsed3,
120 url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output3,
121 &out_parsed);
122 }
123 canon_timer.Done();
124 }
125
TEST(URLParse,GURL)126 TEST(URLParse, GURL) {
127 base::PerfTimeLogger gurl_timer("Typical_GURL_AMillion");
128 for (int i = 0; i < 333333; i++) { // divide by 3 so we get 1M
129 GURL gurl1(kTypicalUrl1);
130 GURL gurl2(kTypicalUrl2);
131 GURL gurl3(kTypicalUrl3);
132 }
133 gurl_timer.Done();
134 }
135
136 } // namespace
137