| Index: net/cookies/cookie_monster_unittest.cc
|
| diff --git a/net/cookies/cookie_monster_unittest.cc b/net/cookies/cookie_monster_unittest.cc
|
| index 08a57ff8d57190fdd39ba9c7a96e7a1131f9fd70..05b42751b4c0428c2adf1af9f8b164f6e1c0805b 100644
|
| --- a/net/cookies/cookie_monster_unittest.cc
|
| +++ b/net/cookies/cookie_monster_unittest.cc
|
| @@ -64,12 +64,30 @@ class NewMockPersistentCookieStore
|
| virtual ~NewMockPersistentCookieStore() {}
|
| };
|
|
|
| +MATCHER_P(CookieEquals, expected, "") {
|
| + return !(arg.FullCompare(expected) || expected.FullCompare(arg));
|
| +}
|
| +
|
| const char kTopLevelDomainPlus1[] = "http://www.harvard.edu";
|
| const char kTopLevelDomainPlus2[] = "http://www.math.harvard.edu";
|
| const char kTopLevelDomainPlus2Secure[] = "https://www.math.harvard.edu";
|
| const char kTopLevelDomainPlus3[] = "http://www.bourbaki.math.harvard.edu";
|
| const char kOtherDomain[] = "http://www.mit.edu";
|
|
|
| +bool AlwaysTrueCookiePredicate(CanonicalCookie* to_save,
|
| + const CanonicalCookie& cookie) {
|
| + if (to_save)
|
| + *to_save = cookie;
|
| + return true;
|
| +}
|
| +
|
| +bool AlwaysFalseCookiePredicate(CanonicalCookie* to_save,
|
| + const CanonicalCookie& cookie) {
|
| + if (to_save)
|
| + *to_save = cookie;
|
| + return false;
|
| +}
|
| +
|
| struct CookieMonsterTestTraits {
|
| static scoped_ptr<CookieStore> Create() {
|
| return make_scoped_ptr(new CookieMonster(nullptr, nullptr));
|
| @@ -164,6 +182,21 @@ class CookieMonsterTestBase : public CookieStoreTest<T> {
|
| return callback.result();
|
| }
|
|
|
| + int DeleteAllCreatedBetweenWithPredicate(
|
| + CookieMonster* cm,
|
| + const base::Time delete_begin,
|
| + const base::Time delete_end,
|
| + const base::Callback<bool(const CanonicalCookie&)>& predicate) {
|
| + DCHECK(cm);
|
| + ResultSavingCookieCallback<int> callback;
|
| + cm->DeleteAllCreatedBetweenWithPredicateAsync(
|
| + delete_begin, delete_end, predicate,
|
| + base::Bind(&ResultSavingCookieCallback<int>::Run,
|
| + base::Unretained(&callback)));
|
| + callback.WaitUntilDone();
|
| + return callback.result();
|
| + }
|
| +
|
| // Helper for DeleteAllForHost test; repopulates CM with same layout
|
| // each time.
|
| void PopulateCmForDeleteAllForHost(CookieMonster* cm) {
|
| @@ -675,6 +708,16 @@ ACTION_P5(DeleteAllCreatedBetweenForHostAction,
|
| delete_begin, delete_end, url, callback->AsCallback());
|
| }
|
|
|
| +ACTION_P5(DeleteAllCreatedBetweenWithPredicateAction,
|
| + cookie_monster,
|
| + delete_begin,
|
| + delete_end,
|
| + predicate,
|
| + callback) {
|
| + cookie_monster->DeleteAllCreatedBetweenWithPredicateAsync(
|
| + delete_begin, delete_end, predicate, callback->AsCallback());
|
| +}
|
| +
|
| ACTION_P3(DeleteCanonicalCookieAction, cookie_monster, cookie, callback) {
|
| cookie_monster->DeleteCanonicalCookieAsync(cookie, callback->AsCallback());
|
| }
|
| @@ -1069,6 +1112,30 @@ TEST_F(DeferredCookieTaskTest, DeferredDeleteAllForHostCreatedBetweenCookies) {
|
| loop.Run();
|
| }
|
|
|
| +TEST_F(DeferredCookieTaskTest,
|
| + DeferredDeleteAllWithPredicateCreatedBetweenCookies) {
|
| + MockDeleteCallback delete_callback;
|
| +
|
| + base::Callback<bool(const CanonicalCookie&)> predicate =
|
| + base::Bind(&AlwaysTrueCookiePredicate, nullptr);
|
| +
|
| + BeginWith(DeleteAllCreatedBetweenWithPredicateAction(
|
| + &cookie_monster(), base::Time(), base::Time::Now(), predicate,
|
| + &delete_callback));
|
| +
|
| + WaitForLoadCall();
|
| +
|
| + EXPECT_CALL(delete_callback, Invoke(false))
|
| + .WillOnce(DeleteAllCreatedBetweenWithPredicateAction(
|
| + &cookie_monster(), base::Time(), base::Time::Now(), predicate,
|
| + &delete_callback));
|
| + base::RunLoop loop;
|
| + EXPECT_CALL(delete_callback, Invoke(false)).WillOnce(QuitRunLoop(&loop));
|
| +
|
| + CompleteLoading();
|
| + loop.Run();
|
| +}
|
| +
|
| TEST_F(DeferredCookieTaskTest, DeferredDeleteCanonicalCookie) {
|
| std::vector<CanonicalCookie*> cookies;
|
| CanonicalCookie cookie = BuildCanonicalCookie(
|
| @@ -1217,6 +1284,89 @@ TEST_F(CookieMonsterTest, TestCookieDeleteAllCreatedBetweenTimestamps) {
|
| EXPECT_EQ(0, DeleteAll(cm.get()));
|
| }
|
|
|
| +TEST_F(CookieMonsterTest,
|
| + TestCookieDeleteAllCreatedBetweenTimestampsWithPredicate) {
|
| + scoped_ptr<CookieMonster> cm(new CookieMonster(nullptr, nullptr));
|
| + Time now = Time::Now();
|
| +
|
| + CanonicalCookie test_cookie;
|
| + base::Callback<bool(const CanonicalCookie&)> true_predicate =
|
| + base::Bind(&AlwaysTrueCookiePredicate, &test_cookie);
|
| +
|
| + base::Callback<bool(const CanonicalCookie&)> false_predicate =
|
| + base::Bind(&AlwaysFalseCookiePredicate, &test_cookie);
|
| +
|
| + // Nothing has been added so nothing should be deleted.
|
| + EXPECT_EQ(
|
| + 0, DeleteAllCreatedBetweenWithPredicate(
|
| + cm.get(), now - TimeDelta::FromDays(99), Time(), true_predicate));
|
| +
|
| + // Create 3 cookies with creation date of today, yesterday and the day before.
|
| + EXPECT_TRUE(
|
| + cm->SetCookieWithCreationTime(http_www_google_.url(), "T-0=Now", now));
|
| + EXPECT_TRUE(cm->SetCookieWithCreationTime(
|
| + http_www_google_.url(), "T-1=Yesterday", now - TimeDelta::FromDays(1)));
|
| + EXPECT_TRUE(cm->SetCookieWithCreationTime(
|
| + http_www_google_.url(), "T-2=DayBefore", now - TimeDelta::FromDays(2)));
|
| + EXPECT_TRUE(cm->SetCookieWithCreationTime(
|
| + http_www_google_.url(), "T-3=ThreeDays", now - TimeDelta::FromDays(3)));
|
| + EXPECT_TRUE(cm->SetCookieWithCreationTime(
|
| + http_www_google_.url(), "T-7=LastWeek", now - TimeDelta::FromDays(7)));
|
| +
|
| + // Try to delete threedays and the daybefore, but we should do nothing due
|
| + // to the predicate.
|
| + EXPECT_EQ(0, DeleteAllCreatedBetweenWithPredicate(
|
| + cm.get(), now - TimeDelta::FromDays(3),
|
| + now - TimeDelta::FromDays(1), false_predicate));
|
| + // Same as above, but we use the true_predicate, so it works.
|
| + EXPECT_EQ(2, DeleteAllCreatedBetweenWithPredicate(
|
| + cm.get(), now - TimeDelta::FromDays(3),
|
| + now - TimeDelta::FromDays(1), true_predicate));
|
| +
|
| + // Try to delete yesterday, also make sure that delete_end is not
|
| + // inclusive.
|
| + EXPECT_EQ(0,
|
| + DeleteAllCreatedBetweenWithPredicate(
|
| + cm.get(), now - TimeDelta::FromDays(2), now, false_predicate));
|
| + EXPECT_EQ(1,
|
| + DeleteAllCreatedBetweenWithPredicate(
|
| + cm.get(), now - TimeDelta::FromDays(2), now, true_predicate));
|
| + // Check our cookie values.
|
| + scoped_ptr<CanonicalCookie> expected_cookie =
|
| + CanonicalCookie::Create(http_www_google_.url(), "T-1=Yesterday",
|
| + now - TimeDelta::FromDays(1), CookieOptions());
|
| + // False means 'less than or equal', so we test both ways for full equal.
|
| + EXPECT_THAT(test_cookie, CookieEquals(*expected_cookie))
|
| + << "Actual:\n"
|
| + << test_cookie.DebugString() << "\nExpected:\n"
|
| + << expected_cookie->DebugString();
|
| +
|
| + // Make sure the delete_begin is inclusive.
|
| + EXPECT_EQ(0,
|
| + DeleteAllCreatedBetweenWithPredicate(
|
| + cm.get(), now - TimeDelta::FromDays(7), now, false_predicate));
|
| + EXPECT_EQ(1,
|
| + DeleteAllCreatedBetweenWithPredicate(
|
| + cm.get(), now - TimeDelta::FromDays(7), now, true_predicate));
|
| +
|
| + // Delete the last (now) item.
|
| + EXPECT_EQ(0, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(),
|
| + false_predicate));
|
| + EXPECT_EQ(1, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(),
|
| + true_predicate));
|
| + expected_cookie = CanonicalCookie::Create(http_www_google_.url(), "T-0=Now",
|
| + now, CookieOptions());
|
| + // False means 'less than or equal', so we test both ways for full equal.
|
| + EXPECT_FALSE(expected_cookie->FullCompare(test_cookie) ||
|
| + test_cookie.FullCompare(*expected_cookie))
|
| + << "Actual:\n"
|
| + << test_cookie.DebugString() << "\nExpected:\n"
|
| + << expected_cookie->DebugString();
|
| +
|
| + // Really make sure everything is gone.
|
| + EXPECT_EQ(0, DeleteAll(cm.get()));
|
| +}
|
| +
|
| static const int kAccessDelayMs = kLastAccessThresholdMilliseconds + 20;
|
|
|
| TEST_F(CookieMonsterTest, TestLastAccess) {
|
| @@ -2210,7 +2360,6 @@ class FlushablePersistentStore : public CookieMonster::PersistentCookieStore {
|
| base::Bind(&LoadedCallbackTask::Run,
|
| new LoadedCallbackTask(loaded_callback, out_cookies)));
|
| }
|
| -
|
| void LoadCookiesForKey(const std::string& key,
|
| const LoadedCallback& loaded_callback) override {
|
| Load(loaded_callback);
|
|
|