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