| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <time.h> | 5 #include <time.h> |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/platform_thread.h" | 10 #include "base/platform_thread.h" |
| 11 #include "base/ref_counted.h" | 11 #include "base/ref_counted.h" |
| 12 #include "base/scoped_ptr.h" | 12 #include "base/scoped_ptr.h" |
| 13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 14 #include "base/time.h" | 14 #include "base/time.h" |
| 15 #include "googleurl/src/gurl.h" | 15 #include "googleurl/src/gurl.h" |
| 16 #include "net/base/cookie_monster.h" | 16 #include "net/base/cookie_monster.h" |
| 17 #include "net/base/cookie_monster_store_test.h" // For CookieStore Mock |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 19 |
| 20 namespace net { |
| 21 |
| 19 using base::Time; | 22 using base::Time; |
| 20 using base::TimeDelta; | 23 using base::TimeDelta; |
| 21 | 24 |
| 22 namespace { | 25 namespace { |
| 23 | 26 |
| 24 class ParsedCookieTest : public testing::Test { }; | 27 class ParsedCookieTest : public testing::Test { }; |
| 25 class CookieMonsterTest : public testing::Test { }; | 28 class CookieMonsterTest : public testing::Test { }; |
| 26 | 29 |
| 27 // Describes a call to one of the 3 functions of PersistentCookieStore. | |
| 28 struct CookieStoreCommand { | |
| 29 enum Type { | |
| 30 ADD, | |
| 31 UPDATE_ACCESS_TIME, | |
| 32 REMOVE, | |
| 33 }; | |
| 34 | |
| 35 CookieStoreCommand(Type type, | |
| 36 const std::string& key, | |
| 37 const net::CookieMonster::CanonicalCookie& cookie) | |
| 38 : type(type), key(key), cookie(cookie) {} | |
| 39 | |
| 40 Type type; | |
| 41 std::string key; // Only applicable to the ADD command. | |
| 42 net::CookieMonster::CanonicalCookie cookie; | |
| 43 }; | |
| 44 | |
| 45 // Implementation of PersistentCookieStore that captures the | |
| 46 // received commands and saves them to a list. | |
| 47 // The result of calls to Load() can be configured using SetLoadExpectation(). | |
| 48 class MockPersistentCookieStore | |
| 49 : public net::CookieMonster::PersistentCookieStore { | |
| 50 public: | |
| 51 typedef std::vector<CookieStoreCommand> CommandList; | |
| 52 | |
| 53 MockPersistentCookieStore() : load_return_value_(true) { | |
| 54 } | |
| 55 | |
| 56 virtual bool Load( | |
| 57 std::vector<net::CookieMonster::KeyedCanonicalCookie>* out_cookies) { | |
| 58 bool ok = load_return_value_; | |
| 59 if (ok) | |
| 60 *out_cookies = load_result_; | |
| 61 return ok; | |
| 62 } | |
| 63 | |
| 64 virtual void AddCookie(const std::string& key, | |
| 65 const net::CookieMonster::CanonicalCookie& cookie) { | |
| 66 commands_.push_back( | |
| 67 CookieStoreCommand(CookieStoreCommand::ADD, key, cookie)); | |
| 68 } | |
| 69 | |
| 70 virtual void UpdateCookieAccessTime( | |
| 71 const net::CookieMonster::CanonicalCookie& cookie) { | |
| 72 commands_.push_back(CookieStoreCommand( | |
| 73 CookieStoreCommand::UPDATE_ACCESS_TIME, std::string(), cookie)); | |
| 74 } | |
| 75 | |
| 76 virtual void DeleteCookie( | |
| 77 const net::CookieMonster::CanonicalCookie& cookie) { | |
| 78 commands_.push_back( | |
| 79 CookieStoreCommand(CookieStoreCommand::REMOVE, std::string(), cookie)); | |
| 80 } | |
| 81 | |
| 82 void SetLoadExpectation( | |
| 83 bool return_value, | |
| 84 const std::vector<net::CookieMonster::KeyedCanonicalCookie>& result) { | |
| 85 load_return_value_ = return_value; | |
| 86 load_result_ = result; | |
| 87 } | |
| 88 | |
| 89 const CommandList& commands() const { | |
| 90 return commands_; | |
| 91 } | |
| 92 | |
| 93 private: | |
| 94 CommandList commands_; | |
| 95 | |
| 96 // Deferred result to use when Load() is called. | |
| 97 bool load_return_value_; | |
| 98 std::vector<net::CookieMonster::KeyedCanonicalCookie> load_result_; | |
| 99 | |
| 100 DISALLOW_COPY_AND_ASSIGN(MockPersistentCookieStore); | |
| 101 }; | |
| 102 | |
| 103 // Mock for CookieMonster::Delegate | |
| 104 class MockCookieMonsterDelegate : public net::CookieMonster::Delegate { | |
| 105 public: | |
| 106 typedef std::pair<net::CookieMonster::CanonicalCookie, bool> | |
| 107 CookieNotification; | |
| 108 | |
| 109 MockCookieMonsterDelegate() {} | |
| 110 | |
| 111 virtual void OnCookieChanged( | |
| 112 const net::CookieMonster::CanonicalCookie& cookie, | |
| 113 bool removed) { | |
| 114 CookieNotification notification(cookie, removed); | |
| 115 changes_.push_back(notification); | |
| 116 } | |
| 117 | |
| 118 const std::vector<CookieNotification>& changes() const { return changes_; } | |
| 119 | |
| 120 void reset() { changes_.clear(); } | |
| 121 | |
| 122 private: | |
| 123 virtual ~MockCookieMonsterDelegate() {} | |
| 124 | |
| 125 std::vector<CookieNotification> changes_; | |
| 126 | |
| 127 DISALLOW_COPY_AND_ASSIGN(MockCookieMonsterDelegate); | |
| 128 }; | |
| 129 | |
| 130 // Helper to build a list of KeyedCanonicalCookies. | |
| 131 void AddKeyedCookieToList( | |
| 132 const std::string& key, | |
| 133 const std::string& cookie_line, | |
| 134 const Time& creation_time, | |
| 135 std::vector<net::CookieMonster::KeyedCanonicalCookie>* out_list) { | |
| 136 | |
| 137 // Parse the cookie line. | |
| 138 net::CookieMonster::ParsedCookie pc(cookie_line); | |
| 139 EXPECT_TRUE(pc.IsValid()); | |
| 140 | |
| 141 // This helper is simplistic in interpreting a parsed cookie, in order to | |
| 142 // avoid duplicated CookieMonster's CanonPath() and CanonExpiration() | |
| 143 // functions. Would be nice to export them, and re-use here. | |
| 144 EXPECT_FALSE(pc.HasMaxAge()); | |
| 145 EXPECT_TRUE(pc.HasPath()); | |
| 146 Time cookie_expires = pc.HasExpires() ? | |
| 147 net::CookieMonster::ParseCookieTime(pc.Expires()) : Time(); | |
| 148 std::string cookie_path = pc.Path(); | |
| 149 | |
| 150 scoped_ptr<net::CookieMonster::CanonicalCookie> cookie( | |
| 151 new net::CookieMonster::CanonicalCookie( | |
| 152 pc.Name(), pc.Value(), key, cookie_path, | |
| 153 pc.IsSecure(), pc.IsHttpOnly(), | |
| 154 creation_time, creation_time, | |
| 155 !cookie_expires.is_null(), | |
| 156 cookie_expires)); | |
| 157 | |
| 158 out_list->push_back( | |
| 159 net::CookieMonster::KeyedCanonicalCookie( | |
| 160 key, cookie.release())); | |
| 161 } | |
| 162 | |
| 163 // Helper for DeleteAllForHost test; repopulates CM with same layout | 30 // Helper for DeleteAllForHost test; repopulates CM with same layout |
| 164 // each time. | 31 // each time. |
| 165 const char* kTopLevelDomainPlus1 = "http://www.harvard.edu"; | 32 const char* kTopLevelDomainPlus1 = "http://www.harvard.edu"; |
| 166 const char* kTopLevelDomainPlus2 = "http://www.math.harvard.edu"; | 33 const char* kTopLevelDomainPlus2 = "http://www.math.harvard.edu"; |
| 167 const char* kTopLevelDomainPlus2Secure = "https://www.math.harvard.edu"; | 34 const char* kTopLevelDomainPlus2Secure = "https://www.math.harvard.edu"; |
| 168 const char* kTopLevelDomainPlus3 = | 35 const char* kTopLevelDomainPlus3 = |
| 169 "http://www.bourbaki.math.harvard.edu"; | 36 "http://www.bourbaki.math.harvard.edu"; |
| 170 const char* kOtherDomain = "http://www.mit.edu"; | 37 const char* kOtherDomain = "http://www.mit.edu"; |
| 171 | 38 |
| 172 void PopulateCmForDeleteAllForHost(scoped_refptr<net::CookieMonster> cm) { | 39 void PopulateCmForDeleteAllForHost(scoped_refptr<net::CookieMonster> cm) { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 EXPECT_TRUE(cm->SetCookieWithDetails(url_top_level_domain_plus_2, | 107 EXPECT_TRUE(cm->SetCookieWithDetails(url_top_level_domain_plus_2, |
| 241 "host_path_2", "X", | 108 "host_path_2", "X", |
| 242 "", "/dir1/dir2", | 109 "", "/dir1/dir2", |
| 243 base::Time(), false, false)); | 110 base::Time(), false, false)); |
| 244 | 111 |
| 245 EXPECT_EQ(13U, cm->GetAllCookies().size()); | 112 EXPECT_EQ(13U, cm->GetAllCookies().size()); |
| 246 } | 113 } |
| 247 | 114 |
| 248 } // namespace | 115 } // namespace |
| 249 | 116 |
| 250 | |
| 251 TEST(ParsedCookieTest, TestBasic) { | 117 TEST(ParsedCookieTest, TestBasic) { |
| 252 net::CookieMonster::ParsedCookie pc("a=b"); | 118 net::CookieMonster::ParsedCookie pc("a=b"); |
| 253 EXPECT_TRUE(pc.IsValid()); | 119 EXPECT_TRUE(pc.IsValid()); |
| 254 EXPECT_FALSE(pc.IsSecure()); | 120 EXPECT_FALSE(pc.IsSecure()); |
| 255 EXPECT_EQ("a", pc.Name()); | 121 EXPECT_EQ("a", pc.Name()); |
| 256 EXPECT_EQ("b", pc.Value()); | 122 EXPECT_EQ("b", pc.Value()); |
| 257 } | 123 } |
| 258 | 124 |
| 259 TEST(ParsedCookieTest, TestQuoted) { | 125 TEST(ParsedCookieTest, TestQuoted) { |
| 260 // These are some quoting cases which the major browsers all | 126 // These are some quoting cases which the major browsers all |
| (...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1483 // duplicate cookie (both from the in-memory cache, and from the backing store). | 1349 // duplicate cookie (both from the in-memory cache, and from the backing store). |
| 1484 // | 1350 // |
| 1485 // This is a regression test for: http://crbug.com/17855. | 1351 // This is a regression test for: http://crbug.com/17855. |
| 1486 TEST(CookieMonsterTest, DontImportDuplicateCookies) { | 1352 TEST(CookieMonsterTest, DontImportDuplicateCookies) { |
| 1487 GURL url_google("http://www.google.com/"); | 1353 GURL url_google("http://www.google.com/"); |
| 1488 | 1354 |
| 1489 scoped_refptr<MockPersistentCookieStore> store( | 1355 scoped_refptr<MockPersistentCookieStore> store( |
| 1490 new MockPersistentCookieStore); | 1356 new MockPersistentCookieStore); |
| 1491 | 1357 |
| 1492 // We will fill some initial cookies into the PersistentCookieStore, | 1358 // We will fill some initial cookies into the PersistentCookieStore, |
| 1493 // to simulate a database with 4 duplicates. | 1359 // to simulate a database with 4 duplicates. Note that we need to |
| 1360 // be careful not to have any duplicate creation times at all (as it's a |
| 1361 // violation of a CookieMonster invariant) even if Time::Now() doesn't |
| 1362 // move between calls. |
| 1494 std::vector<net::CookieMonster::KeyedCanonicalCookie> initial_cookies; | 1363 std::vector<net::CookieMonster::KeyedCanonicalCookie> initial_cookies; |
| 1495 | 1364 |
| 1496 // Insert 4 cookies with name "X" on path "/", with varying creation | 1365 // Insert 4 cookies with name "X" on path "/", with varying creation |
| 1497 // dates. We expect only the most recent one to be preserved following | 1366 // dates. We expect only the most recent one to be preserved following |
| 1498 // the import. | 1367 // the import. |
| 1499 | 1368 |
| 1500 AddKeyedCookieToList("www.google.com", | 1369 AddKeyedCookieToList("www.google.com", |
| 1501 "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT", | 1370 "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT", |
| 1502 Time::Now() + TimeDelta::FromDays(3), | 1371 Time::Now() + TimeDelta::FromDays(3), |
| 1503 &initial_cookies); | 1372 &initial_cookies); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1522 // dates. We expect only the most recent one to be preserved the import. | 1391 // dates. We expect only the most recent one to be preserved the import. |
| 1523 | 1392 |
| 1524 // ===> This one is the WINNER (biggest creation time). <==== | 1393 // ===> This one is the WINNER (biggest creation time). <==== |
| 1525 AddKeyedCookieToList("www.google.com", | 1394 AddKeyedCookieToList("www.google.com", |
| 1526 "X=a1; path=/2; expires=Mon, 18-Apr-22 22:50:14 GMT", | 1395 "X=a1; path=/2; expires=Mon, 18-Apr-22 22:50:14 GMT", |
| 1527 Time::Now() + TimeDelta::FromDays(9), | 1396 Time::Now() + TimeDelta::FromDays(9), |
| 1528 &initial_cookies); | 1397 &initial_cookies); |
| 1529 | 1398 |
| 1530 AddKeyedCookieToList("www.google.com", | 1399 AddKeyedCookieToList("www.google.com", |
| 1531 "X=a2; path=/2; expires=Mon, 18-Apr-22 22:50:14 GMT", | 1400 "X=a2; path=/2; expires=Mon, 18-Apr-22 22:50:14 GMT", |
| 1532 Time::Now() + TimeDelta::FromDays(1), | 1401 Time::Now() + TimeDelta::FromDays(2), |
| 1533 &initial_cookies); | 1402 &initial_cookies); |
| 1534 | 1403 |
| 1535 // Insert 1 cookie with name "Y" on path "/". | 1404 // Insert 1 cookie with name "Y" on path "/". |
| 1536 AddKeyedCookieToList("www.google.com", | 1405 AddKeyedCookieToList("www.google.com", |
| 1537 "Y=a; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT", | 1406 "Y=a; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT", |
| 1538 Time::Now() + TimeDelta::FromDays(9), | 1407 Time::Now() + TimeDelta::FromDays(10), |
| 1539 &initial_cookies); | 1408 &initial_cookies); |
| 1540 | 1409 |
| 1541 // Inject our initial cookies into the mock PersistentCookieStore. | 1410 // Inject our initial cookies into the mock PersistentCookieStore. |
| 1542 store->SetLoadExpectation(true, initial_cookies); | 1411 store->SetLoadExpectation(true, initial_cookies); |
| 1543 | 1412 |
| 1544 scoped_refptr<net::CookieMonster> cm(new net::CookieMonster(store, NULL)); | 1413 scoped_refptr<net::CookieMonster> cm(new net::CookieMonster(store, NULL)); |
| 1545 | 1414 |
| 1546 // Verify that duplicates were not imported for path "/". | 1415 // Verify that duplicates were not imported for path "/". |
| 1547 // (If this had failed, GetCookies() would have also returned X=1, X=2, X=4). | 1416 // (If this had failed, GetCookies() would have also returned X=1, X=2, X=4). |
| 1548 EXPECT_EQ("X=3; Y=a", cm->GetCookies(GURL("http://www.google.com/"))); | 1417 EXPECT_EQ("X=3; Y=a", cm->GetCookies(GURL("http://www.google.com/"))); |
| 1549 | 1418 |
| 1550 // Verify that same-named cookie on a different path ("/x2") didn't get | 1419 // Verify that same-named cookie on a different path ("/x2") didn't get |
| 1551 // messed up. | 1420 // messed up. |
| 1552 EXPECT_EQ("X=a1; X=3; Y=a", | 1421 EXPECT_EQ("X=a1; X=3; Y=a", |
| 1553 cm->GetCookies(GURL("http://www.google.com/2/x"))); | 1422 cm->GetCookies(GURL("http://www.google.com/2/x"))); |
| 1554 | 1423 |
| 1555 // Verify that the PersistentCookieStore was told to kill its 4 duplicates. | 1424 // Verify that the PersistentCookieStore was told to kill its 4 duplicates. |
| 1556 ASSERT_EQ(4u, store->commands().size()); | 1425 ASSERT_EQ(4u, store->commands().size()); |
| 1557 EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[0].type); | 1426 EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[0].type); |
| 1558 EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[1].type); | 1427 EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[1].type); |
| 1559 EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[2].type); | 1428 EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[2].type); |
| 1560 EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[3].type); | 1429 EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[3].type); |
| 1561 } | 1430 } |
| 1562 | 1431 |
| 1432 // Tests importing from a persistent cookie store that contains cookies |
| 1433 // with duplicate creation times. This situation should be handled by |
| 1434 // dropping the cookies before insertion/visibility to user. |
| 1435 // |
| 1436 // This is a regression test for: http://crbug.com/43188. |
| 1437 TEST(CookieMonsterTest, DontImportDuplicateCreationTimes) { |
| 1438 GURL url_google("http://www.google.com/"); |
| 1439 |
| 1440 scoped_refptr<MockPersistentCookieStore> store( |
| 1441 new MockPersistentCookieStore); |
| 1442 |
| 1443 Time now(Time::Now()); |
| 1444 Time earlier(now - TimeDelta::FromDays(1)); |
| 1445 |
| 1446 // Insert 8 cookies, four with the current time as creation times, and |
| 1447 // four with the earlier time as creation times. We should only get |
| 1448 // two cookies remaining, but which two (other than that there should |
| 1449 // be one from each set) will be random. |
| 1450 std::vector<net::CookieMonster::KeyedCanonicalCookie> initial_cookies; |
| 1451 AddKeyedCookieToList("www.google.com", |
| 1452 "X=1; path=/", |
| 1453 now, |
| 1454 &initial_cookies); |
| 1455 AddKeyedCookieToList("www.google.com", |
| 1456 "X=2; path=/", |
| 1457 now, |
| 1458 &initial_cookies); |
| 1459 AddKeyedCookieToList("www.google.com", |
| 1460 "X=3; path=/", |
| 1461 now, |
| 1462 &initial_cookies); |
| 1463 AddKeyedCookieToList("www.google.com", |
| 1464 "X=4; path=/", |
| 1465 now, |
| 1466 &initial_cookies); |
| 1467 |
| 1468 AddKeyedCookieToList("www.google.com", |
| 1469 "Y=1; path=/", |
| 1470 earlier, |
| 1471 &initial_cookies); |
| 1472 AddKeyedCookieToList("www.google.com", |
| 1473 "Y=2; path=/", |
| 1474 earlier, |
| 1475 &initial_cookies); |
| 1476 AddKeyedCookieToList("www.google.com", |
| 1477 "Y=3; path=/", |
| 1478 earlier, |
| 1479 &initial_cookies); |
| 1480 AddKeyedCookieToList("www.google.com", |
| 1481 "Y=4; path=/", |
| 1482 earlier, |
| 1483 &initial_cookies); |
| 1484 |
| 1485 // Inject our initial cookies into the mock PersistentCookieStore. |
| 1486 store->SetLoadExpectation(true, initial_cookies); |
| 1487 |
| 1488 scoped_refptr<net::CookieMonster> cm(new net::CookieMonster(store, NULL)); |
| 1489 |
| 1490 net::CookieMonster::CookieList list(cm->GetAllCookies()); |
| 1491 EXPECT_EQ(2U, list.size()); |
| 1492 // Confirm that we have one of each. |
| 1493 std::string name1(list[0].Name()); |
| 1494 std::string name2(list[1].Name()); |
| 1495 EXPECT_TRUE(name1 == "X" || name2 == "X"); |
| 1496 EXPECT_TRUE(name1 == "Y" || name2 == "Y"); |
| 1497 EXPECT_NE(name1, name2); |
| 1498 } |
| 1499 |
| 1563 TEST(CookieMonsterTest, Delegate) { | 1500 TEST(CookieMonsterTest, Delegate) { |
| 1564 GURL url_google(kUrlGoogle); | 1501 GURL url_google(kUrlGoogle); |
| 1565 | 1502 |
| 1566 scoped_refptr<MockPersistentCookieStore> store( | 1503 scoped_refptr<MockPersistentCookieStore> store( |
| 1567 new MockPersistentCookieStore); | 1504 new MockPersistentCookieStore); |
| 1568 scoped_refptr<MockCookieMonsterDelegate> delegate( | 1505 scoped_refptr<MockCookieMonsterDelegate> delegate( |
| 1569 new MockCookieMonsterDelegate); | 1506 new MockCookieMonsterDelegate); |
| 1570 scoped_refptr<net::CookieMonster> cm(new net::CookieMonster(store, delegate)); | 1507 scoped_refptr<net::CookieMonster> cm(new net::CookieMonster(store, delegate)); |
| 1571 | 1508 |
| 1572 EXPECT_TRUE(cm->SetCookie(url_google, "A=B")); | 1509 EXPECT_TRUE(cm->SetCookie(url_google, "A=B")); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1708 EXPECT_EQ("E", it->Name()); | 1645 EXPECT_EQ("E", it->Name()); |
| 1709 EXPECT_EQ("F", it->Value()); | 1646 EXPECT_EQ("F", it->Value()); |
| 1710 EXPECT_EQ("/", it->Path()); | 1647 EXPECT_EQ("/", it->Path()); |
| 1711 EXPECT_EQ("www.google.izzle", it->Domain()); | 1648 EXPECT_EQ("www.google.izzle", it->Domain()); |
| 1712 EXPECT_TRUE(it->IsSecure()); | 1649 EXPECT_TRUE(it->IsSecure()); |
| 1713 EXPECT_FALSE(it->IsHttpOnly()); | 1650 EXPECT_FALSE(it->IsHttpOnly()); |
| 1714 | 1651 |
| 1715 ASSERT_TRUE(++it == cookies.end()); | 1652 ASSERT_TRUE(++it == cookies.end()); |
| 1716 } | 1653 } |
| 1717 | 1654 |
| 1718 | |
| 1719 | |
| 1720 TEST(CookieMonsterTest, DeleteAllForHost) { | 1655 TEST(CookieMonsterTest, DeleteAllForHost) { |
| 1721 scoped_refptr<net::CookieMonster> cm(new net::CookieMonster(NULL, NULL)); | 1656 scoped_refptr<net::CookieMonster> cm(new net::CookieMonster(NULL, NULL)); |
| 1722 | 1657 |
| 1723 // Test probes: | 1658 // Test probes: |
| 1724 // * Non-secure URL, mid-level (http://w.c.b.a) | 1659 // * Non-secure URL, mid-level (http://w.c.b.a) |
| 1725 // * Secure URL, mid-level (https://w.c.b.a) | 1660 // * Secure URL, mid-level (https://w.c.b.a) |
| 1726 // * URL with path, mid-level (https:/w.c.b.a/dir1/xx) | 1661 // * URL with path, mid-level (https:/w.c.b.a/dir1/xx) |
| 1727 // All three tests should nuke only the midlevel host cookie, | 1662 // All three tests should nuke only the midlevel host cookie, |
| 1728 // the http_only cookie, the host secure cookie, and the two host | 1663 // the http_only cookie, the host secure cookie, and the two host |
| 1729 // path cookies. http_only, secure, and paths are ignored by | 1664 // path cookies. http_only, secure, and paths are ignored by |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1772 EXPECT_EQ("dom_1=X; dom_2=X; dom_3=X; host_3=X", | 1707 EXPECT_EQ("dom_1=X; dom_2=X; dom_3=X; host_3=X", |
| 1773 cm->GetCookies(GURL(kTopLevelDomainPlus3))); | 1708 cm->GetCookies(GURL(kTopLevelDomainPlus3))); |
| 1774 EXPECT_EQ("dom_1=X; dom_2=X; sec_dom=X", | 1709 EXPECT_EQ("dom_1=X; dom_2=X; sec_dom=X", |
| 1775 cm->GetCookies(GURL(kTopLevelDomainPlus2Secure))); | 1710 cm->GetCookies(GURL(kTopLevelDomainPlus2Secure))); |
| 1776 EXPECT_EQ("dom_1=X; host_1=X", cm->GetCookies(GURL(kTopLevelDomainPlus1))); | 1711 EXPECT_EQ("dom_1=X; host_1=X", cm->GetCookies(GURL(kTopLevelDomainPlus1))); |
| 1777 EXPECT_EQ("dom_path_2=X; dom_path_1=X; dom_1=X; dom_2=X; sec_dom=X", | 1712 EXPECT_EQ("dom_path_2=X; dom_path_1=X; dom_1=X; dom_2=X; sec_dom=X", |
| 1778 cm->GetCookies(GURL(kTopLevelDomainPlus2Secure + | 1713 cm->GetCookies(GURL(kTopLevelDomainPlus2Secure + |
| 1779 std::string("/dir1/dir2/xxx")))); | 1714 std::string("/dir1/dir2/xxx")))); |
| 1780 | 1715 |
| 1781 } | 1716 } |
| 1717 |
| 1718 TEST(CookieMonsterTest, UniqueCreationTime) { |
| 1719 scoped_refptr<net::CookieMonster> cm(new net::CookieMonster(NULL, NULL)); |
| 1720 GURL url_google(kUrlGoogle); |
| 1721 net::CookieOptions options; |
| 1722 |
| 1723 // Add in three cookies through every public interface to the |
| 1724 // CookieMonster and confirm that none of them have duplicate |
| 1725 // creation times. |
| 1726 |
| 1727 // SetCookieWithCreationTime and SetCookieWithCreationTimeAndOptions |
| 1728 // are not included as they aren't going to be public for very much |
| 1729 // longer. |
| 1730 |
| 1731 // SetCookie, SetCookies, SetCookiesWithOptions, |
| 1732 // SetCookieWithOptions, SetCookieWithDetails |
| 1733 |
| 1734 cm->SetCookie(url_google, "SetCookie1=A"); |
| 1735 cm->SetCookie(url_google, "SetCookie2=A"); |
| 1736 cm->SetCookie(url_google, "SetCookie3=A"); |
| 1737 |
| 1738 { |
| 1739 std::vector<std::string> cookie_lines; |
| 1740 cookie_lines.push_back("setCookies1=A"); |
| 1741 cookie_lines.push_back("setCookies2=A"); |
| 1742 cookie_lines.push_back("setCookies4=A"); |
| 1743 cm->SetCookies(url_google, cookie_lines); |
| 1744 } |
| 1745 |
| 1746 { |
| 1747 std::vector<std::string> cookie_lines; |
| 1748 cookie_lines.push_back("setCookiesWithOptions1=A"); |
| 1749 cookie_lines.push_back("setCookiesWithOptions2=A"); |
| 1750 cookie_lines.push_back("setCookiesWithOptions3=A"); |
| 1751 |
| 1752 cm->SetCookiesWithOptions(url_google, cookie_lines, options); |
| 1753 } |
| 1754 |
| 1755 cm->SetCookieWithOptions(url_google, "setCookieWithOptions1=A", options); |
| 1756 cm->SetCookieWithOptions(url_google, "setCookieWithOptions2=A", options); |
| 1757 cm->SetCookieWithOptions(url_google, "setCookieWithOptions3=A", options); |
| 1758 |
| 1759 cm->SetCookieWithDetails(url_google, "setCookieWithDetails1", "A", |
| 1760 ".google.com", "/", Time(), false, false); |
| 1761 cm->SetCookieWithDetails(url_google, "setCookieWithDetails2", "A", |
| 1762 ".google.com", "/", Time(), false, false); |
| 1763 cm->SetCookieWithDetails(url_google, "setCookieWithDetails3", "A", |
| 1764 ".google.com", "/", Time(), false, false); |
| 1765 |
| 1766 // Now we check |
| 1767 net::CookieMonster::CookieList cookie_list(cm->GetAllCookies()); |
| 1768 typedef std::map<int64, net::CookieMonster::CanonicalCookie> TimeCookieMap; |
| 1769 TimeCookieMap check_map; |
| 1770 for (net::CookieMonster::CookieList::const_iterator it = cookie_list.begin(); |
| 1771 it != cookie_list.end(); it++) { |
| 1772 const int64 creation_date = it->CreationDate().ToInternalValue(); |
| 1773 TimeCookieMap::const_iterator |
| 1774 existing_cookie_it(check_map.find(creation_date)); |
| 1775 EXPECT_TRUE(existing_cookie_it == check_map.end()) |
| 1776 << "Cookie " << it->Name() << " has same creation date (" |
| 1777 << it->CreationDate().ToInternalValue() |
| 1778 << ") as previously entered cookie " |
| 1779 << existing_cookie_it->second.Name(); |
| 1780 |
| 1781 if (existing_cookie_it == check_map.end()) { |
| 1782 check_map.insert(TimeCookieMap::value_type( |
| 1783 it->CreationDate().ToInternalValue(), *it)); |
| 1784 } |
| 1785 } |
| 1786 } |
| 1787 |
| 1788 } // namespace |
| OLD | NEW |