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 "net/cookies/cookie_store_unittest.h" | 5 #include "net/cookies/cookie_store_unittest.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 static const bool filters_schemes = true; | 95 static const bool filters_schemes = true; |
96 static const bool has_path_prefix_bug = false; | 96 static const bool has_path_prefix_bug = false; |
97 static const int creation_time_granularity_in_ms = 0; | 97 static const int creation_time_granularity_in_ms = 0; |
98 static const bool enforce_strict_secure = true; | 98 static const bool enforce_strict_secure = true; |
99 }; | 99 }; |
100 | 100 |
101 INSTANTIATE_TYPED_TEST_CASE_P(CookieMonster, | 101 INSTANTIATE_TYPED_TEST_CASE_P(CookieMonster, |
102 CookieStoreTest, | 102 CookieStoreTest, |
103 CookieMonsterTestTraits); | 103 CookieMonsterTestTraits); |
104 | 104 |
105 INSTANTIATE_TYPED_TEST_CASE_P(CookieMonster, | |
106 MultiThreadedCookieStoreTest, | |
107 CookieMonsterTestTraits); | |
108 | |
109 INSTANTIATE_TYPED_TEST_CASE_P(CookieMonsterStrictSecure, | 105 INSTANTIATE_TYPED_TEST_CASE_P(CookieMonsterStrictSecure, |
110 CookieStoreTest, | 106 CookieStoreTest, |
111 CookieMonsterEnforcingStrictSecure); | 107 CookieMonsterEnforcingStrictSecure); |
112 | 108 |
113 template <typename T> | 109 template <typename T> |
114 class CookieMonsterTestBase : public CookieStoreTest<T> { | 110 class CookieMonsterTestBase : public CookieStoreTest<T> { |
115 public: | 111 public: |
116 using CookieStoreTest<T>::SetCookie; | 112 using CookieStoreTest<T>::SetCookie; |
117 | 113 |
118 protected: | 114 protected: |
(...skipping 2339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2458 EXPECT_EQ(samples1->TotalCount() + 1, samples2->TotalCount()); | 2454 EXPECT_EQ(samples1->TotalCount() + 1, samples2->TotalCount()); |
2459 | 2455 |
2460 // kValidCookieLine creates a session cookie. | 2456 // kValidCookieLine creates a session cookie. |
2461 ASSERT_TRUE(SetCookie(cm.get(), http_www_google_.url(), kValidCookieLine)); | 2457 ASSERT_TRUE(SetCookie(cm.get(), http_www_google_.url(), kValidCookieLine)); |
2462 | 2458 |
2463 scoped_ptr<base::HistogramSamples> samples3( | 2459 scoped_ptr<base::HistogramSamples> samples3( |
2464 expired_histogram->SnapshotSamples()); | 2460 expired_histogram->SnapshotSamples()); |
2465 EXPECT_EQ(samples2->TotalCount(), samples3->TotalCount()); | 2461 EXPECT_EQ(samples2->TotalCount(), samples3->TotalCount()); |
2466 } | 2462 } |
2467 | 2463 |
2468 namespace { | |
2469 | |
2470 class MultiThreadedCookieMonsterTest : public CookieMonsterTest { | |
2471 public: | |
2472 MultiThreadedCookieMonsterTest() : other_thread_("CMTthread") {} | |
2473 | |
2474 // Helper methods for calling the asynchronous CookieMonster methods | |
2475 // from a different thread. | |
2476 | |
2477 void GetAllCookiesTask(CookieMonster* cm, GetCookieListCallback* callback) { | |
2478 cm->GetAllCookiesAsync( | |
2479 base::Bind(&GetCookieListCallback::Run, base::Unretained(callback))); | |
2480 } | |
2481 | |
2482 void GetAllCookiesForURLTask(CookieMonster* cm, | |
2483 const GURL& url, | |
2484 GetCookieListCallback* callback) { | |
2485 cm->GetAllCookiesForURLAsync(url, base::Bind(&GetCookieListCallback::Run, | |
2486 base::Unretained(callback))); | |
2487 } | |
2488 | |
2489 void GetAllCookiesForURLWithOptionsTask(CookieMonster* cm, | |
2490 const GURL& url, | |
2491 const CookieOptions& options, | |
2492 GetCookieListCallback* callback) { | |
2493 cm->GetCookieListWithOptionsAsync( | |
2494 url, options, | |
2495 base::Bind(&GetCookieListCallback::Run, base::Unretained(callback))); | |
2496 } | |
2497 | |
2498 void SetCookieWithDetailsTask(CookieMonster* cm, | |
2499 const GURL& url, | |
2500 ResultSavingCookieCallback<bool>* callback) { | |
2501 // Define the parameters here instead of in the calling fucntion. | |
2502 // The maximum number of parameters for Bind function is 6. | |
2503 std::string name = "A"; | |
2504 std::string value = "B"; | |
2505 std::string domain = std::string(); | |
2506 std::string path = "/foo"; | |
2507 base::Time expiration_time = base::Time(); | |
2508 bool secure = false; | |
2509 bool http_only = false; | |
2510 bool same_site = false; | |
2511 CookiePriority priority = COOKIE_PRIORITY_DEFAULT; | |
2512 cm->SetCookieWithDetailsAsync( | |
2513 url, name, value, domain, path, base::Time(), expiration_time, | |
2514 base::Time(), secure, http_only, same_site, | |
2515 false /* enforces strict secure cookies */, priority, | |
2516 base::Bind(&ResultSavingCookieCallback<bool>::Run, | |
2517 base::Unretained(callback))); | |
2518 } | |
2519 | |
2520 void DeleteAllCreatedBetweenTask(CookieMonster* cm, | |
2521 const base::Time& delete_begin, | |
2522 const base::Time& delete_end, | |
2523 ResultSavingCookieCallback<int>* callback) { | |
2524 cm->DeleteAllCreatedBetweenAsync( | |
2525 delete_begin, delete_end, | |
2526 base::Bind(&ResultSavingCookieCallback<int>::Run, | |
2527 base::Unretained(callback))); | |
2528 } | |
2529 | |
2530 void DeleteAllCreatedBetweenForHostTask( | |
2531 CookieMonster* cm, | |
2532 const base::Time delete_begin, | |
2533 const base::Time delete_end, | |
2534 const GURL& url, | |
2535 ResultSavingCookieCallback<int>* callback) { | |
2536 cm->DeleteAllCreatedBetweenForHostAsync( | |
2537 delete_begin, delete_end, url, | |
2538 base::Bind(&ResultSavingCookieCallback<int>::Run, | |
2539 base::Unretained(callback))); | |
2540 } | |
2541 | |
2542 void DeleteCanonicalCookieTask(CookieMonster* cm, | |
2543 const CanonicalCookie& cookie, | |
2544 ResultSavingCookieCallback<int>* callback) { | |
2545 cm->DeleteCanonicalCookieAsync( | |
2546 cookie, base::Bind(&ResultSavingCookieCallback<int>::Run, | |
2547 base::Unretained(callback))); | |
2548 } | |
2549 | |
2550 protected: | |
2551 void RunOnOtherThread(const base::Closure& task) { | |
2552 other_thread_.Start(); | |
2553 other_thread_.task_runner()->PostTask(FROM_HERE, task); | |
2554 other_thread_.Stop(); | |
2555 } | |
2556 | |
2557 Thread other_thread_; | |
2558 }; | |
2559 | |
2560 } // namespace | |
2561 | |
2562 TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckGetAllCookies) { | |
2563 scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL)); | |
2564 EXPECT_TRUE(SetCookie(cm.get(), http_www_google_.url(), "A=B")); | |
2565 CookieList cookies = GetAllCookies(cm.get()); | |
2566 CookieList::const_iterator it = cookies.begin(); | |
2567 ASSERT_TRUE(it != cookies.end()); | |
2568 EXPECT_EQ(http_www_google_.host(), it->Domain()); | |
2569 EXPECT_EQ("A", it->Name()); | |
2570 ASSERT_TRUE(++it == cookies.end()); | |
2571 GetCookieListCallback callback(&other_thread_); | |
2572 base::Closure task = | |
2573 base::Bind(&MultiThreadedCookieMonsterTest::GetAllCookiesTask, | |
2574 base::Unretained(this), cm, &callback); | |
2575 RunOnOtherThread(task); | |
2576 callback.WaitUntilDone(); | |
2577 it = callback.cookies().begin(); | |
2578 ASSERT_TRUE(it != callback.cookies().end()); | |
2579 EXPECT_EQ(http_www_google_.host(), it->Domain()); | |
2580 EXPECT_EQ("A", it->Name()); | |
2581 ASSERT_TRUE(++it == callback.cookies().end()); | |
2582 } | |
2583 | |
2584 TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckGetAllCookiesForURL) { | |
2585 scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL)); | |
2586 EXPECT_TRUE(SetCookie(cm.get(), http_www_google_.url(), "A=B")); | |
2587 CookieList cookies = GetAllCookiesForURL(cm.get(), http_www_google_.url()); | |
2588 CookieList::const_iterator it = cookies.begin(); | |
2589 ASSERT_TRUE(it != cookies.end()); | |
2590 EXPECT_EQ(http_www_google_.host(), it->Domain()); | |
2591 EXPECT_EQ("A", it->Name()); | |
2592 ASSERT_TRUE(++it == cookies.end()); | |
2593 GetCookieListCallback callback(&other_thread_); | |
2594 base::Closure task = | |
2595 base::Bind(&MultiThreadedCookieMonsterTest::GetAllCookiesForURLTask, | |
2596 base::Unretained(this), cm, http_www_google_.url(), &callback); | |
2597 RunOnOtherThread(task); | |
2598 callback.WaitUntilDone(); | |
2599 it = callback.cookies().begin(); | |
2600 ASSERT_TRUE(it != callback.cookies().end()); | |
2601 EXPECT_EQ(http_www_google_.host(), it->Domain()); | |
2602 EXPECT_EQ("A", it->Name()); | |
2603 ASSERT_TRUE(++it == callback.cookies().end()); | |
2604 } | |
2605 | |
2606 TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckGetAllCookiesForURLWithOpt) { | |
2607 scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL)); | |
2608 EXPECT_TRUE(SetCookie(cm.get(), http_www_google_.url(), "A=B")); | |
2609 CookieOptions options; | |
2610 CookieList cookies = | |
2611 GetAllCookiesForURLWithOptions(cm.get(), http_www_google_.url(), options); | |
2612 CookieList::const_iterator it = cookies.begin(); | |
2613 ASSERT_TRUE(it != cookies.end()); | |
2614 EXPECT_EQ(http_www_google_.host(), it->Domain()); | |
2615 EXPECT_EQ("A", it->Name()); | |
2616 ASSERT_TRUE(++it == cookies.end()); | |
2617 GetCookieListCallback callback(&other_thread_); | |
2618 base::Closure task = base::Bind( | |
2619 &MultiThreadedCookieMonsterTest::GetAllCookiesForURLWithOptionsTask, | |
2620 base::Unretained(this), cm, http_www_google_.url(), options, &callback); | |
2621 RunOnOtherThread(task); | |
2622 callback.WaitUntilDone(); | |
2623 it = callback.cookies().begin(); | |
2624 ASSERT_TRUE(it != callback.cookies().end()); | |
2625 EXPECT_EQ(http_www_google_.host(), it->Domain()); | |
2626 EXPECT_EQ("A", it->Name()); | |
2627 ASSERT_TRUE(++it == callback.cookies().end()); | |
2628 } | |
2629 | |
2630 TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckSetCookieWithDetails) { | |
2631 scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL)); | |
2632 EXPECT_TRUE(SetCookieWithDetails(cm.get(), www_google_foo_.url(), "A", "B", | |
2633 std::string(), "/foo", base::Time(), | |
2634 base::Time(), base::Time(), false, false, | |
2635 false, COOKIE_PRIORITY_DEFAULT)); | |
2636 ResultSavingCookieCallback<bool> callback(&other_thread_); | |
2637 base::Closure task = | |
2638 base::Bind(&MultiThreadedCookieMonsterTest::SetCookieWithDetailsTask, | |
2639 base::Unretained(this), cm, www_google_foo_.url(), &callback); | |
2640 RunOnOtherThread(task); | |
2641 callback.WaitUntilDone(); | |
2642 EXPECT_TRUE(callback.result()); | |
2643 } | |
2644 | |
2645 TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckDeleteAllCreatedBetween) { | |
2646 scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL)); | |
2647 CookieOptions options; | |
2648 Time now = Time::Now(); | |
2649 EXPECT_TRUE( | |
2650 SetCookieWithOptions(cm.get(), http_www_google_.url(), "A=B", options)); | |
2651 EXPECT_EQ(1, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(99), | |
2652 Time())); | |
2653 EXPECT_TRUE( | |
2654 SetCookieWithOptions(cm.get(), http_www_google_.url(), "A=B", options)); | |
2655 ResultSavingCookieCallback<int> callback(&other_thread_); | |
2656 base::Closure task = | |
2657 base::Bind(&MultiThreadedCookieMonsterTest::DeleteAllCreatedBetweenTask, | |
2658 base::Unretained(this), cm, now - TimeDelta::FromDays(99), | |
2659 Time(), &callback); | |
2660 RunOnOtherThread(task); | |
2661 callback.WaitUntilDone(); | |
2662 EXPECT_EQ(1, callback.result()); | |
2663 } | |
2664 | |
2665 TEST_F(MultiThreadedCookieMonsterTest, | |
2666 ThreadCheckDeleteAllCreatedBetweenForHost) { | |
2667 scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL)); | |
2668 GURL url_not_google("http://www.notgoogle.com"); | |
2669 | |
2670 CookieOptions options; | |
2671 Time now = Time::Now(); | |
2672 // ago1 < ago2 < ago3 < now. | |
2673 Time ago1 = now - TimeDelta::FromDays(101); | |
2674 Time ago2 = now - TimeDelta::FromDays(100); | |
2675 Time ago3 = now - TimeDelta::FromDays(99); | |
2676 | |
2677 // These 3 cookies match the first deletion. | |
2678 EXPECT_TRUE( | |
2679 SetCookieWithOptions(cm.get(), http_www_google_.url(), "A=B", options)); | |
2680 EXPECT_TRUE( | |
2681 SetCookieWithOptions(cm.get(), http_www_google_.url(), "C=D", options)); | |
2682 EXPECT_TRUE( | |
2683 SetCookieWithOptions(cm.get(), http_www_google_.url(), "Y=Z", options)); | |
2684 | |
2685 // This cookie does not match host. | |
2686 EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_not_google, "E=F", options)); | |
2687 | |
2688 // This cookie does not match time range: [ago3, inf], for first deletion, but | |
2689 // matches for the second deletion. | |
2690 EXPECT_TRUE( | |
2691 cm->SetCookieWithCreationTime(http_www_google_.url(), "G=H", ago2)); | |
2692 | |
2693 // 1. First set of deletions. | |
2694 EXPECT_EQ(3, // Deletes A=B, C=D, Y=Z | |
2695 DeleteAllCreatedBetweenForHost(cm.get(), ago3, Time::Max(), | |
2696 http_www_google_.url())); | |
2697 | |
2698 EXPECT_TRUE( | |
2699 SetCookieWithOptions(cm.get(), http_www_google_.url(), "A=B", options)); | |
2700 ResultSavingCookieCallback<int> callback(&other_thread_); | |
2701 | |
2702 // 2. Second set of deletions. | |
2703 base::Closure task = base::Bind( | |
2704 &MultiThreadedCookieMonsterTest::DeleteAllCreatedBetweenForHostTask, | |
2705 base::Unretained(this), cm, ago1, Time(), http_www_google_.url(), | |
2706 &callback); | |
2707 RunOnOtherThread(task); | |
2708 callback.WaitUntilDone(); | |
2709 EXPECT_EQ(2, callback.result()); // Deletes A=B, G=H. | |
2710 } | |
2711 | |
2712 TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckDeleteCanonicalCookie) { | |
2713 scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL)); | |
2714 CookieOptions options; | |
2715 EXPECT_TRUE( | |
2716 SetCookieWithOptions(cm.get(), http_www_google_.url(), "A=B", options)); | |
2717 CookieList cookies = GetAllCookies(cm.get()); | |
2718 CookieList::iterator it = cookies.begin(); | |
2719 EXPECT_TRUE(DeleteCanonicalCookie(cm.get(), *it)); | |
2720 | |
2721 EXPECT_TRUE( | |
2722 SetCookieWithOptions(cm.get(), http_www_google_.url(), "A=B", options)); | |
2723 ResultSavingCookieCallback<int> callback(&other_thread_); | |
2724 cookies = GetAllCookies(cm.get()); | |
2725 it = cookies.begin(); | |
2726 base::Closure task = | |
2727 base::Bind(&MultiThreadedCookieMonsterTest::DeleteCanonicalCookieTask, | |
2728 base::Unretained(this), cm, *it, &callback); | |
2729 RunOnOtherThread(task); | |
2730 callback.WaitUntilDone(); | |
2731 EXPECT_EQ(1, callback.result()); | |
2732 } | |
2733 | |
2734 // Ensure that cookies for http, https, ws, and wss all share the same storage | |
2735 // and policies when GetAllCookiesForURLAsync is used. This test is part of | |
2736 // MultiThreadedCookieMonsterTest in order to test and use | |
2737 // GetAllCookiesForURLAsync, but it does not use any additional threads. | |
2738 TEST_F(MultiThreadedCookieMonsterTest, GetAllCookiesForURLEffectiveDomain) { | |
2739 scoped_ptr<CanonicalCookie> cookie(CanonicalCookie::Create( | |
2740 http_www_google_.url(), kValidCookieLine, Time::Now(), CookieOptions())); | |
2741 | |
2742 // This cookie will be freed by the CookieMonster. | |
2743 std::vector<CanonicalCookie*> cookies = {new CanonicalCookie(*cookie)}; | |
2744 scoped_refptr<NewMockPersistentCookieStore> store( | |
2745 new NewMockPersistentCookieStore); | |
2746 scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL)); | |
2747 | |
2748 CookieMonster::PersistentCookieStore::LoadedCallback loaded_callback; | |
2749 ::testing::StrictMock<::testing::MockFunction<void(int)>> checkpoint; | |
2750 const std::string key = cookie_util::GetEffectiveDomain( | |
2751 http_www_google_.url().scheme(), http_www_google_.url().host()); | |
2752 | |
2753 ::testing::InSequence s; | |
2754 EXPECT_CALL(checkpoint, Call(0)); | |
2755 EXPECT_CALL(*store, Load(::testing::_)); | |
2756 EXPECT_CALL(*store, LoadCookiesForKey(key, ::testing::_)) | |
2757 .WillOnce(::testing::SaveArg<1>(&loaded_callback)); | |
2758 EXPECT_CALL(checkpoint, Call(1)); | |
2759 // LoadCookiesForKey will never be called after checkpoint.Call(1) although | |
2760 // we will call GetAllCookiesForURLAsync again, because all URLs below share | |
2761 // the same key. | |
2762 EXPECT_CALL(*store, LoadCookiesForKey(::testing::_, ::testing::_)).Times(0); | |
2763 | |
2764 GetCookieListCallback callback; | |
2765 checkpoint.Call(0); | |
2766 GetAllCookiesForURLTask(cm.get(), http_www_google_.url(), &callback); | |
2767 checkpoint.Call(1); | |
2768 // Pass the cookies to the CookieMonster. | |
2769 loaded_callback.Run(cookies); | |
2770 // Now GetAllCookiesForURLTask is done. | |
2771 callback.WaitUntilDone(); | |
2772 // See that the callback was called with the cookies. | |
2773 ASSERT_EQ(1u, callback.cookies().size()); | |
2774 EXPECT_TRUE(cookie->IsEquivalent(callback.cookies()[0])); | |
2775 | |
2776 // All urls in |urls| should share the same cookie domain. | |
2777 const GURL kUrls[] = { | |
2778 http_www_google_.url(), https_www_google_.url(), ws_www_google_.url(), | |
2779 wss_www_google_.url(), | |
2780 }; | |
2781 for (const GURL& url : kUrls) { | |
2782 // Call the function with |url| and verify it is done synchronously without | |
2783 // calling LoadCookiesForKey. | |
2784 GetCookieListCallback callback; | |
2785 GetAllCookiesForURLTask(cm.get(), url, &callback); | |
2786 callback.WaitUntilDone(); | |
2787 ASSERT_EQ(1u, callback.cookies().size()); | |
2788 EXPECT_TRUE(cookie->IsEquivalent(callback.cookies()[0])); | |
2789 } | |
2790 } | |
2791 | |
2792 TEST_F(CookieMonsterTest, InvalidExpiryTime) { | 2464 TEST_F(CookieMonsterTest, InvalidExpiryTime) { |
2793 std::string cookie_line = | 2465 std::string cookie_line = |
2794 std::string(kValidCookieLine) + "; expires=Blarg arg arg"; | 2466 std::string(kValidCookieLine) + "; expires=Blarg arg arg"; |
2795 scoped_ptr<CanonicalCookie> cookie(CanonicalCookie::Create( | 2467 scoped_ptr<CanonicalCookie> cookie(CanonicalCookie::Create( |
2796 http_www_google_.url(), cookie_line, Time::Now(), CookieOptions())); | 2468 http_www_google_.url(), cookie_line, Time::Now(), CookieOptions())); |
2797 ASSERT_FALSE(cookie->IsPersistent()); | 2469 ASSERT_FALSE(cookie->IsPersistent()); |
2798 } | 2470 } |
2799 | 2471 |
2800 // Test that CookieMonster writes session cookies into the underlying | 2472 // Test that CookieMonster writes session cookies into the underlying |
2801 // CookieStore if the "persist session cookies" option is on. | 2473 // CookieStore if the "persist session cookies" option is on. |
(...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3489 monster()->AddCallbackForCookie( | 3161 monster()->AddCallbackForCookie( |
3490 test_url_, "abc", | 3162 test_url_, "abc", |
3491 base::Bind(&RecordCookieChanges, &cookies1, nullptr))); | 3163 base::Bind(&RecordCookieChanges, &cookies1, nullptr))); |
3492 SetCookie(monster(), test_url_, "abc=def"); | 3164 SetCookie(monster(), test_url_, "abc=def"); |
3493 base::MessageLoop::current()->RunUntilIdle(); | 3165 base::MessageLoop::current()->RunUntilIdle(); |
3494 EXPECT_EQ(1U, cookies0.size()); | 3166 EXPECT_EQ(1U, cookies0.size()); |
3495 EXPECT_EQ(1U, cookies0.size()); | 3167 EXPECT_EQ(1U, cookies0.size()); |
3496 } | 3168 } |
3497 | 3169 |
3498 } // namespace net | 3170 } // namespace net |
OLD | NEW |