| 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 <time.h> | |
| 8 #include <string> | 7 #include <string> |
| 9 | 8 |
| 10 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 11 #include "base/bind.h" | 10 #include "base/bind.h" |
| 12 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
| 13 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/message_loop.h" | 13 #include "base/message_loop.h" |
| 15 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
| 16 #include "base/stringprintf.h" | 15 #include "base/stringprintf.h" |
| 17 #include "base/string_tokenizer.h" | 16 #include "base/string_tokenizer.h" |
| 18 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
| 19 #include "base/time.h" | 18 #include "base/time.h" |
| 20 #include "googleurl/src/gurl.h" | 19 #include "googleurl/src/gurl.h" |
| 20 #include "net/cookies/canonical_cookie.h" |
| 21 #include "net/cookies/cookie_monster.h" | 21 #include "net/cookies/cookie_monster.h" |
| 22 #include "net/cookies/cookie_monster_store_test.h" // For CookieStore mock | 22 #include "net/cookies/cookie_monster_store_test.h" // For CookieStore mock |
| 23 #include "net/cookies/cookie_util.h" | 23 #include "net/cookies/cookie_util.h" |
| 24 #include "net/cookies/parsed_cookie.h" | 24 #include "net/cookies/parsed_cookie.h" |
| 25 #include "testing/gmock/include/gmock/gmock.h" | 25 #include "testing/gmock/include/gmock/gmock.h" |
| 26 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 27 | 27 |
| 28 namespace net { | 28 namespace net { |
| 29 | 29 |
| 30 using base::Time; | 30 using base::Time; |
| 31 using base::TimeDelta; | 31 using base::TimeDelta; |
| 32 | 32 |
| 33 namespace { | 33 namespace { |
| 34 | 34 |
| 35 // TODO(erikwright): Replace the pre-existing MockPersistentCookieStore (and | 35 // TODO(erikwright): Replace the pre-existing MockPersistentCookieStore (and |
| 36 // brethren) with this one, and remove the 'New' prefix. | 36 // brethren) with this one, and remove the 'New' prefix. |
| 37 class NewMockPersistentCookieStore | 37 class NewMockPersistentCookieStore |
| 38 : public CookieMonster::PersistentCookieStore { | 38 : public CookieMonster::PersistentCookieStore { |
| 39 public: | 39 public: |
| 40 MOCK_METHOD1(Load, void(const LoadedCallback& loaded_callback)); | 40 MOCK_METHOD1(Load, void(const LoadedCallback& loaded_callback)); |
| 41 MOCK_METHOD2(LoadCookiesForKey, void(const std::string& key, | 41 MOCK_METHOD2(LoadCookiesForKey, void(const std::string& key, |
| 42 const LoadedCallback& loaded_callback)); | 42 const LoadedCallback& loaded_callback)); |
| 43 MOCK_METHOD1(AddCookie, void(const CookieMonster::CanonicalCookie& cc)); | 43 MOCK_METHOD1(AddCookie, void(const CanonicalCookie& cc)); |
| 44 MOCK_METHOD1(UpdateCookieAccessTime, | 44 MOCK_METHOD1(UpdateCookieAccessTime, void(const CanonicalCookie& cc)); |
| 45 void(const CookieMonster::CanonicalCookie& cc)); | 45 MOCK_METHOD1(DeleteCookie, void(const CanonicalCookie& cc)); |
| 46 MOCK_METHOD1(DeleteCookie, void(const CookieMonster::CanonicalCookie& cc)); | |
| 47 MOCK_METHOD1(Flush, void(const base::Closure& callback)); | 46 MOCK_METHOD1(Flush, void(const base::Closure& callback)); |
| 48 MOCK_METHOD0(SetForceKeepSessionState, void()); | 47 MOCK_METHOD0(SetForceKeepSessionState, void()); |
| 49 | 48 |
| 50 private: | 49 private: |
| 51 virtual ~NewMockPersistentCookieStore() {} | 50 virtual ~NewMockPersistentCookieStore() {} |
| 52 }; | 51 }; |
| 53 | 52 |
| 54 const char* kTopLevelDomainPlus1 = "http://www.harvard.edu"; | 53 const char* kTopLevelDomainPlus1 = "http://www.harvard.edu"; |
| 55 const char* kTopLevelDomainPlus2 = "http://www.math.harvard.edu"; | 54 const char* kTopLevelDomainPlus2 = "http://www.math.harvard.edu"; |
| 56 const char* kTopLevelDomainPlus2Secure = "https://www.math.harvard.edu"; | 55 const char* kTopLevelDomainPlus2Secure = "https://www.math.harvard.edu"; |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 const GURL& url) { | 182 const GURL& url) { |
| 184 DCHECK(cm); | 183 DCHECK(cm); |
| 185 DeleteCallback callback; | 184 DeleteCallback callback; |
| 186 cm->DeleteAllForHostAsync( | 185 cm->DeleteAllForHostAsync( |
| 187 url, base::Bind(&DeleteCallback::Run, base::Unretained(&callback))); | 186 url, base::Bind(&DeleteCallback::Run, base::Unretained(&callback))); |
| 188 RunFor(kTimeout); | 187 RunFor(kTimeout); |
| 189 EXPECT_TRUE(callback.did_run()); | 188 EXPECT_TRUE(callback.did_run()); |
| 190 return callback.num_deleted(); | 189 return callback.num_deleted(); |
| 191 } | 190 } |
| 192 | 191 |
| 193 bool DeleteCanonicalCookie(CookieMonster*cm, | 192 bool DeleteCanonicalCookie(CookieMonster*cm, const CanonicalCookie& cookie) { |
| 194 const CookieMonster::CanonicalCookie& cookie) { | |
| 195 DCHECK(cm); | 193 DCHECK(cm); |
| 196 SetCookieCallback callback; | 194 SetCookieCallback callback; |
| 197 cm->DeleteCanonicalCookieAsync( | 195 cm->DeleteCanonicalCookieAsync( |
| 198 cookie, | 196 cookie, |
| 199 base::Bind(&SetCookieCallback::Run, base::Unretained(&callback))); | 197 base::Bind(&SetCookieCallback::Run, base::Unretained(&callback))); |
| 200 RunFor(kTimeout); | 198 RunFor(kTimeout); |
| 201 EXPECT_TRUE(callback.did_run()); | 199 EXPECT_TRUE(callback.did_run()); |
| 202 return callback.result(); | 200 return callback.result(); |
| 203 } | 201 } |
| 204 | 202 |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 MOCK_METHOD0(Begin, void(void)); | 577 MOCK_METHOD0(Begin, void(void)); |
| 580 | 578 |
| 581 // Returns the CookieMonster instance under test. | 579 // Returns the CookieMonster instance under test. |
| 582 CookieMonster& cookie_monster() { return *cookie_monster_; } | 580 CookieMonster& cookie_monster() { return *cookie_monster_; } |
| 583 | 581 |
| 584 private: | 582 private: |
| 585 // Declares that mock expectations in this test suite are strictly ordered. | 583 // Declares that mock expectations in this test suite are strictly ordered. |
| 586 testing::InSequence in_sequence_; | 584 testing::InSequence in_sequence_; |
| 587 // Holds cookies to be returned from PersistentCookieStore::Load or | 585 // Holds cookies to be returned from PersistentCookieStore::Load or |
| 588 // PersistentCookieStore::LoadCookiesForKey. | 586 // PersistentCookieStore::LoadCookiesForKey. |
| 589 std::vector<CookieMonster::CanonicalCookie*> loaded_cookies_; | 587 std::vector<CanonicalCookie*> loaded_cookies_; |
| 590 // Stores the callback passed from the CookieMonster to the | 588 // Stores the callback passed from the CookieMonster to the |
| 591 // PersistentCookieStore::Load | 589 // PersistentCookieStore::Load |
| 592 CookieMonster::PersistentCookieStore::LoadedCallback loaded_callback_; | 590 CookieMonster::PersistentCookieStore::LoadedCallback loaded_callback_; |
| 593 // Stores the callback passed from the CookieMonster to the | 591 // Stores the callback passed from the CookieMonster to the |
| 594 // PersistentCookieStore::LoadCookiesForKey | 592 // PersistentCookieStore::LoadCookiesForKey |
| 595 std::queue<CookieMonster::PersistentCookieStore::LoadedCallback> | 593 std::queue<CookieMonster::PersistentCookieStore::LoadedCallback> |
| 596 loaded_for_key_callbacks_; | 594 loaded_for_key_callbacks_; |
| 597 | 595 |
| 598 // Stores the CookieMonster under test. | 596 // Stores the CookieMonster under test. |
| 599 scoped_refptr<CookieMonster> cookie_monster_; | 597 scoped_refptr<CookieMonster> cookie_monster_; |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 802 EXPECT_CALL(delete_callback, Invoke(false)).WillOnce( | 800 EXPECT_CALL(delete_callback, Invoke(false)).WillOnce( |
| 803 DeleteAllForHostAction( | 801 DeleteAllForHostAction( |
| 804 &cookie_monster(), url_google_, &delete_callback)); | 802 &cookie_monster(), url_google_, &delete_callback)); |
| 805 EXPECT_CALL(delete_callback, Invoke(false)).WillOnce( | 803 EXPECT_CALL(delete_callback, Invoke(false)).WillOnce( |
| 806 QuitCurrentMessageLoop()); | 804 QuitCurrentMessageLoop()); |
| 807 | 805 |
| 808 CompleteLoadingAndWait(); | 806 CompleteLoadingAndWait(); |
| 809 } | 807 } |
| 810 | 808 |
| 811 TEST_F(DeferredCookieTaskTest, DeferredDeleteCanonicalCookie) { | 809 TEST_F(DeferredCookieTaskTest, DeferredDeleteCanonicalCookie) { |
| 812 std::vector<CookieMonster::CanonicalCookie*> cookies; | 810 std::vector<CanonicalCookie*> cookies; |
| 813 CookieMonster::CanonicalCookie cookie = BuildCanonicalCookie( | 811 CanonicalCookie cookie = BuildCanonicalCookie( |
| 814 "www.google.com", "X=1; path=/", base::Time::Now()); | 812 "www.google.com", "X=1; path=/", base::Time::Now()); |
| 815 | 813 |
| 816 MockDeleteCookieCallback delete_cookie_callback; | 814 MockDeleteCookieCallback delete_cookie_callback; |
| 817 | 815 |
| 818 BeginWith(DeleteCanonicalCookieAction( | 816 BeginWith(DeleteCanonicalCookieAction( |
| 819 &cookie_monster(), cookie, &delete_cookie_callback)); | 817 &cookie_monster(), cookie, &delete_cookie_callback)); |
| 820 | 818 |
| 821 WaitForLoadCall(); | 819 WaitForLoadCall(); |
| 822 | 820 |
| 823 EXPECT_CALL(delete_cookie_callback, Invoke(false)).WillOnce( | 821 EXPECT_CALL(delete_cookie_callback, Invoke(false)).WillOnce( |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 GetCookiesWithInfoAction( | 872 GetCookiesWithInfoAction( |
| 875 &cookie_monster(), url_google_, &get_cookie_info_callback)); | 873 &cookie_monster(), url_google_, &get_cookie_info_callback)); |
| 876 EXPECT_CALL(get_cookie_info_callback, Invoke("X=1", testing::_)).WillOnce( | 874 EXPECT_CALL(get_cookie_info_callback, Invoke("X=1", testing::_)).WillOnce( |
| 877 QuitCurrentMessageLoop()); | 875 QuitCurrentMessageLoop()); |
| 878 EXPECT_CALL(set_cookies_callback, Invoke(true)); | 876 EXPECT_CALL(set_cookies_callback, Invoke(true)); |
| 879 EXPECT_CALL(delete_cookie_callback, Invoke()); | 877 EXPECT_CALL(delete_cookie_callback, Invoke()); |
| 880 | 878 |
| 881 CompleteLoadingAndWait(); | 879 CompleteLoadingAndWait(); |
| 882 } | 880 } |
| 883 | 881 |
| 884 TEST_F(CookieMonsterTest, TestCookieDateParsing) { | |
| 885 const struct { | |
| 886 const char* str; | |
| 887 const bool valid; | |
| 888 const time_t epoch; | |
| 889 } tests[] = { | |
| 890 { "Sat, 15-Apr-17 21:01:22 GMT", true, 1492290082 }, | |
| 891 { "Thu, 19-Apr-2007 16:00:00 GMT", true, 1176998400 }, | |
| 892 { "Wed, 25 Apr 2007 21:02:13 GMT", true, 1177534933 }, | |
| 893 { "Thu, 19/Apr\\2007 16:00:00 GMT", true, 1176998400 }, | |
| 894 { "Fri, 1 Jan 2010 01:01:50 GMT", true, 1262307710 }, | |
| 895 { "Wednesday, 1-Jan-2003 00:00:00 GMT", true, 1041379200 }, | |
| 896 { ", 1-Jan-2003 00:00:00 GMT", true, 1041379200 }, | |
| 897 { " 1-Jan-2003 00:00:00 GMT", true, 1041379200 }, | |
| 898 { "1-Jan-2003 00:00:00 GMT", true, 1041379200 }, | |
| 899 { "Wed,18-Apr-07 22:50:12 GMT", true, 1176936612 }, | |
| 900 { "WillyWonka , 18-Apr-07 22:50:12 GMT", true, 1176936612 }, | |
| 901 { "WillyWonka , 18-Apr-07 22:50:12", true, 1176936612 }, | |
| 902 { "WillyWonka , 18-apr-07 22:50:12", true, 1176936612 }, | |
| 903 { "Mon, 18-Apr-1977 22:50:13 GMT", true, 230251813 }, | |
| 904 { "Mon, 18-Apr-77 22:50:13 GMT", true, 230251813 }, | |
| 905 // If the cookie came in with the expiration quoted (which in terms of | |
| 906 // the RFC you shouldn't do), we will get string quoted. Bug 1261605. | |
| 907 { "\"Sat, 15-Apr-17\\\"21:01:22\\\"GMT\"", true, 1492290082 }, | |
| 908 // Test with full month names and partial names. | |
| 909 { "Partyday, 18- April-07 22:50:12", true, 1176936612 }, | |
| 910 { "Partyday, 18 - Apri-07 22:50:12", true, 1176936612 }, | |
| 911 { "Wednes, 1-Januar-2003 00:00:00 GMT", true, 1041379200 }, | |
| 912 // Test that we always take GMT even with other time zones or bogus | |
| 913 // values. The RFC says everything should be GMT, and in the worst case | |
| 914 // we are 24 hours off because of zone issues. | |
| 915 { "Sat, 15-Apr-17 21:01:22", true, 1492290082 }, | |
| 916 { "Sat, 15-Apr-17 21:01:22 GMT-2", true, 1492290082 }, | |
| 917 { "Sat, 15-Apr-17 21:01:22 GMT BLAH", true, 1492290082 }, | |
| 918 { "Sat, 15-Apr-17 21:01:22 GMT-0400", true, 1492290082 }, | |
| 919 { "Sat, 15-Apr-17 21:01:22 GMT-0400 (EDT)",true, 1492290082 }, | |
| 920 { "Sat, 15-Apr-17 21:01:22 DST", true, 1492290082 }, | |
| 921 { "Sat, 15-Apr-17 21:01:22 -0400", true, 1492290082 }, | |
| 922 { "Sat, 15-Apr-17 21:01:22 (hello there)", true, 1492290082 }, | |
| 923 // Test that if we encounter multiple : fields, that we take the first | |
| 924 // that correctly parses. | |
| 925 { "Sat, 15-Apr-17 21:01:22 11:22:33", true, 1492290082 }, | |
| 926 { "Sat, 15-Apr-17 ::00 21:01:22", true, 1492290082 }, | |
| 927 { "Sat, 15-Apr-17 boink:z 21:01:22", true, 1492290082 }, | |
| 928 // We take the first, which in this case is invalid. | |
| 929 { "Sat, 15-Apr-17 91:22:33 21:01:22", false, 0 }, | |
| 930 // amazon.com formats their cookie expiration like this. | |
| 931 { "Thu Apr 18 22:50:12 2007 GMT", true, 1176936612 }, | |
| 932 // Test that hh:mm:ss can occur anywhere. | |
| 933 { "22:50:12 Thu Apr 18 2007 GMT", true, 1176936612 }, | |
| 934 { "Thu 22:50:12 Apr 18 2007 GMT", true, 1176936612 }, | |
| 935 { "Thu Apr 22:50:12 18 2007 GMT", true, 1176936612 }, | |
| 936 { "Thu Apr 18 22:50:12 2007 GMT", true, 1176936612 }, | |
| 937 { "Thu Apr 18 2007 22:50:12 GMT", true, 1176936612 }, | |
| 938 { "Thu Apr 18 2007 GMT 22:50:12", true, 1176936612 }, | |
| 939 // Test that the day and year can be anywhere if they are unambigious. | |
| 940 { "Sat, 15-Apr-17 21:01:22 GMT", true, 1492290082 }, | |
| 941 { "15-Sat, Apr-17 21:01:22 GMT", true, 1492290082 }, | |
| 942 { "15-Sat, Apr 21:01:22 GMT 17", true, 1492290082 }, | |
| 943 { "15-Sat, Apr 21:01:22 GMT 2017", true, 1492290082 }, | |
| 944 { "15 Apr 21:01:22 2017", true, 1492290082 }, | |
| 945 { "15 17 Apr 21:01:22", true, 1492290082 }, | |
| 946 { "Apr 15 17 21:01:22", true, 1492290082 }, | |
| 947 { "Apr 15 21:01:22 17", true, 1492290082 }, | |
| 948 { "2017 April 15 21:01:22", true, 1492290082 }, | |
| 949 { "15 April 2017 21:01:22", true, 1492290082 }, | |
| 950 // Some invalid dates | |
| 951 { "98 April 17 21:01:22", false, 0 }, | |
| 952 { "Thu, 012-Aug-2008 20:49:07 GMT", false, 0 }, | |
| 953 { "Thu, 12-Aug-31841 20:49:07 GMT", false, 0 }, | |
| 954 { "Thu, 12-Aug-9999999999 20:49:07 GMT", false, 0 }, | |
| 955 { "Thu, 999999999999-Aug-2007 20:49:07 GMT", false, 0 }, | |
| 956 { "Thu, 12-Aug-2007 20:61:99999999999 GMT", false, 0 }, | |
| 957 { "IAintNoDateFool", false, 0 }, | |
| 958 }; | |
| 959 | |
| 960 Time parsed_time; | |
| 961 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | |
| 962 parsed_time = CookieMonster::ParseCookieTime(tests[i].str); | |
| 963 if (!tests[i].valid) { | |
| 964 EXPECT_FALSE(!parsed_time.is_null()) << tests[i].str; | |
| 965 continue; | |
| 966 } | |
| 967 EXPECT_TRUE(!parsed_time.is_null()) << tests[i].str; | |
| 968 EXPECT_EQ(tests[i].epoch, parsed_time.ToTimeT()) << tests[i].str; | |
| 969 } | |
| 970 } | |
| 971 | |
| 972 TEST_F(CookieMonsterTest, TestCookieDeleteAll) { | 882 TEST_F(CookieMonsterTest, TestCookieDeleteAll) { |
| 973 scoped_refptr<MockPersistentCookieStore> store( | 883 scoped_refptr<MockPersistentCookieStore> store( |
| 974 new MockPersistentCookieStore); | 884 new MockPersistentCookieStore); |
| 975 scoped_refptr<CookieMonster> cm(new CookieMonster(store, NULL)); | 885 scoped_refptr<CookieMonster> cm(new CookieMonster(store, NULL)); |
| 976 CookieOptions options; | 886 CookieOptions options; |
| 977 options.set_include_httponly(); | 887 options.set_include_httponly(); |
| 978 | 888 |
| 979 EXPECT_TRUE(SetCookie(cm, url_google_, kValidCookieLine)); | 889 EXPECT_TRUE(SetCookie(cm, url_google_, kValidCookieLine)); |
| 980 EXPECT_EQ("A=B", GetCookies(cm, url_google_)); | 890 EXPECT_EQ("A=B", GetCookies(cm, url_google_)); |
| 981 | 891 |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1285 // This is a regression test for: http://crbug.com/17855. | 1195 // This is a regression test for: http://crbug.com/17855. |
| 1286 TEST_F(CookieMonsterTest, DontImportDuplicateCookies) { | 1196 TEST_F(CookieMonsterTest, DontImportDuplicateCookies) { |
| 1287 scoped_refptr<MockPersistentCookieStore> store( | 1197 scoped_refptr<MockPersistentCookieStore> store( |
| 1288 new MockPersistentCookieStore); | 1198 new MockPersistentCookieStore); |
| 1289 | 1199 |
| 1290 // We will fill some initial cookies into the PersistentCookieStore, | 1200 // We will fill some initial cookies into the PersistentCookieStore, |
| 1291 // to simulate a database with 4 duplicates. Note that we need to | 1201 // to simulate a database with 4 duplicates. Note that we need to |
| 1292 // be careful not to have any duplicate creation times at all (as it's a | 1202 // be careful not to have any duplicate creation times at all (as it's a |
| 1293 // violation of a CookieMonster invariant) even if Time::Now() doesn't | 1203 // violation of a CookieMonster invariant) even if Time::Now() doesn't |
| 1294 // move between calls. | 1204 // move between calls. |
| 1295 std::vector<CookieMonster::CanonicalCookie*> initial_cookies; | 1205 std::vector<CanonicalCookie*> initial_cookies; |
| 1296 | 1206 |
| 1297 // Insert 4 cookies with name "X" on path "/", with varying creation | 1207 // Insert 4 cookies with name "X" on path "/", with varying creation |
| 1298 // dates. We expect only the most recent one to be preserved following | 1208 // dates. We expect only the most recent one to be preserved following |
| 1299 // the import. | 1209 // the import. |
| 1300 | 1210 |
| 1301 AddCookieToList("www.google.com", | 1211 AddCookieToList("www.google.com", |
| 1302 "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT", | 1212 "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT", |
| 1303 Time::Now() + TimeDelta::FromDays(3), | 1213 Time::Now() + TimeDelta::FromDays(3), |
| 1304 &initial_cookies); | 1214 &initial_cookies); |
| 1305 | 1215 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1370 scoped_refptr<MockPersistentCookieStore> store( | 1280 scoped_refptr<MockPersistentCookieStore> store( |
| 1371 new MockPersistentCookieStore); | 1281 new MockPersistentCookieStore); |
| 1372 | 1282 |
| 1373 Time now(Time::Now()); | 1283 Time now(Time::Now()); |
| 1374 Time earlier(now - TimeDelta::FromDays(1)); | 1284 Time earlier(now - TimeDelta::FromDays(1)); |
| 1375 | 1285 |
| 1376 // Insert 8 cookies, four with the current time as creation times, and | 1286 // Insert 8 cookies, four with the current time as creation times, and |
| 1377 // four with the earlier time as creation times. We should only get | 1287 // four with the earlier time as creation times. We should only get |
| 1378 // two cookies remaining, but which two (other than that there should | 1288 // two cookies remaining, but which two (other than that there should |
| 1379 // be one from each set) will be random. | 1289 // be one from each set) will be random. |
| 1380 std::vector<CookieMonster::CanonicalCookie*> initial_cookies; | 1290 std::vector<CanonicalCookie*> initial_cookies; |
| 1381 AddCookieToList("www.google.com", "X=1; path=/", now, &initial_cookies); | 1291 AddCookieToList("www.google.com", "X=1; path=/", now, &initial_cookies); |
| 1382 AddCookieToList("www.google.com", "X=2; path=/", now, &initial_cookies); | 1292 AddCookieToList("www.google.com", "X=2; path=/", now, &initial_cookies); |
| 1383 AddCookieToList("www.google.com", "X=3; path=/", now, &initial_cookies); | 1293 AddCookieToList("www.google.com", "X=3; path=/", now, &initial_cookies); |
| 1384 AddCookieToList("www.google.com", "X=4; path=/", now, &initial_cookies); | 1294 AddCookieToList("www.google.com", "X=4; path=/", now, &initial_cookies); |
| 1385 | 1295 |
| 1386 AddCookieToList("www.google.com", "Y=1; path=/", earlier, &initial_cookies); | 1296 AddCookieToList("www.google.com", "Y=1; path=/", earlier, &initial_cookies); |
| 1387 AddCookieToList("www.google.com", "Y=2; path=/", earlier, &initial_cookies); | 1297 AddCookieToList("www.google.com", "Y=2; path=/", earlier, &initial_cookies); |
| 1388 AddCookieToList("www.google.com", "Y=3; path=/", earlier, &initial_cookies); | 1298 AddCookieToList("www.google.com", "Y=3; path=/", earlier, &initial_cookies); |
| 1389 AddCookieToList("www.google.com", "Y=4; path=/", earlier, &initial_cookies); | 1299 AddCookieToList("www.google.com", "Y=4; path=/", earlier, &initial_cookies); |
| 1390 | 1300 |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1651 | 1561 |
| 1652 SetCookieWithDetails(cm, url_google_, "setCookieWithDetails1", "A", | 1562 SetCookieWithDetails(cm, url_google_, "setCookieWithDetails1", "A", |
| 1653 ".google.com", "/", Time(), false, false); | 1563 ".google.com", "/", Time(), false, false); |
| 1654 SetCookieWithDetails(cm, url_google_, "setCookieWithDetails2", "A", | 1564 SetCookieWithDetails(cm, url_google_, "setCookieWithDetails2", "A", |
| 1655 ".google.com", "/", Time(), false, false); | 1565 ".google.com", "/", Time(), false, false); |
| 1656 SetCookieWithDetails(cm, url_google_, "setCookieWithDetails3", "A", | 1566 SetCookieWithDetails(cm, url_google_, "setCookieWithDetails3", "A", |
| 1657 ".google.com", "/", Time(), false, false); | 1567 ".google.com", "/", Time(), false, false); |
| 1658 | 1568 |
| 1659 // Now we check | 1569 // Now we check |
| 1660 CookieList cookie_list(GetAllCookies(cm)); | 1570 CookieList cookie_list(GetAllCookies(cm)); |
| 1661 typedef std::map<int64, CookieMonster::CanonicalCookie> TimeCookieMap; | 1571 typedef std::map<int64, CanonicalCookie> TimeCookieMap; |
| 1662 TimeCookieMap check_map; | 1572 TimeCookieMap check_map; |
| 1663 for (CookieList::const_iterator it = cookie_list.begin(); | 1573 for (CookieList::const_iterator it = cookie_list.begin(); |
| 1664 it != cookie_list.end(); it++) { | 1574 it != cookie_list.end(); it++) { |
| 1665 const int64 creation_date = it->CreationDate().ToInternalValue(); | 1575 const int64 creation_date = it->CreationDate().ToInternalValue(); |
| 1666 TimeCookieMap::const_iterator | 1576 TimeCookieMap::const_iterator |
| 1667 existing_cookie_it(check_map.find(creation_date)); | 1577 existing_cookie_it(check_map.find(creation_date)); |
| 1668 EXPECT_TRUE(existing_cookie_it == check_map.end()) | 1578 EXPECT_TRUE(existing_cookie_it == check_map.end()) |
| 1669 << "Cookie " << it->Name() << " has same creation date (" | 1579 << "Cookie " << it->Name() << " has same creation date (" |
| 1670 << it->CreationDate().ToInternalValue() | 1580 << it->CreationDate().ToInternalValue() |
| 1671 << ") as previously entered cookie " | 1581 << ") as previously entered cookie " |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1751 { | 1661 { |
| 1752 scoped_refptr<CookieMonster> cmin(new CookieMonster(store, NULL)); | 1662 scoped_refptr<CookieMonster> cmin(new CookieMonster(store, NULL)); |
| 1753 CookieList cookies(GetAllCookies(cmin)); | 1663 CookieList cookies(GetAllCookies(cmin)); |
| 1754 ASSERT_EQ(2u, cookies.size()); | 1664 ASSERT_EQ(2u, cookies.size()); |
| 1755 // Ordering is path length, then creation time. So second cookie | 1665 // Ordering is path length, then creation time. So second cookie |
| 1756 // will come first, and we need to swap them. | 1666 // will come first, and we need to swap them. |
| 1757 std::swap(cookies[0], cookies[1]); | 1667 std::swap(cookies[0], cookies[1]); |
| 1758 for (int output_index = 0; output_index < 2; output_index++) { | 1668 for (int output_index = 0; output_index < 2; output_index++) { |
| 1759 int input_index = output_index * 2; | 1669 int input_index = output_index * 2; |
| 1760 const CookiesInputInfo* input = &input_info[input_index]; | 1670 const CookiesInputInfo* input = &input_info[input_index]; |
| 1761 const CookieMonster::CanonicalCookie* output = &cookies[output_index]; | 1671 const CanonicalCookie* output = &cookies[output_index]; |
| 1762 | 1672 |
| 1763 EXPECT_EQ(input->name, output->Name()); | 1673 EXPECT_EQ(input->name, output->Name()); |
| 1764 EXPECT_EQ(input->value, output->Value()); | 1674 EXPECT_EQ(input->value, output->Value()); |
| 1765 EXPECT_EQ(GURL(input->gurl).host(), output->Domain()); | 1675 EXPECT_EQ(GURL(input->gurl).host(), output->Domain()); |
| 1766 EXPECT_EQ(input->path, output->Path()); | 1676 EXPECT_EQ(input->path, output->Path()); |
| 1767 EXPECT_LE(current.ToInternalValue(), | 1677 EXPECT_LE(current.ToInternalValue(), |
| 1768 output->CreationDate().ToInternalValue()); | 1678 output->CreationDate().ToInternalValue()); |
| 1769 EXPECT_EQ(input->secure, output->IsSecure()); | 1679 EXPECT_EQ(input->secure, output->IsSecure()); |
| 1770 EXPECT_EQ(input->http_only, output->IsHttpOnly()); | 1680 EXPECT_EQ(input->http_only, output->IsHttpOnly()); |
| 1771 EXPECT_TRUE(output->IsPersistent()); | 1681 EXPECT_TRUE(output->IsPersistent()); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1926 } | 1836 } |
| 1927 | 1837 |
| 1928 namespace { | 1838 namespace { |
| 1929 | 1839 |
| 1930 // Mock PersistentCookieStore that keeps track of the number of Flush() calls. | 1840 // Mock PersistentCookieStore that keeps track of the number of Flush() calls. |
| 1931 class FlushablePersistentStore : public CookieMonster::PersistentCookieStore { | 1841 class FlushablePersistentStore : public CookieMonster::PersistentCookieStore { |
| 1932 public: | 1842 public: |
| 1933 FlushablePersistentStore() : flush_count_(0) {} | 1843 FlushablePersistentStore() : flush_count_(0) {} |
| 1934 | 1844 |
| 1935 void Load(const LoadedCallback& loaded_callback) { | 1845 void Load(const LoadedCallback& loaded_callback) { |
| 1936 std::vector<CookieMonster::CanonicalCookie*> out_cookies; | 1846 std::vector<CanonicalCookie*> out_cookies; |
| 1937 MessageLoop::current()->PostTask(FROM_HERE, | 1847 MessageLoop::current()->PostTask(FROM_HERE, |
| 1938 base::Bind(&net::LoadedCallbackTask::Run, | 1848 base::Bind(&net::LoadedCallbackTask::Run, |
| 1939 new net::LoadedCallbackTask(loaded_callback, out_cookies))); | 1849 new net::LoadedCallbackTask(loaded_callback, out_cookies))); |
| 1940 } | 1850 } |
| 1941 | 1851 |
| 1942 void LoadCookiesForKey(const std::string& key, | 1852 void LoadCookiesForKey(const std::string& key, |
| 1943 const LoadedCallback& loaded_callback) { | 1853 const LoadedCallback& loaded_callback) { |
| 1944 Load(loaded_callback); | 1854 Load(loaded_callback); |
| 1945 } | 1855 } |
| 1946 | 1856 |
| 1947 void AddCookie(const CookieMonster::CanonicalCookie&) {} | 1857 void AddCookie(const CanonicalCookie&) {} |
| 1948 void UpdateCookieAccessTime(const CookieMonster::CanonicalCookie&) {} | 1858 void UpdateCookieAccessTime(const CanonicalCookie&) {} |
| 1949 void DeleteCookie(const CookieMonster::CanonicalCookie&) {} | 1859 void DeleteCookie(const CanonicalCookie&) {} |
| 1950 void SetForceKeepSessionState() {} | 1860 void SetForceKeepSessionState() {} |
| 1951 | 1861 |
| 1952 void Flush(const base::Closure& callback) { | 1862 void Flush(const base::Closure& callback) { |
| 1953 ++flush_count_; | 1863 ++flush_count_; |
| 1954 if (!callback.is_null()) | 1864 if (!callback.is_null()) |
| 1955 callback.Run(); | 1865 callback.Run(); |
| 1956 } | 1866 } |
| 1957 | 1867 |
| 1958 int flush_count() { | 1868 int flush_count() { |
| 1959 return flush_count_; | 1869 return flush_count_; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2032 MessageLoop::current()->RunAllPending(); | 1942 MessageLoop::current()->RunAllPending(); |
| 2033 | 1943 |
| 2034 ASSERT_EQ(2, counter->callback_count()); | 1944 ASSERT_EQ(2, counter->callback_count()); |
| 2035 | 1945 |
| 2036 cm->FlushStore(base::Bind(&CallbackCounter::Callback, counter.get())); | 1946 cm->FlushStore(base::Bind(&CallbackCounter::Callback, counter.get())); |
| 2037 MessageLoop::current()->RunAllPending(); | 1947 MessageLoop::current()->RunAllPending(); |
| 2038 | 1948 |
| 2039 ASSERT_EQ(3, counter->callback_count()); | 1949 ASSERT_EQ(3, counter->callback_count()); |
| 2040 } | 1950 } |
| 2041 | 1951 |
| 2042 TEST_F(CookieMonsterTest, GetCookieSourceFromURL) { | |
| 2043 EXPECT_EQ("http://example.com/", | |
| 2044 CookieMonster::CanonicalCookie::GetCookieSourceFromURL( | |
| 2045 GURL("http://example.com"))); | |
| 2046 EXPECT_EQ("http://example.com/", | |
| 2047 CookieMonster::CanonicalCookie::GetCookieSourceFromURL( | |
| 2048 GURL("http://example.com/"))); | |
| 2049 EXPECT_EQ("http://example.com/", | |
| 2050 CookieMonster::CanonicalCookie::GetCookieSourceFromURL( | |
| 2051 GURL("http://example.com/test"))); | |
| 2052 EXPECT_EQ("file:///tmp/test.html", | |
| 2053 CookieMonster::CanonicalCookie::GetCookieSourceFromURL( | |
| 2054 GURL("file:///tmp/test.html"))); | |
| 2055 EXPECT_EQ("http://example.com/", | |
| 2056 CookieMonster::CanonicalCookie::GetCookieSourceFromURL( | |
| 2057 GURL("http://example.com:1234/"))); | |
| 2058 EXPECT_EQ("http://example.com/", | |
| 2059 CookieMonster::CanonicalCookie::GetCookieSourceFromURL( | |
| 2060 GURL("https://example.com/"))); | |
| 2061 EXPECT_EQ("http://example.com/", | |
| 2062 CookieMonster::CanonicalCookie::GetCookieSourceFromURL( | |
| 2063 GURL("http://user:pwd@example.com/"))); | |
| 2064 EXPECT_EQ("http://example.com/", | |
| 2065 CookieMonster::CanonicalCookie::GetCookieSourceFromURL( | |
| 2066 GURL("http://example.com/test?foo"))); | |
| 2067 EXPECT_EQ("http://example.com/", | |
| 2068 CookieMonster::CanonicalCookie::GetCookieSourceFromURL( | |
| 2069 GURL("http://example.com/test#foo"))); | |
| 2070 } | |
| 2071 | |
| 2072 TEST_F(CookieMonsterTest, HistogramCheck) { | 1952 TEST_F(CookieMonsterTest, HistogramCheck) { |
| 2073 scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL)); | 1953 scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL)); |
| 2074 // Should match call in InitializeHistograms, but doesn't really matter | 1954 // Should match call in InitializeHistograms, but doesn't really matter |
| 2075 // since the histogram should have been initialized by the CM construction | 1955 // since the histogram should have been initialized by the CM construction |
| 2076 // above. | 1956 // above. |
| 2077 base::Histogram* expired_histogram = | 1957 base::Histogram* expired_histogram = |
| 2078 base::Histogram::FactoryGet( | 1958 base::Histogram::FactoryGet( |
| 2079 "Cookie.ExpirationDurationMinutes", 1, 10 * 365 * 24 * 60, 50, | 1959 "Cookie.ExpirationDurationMinutes", 1, 10 * 365 * 24 * 60, 50, |
| 2080 base::Histogram::kUmaTargetedHistogramFlag); | 1960 base::Histogram::kUmaTargetedHistogramFlag); |
| 2081 | 1961 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2163 | 2043 |
| 2164 void DeleteAllForHostTask(CookieMonster* cm, | 2044 void DeleteAllForHostTask(CookieMonster* cm, |
| 2165 const GURL& url, | 2045 const GURL& url, |
| 2166 DeleteCallback* callback) { | 2046 DeleteCallback* callback) { |
| 2167 cm->DeleteAllForHostAsync( | 2047 cm->DeleteAllForHostAsync( |
| 2168 url, | 2048 url, |
| 2169 base::Bind(&DeleteCallback::Run, base::Unretained(callback))); | 2049 base::Bind(&DeleteCallback::Run, base::Unretained(callback))); |
| 2170 } | 2050 } |
| 2171 | 2051 |
| 2172 void DeleteCanonicalCookieTask(CookieMonster* cm, | 2052 void DeleteCanonicalCookieTask(CookieMonster* cm, |
| 2173 const CookieMonster::CanonicalCookie& cookie, | 2053 const CanonicalCookie& cookie, |
| 2174 SetCookieCallback* callback) { | 2054 SetCookieCallback* callback) { |
| 2175 cm->DeleteCanonicalCookieAsync( | 2055 cm->DeleteCanonicalCookieAsync( |
| 2176 cookie, | 2056 cookie, |
| 2177 base::Bind(&SetCookieCallback::Run, base::Unretained(callback))); | 2057 base::Bind(&SetCookieCallback::Run, base::Unretained(callback))); |
| 2178 } | 2058 } |
| 2179 | 2059 |
| 2180 protected: | 2060 protected: |
| 2181 void RunOnOtherThread(const base::Closure& task) { | 2061 void RunOnOtherThread(const base::Closure& task) { |
| 2182 other_thread_.Start(); | 2062 other_thread_.Start(); |
| 2183 other_thread_.message_loop()->PostTask(FROM_HERE, task); | 2063 other_thread_.message_loop()->PostTask(FROM_HERE, task); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2329 &net::MultiThreadedCookieMonsterTest::DeleteCanonicalCookieTask, | 2209 &net::MultiThreadedCookieMonsterTest::DeleteCanonicalCookieTask, |
| 2330 base::Unretained(this), | 2210 base::Unretained(this), |
| 2331 cm, *it, &callback); | 2211 cm, *it, &callback); |
| 2332 RunOnOtherThread(task); | 2212 RunOnOtherThread(task); |
| 2333 EXPECT_TRUE(callback.did_run()); | 2213 EXPECT_TRUE(callback.did_run()); |
| 2334 EXPECT_TRUE(callback.result()); | 2214 EXPECT_TRUE(callback.result()); |
| 2335 } | 2215 } |
| 2336 | 2216 |
| 2337 TEST_F(CookieMonsterTest, InvalidExpiryTime) { | 2217 TEST_F(CookieMonsterTest, InvalidExpiryTime) { |
| 2338 ParsedCookie pc(std::string(kValidCookieLine) + "; expires=Blarg arg arg"); | 2218 ParsedCookie pc(std::string(kValidCookieLine) + "; expires=Blarg arg arg"); |
| 2339 scoped_ptr<CookieMonster::CanonicalCookie> cookie( | 2219 scoped_ptr<CanonicalCookie> cookie(CanonicalCookie::Create(url_google_, pc)); |
| 2340 CookieMonster::CanonicalCookie::Create(url_google_, pc)); | |
| 2341 | 2220 |
| 2342 #if defined(ENABLE_PERSISTENT_SESSION_COOKIES) | 2221 #if defined(ENABLE_PERSISTENT_SESSION_COOKIES) |
| 2343 ASSERT_TRUE(cookie->IsPersistent()); | 2222 ASSERT_TRUE(cookie->IsPersistent()); |
| 2344 #else | 2223 #else |
| 2345 ASSERT_FALSE(cookie->IsPersistent()); | 2224 ASSERT_FALSE(cookie->IsPersistent()); |
| 2346 #endif | 2225 #endif |
| 2347 } | 2226 } |
| 2348 | 2227 |
| 2349 // Test that CookieMonster writes session cookies into the underlying | 2228 // Test that CookieMonster writes session cookies into the underlying |
| 2350 // CookieStore if the "persist session cookies" option is on. | 2229 // CookieStore if the "persist session cookies" option is on. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2421 EXPECT_TRUE(SetCookie(cm, url_google_, "B=Bar")); | 2300 EXPECT_TRUE(SetCookie(cm, url_google_, "B=Bar")); |
| 2422 this->MatchCookieLines("A=Foo; B=Bar", GetCookies(cm, url_google_)); | 2301 this->MatchCookieLines("A=Foo; B=Bar", GetCookies(cm, url_google_)); |
| 2423 #if defined(ENABLE_PERSISTENT_SESSION_COOKIES) | 2302 #if defined(ENABLE_PERSISTENT_SESSION_COOKIES) |
| 2424 EXPECT_EQ(6u, store->commands().size()); | 2303 EXPECT_EQ(6u, store->commands().size()); |
| 2425 #else | 2304 #else |
| 2426 EXPECT_EQ(5u, store->commands().size()); | 2305 EXPECT_EQ(5u, store->commands().size()); |
| 2427 #endif | 2306 #endif |
| 2428 } | 2307 } |
| 2429 | 2308 |
| 2430 } // namespace net | 2309 } // namespace net |
| OLD | NEW |