| 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 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 // Note that the performance tests currently all operate on a loaded cookie | 45 // Note that the performance tests currently all operate on a loaded cookie |
| 46 // store (or, more precisely, one that has no backing persistent store). | 46 // store (or, more precisely, one that has no backing persistent store). |
| 47 // Therefore, callbacks will actually always complete synchronously. If the | 47 // Therefore, callbacks will actually always complete synchronously. If the |
| 48 // tests get more advanced we need to add other means of signaling | 48 // tests get more advanced we need to add other means of signaling |
| 49 // completion. | 49 // completion. |
| 50 base::MessageLoop::current()->RunUntilIdle(); | 50 base::MessageLoop::current()->RunUntilIdle(); |
| 51 EXPECT_TRUE(has_run_); | 51 EXPECT_TRUE(has_run_); |
| 52 has_run_ = false; | 52 has_run_ = false; |
| 53 } | 53 } |
| 54 | 54 |
| 55 void Run() { | 55 void Run() { has_run_ = true; } |
| 56 has_run_ = true; | |
| 57 } | |
| 58 | 56 |
| 59 bool has_run_; | 57 bool has_run_; |
| 60 }; | 58 }; |
| 61 | 59 |
| 62 class SetCookieCallback : public BaseCallback { | 60 class SetCookieCallback : public BaseCallback { |
| 63 public: | 61 public: |
| 64 void SetCookie( | 62 void SetCookie(CookieMonster* cm, |
| 65 CookieMonster* cm, const GURL& gurl, const std::string& cookie) { | 63 const GURL& gurl, |
| 66 cm->SetCookieWithOptionsAsync(gurl, cookie, options_, base::Bind( | 64 const std::string& cookie) { |
| 67 &SetCookieCallback::Run, base::Unretained(this))); | 65 cm->SetCookieWithOptionsAsync( |
| 66 gurl, cookie, options_, |
| 67 base::Bind(&SetCookieCallback::Run, base::Unretained(this))); |
| 68 WaitForCallback(); | 68 WaitForCallback(); |
| 69 } | 69 } |
| 70 |
| 70 private: | 71 private: |
| 71 void Run(bool success) { | 72 void Run(bool success) { |
| 72 EXPECT_TRUE(success); | 73 EXPECT_TRUE(success); |
| 73 BaseCallback::Run(); | 74 BaseCallback::Run(); |
| 74 } | 75 } |
| 75 net::CookieOptions options_; | 76 net::CookieOptions options_; |
| 76 }; | 77 }; |
| 77 | 78 |
| 78 class GetCookiesCallback : public BaseCallback { | 79 class GetCookiesCallback : public BaseCallback { |
| 79 public: | 80 public: |
| 80 const std::string& GetCookies(CookieMonster* cm, const GURL& gurl) { | 81 const std::string& GetCookies(CookieMonster* cm, const GURL& gurl) { |
| 81 cm->GetCookiesWithOptionsAsync(gurl, options_, base::Bind( | 82 cm->GetCookiesWithOptionsAsync( |
| 82 &GetCookiesCallback::Run, base::Unretained(this))); | 83 gurl, options_, |
| 84 base::Bind(&GetCookiesCallback::Run, base::Unretained(this))); |
| 83 WaitForCallback(); | 85 WaitForCallback(); |
| 84 return cookies_; | 86 return cookies_; |
| 85 } | 87 } |
| 86 | 88 |
| 87 private: | 89 private: |
| 88 void Run(const std::string& cookies) { | 90 void Run(const std::string& cookies) { |
| 89 cookies_ = cookies; | 91 cookies_ = cookies; |
| 90 BaseCallback::Run(); | 92 BaseCallback::Run(); |
| 91 } | 93 } |
| 92 std::string cookies_; | 94 std::string cookies_; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 std::string cookie(kCookieLine); | 156 std::string cookie(kCookieLine); |
| 155 std::vector<GURL> gurls; // just wanna have ffffuunnn | 157 std::vector<GURL> gurls; // just wanna have ffffuunnn |
| 156 for (int i = 0; i < kNumCookies; ++i) { | 158 for (int i = 0; i < kNumCookies; ++i) { |
| 157 gurls.push_back(GURL(base::StringPrintf("https://a%04d.izzle", i))); | 159 gurls.push_back(GURL(base::StringPrintf("https://a%04d.izzle", i))); |
| 158 } | 160 } |
| 159 | 161 |
| 160 SetCookieCallback setCookieCallback; | 162 SetCookieCallback setCookieCallback; |
| 161 | 163 |
| 162 // Add a cookie on a bunch of host | 164 // Add a cookie on a bunch of host |
| 163 base::PerfTimeLogger timer("Cookie_monster_add_many_hosts"); | 165 base::PerfTimeLogger timer("Cookie_monster_add_many_hosts"); |
| 164 for (std::vector<GURL>::const_iterator it = gurls.begin(); | 166 for (std::vector<GURL>::const_iterator it = gurls.begin(); it != gurls.end(); |
| 165 it != gurls.end(); ++it) { | 167 ++it) { |
| 166 setCookieCallback.SetCookie(cm.get(), *it, cookie); | 168 setCookieCallback.SetCookie(cm.get(), *it, cookie); |
| 167 } | 169 } |
| 168 timer.Done(); | 170 timer.Done(); |
| 169 | 171 |
| 170 GetCookiesCallback getCookiesCallback; | 172 GetCookiesCallback getCookiesCallback; |
| 171 | 173 |
| 172 base::PerfTimeLogger timer2("Cookie_monster_query_many_hosts"); | 174 base::PerfTimeLogger timer2("Cookie_monster_query_many_hosts"); |
| 173 for (std::vector<GURL>::const_iterator it = gurls.begin(); | 175 for (std::vector<GURL>::const_iterator it = gurls.begin(); it != gurls.end(); |
| 174 it != gurls.end(); ++it) { | 176 ++it) { |
| 175 getCookiesCallback.GetCookies(cm.get(), *it); | 177 getCookiesCallback.GetCookies(cm.get(), *it); |
| 176 } | 178 } |
| 177 timer2.Done(); | 179 timer2.Done(); |
| 178 | 180 |
| 179 base::PerfTimeLogger timer3("Cookie_monster_deleteall_many_hosts"); | 181 base::PerfTimeLogger timer3("Cookie_monster_deleteall_many_hosts"); |
| 180 cm->DeleteAllAsync(CookieMonster::DeleteCallback()); | 182 cm->DeleteAllAsync(CookieMonster::DeleteCallback()); |
| 181 base::MessageLoop::current()->RunUntilIdle(); | 183 base::MessageLoop::current()->RunUntilIdle(); |
| 182 timer3.Done(); | 184 timer3.Done(); |
| 183 } | 185 } |
| 184 | 186 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 207 domain_list.push_back(domain_base_3); | 209 domain_list.push_back(domain_base_3); |
| 208 for (int i4 = 0; i4 < 2; i4++) { | 210 for (int i4 = 0; i4 < 2; i4++) { |
| 209 std::string domain_base_4((i4 ? "a." : "b.") + domain_base_3); | 211 std::string domain_base_4((i4 ? "a." : "b.") + domain_base_3); |
| 210 EXPECT_EQ("top.com", cm->GetKey(domain_base_4)); | 212 EXPECT_EQ("top.com", cm->GetKey(domain_base_4)); |
| 211 domain_list.push_back(domain_base_4); | 213 domain_list.push_back(domain_base_4); |
| 212 } | 214 } |
| 213 } | 215 } |
| 214 } | 216 } |
| 215 } | 217 } |
| 216 | 218 |
| 217 | |
| 218 EXPECT_EQ(31u, domain_list.size()); | 219 EXPECT_EQ(31u, domain_list.size()); |
| 219 for (std::vector<std::string>::const_iterator it = domain_list.begin(); | 220 for (std::vector<std::string>::const_iterator it = domain_list.begin(); |
| 220 it != domain_list.end(); it++) { | 221 it != domain_list.end(); it++) { |
| 221 GURL gurl("https://" + *it + "/"); | 222 GURL gurl("https://" + *it + "/"); |
| 222 const std::string cookie = base::StringPrintf(domain_cookie_format_tree, | 223 const std::string cookie = |
| 223 it->c_str()); | 224 base::StringPrintf(domain_cookie_format_tree, it->c_str()); |
| 224 setCookieCallback.SetCookie(cm.get(), gurl, cookie); | 225 setCookieCallback.SetCookie(cm.get(), gurl, cookie); |
| 225 } | 226 } |
| 226 EXPECT_EQ(31u, cm->GetAllCookies().size()); | 227 EXPECT_EQ(31u, cm->GetAllCookies().size()); |
| 227 | 228 |
| 228 GURL probe_gurl("https://b.a.b.a.top.com/"); | 229 GURL probe_gurl("https://b.a.b.a.top.com/"); |
| 229 std::string cookie_line = getCookiesCallback.GetCookies(cm.get(), probe_gurl); | 230 std::string cookie_line = getCookiesCallback.GetCookies(cm.get(), probe_gurl); |
| 230 EXPECT_EQ(5, CountInString(cookie_line, '=')) | 231 EXPECT_EQ(5, CountInString(cookie_line, '=')) |
| 231 << "Cookie line: " << cookie_line; | 232 << "Cookie line: " << cookie_line; |
| 232 base::PerfTimeLogger timer("Cookie_monster_query_domain_tree"); | 233 base::PerfTimeLogger timer("Cookie_monster_query_domain_tree"); |
| 233 for (int i = 0; i < kNumCookies; i++) { | 234 for (int i = 0; i < kNumCookies; i++) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 254 domain_list.push_back("b.a.top.com"); | 255 domain_list.push_back("b.a.top.com"); |
| 255 domain_list.push_back("a.b.a.top.com"); | 256 domain_list.push_back("a.b.a.top.com"); |
| 256 domain_list.push_back("b.a.b.a.top.com"); | 257 domain_list.push_back("b.a.b.a.top.com"); |
| 257 EXPECT_EQ(4u, domain_list.size()); | 258 EXPECT_EQ(4u, domain_list.size()); |
| 258 | 259 |
| 259 const char domain_cookie_format_line[] = "a%03d=b; domain=%s"; | 260 const char domain_cookie_format_line[] = "a%03d=b; domain=%s"; |
| 260 for (int i = 0; i < 8; i++) { | 261 for (int i = 0; i < 8; i++) { |
| 261 for (std::vector<std::string>::const_iterator it = domain_list.begin(); | 262 for (std::vector<std::string>::const_iterator it = domain_list.begin(); |
| 262 it != domain_list.end(); it++) { | 263 it != domain_list.end(); it++) { |
| 263 GURL gurl("https://" + *it + "/"); | 264 GURL gurl("https://" + *it + "/"); |
| 264 const std::string cookie = base::StringPrintf(domain_cookie_format_line, | 265 const std::string cookie = |
| 265 i, it->c_str()); | 266 base::StringPrintf(domain_cookie_format_line, i, it->c_str()); |
| 266 setCookieCallback.SetCookie(cm.get(), gurl, cookie); | 267 setCookieCallback.SetCookie(cm.get(), gurl, cookie); |
| 267 } | 268 } |
| 268 } | 269 } |
| 269 | 270 |
| 270 cookie_line = getCookiesCallback.GetCookies(cm.get(), probe_gurl); | 271 cookie_line = getCookiesCallback.GetCookies(cm.get(), probe_gurl); |
| 271 EXPECT_EQ(32, CountInString(cookie_line, '=')); | 272 EXPECT_EQ(32, CountInString(cookie_line, '=')); |
| 272 base::PerfTimeLogger timer2("Cookie_monster_query_domain_line"); | 273 base::PerfTimeLogger timer2("Cookie_monster_query_domain_line"); |
| 273 for (int i = 0; i < kNumCookies; i++) { | 274 for (int i = 0; i < kNumCookies; i++) { |
| 274 getCookiesCallback.GetCookies(cm.get(), probe_gurl); | 275 getCookiesCallback.GetCookies(cm.get(), probe_gurl); |
| 275 } | 276 } |
| 276 timer2.Done(); | 277 timer2.Done(); |
| 277 } | 278 } |
| 278 | 279 |
| 279 TEST_F(CookieMonsterTest, TestImport) { | 280 TEST_F(CookieMonsterTest, TestImport) { |
| 280 scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore); | 281 scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore); |
| 281 std::vector<CanonicalCookie*> initial_cookies; | 282 std::vector<CanonicalCookie*> initial_cookies; |
| 282 GetCookiesCallback getCookiesCallback; | 283 GetCookiesCallback getCookiesCallback; |
| 283 | 284 |
| 284 // We want to setup a fairly large backing store, with 300 domains of 50 | 285 // We want to setup a fairly large backing store, with 300 domains of 50 |
| 285 // cookies each. Creation times must be unique. | 286 // cookies each. Creation times must be unique. |
| 286 int64 time_tick(base::Time::Now().ToInternalValue()); | 287 int64 time_tick(base::Time::Now().ToInternalValue()); |
| 287 | 288 |
| 288 for (int domain_num = 0; domain_num < 300; domain_num++) { | 289 for (int domain_num = 0; domain_num < 300; domain_num++) { |
| 289 std::string domain_name(base::StringPrintf(".Domain_%d.com", domain_num)); | 290 std::string domain_name(base::StringPrintf(".Domain_%d.com", domain_num)); |
| 290 std::string gurl("www" + domain_name); | 291 std::string gurl("www" + domain_name); |
| 291 for (int cookie_num = 0; cookie_num < 50; cookie_num++) { | 292 for (int cookie_num = 0; cookie_num < 50; cookie_num++) { |
| 292 std::string cookie_line(base::StringPrintf("Cookie_%d=1; Path=/", | 293 std::string cookie_line( |
| 293 cookie_num)); | 294 base::StringPrintf("Cookie_%d=1; Path=/", cookie_num)); |
| 294 AddCookieToList(gurl, cookie_line, | 295 AddCookieToList(gurl, cookie_line, |
| 295 base::Time::FromInternalValue(time_tick++), | 296 base::Time::FromInternalValue(time_tick++), |
| 296 &initial_cookies); | 297 &initial_cookies); |
| 297 } | 298 } |
| 298 } | 299 } |
| 299 | 300 |
| 300 store->SetLoadExpectation(true, initial_cookies); | 301 store->SetLoadExpectation(true, initial_cookies); |
| 301 | 302 |
| 302 scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL)); | 303 scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL)); |
| 303 | 304 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 328 // times reported are approximately the same--this indicates that no GC | 329 // times reported are approximately the same--this indicates that no GC |
| 329 // happened repeatedly for any case. | 330 // happened repeatedly for any case. |
| 330 TEST_F(CookieMonsterTest, TestGCTimes) { | 331 TEST_F(CookieMonsterTest, TestGCTimes) { |
| 331 SetCookieCallback setCookieCallback; | 332 SetCookieCallback setCookieCallback; |
| 332 | 333 |
| 333 const struct TestCase { | 334 const struct TestCase { |
| 334 const char* const name; | 335 const char* const name; |
| 335 size_t num_cookies; | 336 size_t num_cookies; |
| 336 size_t num_old_cookies; | 337 size_t num_old_cookies; |
| 337 } test_cases[] = { | 338 } test_cases[] = { |
| 338 { | 339 { |
| 339 // A whole lot of recent cookies; gc shouldn't happen. | 340 // A whole lot of recent cookies; gc shouldn't happen. |
| 340 "all_recent", | 341 "all_recent", |
| 341 CookieMonster::kMaxCookies * 2, | 342 CookieMonster::kMaxCookies * 2, |
| 342 0, | 343 0, |
| 343 }, { | 344 }, |
| 344 // Some old cookies, but still overflowing max. | 345 { |
| 345 "mostly_recent", | 346 // Some old cookies, but still overflowing max. |
| 346 CookieMonster::kMaxCookies * 2, | 347 "mostly_recent", |
| 347 CookieMonster::kMaxCookies / 2, | 348 CookieMonster::kMaxCookies * 2, |
| 348 }, { | 349 CookieMonster::kMaxCookies / 2, |
| 349 // Old cookies enough to bring us right down to our purge line. | 350 }, |
| 350 "balanced", | 351 { |
| 351 CookieMonster::kMaxCookies * 2, | 352 // Old cookies enough to bring us right down to our purge line. |
| 352 CookieMonster::kMaxCookies + CookieMonster::kPurgeCookies + 1, | 353 "balanced", |
| 353 }, { | 354 CookieMonster::kMaxCookies * 2, |
| 354 "mostly_old", | 355 CookieMonster::kMaxCookies + CookieMonster::kPurgeCookies + 1, |
| 355 // Old cookies enough to bring below our purge line (which we | 356 }, |
| 356 // shouldn't do). | 357 { |
| 357 CookieMonster::kMaxCookies * 2, | 358 "mostly_old", |
| 358 CookieMonster::kMaxCookies * 3 / 4, | 359 // Old cookies enough to bring below our purge line (which we |
| 359 }, { | 360 // shouldn't do). |
| 360 "less_than_gc_thresh", | 361 CookieMonster::kMaxCookies * 2, |
| 361 // Few enough cookies that gc shouldn't happen at all. | 362 CookieMonster::kMaxCookies * 3 / 4, |
| 362 CookieMonster::kMaxCookies - 5, | 363 }, |
| 363 0, | 364 { |
| 364 }, | 365 "less_than_gc_thresh", |
| 366 // Few enough cookies that gc shouldn't happen at all. |
| 367 CookieMonster::kMaxCookies - 5, |
| 368 0, |
| 369 }, |
| 365 }; | 370 }; |
| 366 for (int ci = 0; ci < static_cast<int>(arraysize(test_cases)); ++ci) { | 371 for (int ci = 0; ci < static_cast<int>(arraysize(test_cases)); ++ci) { |
| 367 const TestCase& test_case(test_cases[ci]); | 372 const TestCase& test_case(test_cases[ci]); |
| 368 scoped_refptr<CookieMonster> cm( | 373 scoped_refptr<CookieMonster> cm(CreateMonsterFromStoreForGC( |
| 369 CreateMonsterFromStoreForGC( | 374 test_case.num_cookies, test_case.num_old_cookies, |
| 370 test_case.num_cookies, test_case.num_old_cookies, | 375 CookieMonster::kSafeFromGlobalPurgeDays * 2)); |
| 371 CookieMonster::kSafeFromGlobalPurgeDays * 2)); | |
| 372 | 376 |
| 373 GURL gurl("http://google.com"); | 377 GURL gurl("http://google.com"); |
| 374 std::string cookie_line("z=3"); | 378 std::string cookie_line("z=3"); |
| 375 // Trigger the Garbage collection we're allowed. | 379 // Trigger the Garbage collection we're allowed. |
| 376 setCookieCallback.SetCookie(cm.get(), gurl, cookie_line); | 380 setCookieCallback.SetCookie(cm.get(), gurl, cookie_line); |
| 377 | 381 |
| 378 base::PerfTimeLogger timer((std::string("GC_") + test_case.name).c_str()); | 382 base::PerfTimeLogger timer((std::string("GC_") + test_case.name).c_str()); |
| 379 for (int i = 0; i < kNumCookies; i++) | 383 for (int i = 0; i < kNumCookies; i++) |
| 380 setCookieCallback.SetCookie(cm.get(), gurl, cookie_line); | 384 setCookieCallback.SetCookie(cm.get(), gurl, cookie_line); |
| 381 timer.Done(); | 385 timer.Done(); |
| 382 } | 386 } |
| 383 } | 387 } |
| 384 | 388 |
| 385 } // namespace net | 389 } // namespace net |
| OLD | NEW |