1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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 #include "net/cookies/cookie_monster.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <memory>
8*6777b538SAndroid Build Coastguard Worker #include <optional>
9*6777b538SAndroid Build Coastguard Worker #include <utility>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/run_loop.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/test/task_environment.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/timer/elapsed_timer.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/cookies/canonical_cookie.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_monster_store_test.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_util.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/cookies/parsed_cookie.h"
23*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
24*6777b538SAndroid Build Coastguard Worker #include "testing/perf/perf_result_reporter.h"
25*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker namespace net {
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker namespace {
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker const int kNumCookies = 20000;
32*6777b538SAndroid Build Coastguard Worker const char kCookieLine[] = "A = \"b=;\\\"\" ;secure;;; samesite=none";
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricPrefixParsedCookie[] = "ParsedCookie.";
35*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricPrefixCookieMonster[] = "CookieMonster.";
36*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricParseTimeMs[] = "parse_time";
37*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricAddTimeMs[] = "add_time";
38*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricQueryTimeMs[] = "query_time";
39*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricDeleteAllTimeMs[] = "delete_all_time";
40*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricQueryDomainTimeMs[] = "query_domain_time";
41*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricImportTimeMs[] = "import_time";
42*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricGetKeyTimeMs[] = "get_key_time";
43*6777b538SAndroid Build Coastguard Worker static constexpr char kMetricGCTimeMs[] = "gc_time";
44*6777b538SAndroid Build Coastguard Worker
SetUpParseReporter(const std::string & story)45*6777b538SAndroid Build Coastguard Worker perf_test::PerfResultReporter SetUpParseReporter(const std::string& story) {
46*6777b538SAndroid Build Coastguard Worker perf_test::PerfResultReporter reporter(kMetricPrefixParsedCookie, story);
47*6777b538SAndroid Build Coastguard Worker reporter.RegisterImportantMetric(kMetricParseTimeMs, "ms");
48*6777b538SAndroid Build Coastguard Worker return reporter;
49*6777b538SAndroid Build Coastguard Worker }
50*6777b538SAndroid Build Coastguard Worker
SetUpCookieMonsterReporter(const std::string & story)51*6777b538SAndroid Build Coastguard Worker perf_test::PerfResultReporter SetUpCookieMonsterReporter(
52*6777b538SAndroid Build Coastguard Worker const std::string& story) {
53*6777b538SAndroid Build Coastguard Worker perf_test::PerfResultReporter reporter(kMetricPrefixCookieMonster, story);
54*6777b538SAndroid Build Coastguard Worker reporter.RegisterImportantMetric(kMetricAddTimeMs, "ms");
55*6777b538SAndroid Build Coastguard Worker reporter.RegisterImportantMetric(kMetricQueryTimeMs, "ms");
56*6777b538SAndroid Build Coastguard Worker reporter.RegisterImportantMetric(kMetricDeleteAllTimeMs, "ms");
57*6777b538SAndroid Build Coastguard Worker reporter.RegisterImportantMetric(kMetricQueryDomainTimeMs, "ms");
58*6777b538SAndroid Build Coastguard Worker reporter.RegisterImportantMetric(kMetricImportTimeMs, "ms");
59*6777b538SAndroid Build Coastguard Worker reporter.RegisterImportantMetric(kMetricGetKeyTimeMs, "ms");
60*6777b538SAndroid Build Coastguard Worker reporter.RegisterImportantMetric(kMetricGCTimeMs, "ms");
61*6777b538SAndroid Build Coastguard Worker return reporter;
62*6777b538SAndroid Build Coastguard Worker }
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker class CookieMonsterTest : public testing::Test {
65*6777b538SAndroid Build Coastguard Worker public:
66*6777b538SAndroid Build Coastguard Worker CookieMonsterTest() = default;
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker private:
69*6777b538SAndroid Build Coastguard Worker base::test::SingleThreadTaskEnvironment task_environment_{
70*6777b538SAndroid Build Coastguard Worker base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
71*6777b538SAndroid Build Coastguard Worker };
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker class CookieTestCallback {
74*6777b538SAndroid Build Coastguard Worker public:
75*6777b538SAndroid Build Coastguard Worker CookieTestCallback() = default;
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker protected:
WaitForCallback()78*6777b538SAndroid Build Coastguard Worker void WaitForCallback() {
79*6777b538SAndroid Build Coastguard Worker // Note that the performance tests currently all operate on a loaded cookie
80*6777b538SAndroid Build Coastguard Worker // store (or, more precisely, one that has no backing persistent store).
81*6777b538SAndroid Build Coastguard Worker // Therefore, callbacks will actually always complete synchronously. If the
82*6777b538SAndroid Build Coastguard Worker // tests get more advanced we need to add other means of signaling
83*6777b538SAndroid Build Coastguard Worker // completion.
84*6777b538SAndroid Build Coastguard Worker base::RunLoop().RunUntilIdle();
85*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(has_run_);
86*6777b538SAndroid Build Coastguard Worker has_run_ = false;
87*6777b538SAndroid Build Coastguard Worker }
88*6777b538SAndroid Build Coastguard Worker
Run()89*6777b538SAndroid Build Coastguard Worker void Run() { has_run_ = true; }
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker bool has_run_ = false;
92*6777b538SAndroid Build Coastguard Worker };
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker class SetCookieCallback : public CookieTestCallback {
95*6777b538SAndroid Build Coastguard Worker public:
SetCookie(CookieMonster * cm,const GURL & gurl,const std::string & cookie_line)96*6777b538SAndroid Build Coastguard Worker void SetCookie(CookieMonster* cm,
97*6777b538SAndroid Build Coastguard Worker const GURL& gurl,
98*6777b538SAndroid Build Coastguard Worker const std::string& cookie_line) {
99*6777b538SAndroid Build Coastguard Worker auto cookie =
100*6777b538SAndroid Build Coastguard Worker CanonicalCookie::CreateForTesting(gurl, cookie_line, base::Time::Now());
101*6777b538SAndroid Build Coastguard Worker cm->SetCanonicalCookieAsync(
102*6777b538SAndroid Build Coastguard Worker std::move(cookie), gurl, options_,
103*6777b538SAndroid Build Coastguard Worker base::BindOnce(&SetCookieCallback::Run, base::Unretained(this)));
104*6777b538SAndroid Build Coastguard Worker WaitForCallback();
105*6777b538SAndroid Build Coastguard Worker }
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker private:
Run(CookieAccessResult result)108*6777b538SAndroid Build Coastguard Worker void Run(CookieAccessResult result) {
109*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.status.IsInclude())
110*6777b538SAndroid Build Coastguard Worker << "result.status: " << result.status.GetDebugString();
111*6777b538SAndroid Build Coastguard Worker CookieTestCallback::Run();
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker CookieOptions options_;
114*6777b538SAndroid Build Coastguard Worker };
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker class GetCookieListCallback : public CookieTestCallback {
117*6777b538SAndroid Build Coastguard Worker public:
GetCookieList(CookieMonster * cm,const GURL & gurl)118*6777b538SAndroid Build Coastguard Worker const CookieList& GetCookieList(CookieMonster* cm, const GURL& gurl) {
119*6777b538SAndroid Build Coastguard Worker cm->GetCookieListWithOptionsAsync(
120*6777b538SAndroid Build Coastguard Worker gurl, options_, CookiePartitionKeyCollection(),
121*6777b538SAndroid Build Coastguard Worker base::BindOnce(&GetCookieListCallback::Run, base::Unretained(this)));
122*6777b538SAndroid Build Coastguard Worker WaitForCallback();
123*6777b538SAndroid Build Coastguard Worker return cookie_list_;
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker
126*6777b538SAndroid Build Coastguard Worker private:
Run(const CookieAccessResultList & cookie_list,const CookieAccessResultList & excluded_cookies)127*6777b538SAndroid Build Coastguard Worker void Run(const CookieAccessResultList& cookie_list,
128*6777b538SAndroid Build Coastguard Worker const CookieAccessResultList& excluded_cookies) {
129*6777b538SAndroid Build Coastguard Worker cookie_list_ = cookie_util::StripAccessResults(cookie_list);
130*6777b538SAndroid Build Coastguard Worker CookieTestCallback::Run();
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker CookieList cookie_list_;
133*6777b538SAndroid Build Coastguard Worker CookieOptions options_;
134*6777b538SAndroid Build Coastguard Worker };
135*6777b538SAndroid Build Coastguard Worker
136*6777b538SAndroid Build Coastguard Worker class GetAllCookiesCallback : public CookieTestCallback {
137*6777b538SAndroid Build Coastguard Worker public:
GetAllCookies(CookieMonster * cm)138*6777b538SAndroid Build Coastguard Worker CookieList GetAllCookies(CookieMonster* cm) {
139*6777b538SAndroid Build Coastguard Worker cm->GetAllCookiesAsync(
140*6777b538SAndroid Build Coastguard Worker base::BindOnce(&GetAllCookiesCallback::Run, base::Unretained(this)));
141*6777b538SAndroid Build Coastguard Worker WaitForCallback();
142*6777b538SAndroid Build Coastguard Worker return cookies_;
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker
145*6777b538SAndroid Build Coastguard Worker private:
Run(const CookieList & cookies)146*6777b538SAndroid Build Coastguard Worker void Run(const CookieList& cookies) {
147*6777b538SAndroid Build Coastguard Worker cookies_ = cookies;
148*6777b538SAndroid Build Coastguard Worker CookieTestCallback::Run();
149*6777b538SAndroid Build Coastguard Worker }
150*6777b538SAndroid Build Coastguard Worker CookieList cookies_;
151*6777b538SAndroid Build Coastguard Worker };
152*6777b538SAndroid Build Coastguard Worker
153*6777b538SAndroid Build Coastguard Worker } // namespace
154*6777b538SAndroid Build Coastguard Worker
TEST(ParsedCookieTest,TestParseCookies)155*6777b538SAndroid Build Coastguard Worker TEST(ParsedCookieTest, TestParseCookies) {
156*6777b538SAndroid Build Coastguard Worker std::string cookie(kCookieLine);
157*6777b538SAndroid Build Coastguard Worker auto reporter = SetUpParseReporter("parse_cookies");
158*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer timer;
159*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kNumCookies; ++i) {
160*6777b538SAndroid Build Coastguard Worker ParsedCookie pc(cookie);
161*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(pc.IsValid());
162*6777b538SAndroid Build Coastguard Worker }
163*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricParseTimeMs, timer.Elapsed().InMillisecondsF());
164*6777b538SAndroid Build Coastguard Worker }
165*6777b538SAndroid Build Coastguard Worker
TEST(ParsedCookieTest,TestParseBigCookies)166*6777b538SAndroid Build Coastguard Worker TEST(ParsedCookieTest, TestParseBigCookies) {
167*6777b538SAndroid Build Coastguard Worker std::string cookie(3800, 'z');
168*6777b538SAndroid Build Coastguard Worker cookie += kCookieLine;
169*6777b538SAndroid Build Coastguard Worker auto reporter = SetUpParseReporter("parse_big_cookies");
170*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer timer;
171*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kNumCookies; ++i) {
172*6777b538SAndroid Build Coastguard Worker ParsedCookie pc(cookie);
173*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(pc.IsValid());
174*6777b538SAndroid Build Coastguard Worker }
175*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricParseTimeMs, timer.Elapsed().InMillisecondsF());
176*6777b538SAndroid Build Coastguard Worker }
177*6777b538SAndroid Build Coastguard Worker
TEST_F(CookieMonsterTest,TestAddCookiesOnSingleHost)178*6777b538SAndroid Build Coastguard Worker TEST_F(CookieMonsterTest, TestAddCookiesOnSingleHost) {
179*6777b538SAndroid Build Coastguard Worker auto cm = std::make_unique<CookieMonster>(nullptr, nullptr);
180*6777b538SAndroid Build Coastguard Worker std::vector<std::string> cookies;
181*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kNumCookies; i++) {
182*6777b538SAndroid Build Coastguard Worker cookies.push_back(base::StringPrintf("a%03d=b; SameSite=None; Secure", i));
183*6777b538SAndroid Build Coastguard Worker }
184*6777b538SAndroid Build Coastguard Worker
185*6777b538SAndroid Build Coastguard Worker SetCookieCallback setCookieCallback;
186*6777b538SAndroid Build Coastguard Worker
187*6777b538SAndroid Build Coastguard Worker // Add a bunch of cookies on a single host
188*6777b538SAndroid Build Coastguard Worker auto reporter = SetUpCookieMonsterReporter("single_host");
189*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer add_timer;
190*6777b538SAndroid Build Coastguard Worker
191*6777b538SAndroid Build Coastguard Worker const GURL kGoogleURL = GURL("https://www.foo.com");
192*6777b538SAndroid Build Coastguard Worker for (std::vector<std::string>::const_iterator it = cookies.begin();
193*6777b538SAndroid Build Coastguard Worker it != cookies.end(); ++it) {
194*6777b538SAndroid Build Coastguard Worker setCookieCallback.SetCookie(cm.get(), kGoogleURL, *it);
195*6777b538SAndroid Build Coastguard Worker }
196*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricAddTimeMs, add_timer.Elapsed().InMillisecondsF());
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard Worker GetCookieListCallback getCookieListCallback;
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer query_timer;
201*6777b538SAndroid Build Coastguard Worker for (std::vector<std::string>::const_iterator it = cookies.begin();
202*6777b538SAndroid Build Coastguard Worker it != cookies.end(); ++it) {
203*6777b538SAndroid Build Coastguard Worker getCookieListCallback.GetCookieList(cm.get(), kGoogleURL);
204*6777b538SAndroid Build Coastguard Worker }
205*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricQueryTimeMs,
206*6777b538SAndroid Build Coastguard Worker query_timer.Elapsed().InMillisecondsF());
207*6777b538SAndroid Build Coastguard Worker
208*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer delete_all_timer;
209*6777b538SAndroid Build Coastguard Worker cm->DeleteAllAsync(CookieMonster::DeleteCallback());
210*6777b538SAndroid Build Coastguard Worker base::RunLoop().RunUntilIdle();
211*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricDeleteAllTimeMs,
212*6777b538SAndroid Build Coastguard Worker delete_all_timer.Elapsed().InMillisecondsF());
213*6777b538SAndroid Build Coastguard Worker }
214*6777b538SAndroid Build Coastguard Worker
TEST_F(CookieMonsterTest,TestAddCookieOnManyHosts)215*6777b538SAndroid Build Coastguard Worker TEST_F(CookieMonsterTest, TestAddCookieOnManyHosts) {
216*6777b538SAndroid Build Coastguard Worker auto cm = std::make_unique<CookieMonster>(nullptr, nullptr);
217*6777b538SAndroid Build Coastguard Worker std::string cookie(kCookieLine);
218*6777b538SAndroid Build Coastguard Worker std::vector<GURL> gurls; // just wanna have ffffuunnn
219*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kNumCookies; ++i) {
220*6777b538SAndroid Build Coastguard Worker gurls.emplace_back(base::StringPrintf("https://a%04d.izzle", i));
221*6777b538SAndroid Build Coastguard Worker }
222*6777b538SAndroid Build Coastguard Worker
223*6777b538SAndroid Build Coastguard Worker SetCookieCallback setCookieCallback;
224*6777b538SAndroid Build Coastguard Worker
225*6777b538SAndroid Build Coastguard Worker // Add a cookie on a bunch of host
226*6777b538SAndroid Build Coastguard Worker auto reporter = SetUpCookieMonsterReporter("many_hosts");
227*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer add_timer;
228*6777b538SAndroid Build Coastguard Worker for (std::vector<GURL>::const_iterator it = gurls.begin(); it != gurls.end();
229*6777b538SAndroid Build Coastguard Worker ++it) {
230*6777b538SAndroid Build Coastguard Worker setCookieCallback.SetCookie(cm.get(), *it, cookie);
231*6777b538SAndroid Build Coastguard Worker }
232*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricAddTimeMs, add_timer.Elapsed().InMillisecondsF());
233*6777b538SAndroid Build Coastguard Worker
234*6777b538SAndroid Build Coastguard Worker GetCookieListCallback getCookieListCallback;
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer query_timer;
237*6777b538SAndroid Build Coastguard Worker for (std::vector<GURL>::const_iterator it = gurls.begin(); it != gurls.end();
238*6777b538SAndroid Build Coastguard Worker ++it) {
239*6777b538SAndroid Build Coastguard Worker getCookieListCallback.GetCookieList(cm.get(), *it);
240*6777b538SAndroid Build Coastguard Worker }
241*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricQueryTimeMs,
242*6777b538SAndroid Build Coastguard Worker query_timer.Elapsed().InMillisecondsF());
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer delete_all_timer;
245*6777b538SAndroid Build Coastguard Worker cm->DeleteAllAsync(CookieMonster::DeleteCallback());
246*6777b538SAndroid Build Coastguard Worker base::RunLoop().RunUntilIdle();
247*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricDeleteAllTimeMs,
248*6777b538SAndroid Build Coastguard Worker delete_all_timer.Elapsed().InMillisecondsF());
249*6777b538SAndroid Build Coastguard Worker }
250*6777b538SAndroid Build Coastguard Worker
TEST_F(CookieMonsterTest,TestDomainTree)251*6777b538SAndroid Build Coastguard Worker TEST_F(CookieMonsterTest, TestDomainTree) {
252*6777b538SAndroid Build Coastguard Worker auto cm = std::make_unique<CookieMonster>(nullptr, nullptr);
253*6777b538SAndroid Build Coastguard Worker GetCookieListCallback getCookieListCallback;
254*6777b538SAndroid Build Coastguard Worker SetCookieCallback setCookieCallback;
255*6777b538SAndroid Build Coastguard Worker const char domain_cookie_format_tree[] =
256*6777b538SAndroid Build Coastguard Worker "a=b; domain=%s; samesite=none; secure";
257*6777b538SAndroid Build Coastguard Worker const std::string domain_base("top.com");
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Worker std::vector<std::string> domain_list;
260*6777b538SAndroid Build Coastguard Worker
261*6777b538SAndroid Build Coastguard Worker // Create a balanced binary tree of domains on which the cookie is set.
262*6777b538SAndroid Build Coastguard Worker domain_list.push_back(domain_base);
263*6777b538SAndroid Build Coastguard Worker for (int i1 = 0; i1 < 2; i1++) {
264*6777b538SAndroid Build Coastguard Worker std::string domain_base_1((i1 ? "a." : "b.") + domain_base);
265*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("top.com", cm->GetKey(domain_base_1));
266*6777b538SAndroid Build Coastguard Worker domain_list.push_back(domain_base_1);
267*6777b538SAndroid Build Coastguard Worker for (int i2 = 0; i2 < 2; i2++) {
268*6777b538SAndroid Build Coastguard Worker std::string domain_base_2((i2 ? "a." : "b.") + domain_base_1);
269*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("top.com", cm->GetKey(domain_base_2));
270*6777b538SAndroid Build Coastguard Worker domain_list.push_back(domain_base_2);
271*6777b538SAndroid Build Coastguard Worker for (int i3 = 0; i3 < 2; i3++) {
272*6777b538SAndroid Build Coastguard Worker std::string domain_base_3((i3 ? "a." : "b.") + domain_base_2);
273*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("top.com", cm->GetKey(domain_base_3));
274*6777b538SAndroid Build Coastguard Worker domain_list.push_back(domain_base_3);
275*6777b538SAndroid Build Coastguard Worker for (int i4 = 0; i4 < 2; i4++) {
276*6777b538SAndroid Build Coastguard Worker std::string domain_base_4((i4 ? "a." : "b.") + domain_base_3);
277*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("top.com", cm->GetKey(domain_base_4));
278*6777b538SAndroid Build Coastguard Worker domain_list.push_back(domain_base_4);
279*6777b538SAndroid Build Coastguard Worker }
280*6777b538SAndroid Build Coastguard Worker }
281*6777b538SAndroid Build Coastguard Worker }
282*6777b538SAndroid Build Coastguard Worker }
283*6777b538SAndroid Build Coastguard Worker
284*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(31u, domain_list.size());
285*6777b538SAndroid Build Coastguard Worker for (std::vector<std::string>::const_iterator it = domain_list.begin();
286*6777b538SAndroid Build Coastguard Worker it != domain_list.end(); it++) {
287*6777b538SAndroid Build Coastguard Worker GURL gurl("https://" + *it + "/");
288*6777b538SAndroid Build Coastguard Worker const std::string cookie =
289*6777b538SAndroid Build Coastguard Worker base::StringPrintf(domain_cookie_format_tree, it->c_str());
290*6777b538SAndroid Build Coastguard Worker setCookieCallback.SetCookie(cm.get(), gurl, cookie);
291*6777b538SAndroid Build Coastguard Worker }
292*6777b538SAndroid Build Coastguard Worker
293*6777b538SAndroid Build Coastguard Worker GetAllCookiesCallback getAllCookiesCallback;
294*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(31u, getAllCookiesCallback.GetAllCookies(cm.get()).size());
295*6777b538SAndroid Build Coastguard Worker
296*6777b538SAndroid Build Coastguard Worker GURL probe_gurl("https://b.a.b.a.top.com/");
297*6777b538SAndroid Build Coastguard Worker const CookieList& cookie_list =
298*6777b538SAndroid Build Coastguard Worker getCookieListCallback.GetCookieList(cm.get(), probe_gurl);
299*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5u, cookie_list.size())
300*6777b538SAndroid Build Coastguard Worker << CanonicalCookie::BuildCookieLine(cookie_list);
301*6777b538SAndroid Build Coastguard Worker auto reporter = SetUpCookieMonsterReporter("tree");
302*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer query_domain_timer;
303*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kNumCookies; i++) {
304*6777b538SAndroid Build Coastguard Worker getCookieListCallback.GetCookieList(cm.get(), probe_gurl);
305*6777b538SAndroid Build Coastguard Worker }
306*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricQueryDomainTimeMs,
307*6777b538SAndroid Build Coastguard Worker query_domain_timer.Elapsed().InMillisecondsF());
308*6777b538SAndroid Build Coastguard Worker }
309*6777b538SAndroid Build Coastguard Worker
TEST_F(CookieMonsterTest,TestDomainLine)310*6777b538SAndroid Build Coastguard Worker TEST_F(CookieMonsterTest, TestDomainLine) {
311*6777b538SAndroid Build Coastguard Worker auto cm = std::make_unique<CookieMonster>(nullptr, nullptr);
312*6777b538SAndroid Build Coastguard Worker SetCookieCallback setCookieCallback;
313*6777b538SAndroid Build Coastguard Worker GetCookieListCallback getCookieListCallback;
314*6777b538SAndroid Build Coastguard Worker std::vector<std::string> domain_list;
315*6777b538SAndroid Build Coastguard Worker GURL probe_gurl("https://b.a.b.a.top.com/");
316*6777b538SAndroid Build Coastguard Worker
317*6777b538SAndroid Build Coastguard Worker // Create a line of 32 domain cookies such that all cookies stored
318*6777b538SAndroid Build Coastguard Worker // by effective TLD+1 will apply to probe GURL.
319*6777b538SAndroid Build Coastguard Worker // (TLD + 1 is the level above .com/org/net/etc, e.g. "top.com"
320*6777b538SAndroid Build Coastguard Worker // or "google.com". "Effective" is added to include sites like
321*6777b538SAndroid Build Coastguard Worker // bbc.co.uk, where the effetive TLD+1 is more than one level
322*6777b538SAndroid Build Coastguard Worker // below the top level.)
323*6777b538SAndroid Build Coastguard Worker domain_list.push_back("a.top.com");
324*6777b538SAndroid Build Coastguard Worker domain_list.push_back("b.a.top.com");
325*6777b538SAndroid Build Coastguard Worker domain_list.push_back("a.b.a.top.com");
326*6777b538SAndroid Build Coastguard Worker domain_list.push_back("b.a.b.a.top.com");
327*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4u, domain_list.size());
328*6777b538SAndroid Build Coastguard Worker
329*6777b538SAndroid Build Coastguard Worker const char domain_cookie_format_line[] =
330*6777b538SAndroid Build Coastguard Worker "a%03d=b; domain=%s; samesite=none; secure";
331*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 8; i++) {
332*6777b538SAndroid Build Coastguard Worker for (std::vector<std::string>::const_iterator it = domain_list.begin();
333*6777b538SAndroid Build Coastguard Worker it != domain_list.end(); it++) {
334*6777b538SAndroid Build Coastguard Worker GURL gurl("https://" + *it + "/");
335*6777b538SAndroid Build Coastguard Worker const std::string cookie =
336*6777b538SAndroid Build Coastguard Worker base::StringPrintf(domain_cookie_format_line, i, it->c_str());
337*6777b538SAndroid Build Coastguard Worker setCookieCallback.SetCookie(cm.get(), gurl, cookie);
338*6777b538SAndroid Build Coastguard Worker }
339*6777b538SAndroid Build Coastguard Worker }
340*6777b538SAndroid Build Coastguard Worker
341*6777b538SAndroid Build Coastguard Worker const CookieList& cookie_list =
342*6777b538SAndroid Build Coastguard Worker getCookieListCallback.GetCookieList(cm.get(), probe_gurl);
343*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(32u, cookie_list.size());
344*6777b538SAndroid Build Coastguard Worker auto reporter = SetUpCookieMonsterReporter("line");
345*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer query_domain_timer;
346*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kNumCookies; i++) {
347*6777b538SAndroid Build Coastguard Worker getCookieListCallback.GetCookieList(cm.get(), probe_gurl);
348*6777b538SAndroid Build Coastguard Worker }
349*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricQueryDomainTimeMs,
350*6777b538SAndroid Build Coastguard Worker query_domain_timer.Elapsed().InMillisecondsF());
351*6777b538SAndroid Build Coastguard Worker }
352*6777b538SAndroid Build Coastguard Worker
TEST_F(CookieMonsterTest,TestImport)353*6777b538SAndroid Build Coastguard Worker TEST_F(CookieMonsterTest, TestImport) {
354*6777b538SAndroid Build Coastguard Worker auto store = base::MakeRefCounted<MockPersistentCookieStore>();
355*6777b538SAndroid Build Coastguard Worker std::vector<std::unique_ptr<CanonicalCookie>> initial_cookies;
356*6777b538SAndroid Build Coastguard Worker GetCookieListCallback getCookieListCallback;
357*6777b538SAndroid Build Coastguard Worker
358*6777b538SAndroid Build Coastguard Worker // We want to setup a fairly large backing store, with 300 domains of 50
359*6777b538SAndroid Build Coastguard Worker // cookies each. Creation times must be unique.
360*6777b538SAndroid Build Coastguard Worker int64_t time_tick(base::Time::Now().ToInternalValue());
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard Worker for (int domain_num = 0; domain_num < 300; domain_num++) {
363*6777b538SAndroid Build Coastguard Worker GURL gurl(base::StringPrintf("http://www.Domain_%d.com", domain_num));
364*6777b538SAndroid Build Coastguard Worker for (int cookie_num = 0; cookie_num < 50; cookie_num++) {
365*6777b538SAndroid Build Coastguard Worker std::string cookie_line(
366*6777b538SAndroid Build Coastguard Worker base::StringPrintf("Cookie_%d=1; Path=/", cookie_num));
367*6777b538SAndroid Build Coastguard Worker AddCookieToList(gurl, cookie_line,
368*6777b538SAndroid Build Coastguard Worker base::Time::FromInternalValue(time_tick++),
369*6777b538SAndroid Build Coastguard Worker &initial_cookies);
370*6777b538SAndroid Build Coastguard Worker }
371*6777b538SAndroid Build Coastguard Worker }
372*6777b538SAndroid Build Coastguard Worker
373*6777b538SAndroid Build Coastguard Worker store->SetLoadExpectation(true, std::move(initial_cookies));
374*6777b538SAndroid Build Coastguard Worker
375*6777b538SAndroid Build Coastguard Worker auto cm = std::make_unique<CookieMonster>(store.get(), nullptr);
376*6777b538SAndroid Build Coastguard Worker
377*6777b538SAndroid Build Coastguard Worker // Import will happen on first access.
378*6777b538SAndroid Build Coastguard Worker GURL gurl("www.foo.com");
379*6777b538SAndroid Build Coastguard Worker CookieOptions options;
380*6777b538SAndroid Build Coastguard Worker auto reporter = SetUpCookieMonsterReporter("from_store");
381*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer import_timer;
382*6777b538SAndroid Build Coastguard Worker getCookieListCallback.GetCookieList(cm.get(), gurl);
383*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricImportTimeMs,
384*6777b538SAndroid Build Coastguard Worker import_timer.Elapsed().InMillisecondsF());
385*6777b538SAndroid Build Coastguard Worker
386*6777b538SAndroid Build Coastguard Worker // Just confirm keys were set as expected.
387*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("domain_1.com", cm->GetKey("www.Domain_1.com"));
388*6777b538SAndroid Build Coastguard Worker }
389*6777b538SAndroid Build Coastguard Worker
TEST_F(CookieMonsterTest,TestGetKey)390*6777b538SAndroid Build Coastguard Worker TEST_F(CookieMonsterTest, TestGetKey) {
391*6777b538SAndroid Build Coastguard Worker auto cm = std::make_unique<CookieMonster>(nullptr, nullptr);
392*6777b538SAndroid Build Coastguard Worker auto reporter = SetUpCookieMonsterReporter("baseline_story");
393*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer get_key_timer;
394*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kNumCookies; i++)
395*6777b538SAndroid Build Coastguard Worker cm->GetKey("www.foo.com");
396*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricGetKeyTimeMs,
397*6777b538SAndroid Build Coastguard Worker get_key_timer.Elapsed().InMillisecondsF());
398*6777b538SAndroid Build Coastguard Worker }
399*6777b538SAndroid Build Coastguard Worker
400*6777b538SAndroid Build Coastguard Worker // This test is probing for whether garbage collection happens when it
401*6777b538SAndroid Build Coastguard Worker // shouldn't. This will not in general be visible functionally, since
402*6777b538SAndroid Build Coastguard Worker // if GC runs twice in a row without any change to the store, the second
403*6777b538SAndroid Build Coastguard Worker // GC run will not do anything the first one didn't. That's why this is
404*6777b538SAndroid Build Coastguard Worker // a performance test. The test should be considered to pass if all the
405*6777b538SAndroid Build Coastguard Worker // times reported are approximately the same--this indicates that no GC
406*6777b538SAndroid Build Coastguard Worker // happened repeatedly for any case.
TEST_F(CookieMonsterTest,TestGCTimes)407*6777b538SAndroid Build Coastguard Worker TEST_F(CookieMonsterTest, TestGCTimes) {
408*6777b538SAndroid Build Coastguard Worker SetCookieCallback setCookieCallback;
409*6777b538SAndroid Build Coastguard Worker
410*6777b538SAndroid Build Coastguard Worker const struct TestCase {
411*6777b538SAndroid Build Coastguard Worker const char* const name;
412*6777b538SAndroid Build Coastguard Worker size_t num_cookies;
413*6777b538SAndroid Build Coastguard Worker size_t num_old_cookies;
414*6777b538SAndroid Build Coastguard Worker } test_cases[] = {
415*6777b538SAndroid Build Coastguard Worker {
416*6777b538SAndroid Build Coastguard Worker // A whole lot of recent cookies; gc shouldn't happen.
417*6777b538SAndroid Build Coastguard Worker "all_recent",
418*6777b538SAndroid Build Coastguard Worker CookieMonster::kMaxCookies * 2,
419*6777b538SAndroid Build Coastguard Worker 0,
420*6777b538SAndroid Build Coastguard Worker },
421*6777b538SAndroid Build Coastguard Worker {
422*6777b538SAndroid Build Coastguard Worker // Some old cookies, but still overflowing max.
423*6777b538SAndroid Build Coastguard Worker "mostly_recent",
424*6777b538SAndroid Build Coastguard Worker CookieMonster::kMaxCookies * 2,
425*6777b538SAndroid Build Coastguard Worker CookieMonster::kMaxCookies / 2,
426*6777b538SAndroid Build Coastguard Worker },
427*6777b538SAndroid Build Coastguard Worker {
428*6777b538SAndroid Build Coastguard Worker // Old cookies enough to bring us right down to our purge line.
429*6777b538SAndroid Build Coastguard Worker "balanced",
430*6777b538SAndroid Build Coastguard Worker CookieMonster::kMaxCookies * 2,
431*6777b538SAndroid Build Coastguard Worker CookieMonster::kMaxCookies + CookieMonster::kPurgeCookies + 1,
432*6777b538SAndroid Build Coastguard Worker },
433*6777b538SAndroid Build Coastguard Worker {
434*6777b538SAndroid Build Coastguard Worker "mostly_old",
435*6777b538SAndroid Build Coastguard Worker // Old cookies enough to bring below our purge line (which we
436*6777b538SAndroid Build Coastguard Worker // shouldn't do).
437*6777b538SAndroid Build Coastguard Worker CookieMonster::kMaxCookies * 2,
438*6777b538SAndroid Build Coastguard Worker CookieMonster::kMaxCookies * 3 / 4,
439*6777b538SAndroid Build Coastguard Worker },
440*6777b538SAndroid Build Coastguard Worker {
441*6777b538SAndroid Build Coastguard Worker "less_than_gc_thresh",
442*6777b538SAndroid Build Coastguard Worker // Few enough cookies that gc shouldn't happen at all.
443*6777b538SAndroid Build Coastguard Worker CookieMonster::kMaxCookies - 5,
444*6777b538SAndroid Build Coastguard Worker 0,
445*6777b538SAndroid Build Coastguard Worker },
446*6777b538SAndroid Build Coastguard Worker };
447*6777b538SAndroid Build Coastguard Worker for (const auto& test_case : test_cases) {
448*6777b538SAndroid Build Coastguard Worker std::unique_ptr<CookieMonster> cm = CreateMonsterFromStoreForGC(
449*6777b538SAndroid Build Coastguard Worker test_case.num_cookies, test_case.num_old_cookies, 0, 0,
450*6777b538SAndroid Build Coastguard Worker CookieMonster::kSafeFromGlobalPurgeDays * 2);
451*6777b538SAndroid Build Coastguard Worker
452*6777b538SAndroid Build Coastguard Worker GURL gurl("https://foo.com");
453*6777b538SAndroid Build Coastguard Worker std::string cookie_line("z=3; samesite=none; secure");
454*6777b538SAndroid Build Coastguard Worker // Trigger the Garbage collection we're allowed.
455*6777b538SAndroid Build Coastguard Worker setCookieCallback.SetCookie(cm.get(), gurl, cookie_line);
456*6777b538SAndroid Build Coastguard Worker
457*6777b538SAndroid Build Coastguard Worker auto reporter = SetUpCookieMonsterReporter(test_case.name);
458*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer gc_timer;
459*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kNumCookies; i++)
460*6777b538SAndroid Build Coastguard Worker setCookieCallback.SetCookie(cm.get(), gurl, cookie_line);
461*6777b538SAndroid Build Coastguard Worker reporter.AddResult(kMetricGCTimeMs, gc_timer.Elapsed().InMillisecondsF());
462*6777b538SAndroid Build Coastguard Worker }
463*6777b538SAndroid Build Coastguard Worker }
464*6777b538SAndroid Build Coastguard Worker
465*6777b538SAndroid Build Coastguard Worker } // namespace net
466