| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 #include <memory> |
| 6 | 7 |
| 7 #include "base/bind.h" | 8 #include "base/bind.h" |
| 8 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| 11 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
| 13 #include "base/test/perf_time_logger.h" | 13 #include "base/test/perf_time_logger.h" |
| 14 #include "net/cookies/canonical_cookie.h" | 14 #include "net/cookies/canonical_cookie.h" |
| 15 #include "net/cookies/cookie_monster.h" | 15 #include "net/cookies/cookie_monster.h" |
| 16 #include "net/cookies/cookie_monster_store_test.h" | 16 #include "net/cookies/cookie_monster_store_test.h" |
| 17 #include "net/cookies/parsed_cookie.h" | 17 #include "net/cookies/parsed_cookie.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 19 #include "url/gurl.h" | 19 #include "url/gurl.h" |
| 20 | 20 |
| 21 namespace net { | 21 namespace net { |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 const int kNumCookies = 20000; | 25 const int kNumCookies = 20000; |
| 26 const char kCookieLine[] = "A = \"b=;\\\"\" ;secure;;;"; | 26 const char kCookieLine[] = "A = \"b=;\\\"\" ;secure;;;"; |
| 27 const char kGoogleURL[] = "http://www.google.izzle"; | 27 const char kGoogleURL[] = "http://www.google.izzle"; |
| 28 | 28 |
| 29 int CountInString(const std::string& str, char c) { | 29 int CountInString(const std::string& str, char c) { |
| 30 return std::count(str.begin(), str.end(), c); | 30 return std::count(str.begin(), str.end(), c); |
| 31 } | 31 } |
| 32 | 32 |
| 33 class CookieMonsterTest : public testing::Test { | 33 class CookieMonsterTest : public testing::Test { |
| 34 public: | 34 public: |
| 35 CookieMonsterTest() : message_loop_(new base::MessageLoopForIO()) {} | 35 CookieMonsterTest() : message_loop_(new base::MessageLoopForIO()) {} |
| 36 | 36 |
| 37 private: | 37 private: |
| 38 scoped_ptr<base::MessageLoop> message_loop_; | 38 std::unique_ptr<base::MessageLoop> message_loop_; |
| 39 }; | 39 }; |
| 40 | 40 |
| 41 class BaseCallback { | 41 class BaseCallback { |
| 42 public: | 42 public: |
| 43 BaseCallback() : has_run_(false) {} | 43 BaseCallback() : has_run_(false) {} |
| 44 | 44 |
| 45 protected: | 45 protected: |
| 46 void WaitForCallback() { | 46 void WaitForCallback() { |
| 47 // Note that the performance tests currently all operate on a loaded cookie | 47 // Note that the performance tests currently all operate on a loaded cookie |
| 48 // store (or, more precisely, one that has no backing persistent store). | 48 // store (or, more precisely, one that has no backing persistent store). |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 cookie += kCookieLine; | 114 cookie += kCookieLine; |
| 115 base::PerfTimeLogger timer("Parsed_cookie_parse_big_cookies"); | 115 base::PerfTimeLogger timer("Parsed_cookie_parse_big_cookies"); |
| 116 for (int i = 0; i < kNumCookies; ++i) { | 116 for (int i = 0; i < kNumCookies; ++i) { |
| 117 ParsedCookie pc(cookie); | 117 ParsedCookie pc(cookie); |
| 118 EXPECT_TRUE(pc.IsValid()); | 118 EXPECT_TRUE(pc.IsValid()); |
| 119 } | 119 } |
| 120 timer.Done(); | 120 timer.Done(); |
| 121 } | 121 } |
| 122 | 122 |
| 123 TEST_F(CookieMonsterTest, TestAddCookiesOnSingleHost) { | 123 TEST_F(CookieMonsterTest, TestAddCookiesOnSingleHost) { |
| 124 scoped_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); | 124 std::unique_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); |
| 125 std::vector<std::string> cookies; | 125 std::vector<std::string> cookies; |
| 126 for (int i = 0; i < kNumCookies; i++) { | 126 for (int i = 0; i < kNumCookies; i++) { |
| 127 cookies.push_back(base::StringPrintf("a%03d=b", i)); | 127 cookies.push_back(base::StringPrintf("a%03d=b", i)); |
| 128 } | 128 } |
| 129 | 129 |
| 130 SetCookieCallback setCookieCallback; | 130 SetCookieCallback setCookieCallback; |
| 131 | 131 |
| 132 // Add a bunch of cookies on a single host | 132 // Add a bunch of cookies on a single host |
| 133 base::PerfTimeLogger timer("Cookie_monster_add_single_host"); | 133 base::PerfTimeLogger timer("Cookie_monster_add_single_host"); |
| 134 | 134 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 147 } | 147 } |
| 148 timer2.Done(); | 148 timer2.Done(); |
| 149 | 149 |
| 150 base::PerfTimeLogger timer3("Cookie_monster_deleteall_single_host"); | 150 base::PerfTimeLogger timer3("Cookie_monster_deleteall_single_host"); |
| 151 cm->DeleteAllAsync(CookieMonster::DeleteCallback()); | 151 cm->DeleteAllAsync(CookieMonster::DeleteCallback()); |
| 152 base::MessageLoop::current()->RunUntilIdle(); | 152 base::MessageLoop::current()->RunUntilIdle(); |
| 153 timer3.Done(); | 153 timer3.Done(); |
| 154 } | 154 } |
| 155 | 155 |
| 156 TEST_F(CookieMonsterTest, TestAddCookieOnManyHosts) { | 156 TEST_F(CookieMonsterTest, TestAddCookieOnManyHosts) { |
| 157 scoped_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); | 157 std::unique_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); |
| 158 std::string cookie(kCookieLine); | 158 std::string cookie(kCookieLine); |
| 159 std::vector<GURL> gurls; // just wanna have ffffuunnn | 159 std::vector<GURL> gurls; // just wanna have ffffuunnn |
| 160 for (int i = 0; i < kNumCookies; ++i) { | 160 for (int i = 0; i < kNumCookies; ++i) { |
| 161 gurls.push_back(GURL(base::StringPrintf("https://a%04d.izzle", i))); | 161 gurls.push_back(GURL(base::StringPrintf("https://a%04d.izzle", i))); |
| 162 } | 162 } |
| 163 | 163 |
| 164 SetCookieCallback setCookieCallback; | 164 SetCookieCallback setCookieCallback; |
| 165 | 165 |
| 166 // Add a cookie on a bunch of host | 166 // Add a cookie on a bunch of host |
| 167 base::PerfTimeLogger timer("Cookie_monster_add_many_hosts"); | 167 base::PerfTimeLogger timer("Cookie_monster_add_many_hosts"); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 180 } | 180 } |
| 181 timer2.Done(); | 181 timer2.Done(); |
| 182 | 182 |
| 183 base::PerfTimeLogger timer3("Cookie_monster_deleteall_many_hosts"); | 183 base::PerfTimeLogger timer3("Cookie_monster_deleteall_many_hosts"); |
| 184 cm->DeleteAllAsync(CookieMonster::DeleteCallback()); | 184 cm->DeleteAllAsync(CookieMonster::DeleteCallback()); |
| 185 base::MessageLoop::current()->RunUntilIdle(); | 185 base::MessageLoop::current()->RunUntilIdle(); |
| 186 timer3.Done(); | 186 timer3.Done(); |
| 187 } | 187 } |
| 188 | 188 |
| 189 TEST_F(CookieMonsterTest, TestDomainTree) { | 189 TEST_F(CookieMonsterTest, TestDomainTree) { |
| 190 scoped_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); | 190 std::unique_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); |
| 191 GetCookiesCallback getCookiesCallback; | 191 GetCookiesCallback getCookiesCallback; |
| 192 SetCookieCallback setCookieCallback; | 192 SetCookieCallback setCookieCallback; |
| 193 const char domain_cookie_format_tree[] = "a=b; domain=%s"; | 193 const char domain_cookie_format_tree[] = "a=b; domain=%s"; |
| 194 const std::string domain_base("top.com"); | 194 const std::string domain_base("top.com"); |
| 195 | 195 |
| 196 std::vector<std::string> domain_list; | 196 std::vector<std::string> domain_list; |
| 197 | 197 |
| 198 // Create a balanced binary tree of domains on which the cookie is set. | 198 // Create a balanced binary tree of domains on which the cookie is set. |
| 199 domain_list.push_back(domain_base); | 199 domain_list.push_back(domain_base); |
| 200 for (int i1 = 0; i1 < 2; i1++) { | 200 for (int i1 = 0; i1 < 2; i1++) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 EXPECT_EQ(5, CountInString(cookie_line, '=')) | 233 EXPECT_EQ(5, CountInString(cookie_line, '=')) |
| 234 << "Cookie line: " << cookie_line; | 234 << "Cookie line: " << cookie_line; |
| 235 base::PerfTimeLogger timer("Cookie_monster_query_domain_tree"); | 235 base::PerfTimeLogger timer("Cookie_monster_query_domain_tree"); |
| 236 for (int i = 0; i < kNumCookies; i++) { | 236 for (int i = 0; i < kNumCookies; i++) { |
| 237 getCookiesCallback.GetCookies(cm.get(), probe_gurl); | 237 getCookiesCallback.GetCookies(cm.get(), probe_gurl); |
| 238 } | 238 } |
| 239 timer.Done(); | 239 timer.Done(); |
| 240 } | 240 } |
| 241 | 241 |
| 242 TEST_F(CookieMonsterTest, TestDomainLine) { | 242 TEST_F(CookieMonsterTest, TestDomainLine) { |
| 243 scoped_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); | 243 std::unique_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); |
| 244 SetCookieCallback setCookieCallback; | 244 SetCookieCallback setCookieCallback; |
| 245 GetCookiesCallback getCookiesCallback; | 245 GetCookiesCallback getCookiesCallback; |
| 246 std::vector<std::string> domain_list; | 246 std::vector<std::string> domain_list; |
| 247 GURL probe_gurl("https://b.a.b.a.top.com/"); | 247 GURL probe_gurl("https://b.a.b.a.top.com/"); |
| 248 std::string cookie_line; | 248 std::string cookie_line; |
| 249 | 249 |
| 250 // Create a line of 32 domain cookies such that all cookies stored | 250 // Create a line of 32 domain cookies such that all cookies stored |
| 251 // by effective TLD+1 will apply to probe GURL. | 251 // by effective TLD+1 will apply to probe GURL. |
| 252 // (TLD + 1 is the level above .com/org/net/etc, e.g. "top.com" | 252 // (TLD + 1 is the level above .com/org/net/etc, e.g. "top.com" |
| 253 // or "google.com". "Effective" is added to include sites like | 253 // or "google.com". "Effective" is added to include sites like |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 std::string cookie_line( | 294 std::string cookie_line( |
| 295 base::StringPrintf("Cookie_%d=1; Path=/", cookie_num)); | 295 base::StringPrintf("Cookie_%d=1; Path=/", cookie_num)); |
| 296 AddCookieToList(gurl, cookie_line, | 296 AddCookieToList(gurl, cookie_line, |
| 297 base::Time::FromInternalValue(time_tick++), | 297 base::Time::FromInternalValue(time_tick++), |
| 298 &initial_cookies); | 298 &initial_cookies); |
| 299 } | 299 } |
| 300 } | 300 } |
| 301 | 301 |
| 302 store->SetLoadExpectation(true, initial_cookies); | 302 store->SetLoadExpectation(true, initial_cookies); |
| 303 | 303 |
| 304 scoped_ptr<CookieMonster> cm(new CookieMonster(store.get(), nullptr)); | 304 std::unique_ptr<CookieMonster> cm(new CookieMonster(store.get(), nullptr)); |
| 305 | 305 |
| 306 // Import will happen on first access. | 306 // Import will happen on first access. |
| 307 GURL gurl("www.google.com"); | 307 GURL gurl("www.google.com"); |
| 308 CookieOptions options; | 308 CookieOptions options; |
| 309 base::PerfTimeLogger timer("Cookie_monster_import_from_store"); | 309 base::PerfTimeLogger timer("Cookie_monster_import_from_store"); |
| 310 getCookiesCallback.GetCookies(cm.get(), gurl); | 310 getCookiesCallback.GetCookies(cm.get(), gurl); |
| 311 timer.Done(); | 311 timer.Done(); |
| 312 | 312 |
| 313 // Just confirm keys were set as expected. | 313 // Just confirm keys were set as expected. |
| 314 EXPECT_EQ("domain_1.com", cm->GetKey("www.Domain_1.com")); | 314 EXPECT_EQ("domain_1.com", cm->GetKey("www.Domain_1.com")); |
| 315 } | 315 } |
| 316 | 316 |
| 317 TEST_F(CookieMonsterTest, TestGetKey) { | 317 TEST_F(CookieMonsterTest, TestGetKey) { |
| 318 scoped_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); | 318 std::unique_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr)); |
| 319 base::PerfTimeLogger timer("Cookie_monster_get_key"); | 319 base::PerfTimeLogger timer("Cookie_monster_get_key"); |
| 320 for (int i = 0; i < kNumCookies; i++) | 320 for (int i = 0; i < kNumCookies; i++) |
| 321 cm->GetKey("www.google.com"); | 321 cm->GetKey("www.google.com"); |
| 322 timer.Done(); | 322 timer.Done(); |
| 323 } | 323 } |
| 324 | 324 |
| 325 // This test is probing for whether garbage collection happens when it | 325 // This test is probing for whether garbage collection happens when it |
| 326 // shouldn't. This will not in general be visible functionally, since | 326 // shouldn't. This will not in general be visible functionally, since |
| 327 // if GC runs twice in a row without any change to the store, the second | 327 // if GC runs twice in a row without any change to the store, the second |
| 328 // GC run will not do anything the first one didn't. That's why this is | 328 // GC run will not do anything the first one didn't. That's why this is |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 }, | 364 }, |
| 365 { | 365 { |
| 366 "less_than_gc_thresh", | 366 "less_than_gc_thresh", |
| 367 // Few enough cookies that gc shouldn't happen at all. | 367 // Few enough cookies that gc shouldn't happen at all. |
| 368 CookieMonster::kMaxCookies - 5, | 368 CookieMonster::kMaxCookies - 5, |
| 369 0, | 369 0, |
| 370 }, | 370 }, |
| 371 }; | 371 }; |
| 372 for (int ci = 0; ci < static_cast<int>(arraysize(test_cases)); ++ci) { | 372 for (int ci = 0; ci < static_cast<int>(arraysize(test_cases)); ++ci) { |
| 373 const TestCase& test_case(test_cases[ci]); | 373 const TestCase& test_case(test_cases[ci]); |
| 374 scoped_ptr<CookieMonster> cm = CreateMonsterFromStoreForGC( | 374 std::unique_ptr<CookieMonster> cm = CreateMonsterFromStoreForGC( |
| 375 test_case.num_cookies, test_case.num_old_cookies, 0, 0, | 375 test_case.num_cookies, test_case.num_old_cookies, 0, 0, |
| 376 CookieMonster::kSafeFromGlobalPurgeDays * 2); | 376 CookieMonster::kSafeFromGlobalPurgeDays * 2); |
| 377 | 377 |
| 378 GURL gurl("http://google.com"); | 378 GURL gurl("http://google.com"); |
| 379 std::string cookie_line("z=3"); | 379 std::string cookie_line("z=3"); |
| 380 // Trigger the Garbage collection we're allowed. | 380 // Trigger the Garbage collection we're allowed. |
| 381 setCookieCallback.SetCookie(cm.get(), gurl, cookie_line); | 381 setCookieCallback.SetCookie(cm.get(), gurl, cookie_line); |
| 382 | 382 |
| 383 base::PerfTimeLogger timer((std::string("GC_") + test_case.name).c_str()); | 383 base::PerfTimeLogger timer((std::string("GC_") + test_case.name).c_str()); |
| 384 for (int i = 0; i < kNumCookies; i++) | 384 for (int i = 0; i < kNumCookies; i++) |
| 385 setCookieCallback.SetCookie(cm.get(), gurl, cookie_line); | 385 setCookieCallback.SetCookie(cm.get(), gurl, cookie_line); |
| 386 timer.Done(); | 386 timer.Done(); |
| 387 } | 387 } |
| 388 } | 388 } |
| 389 | 389 |
| 390 } // namespace net | 390 } // namespace net |
| OLD | NEW |