| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "ios/net/cookies/cookie_store_ios.h" | 5 #include "ios/net/cookies/cookie_store_ios.h" |
| 6 | 6 |
| 7 #import <Foundation/Foundation.h> | 7 #import <Foundation/Foundation.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 static const bool preserves_trailing_dots = true; | 62 static const bool preserves_trailing_dots = true; |
| 63 static const bool filters_schemes = false; | 63 static const bool filters_schemes = false; |
| 64 static const bool has_path_prefix_bug = false; | 64 static const bool has_path_prefix_bug = false; |
| 65 static const int creation_time_granularity_in_ms = 0; | 65 static const int creation_time_granularity_in_ms = 0; |
| 66 static const int enforces_prefixes = true; | 66 static const int enforces_prefixes = true; |
| 67 static const bool enforce_strict_secure = false; | 67 static const bool enforce_strict_secure = false; |
| 68 | 68 |
| 69 base::MessageLoop loop_; | 69 base::MessageLoop loop_; |
| 70 }; | 70 }; |
| 71 | 71 |
| 72 // RoundTripTestCookieStore is un-synchronized and re-synchronized after all | |
| 73 // cookie operations. This means all system cookies are converted to Chrome | |
| 74 // cookies and converted back. | |
| 75 // The purpose of this class is to test that cookie conversions do not break the | |
| 76 // cookie store. | |
| 77 class RoundTripTestCookieStore : public net::CookieStore { | |
| 78 public: | |
| 79 RoundTripTestCookieStore() | |
| 80 : store_(new CookieStoreIOS(nullptr)), | |
| 81 dummy_store_(new CookieStoreIOS(nullptr)) { | |
| 82 store_->SetSynchronizedWithSystemStore(true); | |
| 83 } | |
| 84 | |
| 85 ~RoundTripTestCookieStore() override { | |
| 86 store_->SetSynchronizedWithSystemStore(false); | |
| 87 } | |
| 88 | |
| 89 // Inherited CookieStore methods. | |
| 90 void SetCookieWithOptionsAsync(const GURL& url, | |
| 91 const std::string& cookie_line, | |
| 92 const net::CookieOptions& options, | |
| 93 const SetCookiesCallback& callback) override { | |
| 94 RoundTrip(); | |
| 95 store_->SetCookieWithOptionsAsync(url, cookie_line, options, callback); | |
| 96 } | |
| 97 | |
| 98 void SetCookieWithDetailsAsync(const GURL& url, | |
| 99 const std::string& name, | |
| 100 const std::string& value, | |
| 101 const std::string& domain, | |
| 102 const std::string& path, | |
| 103 base::Time creation_time, | |
| 104 base::Time expiration_time, | |
| 105 base::Time last_access_time, | |
| 106 bool secure, | |
| 107 bool http_only, | |
| 108 CookieSameSite same_site, | |
| 109 bool enforce_strict_secure, | |
| 110 CookiePriority priority, | |
| 111 const SetCookiesCallback& callback) override { | |
| 112 RoundTrip(); | |
| 113 store_->SetCookieWithDetailsAsync( | |
| 114 url, name, value, domain, path, creation_time, expiration_time, | |
| 115 last_access_time, secure, http_only, same_site, enforce_strict_secure, | |
| 116 priority, callback); | |
| 117 } | |
| 118 | |
| 119 void GetCookiesWithOptionsAsync(const GURL& url, | |
| 120 const net::CookieOptions& options, | |
| 121 const GetCookiesCallback& callback) override { | |
| 122 RoundTrip(); | |
| 123 store_->GetCookiesWithOptionsAsync(url, options, callback); | |
| 124 } | |
| 125 | |
| 126 void GetCookieListWithOptionsAsync( | |
| 127 const GURL& url, | |
| 128 const net::CookieOptions& options, | |
| 129 const GetCookieListCallback& callback) override { | |
| 130 RoundTrip(); | |
| 131 store_->GetCookieListWithOptionsAsync(url, options, callback); | |
| 132 } | |
| 133 | |
| 134 void GetAllCookiesAsync(const GetCookieListCallback& callback) override { | |
| 135 RoundTrip(); | |
| 136 store_->GetAllCookiesAsync(callback); | |
| 137 } | |
| 138 | |
| 139 void DeleteCookieAsync(const GURL& url, | |
| 140 const std::string& cookie_name, | |
| 141 const base::Closure& callback) override { | |
| 142 RoundTrip(); | |
| 143 store_->DeleteCookieAsync(url, cookie_name, callback); | |
| 144 } | |
| 145 | |
| 146 void DeleteCanonicalCookieAsync( | |
| 147 const CanonicalCookie& cookie, | |
| 148 const DeleteCallback& callback) override { | |
| 149 RoundTrip(); | |
| 150 store_->DeleteCanonicalCookieAsync(cookie, callback); | |
| 151 } | |
| 152 | |
| 153 void DeleteAllCreatedBetweenAsync(const base::Time& delete_begin, | |
| 154 const base::Time& delete_end, | |
| 155 const DeleteCallback& callback) override { | |
| 156 RoundTrip(); | |
| 157 store_->DeleteAllCreatedBetweenAsync(delete_begin, delete_end, callback); | |
| 158 } | |
| 159 | |
| 160 void DeleteAllCreatedBetweenWithPredicateAsync( | |
| 161 const base::Time& delete_begin, | |
| 162 const base::Time& delete_end, | |
| 163 const CookiePredicate& predicate, | |
| 164 const DeleteCallback& callback) override { | |
| 165 RoundTrip(); | |
| 166 store_->DeleteAllCreatedBetweenWithPredicateAsync(delete_begin, delete_end, | |
| 167 predicate, callback); | |
| 168 } | |
| 169 | |
| 170 void DeleteSessionCookiesAsync(const DeleteCallback& callback) override { | |
| 171 RoundTrip(); | |
| 172 store_->DeleteSessionCookiesAsync(callback); | |
| 173 } | |
| 174 | |
| 175 void FlushStore(const base::Closure& callback) override { | |
| 176 RoundTrip(); | |
| 177 store_->FlushStore(callback); | |
| 178 } | |
| 179 | |
| 180 std::unique_ptr<CookieStore::CookieChangedSubscription> AddCallbackForCookie( | |
| 181 const GURL& url, | |
| 182 const std::string& name, | |
| 183 const CookieChangedCallback& callback) override { | |
| 184 return std::unique_ptr<CookieStore::CookieChangedSubscription>(); | |
| 185 } | |
| 186 | |
| 187 bool IsEphemeral() override { | |
| 188 return store_->IsEphemeral(); | |
| 189 } | |
| 190 | |
| 191 private: | |
| 192 void RoundTrip() { | |
| 193 store_->SetSynchronizedWithSystemStore(false); | |
| 194 dummy_store_->SetSynchronizedWithSystemStore(true); | |
| 195 // Check that the system store is empty, because it is synchronized with | |
| 196 // |dummy_store_| which is empty. | |
| 197 NSHTTPCookieStorage* store = [NSHTTPCookieStorage sharedHTTPCookieStorage]; | |
| 198 EXPECT_EQ(0u, [[store cookies] count]); | |
| 199 dummy_store_->SetSynchronizedWithSystemStore(false); | |
| 200 store_->SetSynchronizedWithSystemStore(true); | |
| 201 } | |
| 202 | |
| 203 std::unique_ptr<CookieStoreIOS> store_; | |
| 204 // |dummy_store_| is not directly used, but is needed to make |store_| | |
| 205 // inactive. | |
| 206 std::unique_ptr<CookieStoreIOS> dummy_store_; | |
| 207 }; | |
| 208 | |
| 209 struct RoundTripTestCookieStoreTraits { | |
| 210 static std::unique_ptr<net::CookieStore> Create() { | |
| 211 ClearCookies(); | |
| 212 return base::MakeUnique<RoundTripTestCookieStore>(); | |
| 213 } | |
| 214 | |
| 215 static const bool is_cookie_monster = false; | |
| 216 static const bool supports_http_only = false; | |
| 217 static const bool supports_non_dotted_domains = false; | |
| 218 static const bool preserves_trailing_dots = false; | |
| 219 static const bool filters_schemes = false; | |
| 220 static const bool has_path_prefix_bug = true; | |
| 221 static const int creation_time_granularity_in_ms = 1000; | |
| 222 static const int enforces_prefixes = true; | |
| 223 static const bool enforce_strict_secure = false; | |
| 224 }; | |
| 225 | |
| 226 } // namespace net | 72 } // namespace net |
| 227 | 73 |
| 228 namespace net { | 74 namespace net { |
| 229 | 75 |
| 230 INSTANTIATE_TYPED_TEST_CASE_P(CookieStoreIOS, | 76 INSTANTIATE_TYPED_TEST_CASE_P(CookieStoreIOS, |
| 231 CookieStoreTest, | 77 CookieStoreTest, |
| 232 CookieStoreIOSTestTraits); | 78 CookieStoreIOSTestTraits); |
| 233 | 79 |
| 234 INSTANTIATE_TYPED_TEST_CASE_P(InactiveCookieStoreIOS, | 80 INSTANTIATE_TYPED_TEST_CASE_P(InactiveCookieStoreIOS, |
| 235 CookieStoreTest, | 81 CookieStoreTest, |
| 236 InactiveCookieStoreIOSTestTraits); | 82 InactiveCookieStoreIOSTestTraits); |
| 237 | 83 |
| 238 INSTANTIATE_TYPED_TEST_CASE_P(RoundTripTestCookieStore, | |
| 239 CookieStoreTest, | |
| 240 RoundTripTestCookieStoreTraits); | |
| 241 | |
| 242 } // namespace net | 84 } // namespace net |
| 243 | 85 |
| 244 namespace { | 86 namespace { |
| 245 | 87 |
| 246 // Test net::CookieMonster::PersistentCookieStore allowing to control when the | 88 // Test net::CookieMonster::PersistentCookieStore allowing to control when the |
| 247 // initialization completes. | 89 // initialization completes. |
| 248 class TestPersistentCookieStore | 90 class TestPersistentCookieStore |
| 249 : public net::CookieMonster::PersistentCookieStore { | 91 : public net::CookieMonster::PersistentCookieStore { |
| 250 public: | 92 public: |
| 251 TestPersistentCookieStore() | 93 TestPersistentCookieStore() |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 store_->SetSynchronizedWithSystemStore(true); | 418 store_->SetSynchronizedWithSystemStore(true); |
| 577 GetCookieCallback callback; | 419 GetCookieCallback callback; |
| 578 GetCookies(base::Bind(&GetCookieCallback::Run, base::Unretained(&callback))); | 420 GetCookies(base::Bind(&GetCookieCallback::Run, base::Unretained(&callback))); |
| 579 // Backend loading completes (end of synchronization). | 421 // Backend loading completes (end of synchronization). |
| 580 backend_->RunLoadedCallback(); | 422 backend_->RunLoadedCallback(); |
| 581 EXPECT_TRUE(callback.did_run()); | 423 EXPECT_TRUE(callback.did_run()); |
| 582 EXPECT_EQ("a=b", callback.cookie_line()); | 424 EXPECT_EQ("a=b", callback.cookie_line()); |
| 583 store_->SetSynchronizedWithSystemStore(false); | 425 store_->SetSynchronizedWithSystemStore(false); |
| 584 } | 426 } |
| 585 | 427 |
| 586 // Tests that Synchronization can be "aborted" (i.e. the cookie store is | |
| 587 // unsynchronized while synchronization is in progress). | |
| 588 TEST_F(CookieStoreIOSWithBackend, SyncThenUnsync) { | |
| 589 ClearCookies(); | |
| 590 std::unique_ptr<CookieStoreIOS> dummy_store(new CookieStoreIOS(nullptr)); | |
| 591 // Switch back and forth before synchronization can complete. | |
| 592 store_->SetSynchronizedWithSystemStore(true); | |
| 593 store_->SetSynchronizedWithSystemStore(false); | |
| 594 dummy_store->SetSynchronizedWithSystemStore(true); | |
| 595 backend_->RunLoadedCallback(); | |
| 596 // No cookie leak in the system store. | |
| 597 NSHTTPCookieStorage* store = [NSHTTPCookieStorage sharedHTTPCookieStorage]; | |
| 598 EXPECT_EQ(0u, [[store cookies] count]); | |
| 599 // No cookie lost. | |
| 600 GetCookieCallback callback; | |
| 601 GetCookies(base::Bind(&GetCookieCallback::Run, base::Unretained(&callback))); | |
| 602 EXPECT_TRUE(callback.did_run()); | |
| 603 EXPECT_EQ("a=b", callback.cookie_line()); | |
| 604 dummy_store->SetSynchronizedWithSystemStore(false); | |
| 605 } | |
| 606 | |
| 607 // Tests that Synchronization can be "aborted" while there are pending tasks | |
| 608 // (i.e. the cookie store is unsynchronized while synchronization is in progress | |
| 609 // and there are pending tasks). | |
| 610 TEST_F(CookieStoreIOSWithBackend, SyncThenUnsyncWithPendingTasks) { | |
| 611 ClearCookies(); | |
| 612 std::unique_ptr<CookieStoreIOS> dummy_store(new CookieStoreIOS(nullptr)); | |
| 613 // Start synchornization. | |
| 614 store_->SetSynchronizedWithSystemStore(true); | |
| 615 // Create a pending task while synchronization is in progress. | |
| 616 GetCookieCallback callback; | |
| 617 GetCookies(base::Bind(&GetCookieCallback::Run, base::Unretained(&callback))); | |
| 618 // Cancel the synchronization. | |
| 619 store_->SetSynchronizedWithSystemStore(false); | |
| 620 dummy_store->SetSynchronizedWithSystemStore(true); | |
| 621 // Synchronization completes after being cancelled. | |
| 622 backend_->RunLoadedCallback(); | |
| 623 // The task is not lost. | |
| 624 EXPECT_TRUE(callback.did_run()); | |
| 625 EXPECT_EQ("a=b", callback.cookie_line()); | |
| 626 dummy_store->SetSynchronizedWithSystemStore(false); | |
| 627 } | |
| 628 | |
| 629 TEST_F(CookieStoreIOSWithBackend, UnSynchronizeBeforeLoadComplete) { | |
| 630 ClearCookies(); | |
| 631 // Switch back and forth before synchronization can complete. | |
| 632 store_->SetSynchronizedWithSystemStore(true); | |
| 633 store_->SetSynchronizedWithSystemStore(false); | |
| 634 backend_->RunLoadedCallback(); | |
| 635 // No cookie lost. | |
| 636 GetCookieCallback callback; | |
| 637 GetCookies(base::Bind(&GetCookieCallback::Run, base::Unretained(&callback))); | |
| 638 EXPECT_TRUE(callback.did_run()); | |
| 639 EXPECT_EQ("a=b", callback.cookie_line()); | |
| 640 } | |
| 641 | |
| 642 TEST_F(CookieStoreIOSWithBackend, UnSynchronize) { | |
| 643 ClearCookies(); | |
| 644 store_->SetSynchronizedWithSystemStore(true); | |
| 645 backend_->RunLoadedCallback(); | |
| 646 store_->SetSynchronizedWithSystemStore(false); | |
| 647 // No cookie lost. | |
| 648 GetCookieCallback callback; | |
| 649 GetCookies(base::Bind(&GetCookieCallback::Run, base::Unretained(&callback))); | |
| 650 EXPECT_TRUE(callback.did_run()); | |
| 651 EXPECT_EQ("a=b", callback.cookie_line()); | |
| 652 } | |
| 653 | |
| 654 TEST_F(CookieStoreIOSWithBackend, FlushOnUnSynchronize) { | |
| 655 store_->SetSynchronizedWithSystemStore(true); | |
| 656 EXPECT_FALSE(backend_->flushed()); | |
| 657 store_->SetSynchronizedWithSystemStore(false); | |
| 658 EXPECT_TRUE(backend_->flushed()); | |
| 659 } | |
| 660 | |
| 661 TEST_F(CookieStoreIOSWithBackend, FlushOnCookieChanged) { | 428 TEST_F(CookieStoreIOSWithBackend, FlushOnCookieChanged) { |
| 662 store_->SetSynchronizedWithSystemStore(true); | 429 store_->SetSynchronizedWithSystemStore(true); |
| 663 store_->set_flush_delay_for_testing(base::TimeDelta()); | 430 store_->set_flush_delay_for_testing(base::TimeDelta()); |
| 664 backend_->RunLoadedCallback(); | 431 backend_->RunLoadedCallback(); |
| 665 EXPECT_FALSE(backend_->flushed()); | 432 EXPECT_FALSE(backend_->flushed()); |
| 666 | 433 |
| 667 // Set a cookie an check that it triggers a flush. | 434 // Set a cookie an check that it triggers a flush. |
| 668 SetCookie("x=y"); | 435 SetCookie("x=y"); |
| 669 EXPECT_TRUE(backend_->flushed()); | 436 EXPECT_TRUE(backend_->flushed()); |
| 670 | 437 |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 EXPECT_EQ(2U, cookies.size()); | 665 EXPECT_EQ(2U, cookies.size()); |
| 899 // this deletes the callback | 666 // this deletes the callback |
| 900 handle.reset(); | 667 handle.reset(); |
| 901 SetSystemCookie(kTestCookieURL, "abc", "jkl"); | 668 SetSystemCookie(kTestCookieURL, "abc", "jkl"); |
| 902 EXPECT_EQ(2U, cookies.size()); | 669 EXPECT_EQ(2U, cookies.size()); |
| 903 DeleteSystemCookie(kTestCookieURL, "abc"); | 670 DeleteSystemCookie(kTestCookieURL, "abc"); |
| 904 store_->SetSynchronizedWithSystemStore(false); | 671 store_->SetSynchronizedWithSystemStore(false); |
| 905 } | 672 } |
| 906 | 673 |
| 907 } // namespace net | 674 } // namespace net |
| OLD | NEW |