15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store_unittest.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram_samples.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_split.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_tokenizer.h"
225e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cookies/cookie_constants.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster_store_test.h"  // For CookieStore mock
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_util.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/parsed_cookie.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erikwright): Replace the pre-existing MockPersistentCookieStore (and
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// brethren) with this one, and remove the 'New' prefix.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NewMockPersistentCookieStore
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public CookieMonster::PersistentCookieStore {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Load, void(const LoadedCallback& loaded_callback));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(LoadCookiesForKey, void(const std::string& key,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const LoadedCallback& loaded_callback));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(AddCookie, void(const CanonicalCookie& cc));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(UpdateCookieAccessTime, void(const CanonicalCookie& cc));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(DeleteCookie, void(const CanonicalCookie& cc));
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void Flush(const base::Closure& callback) {
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!callback.is_null())
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::MessageLoop::current()->PostTask(FROM_HERE, callback);
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(SetForceKeepSessionState, void());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NewMockPersistentCookieStore() {}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kTopLevelDomainPlus1 = "http://www.harvard.edu";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kTopLevelDomainPlus2 = "http://www.math.harvard.edu";
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kTopLevelDomainPlus2Secure = "https://www.math.harvard.edu";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kTopLevelDomainPlus3 =
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.bourbaki.math.harvard.edu";
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kOtherDomain = "http://www.mit.edu";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUrlGoogleSpecific[] = "http://www.gmail.google.izzle";
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetCookieListCallback : public CookieCallback {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCookieListCallback() {}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit GetCookieListCallback(Thread* run_in_thread)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : CookieCallback(run_in_thread) {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Run(const CookieList& cookies) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookies_ = cookies;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallbackEpilogue();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CookieList& cookies() { return cookies_; }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList cookies_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CookieMonsterTestTraits {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_refptr<CookieStore> Create() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new CookieMonster(NULL, NULL);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const bool is_cookie_monster              = true;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const bool supports_http_only             = true;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const bool supports_non_dotted_domains    = true;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const bool supports_trailing_dots         = true;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const bool filters_schemes                = true;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const bool has_path_prefix_bug            = false;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int creation_time_granularity_in_ms = 0;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TYPED_TEST_CASE_P(CookieMonster,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieStoreTest,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieMonsterTestTraits);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TYPED_TEST_CASE_P(CookieMonster,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              MultiThreadedCookieStoreTest,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieMonsterTestTraits);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CookieMonsterTest : public CookieStoreTest<CookieMonsterTestTraits> {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList GetAllCookies(CookieMonster* cm) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(cm);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetCookieListCallback callback;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->GetAllCookiesAsync(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&GetCookieListCallback::Run,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&callback)));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(callback.did_run());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return callback.cookies();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList GetAllCookiesForURL(CookieMonster* cm,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& url) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(cm);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetCookieListCallback callback;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->GetAllCookiesForURLAsync(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, base::Bind(&GetCookieListCallback::Run,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::Unretained(&callback)));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(callback.did_run());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return callback.cookies();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList GetAllCookiesForURLWithOptions(CookieMonster* cm,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const GURL& url,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const CookieOptions& options) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(cm);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetCookieListCallback callback;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->GetAllCookiesForURLWithOptionsAsync(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, options, base::Bind(&GetCookieListCallback::Run,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::Unretained(&callback)));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(callback.did_run());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return callback.cookies();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SetCookieWithDetails(CookieMonster* cm,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const GURL& url,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& name,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& value,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& domain,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& path,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const base::Time& expiration_time,
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            bool secure,
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            bool http_only,
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            CookiePriority priority) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(cm);
160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ResultSavingCookieCallback<bool> callback;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->SetCookieWithDetailsAsync(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, name, value, domain, path, expiration_time, secure, http_only,
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        priority,
164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(
165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            &ResultSavingCookieCallback<bool>::Run,
166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            base::Unretained(&callback)));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(callback.did_run());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return callback.result();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DeleteAll(CookieMonster*cm) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(cm);
174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ResultSavingCookieCallback<int> callback;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->DeleteAllAsync(
176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(
177e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            &ResultSavingCookieCallback<int>::Run,
178e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            base::Unretained(&callback)));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(callback.did_run());
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return callback.result();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DeleteAllCreatedBetween(CookieMonster*cm,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const base::Time& delete_begin,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const base::Time& delete_end) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(cm);
188e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ResultSavingCookieCallback<int> callback;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->DeleteAllCreatedBetweenAsync(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete_begin, delete_end,
191e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(
192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            &ResultSavingCookieCallback<int>::Run,
193e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            base::Unretained(&callback)));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(callback.did_run());
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return callback.result();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  int DeleteAllCreatedBetweenForHost(CookieMonster* cm,
2003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                     const base::Time delete_begin,
2013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                     const base::Time delete_end,
2023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                     const GURL& url) {
2033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    DCHECK(cm);
204e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ResultSavingCookieCallback<int> callback;
2053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    cm->DeleteAllCreatedBetweenForHostAsync(
2063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        delete_begin, delete_end, url,
207e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(
208e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            &ResultSavingCookieCallback<int>::Run,
209e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            base::Unretained(&callback)));
2103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    RunFor(kTimeout);
2113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    EXPECT_TRUE(callback.did_run());
2123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return callback.result();
2133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
2143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
2153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  int DeleteAllForHost(CookieMonster* cm,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const GURL& url) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(cm);
218e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ResultSavingCookieCallback<int> callback;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->DeleteAllForHostAsync(
220e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        url, base::Bind(&ResultSavingCookieCallback<int>::Run,
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        base::Unretained(&callback)));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(callback.did_run());
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return callback.result();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool DeleteCanonicalCookie(CookieMonster* cm, const CanonicalCookie& cookie) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(cm);
229e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ResultSavingCookieCallback<bool> callback;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->DeleteCanonicalCookieAsync(
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cookie,
232e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(&ResultSavingCookieCallback<bool>::Run,
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   base::Unretained(&callback)));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(callback.did_run());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return callback.result();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper for DeleteAllForHost test; repopulates CM with same layout
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // each time.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PopulateCmForDeleteAllForHost(scoped_refptr<CookieMonster> cm) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_top_level_domain_plus_1(kTopLevelDomainPlus1);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_top_level_domain_plus_2(kTopLevelDomainPlus2);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_top_level_domain_plus_2_secure(kTopLevelDomainPlus2Secure);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_top_level_domain_plus_3(kTopLevelDomainPlus3);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_other(kOtherDomain);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DeleteAll(cm.get());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Static population for probe:
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //    * Three levels of domain cookie (.b.a, .c.b.a, .d.c.b.a)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //    * Three levels of host cookie (w.b.a, w.c.b.a, w.d.c.b.a)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //    * http_only cookie (w.c.b.a)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //    * Two secure cookies (.c.b.a, w.c.b.a)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //    * Two domain path cookies (.c.b.a/dir1, .c.b.a/dir1/dir2)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //    * Two host path cookies (w.c.b.a/dir1, w.c.b.a/dir1/dir2)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Domain cookies
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           url_top_level_domain_plus_1,
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "dom_1",
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "X",
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           ".harvard.edu",
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "/",
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::Time(),
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           url_top_level_domain_plus_2,
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "dom_2",
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "X",
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           ".math.harvard.edu",
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "/",
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::Time(),
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           url_top_level_domain_plus_3,
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "dom_3",
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "X",
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           ".bourbaki.math.harvard.edu",
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "/",
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::Time(),
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Host cookies
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           url_top_level_domain_plus_1,
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "host_1",
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "X",
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           std::string(),
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "/",
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::Time(),
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           url_top_level_domain_plus_2,
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "host_2",
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "X",
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           std::string(),
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "/",
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::Time(),
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           url_top_level_domain_plus_3,
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "host_3",
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "X",
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           std::string(),
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "/",
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::Time(),
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Http_only cookie
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           url_top_level_domain_plus_2,
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "httpo_check",
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "X",
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           std::string(),
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "/",
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::Time(),
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           true,
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Secure cookies
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           url_top_level_domain_plus_2_secure,
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "sec_dom",
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "X",
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           ".math.harvard.edu",
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "/",
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::Time(),
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           true,
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           url_top_level_domain_plus_2_secure,
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "sec_host",
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "X",
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           std::string(),
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "/",
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::Time(),
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           true,
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Domain path cookies
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           url_top_level_domain_plus_2,
359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "dom_path_1",
360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "X",
361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           ".math.harvard.edu",
362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "/dir1",
363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::Time(),
364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           url_top_level_domain_plus_2,
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "dom_path_2",
370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "X",
371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           ".math.harvard.edu",
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           "/dir1/dir2",
373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::Time(),
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           false,
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Host path cookies
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           url_top_level_domain_plus_2,
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "host_path_1",
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "X",
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           std::string(),
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "/dir1",
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::Time(),
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(this->SetCookieWithDetails(cm.get(),
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           url_top_level_domain_plus_2,
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "host_path_2",
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "X",
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           std::string(),
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           "/dir1/dir2",
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::Time(),
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           false,
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           COOKIE_PRIORITY_DEFAULT));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(13U, this->GetAllCookies(cm.get()).size());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time GetFirstCookieAccessDate(CookieMonster* cm) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CookieList all_cookies(this->GetAllCookies(cm));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return all_cookies.front().LastAccessDate();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FindAndDeleteCookie(CookieMonster* cm,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& domain,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& name) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CookieList cookies = this->GetAllCookies(cm);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (CookieList::iterator it = cookies.begin();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != cookies.end(); ++it)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (it->Domain() == domain && it->Name() == name)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return this->DeleteCanonicalCookie(cm, *it);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CountInString(const std::string& str, char c) {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::count(str.begin(), str.end(), c);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void TestHostGarbageCollectHelper() {
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int domain_max_cookies = CookieMonster::kDomainMaxCookies;
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int domain_purge_cookies = CookieMonster::kDomainPurgeCookies;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int more_than_enough_cookies =
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (domain_max_cookies + domain_purge_cookies) * 2;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add a bunch of cookies on a single host, should purge them.
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int i = 0; i < more_than_enough_cookies; ++i) {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::string cookie = base::StringPrintf("a%03d=b", i);
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        EXPECT_TRUE(SetCookie(cm.get(), url_google_, cookie));
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        std::string cookies = this->GetCookies(cm.get(), url_google_);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Make sure we find it in the cookies.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(cookies.find(cookie), std::string::npos);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Count the number of cookies.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_LE(CountInString(cookies, '='), domain_max_cookies);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add a bunch of cookies on multiple hosts within a single eTLD.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should keep at least kDomainMaxCookies - kDomainPurgeCookies
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // between them.  We shouldn't go above kDomainMaxCookies for both together.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_google_specific(kUrlGoogleSpecific);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int i = 0; i < more_than_enough_cookies; ++i) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::string cookie_general = base::StringPrintf("a%03d=b", i);
450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        EXPECT_TRUE(SetCookie(cm.get(), url_google_, cookie_general));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::string cookie_specific = base::StringPrintf("c%03d=b", i);
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        EXPECT_TRUE(SetCookie(cm.get(), url_google_specific, cookie_specific));
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        std::string cookies_general = this->GetCookies(cm.get(), url_google_);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(cookies_general.find(cookie_general), std::string::npos);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::string cookies_specific =
456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            this->GetCookies(cm.get(), url_google_specific);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(cookies_specific.find(cookie_specific), std::string::npos);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_LE((CountInString(cookies_general, '=') +
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   CountInString(cookies_specific, '=')),
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  domain_max_cookies);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // After all this, there should be at least
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // kDomainMaxCookies - kDomainPurgeCookies for both URLs.
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      std::string cookies_general = this->GetCookies(cm.get(), url_google_);
465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      std::string cookies_specific =
466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          this->GetCookies(cm.get(), url_google_specific);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int total_cookies = (CountInString(cookies_general, '=') +
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CountInString(cookies_specific, '='));
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_GE(total_cookies, domain_max_cookies - domain_purge_cookies);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_LE(total_cookies, domain_max_cookies);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CookiePriority CharToPriority(char ch) {
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (ch) {
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 'L':
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return COOKIE_PRIORITY_LOW;
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 'M':
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return COOKIE_PRIORITY_MEDIUM;
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case 'H':
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return COOKIE_PRIORITY_HIGH;
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return COOKIE_PRIORITY_DEFAULT;
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Instantiates a CookieMonster, adds multiple cookies (to url_google_) with
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // priorities specified by |coded_priority_str|, and tests priority-aware
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // domain cookie eviction.
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |coded_priority_str| specifies a run-length-encoded string of priorities.
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Example: "2M 3L M 4H" means "MMLLLMHHHH", and speicifies sequential (i.e.,
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // from least- to most-recently accessed) insertion of 2 medium-priority
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // cookies, 3 low-priority cookies, 1 medium-priority cookie, and 4
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // high-priority cookies.
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Within each priority, only the least-accessed cookies should be evicted.
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Thus, to describe expected suriving cookies, it suffices to specify the
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // expected population of surviving cookies per priority, i.e.,
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |expected_low_count|, |expected_medium_count|, and |expected_high_count|.
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void TestPriorityCookieCase(CookieMonster* cm,
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const std::string& coded_priority_str,
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              size_t expected_low_count,
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              size_t expected_medium_count,
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              size_t expected_high_count) {
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DeleteAll(cm);
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int next_cookie_id = 0;
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<CookiePriority> priority_list;
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<int> id_list[3];  // Indexed by CookiePriority.
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Parse |coded_priority_str| and add cookies.
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<std::string> priority_tok_list;
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::SplitString(coded_priority_str, ' ', &priority_tok_list);
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (std::vector<std::string>::iterator it = priority_tok_list.begin();
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         it != priority_tok_list.end(); ++it) {
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      size_t len = it->length();
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DCHECK_NE(len, 0U);
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Take last character as priority.
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CookiePriority priority = CharToPriority((*it)[len - 1]);
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string priority_str = CookiePriorityToString(priority);
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // The rest of the string (possibly empty) specifies repetition.
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int rep = 1;
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!it->empty()) {
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        bool result = base::StringToInt(
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            base::StringPiece(it->begin(), it->end() - 1), &rep);
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        DCHECK(result);
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (; rep > 0; --rep, ++next_cookie_id) {
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string cookie = base::StringPrintf(
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            "a%d=b;priority=%s", next_cookie_id, priority_str.c_str());
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(SetCookie(cm, url_google_, cookie));
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        priority_list.push_back(priority);
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        id_list[priority].push_back(next_cookie_id);
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int num_cookies = static_cast<int>(priority_list.size());
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<int> surviving_id_list[3];  // Indexed by CookiePriority.
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Parse the list of cookies
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string cookie_str = this->GetCookies(cm, url_google_);
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<std::string> cookie_tok_list;
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::SplitString(cookie_str, ';', &cookie_tok_list);
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (std::vector<std::string>::iterator it = cookie_tok_list.begin();
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         it != cookie_tok_list.end(); ++it) {
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Assuming *it is "a#=b", so extract and parse "#" portion.
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int id = -1;
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool result = base::StringToInt(
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          base::StringPiece(it->begin() + 1, it->end() - 2), &id);
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DCHECK(result);
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DCHECK_GE(id, 0);
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DCHECK_LT(id, num_cookies);
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      surviving_id_list[priority_list[id]].push_back(id);
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Validate each priority.
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t expected_count[3] = {
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_low_count, expected_medium_count, expected_high_count
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    };
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; i < 3; ++i) {
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DCHECK_LE(surviving_id_list[i].size(), id_list[i].size());
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(expected_count[i], surviving_id_list[i].size());
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Verify that the remaining cookies are the most recent among those
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // with the same priorities.
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (expected_count[i] == surviving_id_list[i].size()) {
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::sort(surviving_id_list[i].begin(), surviving_id_list[i].end());
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_TRUE(std::equal(surviving_id_list[i].begin(),
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               surviving_id_list[i].end(),
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               id_list[i].end() - expected_count[i]));
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void TestPriorityAwareGarbageCollectHelper() {
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Hard-coding limits in the test, but use DCHECK_EQ to enforce constraint.
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK_EQ(180U, CookieMonster::kDomainMaxCookies);
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK_EQ(150U, CookieMonster::kDomainMaxCookies -
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              CookieMonster::kDomainPurgeCookies);
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK_EQ(30U, CookieMonster::kDomainCookiesQuotaLow);
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK_EQ(50U, CookieMonster::kDomainCookiesQuotaMedium);
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK_EQ(70U, CookieMonster::kDomainCookiesQuotaHigh);
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Each test case adds 181 cookies, so 31 cookies are evicted.
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Cookie same priority, repeated for each priority.
585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "181L", 150U, 0U, 0U);
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "181M", 0U, 150U, 0U);
587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "181H", 0U, 0U, 150U);
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Pairwise scenarios.
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => none; round2 => 31M; round 3 => none.
591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "10H 171M", 0U, 140U, 10U);
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => 10L; round2 => 21M; round 3 => none.
593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "141M 40L", 30U, 120U, 0U);
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => none; round2 => none; round 3 => 31H.
595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "101H 80M", 0U, 80U, 70U);
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // For {low, medium} priorities right on quota, different orders.
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => 1L; round 2 => none, round3 => 30L.
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "31L 50M 100H", 0U, 50U, 100U);
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => none; round 2 => 1M, round3 => 30M.
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "51M 100H 30L", 30U, 20U, 100U);
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => none; round 2 => none; round3 => 31H.
603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "101H 50M 30L", 30U, 50U, 70U);
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => 10L; round 2 => 10M; round3 => 11H.
606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "81H 60M 40L", 30U, 50U, 70U);
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // More complex scenarios.
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => 10L; round 2 => 10M; round 3 => 11H.
610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "21H 60M 40L 60H", 30U, 50U, 70U);
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => 10L; round 2 => 11M, 10L; round 3 => none.
612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(
613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        cm.get(), "11H 10M 20L 110M 20L 10H", 20U, 109U, 21U);
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => none; round 2 => none; round 3 => 11L, 10M, 10H.
615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "11L 10M 140H 10M 10L", 10U, 10U, 130U);
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => none; round 2 => 1M; round 3 => 10L, 10M, 10H.
617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "11M 10H 10L 60M 90H", 0U, 60U, 90U);
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Round 1 => none; round 2 => 10L, 21M; round 3 => none.
619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestPriorityCookieCase(cm.get(), "11M 10H 10L 90M 60H", 0U, 80U, 70U);
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Function for creating a CM with a number of cookies in it,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no store (and hence no ability to affect access time).
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieMonster* CreateMonsterForGC(int num_cookies) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CookieMonster* cm(new CookieMonster(NULL, NULL));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < num_cookies; i++) {
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetCookie(cm, GURL(base::StringPrintf("http://h%05d.izzle", i)), "a=1");
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return cm;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erikwright): Replace the other callbacks and synchronous helper methods
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in this test suite with these Mocks.
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T, typename C> class MockCookieCallback {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  C AsCallback() {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::Bind(&T::Invoke, base::Unretained(static_cast<T*>(this)));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGetCookiesCallback
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : public MockCookieCallback<MockGetCookiesCallback,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieStore::GetCookiesCallback> {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Invoke, void(const std::string& cookies));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockSetCookiesCallback
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : public MockCookieCallback<MockSetCookiesCallback,
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieStore::SetCookiesCallback> {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Invoke, void(bool success));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockClosure
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : public MockCookieCallback<MockClosure, base::Closure> {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Invoke, void(void));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGetCookieListCallback
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : public MockCookieCallback<MockGetCookieListCallback,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieMonster::GetCookieListCallback> {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Invoke, void(const CookieList& cookies));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDeleteCallback
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : public MockCookieCallback<MockDeleteCallback,
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieMonster::DeleteCallback> {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Invoke, void(int num_deleted));
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDeleteCookieCallback
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : public MockCookieCallback<MockDeleteCookieCallback,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieMonster::DeleteCookieCallback> {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Invoke, void(bool success));
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct CookiesInputInfo {
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL url;
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string name;
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string value;
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string domain;
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string path;
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::Time expiration_time;
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool secure;
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool http_only;
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CookiePriority priority;
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(QuitCurrentMessageLoop) {
69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(FROM_HERE,
69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                         base::MessageLoop::QuitClosure());
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erikwright): When the synchronous helpers 'GetCookies' etc. are removed,
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rename these, removing the 'Action' suffix.
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P4(DeleteCookieAction, cookie_monster, url, name, callback) {
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->DeleteCookieAsync(url, name, callback->AsCallback());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P3(GetCookiesAction, cookie_monster, url, callback) {
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->GetCookiesWithOptionsAsync(
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, CookieOptions(), callback->AsCallback());
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P4(SetCookieAction, cookie_monster, url, cookie_line, callback) {
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->SetCookieWithOptionsAsync(
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, cookie_line, CookieOptions(), callback->AsCallback());
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P4(DeleteAllCreatedBetweenAction,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cookie_monster, delete_begin, delete_end, callback) {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->DeleteAllCreatedBetweenAsync(
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_begin, delete_end, callback->AsCallback());
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ACTION_P3(SetCookieWithDetailsAction, cookie_monster, cc, callback) {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->SetCookieWithDetailsAsync(
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cc.url, cc.name, cc.value, cc.domain, cc.path, cc.expiration_time,
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cc.secure, cc.http_only, cc.priority,
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback->AsCallback());
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P2(GetAllCookiesAction, cookie_monster, callback) {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->GetAllCookiesAsync(callback->AsCallback());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P3(DeleteAllForHostAction, cookie_monster, url, callback) {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->DeleteAllForHostAsync(url, callback->AsCallback());
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P3(DeleteCanonicalCookieAction, cookie_monster, cookie, callback) {
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->DeleteCanonicalCookieAsync(cookie, callback->AsCallback());
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P2(DeleteAllAction, cookie_monster, callback) {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->DeleteAllAsync(callback->AsCallback());
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P3(GetAllCookiesForUrlWithOptionsAction, cookie_monster, url, callback) {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->GetAllCookiesForURLWithOptionsAsync(
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, CookieOptions(), callback->AsCallback());
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P3(GetAllCookiesForUrlAction, cookie_monster, url, callback) {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->GetAllCookiesForURLAsync(url, callback->AsCallback());
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(PushCallbackAction, callback_vector) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_vector->push(arg1);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P2(DeleteSessionCookiesAction, cookie_monster, callback) {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->DeleteSessionCookiesAsync(callback->AsCallback());
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test suite verifies the task deferral behaviour of the CookieMonster.
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specifically, for each asynchronous method, verify that:
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1. invoking it on an uninitialized cookie store causes the store to begin
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    chain-loading its backing data or loading data for a specific domain key
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    (eTLD+1).
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2. The initial invocation does not complete until the loading completes.
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3. Invocations after the loading has completed complete immediately.
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeferredCookieTaskTest : public CookieMonsterTest {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeferredCookieTaskTest() {
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    persistent_store_ = new NewMockPersistentCookieStore();
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookie_monster_ = new CookieMonster(persistent_store_.get(), NULL);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Defines a cookie to be returned from PersistentCookieStore::Load
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeclareLoadedCookie(const std::string& key,
776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const std::string& cookie_line,
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const base::Time& creation_time) {
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddCookieToList(key, cookie_line, creation_time, &loaded_cookies_);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the message loop, waiting until PersistentCookieStore::Load is called.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call CompleteLoadingAndWait to cause the load to complete.
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForLoadCall() {
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify that PeristentStore::Load was called.
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing::Mock::VerifyAndClear(persistent_store_.get());
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invokes the PersistentCookieStore::LoadCookiesForKey completion callbacks
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and PersistentCookieStore::Load completion callback and waits
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // until the message loop is quit.
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CompleteLoadingAndWait() {
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (!loaded_for_key_callbacks_.empty()) {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_for_key_callbacks_.front().Run(loaded_cookies_);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_cookies_.clear();
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_for_key_callbacks_.pop();
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_callback_.Run(loaded_cookies_);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Performs the provided action, expecting it to cause a call to
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PersistentCookieStore::Load. Call WaitForLoadCall to verify the load call
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is received.
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BeginWith(testing::Action<void(void)> action) {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*this, Begin()).WillOnce(action);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectLoadCall();
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Begin();
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BeginWithForDomainKey(std::string key,
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             testing::Action<void(void)> action) {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*this, Begin()).WillOnce(action);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectLoadCall();
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectLoadForKeyCall(key, false);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Begin();
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Declares an expectation that PersistentCookieStore::Load will be called,
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // saving the provided callback and sending a quit to the message loop.
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectLoadCall() {
824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(*persistent_store_.get(), Load(testing::_))
825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        .WillOnce(testing::DoAll(testing::SaveArg<0>(&loaded_callback_),
826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 QuitCurrentMessageLoop()));
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Declares an expectation that PersistentCookieStore::LoadCookiesForKey
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will be called, saving the provided callback and sending a quit to the
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message loop.
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectLoadForKeyCall(std::string key, bool quit_queue) {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (quit_queue)
834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_CALL(*persistent_store_.get(), LoadCookiesForKey(key, testing::_))
835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          .WillOnce(
836868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               testing::DoAll(PushCallbackAction(&loaded_for_key_callbacks_),
837868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              QuitCurrentMessageLoop()));
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_CALL(*persistent_store_.get(), LoadCookiesForKey(key, testing::_))
840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          .WillOnce(PushCallbackAction(&loaded_for_key_callbacks_));
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invokes the initial action.
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Begin, void(void));
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the CookieMonster instance under test.
847868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieMonster& cookie_monster() { return *cookie_monster_.get(); }
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Declares that mock expectations in this test suite are strictly ordered.
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing::InSequence in_sequence_;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Holds cookies to be returned from PersistentCookieStore::Load or
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PersistentCookieStore::LoadCookiesForKey.
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<CanonicalCookie*> loaded_cookies_;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores the callback passed from the CookieMonster to the
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PersistentCookieStore::Load
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieMonster::PersistentCookieStore::LoadedCallback loaded_callback_;
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores the callback passed from the CookieMonster to the
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PersistentCookieStore::LoadCookiesForKey
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<CookieMonster::PersistentCookieStore::LoadedCallback>
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_for_key_callbacks_;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores the CookieMonster under test.
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cookie_monster_;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores the mock PersistentCookieStore.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<NewMockPersistentCookieStore> persistent_store_;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredGetCookies) {
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeclareLoadedCookie("www.google.izzle",
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Time::Now() + TimeDelta::FromDays(3));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockGetCookiesCallback get_cookies_callback;
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWithForDomainKey("google.izzle", GetCookiesAction(
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), url_google_, &get_cookies_callback));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(get_cookies_callback, Invoke("X=1")).WillOnce(
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCookiesAction(&cookie_monster(), url_google_, &get_cookies_callback));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(get_cookies_callback, Invoke("X=1")).WillOnce(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredSetCookie) {
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSetCookiesCallback set_cookies_callback;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWithForDomainKey("google.izzle", SetCookieAction(
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), url_google_, "A=B", &set_cookies_callback));
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(set_cookies_callback, Invoke(true)).WillOnce(
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetCookieAction(
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &cookie_monster(), url_google_, "X=Y", &set_cookies_callback));
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(set_cookies_callback, Invoke(true)).WillOnce(
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredDeleteCookie) {
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClosure delete_cookie_callback;
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWithForDomainKey("google.izzle", DeleteCookieAction(
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), url_google_, "A", &delete_cookie_callback));
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_cookie_callback, Invoke()).WillOnce(
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DeleteCookieAction(
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &cookie_monster(), url_google_, "X", &delete_cookie_callback));
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_cookie_callback, Invoke()).WillOnce(
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredSetCookieWithDetails) {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSetCookiesCallback set_cookies_callback;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CookiesInputInfo cookie_info = {
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    url_google_foo_, "A", "B", std::string(), "/foo",
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::Time(), false, false, COOKIE_PRIORITY_DEFAULT
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWithForDomainKey("google.izzle", SetCookieWithDetailsAction(
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &cookie_monster(), cookie_info, &set_cookies_callback));
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CookiesInputInfo cookie_info_exp = {
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    url_google_foo_, "A", "B", std::string(), "/foo",
937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::Time(), false, false, COOKIE_PRIORITY_DEFAULT
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(set_cookies_callback, Invoke(true)).WillOnce(
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetCookieWithDetailsAction(
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          &cookie_monster(), cookie_info_exp, &set_cookies_callback));
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(set_cookies_callback, Invoke(true)).WillOnce(
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredGetAllCookies) {
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeclareLoadedCookie("www.google.izzle",
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Time::Now() + TimeDelta::FromDays(3));
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockGetCookieListCallback get_cookie_list_callback;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWith(GetAllCookiesAction(
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), &get_cookie_list_callback));
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(get_cookie_list_callback, Invoke(testing::_)).WillOnce(
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetAllCookiesAction(&cookie_monster(), &get_cookie_list_callback));
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(get_cookie_list_callback, Invoke(testing::_)).WillOnce(
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredGetAllForUrlCookies) {
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeclareLoadedCookie("www.google.izzle",
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Time::Now() + TimeDelta::FromDays(3));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockGetCookieListCallback get_cookie_list_callback;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWithForDomainKey("google.izzle", GetAllCookiesForUrlAction(
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), url_google_, &get_cookie_list_callback));
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(get_cookie_list_callback, Invoke(testing::_)).WillOnce(
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetAllCookiesForUrlAction(
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &cookie_monster(), url_google_, &get_cookie_list_callback));
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(get_cookie_list_callback, Invoke(testing::_)).WillOnce(
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredGetAllForUrlWithOptionsCookies) {
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeclareLoadedCookie("www.google.izzle",
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Time::Now() + TimeDelta::FromDays(3));
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockGetCookieListCallback get_cookie_list_callback;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWithForDomainKey("google.izzle", GetAllCookiesForUrlWithOptionsAction(
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), url_google_, &get_cookie_list_callback));
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(get_cookie_list_callback, Invoke(testing::_)).WillOnce(
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetAllCookiesForUrlWithOptionsAction(
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &cookie_monster(), url_google_, &get_cookie_list_callback));
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(get_cookie_list_callback, Invoke(testing::_)).WillOnce(
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredDeleteAllCookies) {
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDeleteCallback delete_callback;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWith(DeleteAllAction(
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), &delete_callback));
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_callback, Invoke(false)).WillOnce(
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DeleteAllAction(&cookie_monster(), &delete_callback));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_callback, Invoke(false)).WillOnce(
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredDeleteAllCreatedBetweenCookies) {
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDeleteCallback delete_callback;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWith(DeleteAllCreatedBetweenAction(
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), base::Time(), base::Time::Now(), &delete_callback));
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_callback, Invoke(false)).WillOnce(
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DeleteAllCreatedBetweenAction(
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &cookie_monster(), base::Time(), base::Time::Now(),
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &delete_callback));
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_callback, Invoke(false)).WillOnce(
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredDeleteAllForHostCookies) {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDeleteCallback delete_callback;
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWithForDomainKey("google.izzle", DeleteAllForHostAction(
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), url_google_, &delete_callback));
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_callback, Invoke(false)).WillOnce(
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DeleteAllForHostAction(
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &cookie_monster(), url_google_, &delete_callback));
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_callback, Invoke(false)).WillOnce(
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredDeleteCanonicalCookie) {
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<CanonicalCookie*> cookies;
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CanonicalCookie cookie = BuildCanonicalCookie(
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "www.google.com", "X=1; path=/", base::Time::Now());
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDeleteCookieCallback delete_cookie_callback;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWith(DeleteCanonicalCookieAction(
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), cookie, &delete_cookie_callback));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_cookie_callback, Invoke(false)).WillOnce(
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DeleteCanonicalCookieAction(
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), cookie, &delete_cookie_callback));
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_cookie_callback, Invoke(false)).WillOnce(
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredDeleteSessionCookies) {
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDeleteCallback delete_callback;
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginWith(DeleteSessionCookiesAction(
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cookie_monster(), &delete_callback));
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_callback, Invoke(false)).WillOnce(
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DeleteSessionCookiesAction(&cookie_monster(), &delete_callback));
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delete_callback, Invoke(false)).WillOnce(
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuitCurrentMessageLoop());
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that a series of queued tasks are executed in order upon loading of
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the backing store and that new tasks received while the queued tasks are
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being dispatched go to the end of the queue.
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DeferredCookieTaskTest, DeferredTaskOrder) {
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeclareLoadedCookie("www.google.izzle",
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Time::Now() + TimeDelta::FromDays(3));
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockGetCookiesCallback get_cookies_callback;
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSetCookiesCallback set_cookies_callback;
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockGetCookiesCallback get_cookies_callback_deferred;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, Begin()).WillOnce(testing::DoAll(
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCookiesAction(
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &cookie_monster(), url_google_, &get_cookies_callback),
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetCookieAction(
11141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          &cookie_monster(), url_google_, "A=B", &set_cookies_callback)));
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectLoadCall();
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectLoadForKeyCall("google.izzle", false);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Begin();
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadCall();
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(get_cookies_callback, Invoke("X=1")).WillOnce(
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetCookiesAction(
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &cookie_monster(), url_google_, &get_cookies_callback_deferred));
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(set_cookies_callback, Invoke(true));
11241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(get_cookies_callback_deferred, Invoke("A=B; X=1")).WillOnce(
11251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      QuitCurrentMessageLoop());
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteLoadingAndWait();
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, TestCookieDeleteAll) {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockPersistentCookieStore> store(
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MockPersistentCookieStore);
1133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL));
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.set_include_httponly();
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, kValidCookieLine));
1138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B", GetCookies(cm.get(), url_google_));
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
1141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SetCookieWithOptions(cm.get(), url_google_, "C=D; httponly", options));
1142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B; C=D", GetCookiesWithOptions(cm.get(), url_google_, options));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2, DeleteAll(cm.get()));
1145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("", GetCookiesWithOptions(cm.get(), url_google_, options));
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, store->commands().size());
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a persistent cookie.
1149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(
1150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(),
1151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      url_google_,
1152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-22 22:50:13 GMT"));
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, store->commands().size());
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[0].type);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, DeleteAll(cm.get()));  // sync_to_store = true.
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, store->commands().size());
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[1].type);
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("", GetCookiesWithOptions(cm.get(), url_google_, options));
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, TestCookieDeleteAllCreatedBetweenTimestamps) {
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time now = Time::Now();
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing has been added so nothing should be deleted.
1168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(
1169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      0,
1170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(99), Time()));
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create 3 cookies with creation date of today, yesterday and the day before.
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cm->SetCookieWithCreationTime(url_google_, "T-0=Now", now));
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cm->SetCookieWithCreationTime(url_google_, "T-1=Yesterday",
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            now - TimeDelta::FromDays(1)));
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cm->SetCookieWithCreationTime(url_google_, "T-2=DayBefore",
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            now - TimeDelta::FromDays(2)));
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cm->SetCookieWithCreationTime(url_google_, "T-3=ThreeDays",
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            now - TimeDelta::FromDays(3)));
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cm->SetCookieWithCreationTime(url_google_, "T-7=LastWeek",
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            now - TimeDelta::FromDays(7)));
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to delete threedays and the daybefore.
1184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2,
1185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            DeleteAllCreatedBetween(cm.get(),
1186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    now - TimeDelta::FromDays(3),
1187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    now - TimeDelta::FromDays(1)));
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to delete yesterday, also make sure that delete_end is not
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // inclusive.
1191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(
1192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      1, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(2), now));
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the delete_begin is inclusive.
1195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(
1196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      1, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(7), now));
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete the last (now) item.
1199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, DeleteAllCreatedBetween(cm.get(), Time(), Time()));
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Really make sure everything is gone.
1202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, DeleteAll(cm.get()));
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAccessDelayMs = kLastAccessThresholdMilliseconds + 20;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, TestLastAccess) {
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CookieMonster(NULL, NULL, kLastAccessThresholdMilliseconds));
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=B"));
1212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const Time last_access_date(GetFirstCookieAccessDate(cm.get()));
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reading the cookie again immediately shouldn't update the access date,
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since we're inside the threshold.
1216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B", GetCookies(cm.get(), url_google_));
1217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(last_access_date == GetFirstCookieAccessDate(cm.get()));
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reading after a short wait should update the access date.
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformThread::Sleep(
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(kAccessDelayMs));
1222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B", GetCookies(cm.get(), url_google_));
1223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(last_access_date == GetFirstCookieAccessDate(cm.get()));
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, TestHostGarbageCollection) {
1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestHostGarbageCollectHelper();
1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(CookieMonsterTest, TestPriorityAwareGarbageCollection) {
1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestPriorityAwareGarbageCollectHelper();
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, TestDeleteSingleCookie) {
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=B"));
1238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "C=D"));
1239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "E=F"));
1240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B; C=D; E=F", GetCookies(cm.get(), url_google_));
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(FindAndDeleteCookie(cm.get(), url_google_.host(), "C"));
1243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B; E=F", GetCookies(cm.get(), url_google_));
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(FindAndDeleteCookie(cm.get(), "random.host", "E"));
1246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B; E=F", GetCookies(cm.get(), url_google_));
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, SetCookieableSchemes) {
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm_foo(new CookieMonster(NULL, NULL));
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only cm_foo should allow foo:// cookies.
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kSchemes[] = {"foo"};
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm_foo->SetCookieableSchemes(kSchemes, 1);
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL foo_url("foo://host/path");
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url("http://host/path");
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), http_url, "x=1"));
1261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SetCookie(cm.get(), foo_url, "x=1"));
1262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm_foo.get(), foo_url, "x=1"));
1263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SetCookie(cm_foo.get(), http_url, "x=1"));
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, GetAllCookiesForURL) {
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CookieMonster(NULL, NULL, kLastAccessThresholdMilliseconds));
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an httponly cookie.
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.set_include_httponly();
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
1275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SetCookieWithOptions(cm.get(), url_google_, "A=B; httponly", options));
1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(
1277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), url_google_, "C=D; domain=.google.izzle", options));
1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm.get(),
1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   url_google_secure_,
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   "E=F; domain=.google.izzle; secure",
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   options));
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const Time last_access_date(GetFirstCookieAccessDate(cm.get()));
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformThread::Sleep(
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(kAccessDelayMs));
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check cookies for url.
1289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookies = GetAllCookiesForURL(cm.get(), url_google_);
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList::iterator it = cookies.begin();
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it != cookies.end());
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(".google.izzle", it->Domain());
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("C", it->Name());
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check cookies for url excluding http-only cookies.
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookies =
1304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetAllCookiesForURLWithOptions(cm.get(), url_google_, CookieOptions());
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  it = cookies.begin();
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(".google.izzle", it->Domain());
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("C", it->Name());
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test secure cookies.
1314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  cookies = GetAllCookiesForURL(cm.get(), url_google_secure_);
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  it = cookies.begin();
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it != cookies.end());
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(".google.izzle", it->Domain());
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("C", it->Name());
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it != cookies.end());
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(".google.izzle", it->Domain());
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("E", it->Name());
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reading after a short wait should not update the access date.
1332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(last_access_date == GetFirstCookieAccessDate(cm.get()));
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, GetAllCookiesForURLPathMatching) {
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(
1340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), url_google_foo_, "A=B; path=/foo;", options));
1341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(
1342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), url_google_bar_, "C=D; path=/bar;", options));
1343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "E=F;", options));
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookies = GetAllCookiesForURL(cm.get(), url_google_foo_);
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList::iterator it = cookies.begin();
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/foo", it->Path());
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it != cookies.end());
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("E", it->Name());
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", it->Path());
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  cookies = GetAllCookiesForURL(cm.get(), url_google_bar_);
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  it = cookies.begin();
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("C", it->Name());
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/bar", it->Path());
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it != cookies.end());
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("E", it->Name());
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", it->Path());
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, DeleteCookieByName) {
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=A1; path=/"));
1376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=A2; path=/foo"));
1377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=A3; path=/bar"));
1378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "B=B1; path=/"));
1379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "B=B2; path=/foo"));
1380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "B=B3; path=/bar"));
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DeleteCookie(cm.get(), GURL(std::string(kUrlGoogle) + "/foo/bar"), "A");
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookies = GetAllCookies(cm.get());
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t expected_size = 4;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_size, cookies.size());
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (CookieList::iterator it = cookies.begin();
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != cookies.end(); ++it) {
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE("A1", it->Value());
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE("A2", it->Value());
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(CookieMonsterTest, ImportCookiesFromCookieMonster) {
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm_1(new CookieMonster(NULL, NULL));
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm_1.get(), url_google_foo_,
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "A1=B; path=/foo;",
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               options));
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm_1.get(), url_google_bar_,
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "A2=D; path=/bar;",
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               options));
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm_1.get(), url_google_,
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "A3=F;",
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               options));
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookies_1 = GetAllCookies(cm_1.get());
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm_2(new CookieMonster(NULL, NULL));
14101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(cm_2->ImportCookies(cookies_1));
1411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookies_2 = GetAllCookies(cm_2.get());
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t expected_size = 3;
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_size, cookies_2.size());
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList::iterator it = cookies_2.begin();
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies_2.end());
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A1", it->Name());
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/foo", it->Path());
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it != cookies_2.end());
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A2", it->Name());
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/bar", it->Path());
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it != cookies_2.end());
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A3", it->Name());
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", it->Path());
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests importing from a persistent cookie store that contains duplicate
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// equivalent cookies. This situation should be handled by removing the
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// duplicate cookie (both from the in-memory cache, and from the backing store).
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a regression test for: http://crbug.com/17855.
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, DontImportDuplicateCookies) {
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockPersistentCookieStore> store(
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MockPersistentCookieStore);
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We will fill some initial cookies into the PersistentCookieStore,
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to simulate a database with 4 duplicates.  Note that we need to
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be careful not to have any duplicate creation times at all (as it's a
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // violation of a CookieMonster invariant) even if Time::Now() doesn't
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // move between calls.
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<CanonicalCookie*> initial_cookies;
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert 4 cookies with name "X" on path "/", with varying creation
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dates. We expect only the most recent one to be preserved following
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the import.
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com",
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Time::Now() + TimeDelta::FromDays(3),
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  &initial_cookies);
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com",
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "X=2; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Time::Now() + TimeDelta::FromDays(1),
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  &initial_cookies);
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ===> This one is the WINNER (biggest creation time).  <====
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com",
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "X=3; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Time::Now() + TimeDelta::FromDays(4),
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  &initial_cookies);
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com",
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "X=4; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Time::Now(),
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  &initial_cookies);
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert 2 cookies with name "X" on path "/2", with varying creation
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dates. We expect only the most recent one to be preserved the import.
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ===> This one is the WINNER (biggest creation time).  <====
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com",
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "X=a1; path=/2; expires=Mon, 18-Apr-22 22:50:14 GMT",
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Time::Now() + TimeDelta::FromDays(9),
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  &initial_cookies);
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com",
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "X=a2; path=/2; expires=Mon, 18-Apr-22 22:50:14 GMT",
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Time::Now() + TimeDelta::FromDays(2),
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  &initial_cookies);
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert 1 cookie with name "Y" on path "/".
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com",
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "Y=a; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Time::Now() + TimeDelta::FromDays(10),
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  &initial_cookies);
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inject our initial cookies into the mock PersistentCookieStore.
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store->SetLoadExpectation(true, initial_cookies);
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL));
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that duplicates were not imported for path "/".
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (If this had failed, GetCookies() would have also returned X=1, X=2, X=4).
1499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("X=3; Y=a", GetCookies(cm.get(), GURL("http://www.google.com/")));
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that same-named cookie on a different path ("/x2") didn't get
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messed up.
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("X=a1; X=3; Y=a",
1504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL("http://www.google.com/2/x")));
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the PersistentCookieStore was told to kill its 4 duplicates.
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4u, store->commands().size());
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[0].type);
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[1].type);
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[2].type);
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[3].type);
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests importing from a persistent cookie store that contains cookies
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with duplicate creation times.  This situation should be handled by
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dropping the cookies before insertion/visibility to user.
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a regression test for: http://crbug.com/43188.
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, DontImportDuplicateCreationTimes) {
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockPersistentCookieStore> store(
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MockPersistentCookieStore);
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time now(Time::Now());
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time earlier(now - TimeDelta::FromDays(1));
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert 8 cookies, four with the current time as creation times, and
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // four with the earlier time as creation times.  We should only get
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // two cookies remaining, but which two (other than that there should
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be one from each set) will be random.
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<CanonicalCookie*> initial_cookies;
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com", "X=1; path=/", now, &initial_cookies);
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com", "X=2; path=/", now, &initial_cookies);
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com", "X=3; path=/", now, &initial_cookies);
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com", "X=4; path=/", now, &initial_cookies);
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com", "Y=1; path=/", earlier, &initial_cookies);
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com", "Y=2; path=/", earlier, &initial_cookies);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com", "Y=3; path=/", earlier, &initial_cookies);
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddCookieToList("www.google.com", "Y=4; path=/", earlier, &initial_cookies);
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inject our initial cookies into the mock PersistentCookieStore.
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store->SetLoadExpectation(true, initial_cookies);
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL));
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList list(GetAllCookies(cm.get()));
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, list.size());
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm that we have one of each.
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string name1(list[0].Name());
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string name2(list[1].Name());
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(name1 == "X" || name2 == "X");
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(name1 == "Y" || name2 == "Y");
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(name1, name2);
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CookieMonsterTest, CookieMonsterDelegate) {
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockPersistentCookieStore> store(
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MockPersistentCookieStore);
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockCookieMonsterDelegate> delegate(
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MockCookieMonsterDelegate);
1561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(
1562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new CookieMonster(store.get(), delegate.get()));
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=B"));
1565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "C=D"));
1566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "E=F"));
1567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B; C=D; E=F", GetCookies(cm.get(), url_google_));
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, delegate->changes().size());
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(delegate->changes()[0].second);
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url_google_.host(), delegate->changes()[0].first.Domain());
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", delegate->changes()[0].first.Name());
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("B", delegate->changes()[0].first.Value());
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url_google_.host(), delegate->changes()[1].first.Domain());
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(delegate->changes()[1].second);
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("C", delegate->changes()[1].first.Name());
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("D", delegate->changes()[1].first.Value());
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url_google_.host(), delegate->changes()[2].first.Domain());
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(delegate->changes()[2].second);
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("E", delegate->changes()[2].first.Name());
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("F", delegate->changes()[2].first.Value());
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate->reset();
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(FindAndDeleteCookie(cm.get(), url_google_.host(), "C"));
1584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B; E=F", GetCookies(cm.get(), url_google_));
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, delegate->changes().size());
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url_google_.host(), delegate->changes()[0].first.Domain());
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(delegate->changes()[0].second);
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("C", delegate->changes()[0].first.Name());
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("D", delegate->changes()[0].first.Value());
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate->reset();
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(FindAndDeleteCookie(cm.get(), "random.host", "E"));
1593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B; E=F", GetCookies(cm.get(), url_google_));
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, delegate->changes().size());
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert a cookie "a" for path "/path1"
1597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(),
1598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        url_google_,
1599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        "a=val1; path=/path1; "
1600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        "expires=Mon, 18-Apr-22 22:50:13 GMT"));
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, store->commands().size());
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[0].type);
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, delegate->changes().size());
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(delegate->changes()[0].second);
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url_google_.host(), delegate->changes()[0].first.Domain());
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("a", delegate->changes()[0].first.Name());
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val1", delegate->changes()[0].first.Value());
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate->reset();
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert a cookie "a" for path "/path1", that is httponly. This should
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // overwrite the non-http-only version.
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions allow_httponly;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allow_httponly.set_include_httponly();
1614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm.get(),
1615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   url_google_,
1616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "a=val2; path=/path1; httponly; "
1617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "expires=Mon, 18-Apr-22 22:50:14 GMT",
1618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   allow_httponly));
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, store->commands().size());
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[1].type);
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[2].type);
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, delegate->changes().size());
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url_google_.host(), delegate->changes()[0].first.Domain());
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(delegate->changes()[0].second);
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("a", delegate->changes()[0].first.Name());
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val1", delegate->changes()[0].first.Value());
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url_google_.host(), delegate->changes()[1].first.Domain());
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(delegate->changes()[1].second);
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("a", delegate->changes()[1].first.Name());
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val2", delegate->changes()[1].first.Value());
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate->reset();
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, SetCookieWithDetails) {
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithDetails(cm.get(),
1638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   url_google_foo_,
1639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "A",
1640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "B",
1641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   std::string(),
1642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "/foo",
1643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   base::Time(),
1644868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   false,
1645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   false,
1646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   COOKIE_PRIORITY_DEFAULT));
1647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithDetails(cm.get(),
1648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   url_google_bar_,
1649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "C",
1650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "D",
1651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "google.izzle",
1652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "/bar",
1653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   base::Time(),
1654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   false,
1655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   true,
1656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   COOKIE_PRIORITY_DEFAULT));
1657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithDetails(cm.get(),
1658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   url_google_,
1659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "E",
1660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "F",
1661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   std::string(),
1662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   std::string(),
1663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   base::Time(),
1664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   true,
1665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   false,
1666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   COOKIE_PRIORITY_DEFAULT));
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that malformed attributes fail to set the cookie.
1669868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SetCookieWithDetails(cm.get(),
1670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    url_google_foo_,
1671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    " A",
1672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "B",
1673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    std::string(),
1674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "/foo",
1675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    base::Time(),
1676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    COOKIE_PRIORITY_DEFAULT));
1679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SetCookieWithDetails(cm.get(),
1680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    url_google_foo_,
1681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "A;",
1682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "B",
1683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    std::string(),
1684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "/foo",
1685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    base::Time(),
1686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    COOKIE_PRIORITY_DEFAULT));
1689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SetCookieWithDetails(cm.get(),
1690868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    url_google_foo_,
1691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "A=",
1692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "B",
1693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    std::string(),
1694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "/foo",
1695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    base::Time(),
1696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    COOKIE_PRIORITY_DEFAULT));
1699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SetCookieWithDetails(cm.get(),
1700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    url_google_foo_,
1701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "A",
1702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "B",
1703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "google.ozzzzzzle",
1704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "foo",
1705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    base::Time(),
1706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    COOKIE_PRIORITY_DEFAULT));
1709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SetCookieWithDetails(cm.get(),
1710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    url_google_foo_,
1711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "A=",
1712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "B",
1713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    std::string(),
1714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    "foo",
1715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    base::Time(),
1716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    false,
1718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    COOKIE_PRIORITY_DEFAULT));
1719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookies = GetAllCookiesForURL(cm.get(), url_google_foo_);
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList::iterator it = cookies.begin();
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("B", it->Value());
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/foo", it->Path());
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(it->IsPersistent());
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(it->IsSecure());
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(it->IsHttpOnly());
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  cookies = GetAllCookiesForURL(cm.get(), url_google_bar_);
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  it = cookies.begin();
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("C", it->Name());
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("D", it->Value());
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(".google.izzle", it->Domain());
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/bar", it->Path());
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(it->IsSecure());
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(it->IsHttpOnly());
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  cookies = GetAllCookiesForURL(cm.get(), url_google_secure_);
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  it = cookies.begin();
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("E", it->Name());
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("F", it->Value());
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", it->Path());
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(it->IsSecure());
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(it->IsHttpOnly());
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, DeleteAllForHost) {
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test probes:
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    * Non-secure URL, mid-level (http://w.c.b.a)
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    * Secure URL, mid-level (https://w.c.b.a)
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    * URL with path, mid-level (https:/w.c.b.a/dir1/xx)
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All three tests should nuke only the midlevel host cookie,
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the http_only cookie, the host secure cookie, and the two host
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // path cookies.  http_only, secure, and paths are ignored by
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this call, and domain cookies arent touched.
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopulateCmForDeleteAllForHost(cm);
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_1=X; dom_2=X; dom_3=X; host_3=X",
1774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus3)));
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_1=X; dom_2=X; host_2=X; sec_dom=X; sec_host=X",
1776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus2Secure)));
1777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("dom_1=X; host_1=X",
1778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus1)));
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_path_2=X; host_path_2=X; dom_path_1=X; host_path_1=X; "
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "dom_1=X; dom_2=X; host_2=X; sec_dom=X; sec_host=X",
1781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(),
1782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       GURL(kTopLevelDomainPlus2Secure +
1783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            std::string("/dir1/dir2/xxx"))));
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(5, DeleteAllForHost(cm.get(), GURL(kTopLevelDomainPlus2)));
1786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(8U, GetAllCookies(cm.get()).size());
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_1=X; dom_2=X; dom_3=X; host_3=X",
1789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus3)));
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_1=X; dom_2=X; sec_dom=X",
1791868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus2Secure)));
1792868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("dom_1=X; host_1=X",
1793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus1)));
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_path_2=X; dom_path_1=X; dom_1=X; dom_2=X; sec_dom=X",
1795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(),
1796868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       GURL(kTopLevelDomainPlus2Secure +
1797868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            std::string("/dir1/dir2/xxx"))));
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopulateCmForDeleteAllForHost(cm);
1800868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(5, DeleteAllForHost(cm.get(), GURL(kTopLevelDomainPlus2Secure)));
1801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(8U, GetAllCookies(cm.get()).size());
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_1=X; dom_2=X; dom_3=X; host_3=X",
1804868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus3)));
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_1=X; dom_2=X; sec_dom=X",
1806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus2Secure)));
1807868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("dom_1=X; host_1=X",
1808868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus1)));
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_path_2=X; dom_path_1=X; dom_1=X; dom_2=X; sec_dom=X",
1810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(),
1811868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       GURL(kTopLevelDomainPlus2Secure +
1812868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            std::string("/dir1/dir2/xxx"))));
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopulateCmForDeleteAllForHost(cm);
1815868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(5,
1816868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            DeleteAllForHost(
1817868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                cm.get(),
1818868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                GURL(kTopLevelDomainPlus2Secure + std::string("/dir1/xxx"))));
1819868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(8U, GetAllCookies(cm.get()).size());
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_1=X; dom_2=X; dom_3=X; host_3=X",
1822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus3)));
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_1=X; dom_2=X; sec_dom=X",
1824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus2Secure)));
1825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("dom_1=X; host_1=X",
1826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(), GURL(kTopLevelDomainPlus1)));
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("dom_path_2=X; dom_path_1=X; dom_1=X; dom_2=X; sec_dom=X",
1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetCookies(cm.get(),
1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       GURL(kTopLevelDomainPlus2Secure +
1830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            std::string("/dir1/dir2/xxx"))));
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, UniqueCreationTime) {
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add in three cookies through every public interface to the
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CookieMonster and confirm that none of them have duplicate
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // creation times.
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetCookieWithCreationTime and SetCookieWithCreationTimeAndOptions
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are not included as they aren't going to be public for very much
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // longer.
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetCookie, SetCookieWithOptions, SetCookieWithDetails
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1847868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCookie(cm.get(), url_google_, "SetCookie1=A");
1848868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCookie(cm.get(), url_google_, "SetCookie2=A");
1849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCookie(cm.get(), url_google_, "SetCookie3=A");
1850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCookieWithOptions(
1852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), url_google_, "setCookieWithOptions1=A", options);
1853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCookieWithOptions(
1854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), url_google_, "setCookieWithOptions2=A", options);
1855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCookieWithOptions(
1856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), url_google_, "setCookieWithOptions3=A", options);
1857868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCookieWithDetails(cm.get(),
1859868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       url_google_,
1860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       "setCookieWithDetails1",
1861868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       "A",
1862868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       ".google.com",
1863868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       "/",
1864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       Time(),
1865868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       false,
1866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       false,
1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       COOKIE_PRIORITY_DEFAULT);
1868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCookieWithDetails(cm.get(),
1869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       url_google_,
1870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       "setCookieWithDetails2",
1871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       "A",
1872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       ".google.com",
1873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       "/",
1874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       Time(),
1875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       false,
1876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       false,
1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       COOKIE_PRIORITY_DEFAULT);
1878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCookieWithDetails(cm.get(),
1879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       url_google_,
1880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       "setCookieWithDetails3",
1881868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       "A",
1882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       ".google.com",
1883868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       "/",
1884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       Time(),
1885868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       false,
1886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       false,
1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       COOKIE_PRIORITY_DEFAULT);
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we check
1890868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookie_list(GetAllCookies(cm.get()));
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<int64, CanonicalCookie> TimeCookieMap;
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeCookieMap check_map;
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (CookieList::const_iterator it = cookie_list.begin();
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != cookie_list.end(); it++) {
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int64 creation_date = it->CreationDate().ToInternalValue();
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TimeCookieMap::const_iterator
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        existing_cookie_it(check_map.find(creation_date));
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(existing_cookie_it == check_map.end())
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Cookie " << it->Name() << " has same creation date ("
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << it->CreationDate().ToInternalValue()
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << ") as previously entered cookie "
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << existing_cookie_it->second.Name();
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (existing_cookie_it == check_map.end()) {
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      check_map.insert(TimeCookieMap::value_type(
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          it->CreationDate().ToInternalValue(), *it));
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mainly a test of GetEffectiveDomain, or more specifically, of the
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expected behavior of GetEffectiveDomain within the CookieMonster.
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, GetKey) {
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This test is really only interesting if GetKey() actually does something.
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("google.com", cm->GetKey("www.google.com"));
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("google.izzie", cm->GetKey("www.google.izzie"));
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("google.izzie", cm->GetKey(".google.izzie"));
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bbc.co.uk", cm->GetKey("bbc.co.uk"));
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bbc.co.uk", cm->GetKey("a.b.c.d.bbc.co.uk"));
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("apple.com", cm->GetKey("a.b.c.d.apple.com"));
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("apple.izzie", cm->GetKey("a.b.c.d.apple.izzie"));
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cases where the effective domain is null, so we use the host
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as the key.
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("co.uk", cm->GetKey("co.uk"));
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string extension_name("iehocdgbbocmkdidlbnnfbmbinnahbae");
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(extension_name, cm->GetKey(extension_name));
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("com", cm->GetKey("com"));
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hostalias", cm->GetKey("hostalias"));
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("localhost", cm->GetKey("localhost"));
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cookies transfer from/to the backing store correctly.
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, BackingStoreCommunication) {
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Store details for cookies transforming through the backing store interface.
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time current(base::Time::Now());
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockSimplePersistentCookieStore> store(
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MockSimplePersistentCookieStore);
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time new_access_time;
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time expires(base::Time::Now() + base::TimeDelta::FromSeconds(100));
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CookiesInputInfo input_info[] = {
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {GURL("http://a.b.google.com"), "a", "1", "", "/path/to/cookie", expires,
1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     false, false, COOKIE_PRIORITY_DEFAULT},
1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {GURL("https://www.google.com"), "b", "2", ".google.com",
1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     "/path/from/cookie", expires + TimeDelta::FromSeconds(10),
1950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     true, true, COOKIE_PRIORITY_DEFAULT},
1951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {GURL("https://google.com"), "c", "3", "", "/another/path/to/cookie",
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     base::Time::Now() + base::TimeDelta::FromSeconds(100),
1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     true, false, COOKIE_PRIORITY_DEFAULT}
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int INPUT_DELETE = 1;
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create new cookies and flush them to the store.
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_refptr<CookieMonster> cmout(new CookieMonster(store.get(), NULL));
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (const CookiesInputInfo* p = input_info;
1961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)         p < &input_info[ARRAYSIZE_UNSAFE(input_info)];
1962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)         p++) {
1963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_TRUE(SetCookieWithDetails(cmout.get(),
1964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       p->url,
1965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       p->name,
1966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       p->value,
1967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       p->domain,
1968868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       p->path,
1969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       p->expiration_time,
1970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       p->secure,
1971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       p->http_only,
1972868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       p->priority));
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GURL del_url(input_info[INPUT_DELETE].url.Resolve(
1975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     input_info[INPUT_DELETE].path).spec());
1976868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DeleteCookie(cmout.get(), del_url, input_info[INPUT_DELETE].name);
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new cookie monster and make sure that everything is correct
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_refptr<CookieMonster> cmin(new CookieMonster(store.get(), NULL));
1982868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CookieList cookies(GetAllCookies(cmin.get()));
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u, cookies.size());
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ordering is path length, then creation time.  So second cookie
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // will come first, and we need to swap them.
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::swap(cookies[0], cookies[1]);
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int output_index = 0; output_index < 2; output_index++) {
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int input_index = output_index * 2;
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CookiesInputInfo* input = &input_info[input_index];
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CanonicalCookie* output = &cookies[output_index];
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(input->name, output->Name());
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(input->value, output->Value());
1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(input->url.host(), output->Domain());
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(input->path, output->Path());
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_LE(current.ToInternalValue(),
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                output->CreationDate().ToInternalValue());
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(input->secure, output->IsSecure());
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(input->http_only, output->IsHttpOnly());
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(output->IsPersistent());
2001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(input->expiration_time.ToInternalValue(),
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                output->ExpiryDate().ToInternalValue());
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, CookieListOrdering) {
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put a random set of cookies into a monster and make sure
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // they're returned in the right order.
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
2011868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
2012868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SetCookie(cm.get(), GURL("http://d.c.b.a.google.com/aa/x.html"), "c=1"));
2013868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(),
2014868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        GURL("http://b.a.google.com/aa/bb/cc/x.html"),
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "d=1; domain=b.a.google.com"));
2016868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(),
2017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        GURL("http://b.a.google.com/aa/bb/cc/x.html"),
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "a=4; domain=b.a.google.com"));
2019868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(),
2020868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        GURL("http://c.b.a.google.com/aa/bb/cc/x.html"),
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "e=1; domain=c.b.a.google.com"));
2022868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(
2023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), GURL("http://d.c.b.a.google.com/aa/bb/x.html"), "b=1"));
2024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(
2025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), GURL("http://news.bbc.co.uk/midpath/x.html"), "g=10"));
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int i = 0;
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CookieList cookies(GetAllCookiesForURL(
2029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        cm.get(), GURL("http://d.c.b.a.google.com/aa/bb/cc/dd")));
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(5u, cookies.size());
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("d", cookies[i++].Name());
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("a", cookies[i++].Name());
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("e", cookies[i++].Name());
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("b", cookies[i++].Name());
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("c", cookies[i++].Name());
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int i = 0;
2040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CookieList cookies(GetAllCookies(cm.get()));
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(6u, cookies.size());
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("d", cookies[i++].Name());
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("a", cookies[i++].Name());
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("e", cookies[i++].Name());
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("g", cookies[i++].Name());
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("b", cookies[i++].Name());
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("c", cookies[i++].Name());
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test and CookieMonstertest.TestGCTimes (in cookie_monster_perftest.cc)
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are somewhat complementary twins.  This test is probing for whether
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// garbage collection always happens when it should (i.e. that we actually
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// get rid of cookies when we should).  The perftest is probing for
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether garbage collection happens when it shouldn't.  See comments
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// before that test for more details.
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled on Windows, see crbug.com/126095
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_GarbageCollectionTriggers DISABLED_GarbageCollectionTriggers
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_GarbageCollectionTriggers GarbageCollectionTriggers
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, MAYBE_GarbageCollectionTriggers) {
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First we check to make sure that a whole lot of recent cookies
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't get rid of anything after garbage collection is checked for.
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<CookieMonster> cm(
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateMonsterForGC(CookieMonster::kMaxCookies * 2));
2071868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(CookieMonster::kMaxCookies * 2, GetAllCookies(cm.get()).size());
2072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SetCookie(cm.get(), GURL("http://newdomain.com"), "b=2");
2073868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(CookieMonster::kMaxCookies * 2 + 1,
2074868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              GetAllCookies(cm.get()).size());
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we explore a series of relationships between cookie last access
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time and size of store to make sure we only get rid of cookies when
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we really should.
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct TestCase {
20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t num_cookies;
20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t num_old_cookies;
20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t expected_initial_cookies;
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indexed by ExpiryAndKeyScheme
20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t expected_cookies_after_set;
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } test_cases[] = {
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // A whole lot of recent cookies; gc shouldn't happen.
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2,
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2,
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2 + 1
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }, {
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Some old cookies, but still overflowing max.
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2,
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies / 2,
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2,
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2 - CookieMonster::kMaxCookies / 2 + 1
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }, {
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Old cookies enough to bring us right down to our purge line.
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2,
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies + CookieMonster::kPurgeCookies + 1,
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2,
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies - CookieMonster::kPurgeCookies
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }, {
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Old cookies enough to bring below our purge line (which we
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // shouldn't do).
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2,
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 3 / 2,
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies * 2,
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CookieMonster::kMaxCookies - CookieMonster::kPurgeCookies
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int ci = 0; ci < static_cast<int>(ARRAYSIZE_UNSAFE(test_cases)); ++ci) {
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestCase *test_case = &test_cases[ci];
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<CookieMonster> cm(
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateMonsterFromStoreForGC(
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_case->num_cookies, test_case->num_old_cookies,
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            CookieMonster::kSafeFromGlobalPurgeDays * 2));
2121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(test_case->expected_initial_cookies,
2122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              GetAllCookies(cm.get()).size()) << "For test case " << ci;
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Will trigger GC
2124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SetCookie(cm.get(), GURL("http://newdomain.com"), "b=2");
2125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(test_case->expected_cookies_after_set,
2126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              GetAllCookies(cm.get()).size()) << "For test case " << ci;
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that keep expired cookies flag is working.
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, KeepExpiredCookies) {
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm->SetKeepExpiredCookies();
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a persistent cookie.
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetCookieWithOptions(
2138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(),
2139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      url_google_,
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-22 22:50:13 GMT",
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options));
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the canonical cookie.
2144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookie_list = GetAllCookies(cm.get());
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, cookie_list.size());
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a past expiry date to delete the cookie.
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetCookieWithOptions(
2149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(),
2150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      url_google_,
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-1977 22:50:13 GMT",
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options));
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the cookie with the past expiry date is still there.
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetAllCookies() also triggers garbage collection.
2156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  cookie_list = GetAllCookies(cm.get());
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, cookie_list.size());
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(cookie_list[0].IsExpired(Time::Now()));
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock PersistentCookieStore that keeps track of the number of Flush() calls.
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FlushablePersistentStore : public CookieMonster::PersistentCookieStore {
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushablePersistentStore() : flush_count_(0) {}
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Load(const LoadedCallback& loaded_callback) OVERRIDE {
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<CanonicalCookie*> out_cookies;
217090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
217190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        FROM_HERE,
217290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Bind(&net::LoadedCallbackTask::Run,
217390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   new net::LoadedCallbackTask(loaded_callback, out_cookies)));
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LoadCookiesForKey(
21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& key,
21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const LoadedCallback& loaded_callback) OVERRIDE {
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Load(loaded_callback);
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AddCookie(const CanonicalCookie&) OVERRIDE {}
21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateCookieAccessTime(const CanonicalCookie&) OVERRIDE {}
21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeleteCookie(const CanonicalCookie&) OVERRIDE {}
21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetForceKeepSessionState() OVERRIDE {}
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Flush(const base::Closure& callback) OVERRIDE {
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++flush_count_;
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!callback.is_null())
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run();
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flush_count() {
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return flush_count_;
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FlushablePersistentStore() {}
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile int flush_count_;
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Counts the number of times Callback() has been run.
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CallbackCounter : public base::RefCountedThreadSafe<CallbackCounter> {
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallbackCounter() : callback_count_(0) {}
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Callback() {
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++callback_count_;
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callback_count() {
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return callback_count_;
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<CallbackCounter>;
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~CallbackCounter() {}
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile int callback_count_;
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that FlushStore() is forwarded to the store and callbacks are posted.
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, FlushStore) {
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CallbackCounter> counter(new CallbackCounter());
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<FlushablePersistentStore> store(new FlushablePersistentStore());
2229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL));
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, store->flush_count());
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, counter->callback_count());
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Before initialization, FlushStore() should just run the callback.
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm->FlushStore(base::Bind(&CallbackCounter::Callback, counter.get()));
223690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, store->flush_count());
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, counter->callback_count());
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL callback is safe.
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm->FlushStore(base::Closure());
224390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, store->flush_count());
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, counter->callback_count());
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After initialization, FlushStore() should delegate to the store.
2249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetAllCookies(cm.get());  // Force init.
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm->FlushStore(base::Bind(&CallbackCounter::Callback, counter.get()));
225190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, store->flush_count());
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, counter->callback_count());
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL callback is still safe.
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm->FlushStore(base::Closure());
225890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, store->flush_count());
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, counter->callback_count());
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there's no backing store, FlushStore() is always a safe no-op.
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm = new CookieMonster(NULL, NULL);
2265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetAllCookies(cm.get());  // Force init.
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm->FlushStore(base::Closure());
226790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, counter->callback_count());
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm->FlushStore(base::Bind(&CallbackCounter::Callback, counter.get()));
227290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3, counter->callback_count());
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, HistogramCheck) {
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should match call in InitializeHistograms, but doesn't really matter
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since the histogram should have been initialized by the CM construction
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // above.
22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::HistogramBase* expired_histogram =
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Histogram::FactoryGet(
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "Cookie.ExpirationDurationMinutes", 1, 10 * 365 * 24 * 60, 50,
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Histogram::kUmaTargetedHistogramFlag);
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::HistogramSamples> samples1(
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expired_histogram->SnapshotSamples());
2289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(
2290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SetCookieWithDetails(cm.get(),
2291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           GURL("http://fake.a.url"),
2292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           "a",
2293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           "b",
2294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           "a.url",
2295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           "/",
2296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           base::Time::Now() + base::TimeDelta::FromMinutes(59),
2297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           false,
2298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           false,
2299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           COOKIE_PRIORITY_DEFAULT));
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::HistogramSamples> samples2(
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expired_histogram->SnapshotSamples());
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(samples1->TotalCount() + 1, samples2->TotalCount());
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kValidCookieLine creates a session cookie.
2306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(SetCookie(cm.get(), url_google_, kValidCookieLine));
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::HistogramSamples> samples3(
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expired_histogram->SnapshotSamples());
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(samples2->TotalCount(), samples3->TotalCount());
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MultiThreadedCookieMonsterTest : public CookieMonsterTest {
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MultiThreadedCookieMonsterTest() : other_thread_("CMTthread") {}
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper methods for calling the asynchronous CookieMonster methods
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from a different thread.
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetAllCookiesTask(CookieMonster* cm,
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         GetCookieListCallback* callback) {
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->GetAllCookiesAsync(
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&GetCookieListCallback::Run, base::Unretained(callback)));
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetAllCookiesForURLTask(CookieMonster* cm,
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const GURL& url,
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               GetCookieListCallback* callback) {
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->GetAllCookiesForURLAsync(
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url,
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&GetCookieListCallback::Run, base::Unretained(callback)));
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetAllCookiesForURLWithOptionsTask(CookieMonster* cm,
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const GURL& url,
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const CookieOptions& options,
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          GetCookieListCallback* callback) {
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->GetAllCookiesForURLWithOptionsAsync(
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, options,
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&GetCookieListCallback::Run, base::Unretained(callback)));
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCookieWithDetailsTask(CookieMonster* cm, const GURL& url,
2346e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                ResultSavingCookieCallback<bool>* callback) {
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Define the parameters here instead of in the calling fucntion.
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The maximum number of parameters for Bind function is 6.
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string name = "A";
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string value = "B";
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string domain = std::string();
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string path = "/foo";
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time expiration_time = base::Time();
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool secure = false;
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool http_only = false;
2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CookiePriority priority = COOKIE_PRIORITY_DEFAULT;
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->SetCookieWithDetailsAsync(
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, name, value, domain, path, expiration_time, secure, http_only,
2359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        priority,
2360e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(
2361e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            &ResultSavingCookieCallback<bool>::Run,
2362e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            base::Unretained(callback)));
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteAllCreatedBetweenTask(CookieMonster* cm,
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const base::Time& delete_begin,
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const base::Time& delete_end,
2368e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                   ResultSavingCookieCallback<int>* callback) {
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->DeleteAllCreatedBetweenAsync(
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete_begin, delete_end,
2371e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(
2372e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            &ResultSavingCookieCallback<int>::Run, base::Unretained(callback)));
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteAllForHostTask(CookieMonster* cm,
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const GURL& url,
2377e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                            ResultSavingCookieCallback<int>* callback) {
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->DeleteAllForHostAsync(
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url,
2380e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(
2381e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            &ResultSavingCookieCallback<int>::Run, base::Unretained(callback)));
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2384e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void DeleteAllCreatedBetweenForHostTask(
2385e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      CookieMonster* cm,
2386e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      const base::Time delete_begin,
2387e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      const base::Time delete_end,
2388e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      const GURL& url,
2389e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ResultSavingCookieCallback<int>* callback) {
23903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    cm->DeleteAllCreatedBetweenForHostAsync(
23913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        delete_begin, delete_end, url,
2392e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(
2393e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            &ResultSavingCookieCallback<int>::Run,
2394e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            base::Unretained(callback)));
23953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
23963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteCanonicalCookieTask(CookieMonster* cm,
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const CanonicalCookie& cookie,
2399e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                 ResultSavingCookieCallback<bool>* callback) {
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cm->DeleteCanonicalCookieAsync(
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cookie,
2402e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(
2403e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            &ResultSavingCookieCallback<bool>::Run,
2404e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            base::Unretained(callback)));
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunOnOtherThread(const base::Closure& task) {
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    other_thread_.Start();
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    other_thread_.message_loop()->PostTask(FROM_HERE, task);
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFor(kTimeout);
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    other_thread_.Stop();
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Thread other_thread_;
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckGetAllCookies) {
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
2422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=B"));
2423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookies = GetAllCookies(cm.get());
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList::const_iterator it = cookies.begin();
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCookieListCallback callback(&other_thread_);
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure task =
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&net::MultiThreadedCookieMonsterTest::GetAllCookiesTask,
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this),
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 cm, &callback);
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOnOtherThread(task);
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.did_run());
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  it = callback.cookies().begin();
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != callback.cookies().end());
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == callback.cookies().end());
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckGetAllCookiesForURL) {
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
2445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=B"));
2446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookies = GetAllCookiesForURL(cm.get(), url_google_);
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList::const_iterator it = cookies.begin();
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCookieListCallback callback(&other_thread_);
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure task =
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&net::MultiThreadedCookieMonsterTest::GetAllCookiesForURLTask,
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this),
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 cm, url_google_, &callback);
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOnOtherThread(task);
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.did_run());
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  it = callback.cookies().begin();
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != callback.cookies().end());
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == callback.cookies().end());
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckGetAllCookiesForURLWithOpt) {
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
2468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=B"));
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList cookies =
2471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetAllCookiesForURLWithOptions(cm.get(), url_google_, options);
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList::const_iterator it = cookies.begin();
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != cookies.end());
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == cookies.end());
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCookieListCallback callback(&other_thread_);
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure task = base::Bind(
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &net::MultiThreadedCookieMonsterTest::GetAllCookiesForURLWithOptionsTask,
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Unretained(this),
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cm, url_google_, options, &callback);
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOnOtherThread(task);
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.did_run());
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  it = callback.cookies().begin();
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(it != callback.cookies().end());
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.google.izzle", it->Domain());
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", it->Name());
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(++it == callback.cookies().end());
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckSetCookieWithDetails) {
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
2493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithDetails(cm.get(),
2494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   url_google_foo_,
2495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "A",
2496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "B",
2497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   std::string(),
2498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   "/foo",
2499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   base::Time(),
2500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   false,
2501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   false,
2502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   COOKIE_PRIORITY_DEFAULT));
2503e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ResultSavingCookieCallback<bool> callback(&other_thread_);
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure task = base::Bind(
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &net::MultiThreadedCookieMonsterTest::SetCookieWithDetailsTask,
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Unretained(this),
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cm, url_google_foo_, &callback);
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOnOtherThread(task);
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.did_run());
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.result());
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckDeleteAllCreatedBetween) {
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time now = Time::Now();
2517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "A=B", options));
2518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(
2519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      1,
2520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(99), Time()));
2521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "A=B", options));
2522e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ResultSavingCookieCallback<int> callback(&other_thread_);
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure task = base::Bind(
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &net::MultiThreadedCookieMonsterTest::DeleteAllCreatedBetweenTask,
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Unretained(this),
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cm, now - TimeDelta::FromDays(99),
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Time(), &callback);
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOnOtherThread(task);
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.did_run());
253090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1, callback.result());
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckDeleteAllForHost) {
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
2536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "A=B", options));
2537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, DeleteAllForHost(cm.get(), url_google_));
2538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "A=B", options));
2539e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ResultSavingCookieCallback<int> callback(&other_thread_);
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure task = base::Bind(
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &net::MultiThreadedCookieMonsterTest::DeleteAllForHostTask,
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Unretained(this),
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cm, url_google_, &callback);
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOnOtherThread(task);
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.did_run());
254690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1, callback.result());
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(MultiThreadedCookieMonsterTest,
25503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch       ThreadCheckDeleteAllCreatedBetweenForHost) {
25513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
25523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  GURL url_not_google("http://www.notgoogle.com");
25533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
25543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  CookieOptions options;
25553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  Time now = Time::Now();
25563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // ago1 < ago2 < ago3 < now.
25573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  Time ago1 = now - TimeDelta::FromDays(101);
25583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  Time ago2 = now - TimeDelta::FromDays(100);
25593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  Time ago3 = now - TimeDelta::FromDays(99);
25603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
25613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // These 3 cookies match the first deletion.
25623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "A=B", options));
25633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "C=D", options));
25643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "Y=Z", options));
25653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
25663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // This cookie does not match host.
25673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_not_google, "E=F", options));
25683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
25693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // This cookie does not match time range: [ago3, inf], for first deletion, but
25703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // matches for the second deletion.
25713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_TRUE(cm->SetCookieWithCreationTime(url_google_, "G=H", ago2));
25723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
25733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // 1. First set of deletions.
25743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_EQ(
25753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      3,  // Deletes A=B, C=D, Y=Z
25763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      DeleteAllCreatedBetweenForHost(
25773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          cm.get(), ago3, Time::Max(), url_google_));
25783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
25793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "A=B", options));
2580e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ResultSavingCookieCallback<int> callback(&other_thread_);
25813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
25823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // 2. Second set of deletions.
25833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  base::Closure task = base::Bind(
25843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      &net::MultiThreadedCookieMonsterTest::DeleteAllCreatedBetweenForHostTask,
25853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      base::Unretained(this),
25863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      cm, ago1, Time(), url_google_,
25873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      &callback);
25883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  RunOnOtherThread(task);
25893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_TRUE(callback.did_run());
25903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_EQ(2, callback.result());  // Deletes A=B, G=H.
25913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
25923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MultiThreadedCookieMonsterTest, ThreadCheckDeleteCanonicalCookie) {
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(NULL, NULL));
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieOptions options;
2596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "A=B", options));
2597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CookieList cookies = GetAllCookies(cm.get());
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieList::iterator it = cookies.begin();
2599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(DeleteCanonicalCookie(cm.get(), *it));
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookieWithOptions(cm.get(), url_google_, "A=B", options));
2602e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ResultSavingCookieCallback<bool> callback(&other_thread_);
2603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  cookies = GetAllCookies(cm.get());
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  it = cookies.begin();
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure task = base::Bind(
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &net::MultiThreadedCookieMonsterTest::DeleteCanonicalCookieTask,
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Unretained(this),
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cm, *it, &callback);
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunOnOtherThread(task);
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.did_run());
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.result());
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, InvalidExpiryTime) {
26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string cookie_line =
26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string(kValidCookieLine) + "; expires=Blarg arg arg";
26172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<CanonicalCookie> cookie(
26182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CanonicalCookie::Create(url_google_, cookie_line, Time::Now(),
26192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              CookieOptions()));
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(cookie->IsPersistent());
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that CookieMonster writes session cookies into the underlying
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CookieStore if the "persist session cookies" option is on.
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, PersistSessionCookies) {
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockPersistentCookieStore> store(
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MockPersistentCookieStore);
2628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL));
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cm->SetPersistSessionCookies(true);
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All cookies set with SetCookie are session cookies.
2632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=B"));
2633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=B", GetCookies(cm.get(), url_google_));
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The cookie was written to the backing store.
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, store->commands().size());
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[0].type);
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", store->commands()[0].cookie.Name());
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("B", store->commands()[0].cookie.Value());
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Modify the cookie.
2642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=C"));
2643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("A=C", GetCookies(cm.get(), url_google_));
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3u, store->commands().size());
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[1].type);
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", store->commands()[1].cookie.Name());
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("B", store->commands()[1].cookie.Value());
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[2].type);
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", store->commands()[2].cookie.Name());
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("C", store->commands()[2].cookie.Value());
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete the cookie.
2653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DeleteCookie(cm.get(), url_google_, "A");
2654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("", GetCookies(cm.get(), url_google_));
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, store->commands().size());
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[3].type);
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("A", store->commands()[3].cookie.Name());
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("C", store->commands()[3].cookie.Value());
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the commands sent to the persistent cookie store.
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CookieMonsterTest, PersisentCookieStorageTest) {
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MockPersistentCookieStore> store(
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MockPersistentCookieStore);
2665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL));
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a cookie.
2668868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(
2669868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), url_google_, "A=B; expires=Mon, 18-Apr-22 22:50:13 GMT"));
2670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  this->MatchCookieLines("A=B", GetCookies(cm.get(), url_google_));
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, store->commands().size());
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[0].type);
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove it.
2674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "A=B; max-age=0"));
2675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  this->MatchCookieLines(std::string(), GetCookies(cm.get(), url_google_));
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, store->commands().size());
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[1].type);
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a cookie.
2680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(
2681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), url_google_, "A=B; expires=Mon, 18-Apr-22 22:50:13 GMT"));
2682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  this->MatchCookieLines("A=B", GetCookies(cm.get(), url_google_));
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, store->commands().size());
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[2].type);
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overwrite it.
2686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(
2687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cm.get(), url_google_, "A=Foo; expires=Mon, 18-Apr-22 22:50:14 GMT"));
2688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  this->MatchCookieLines("A=Foo", GetCookies(cm.get(), url_google_));
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(5u, store->commands().size());
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[3].type);
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[4].type);
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create some non-persistent cookies and check that they don't go to the
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // persistent storage.
2695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SetCookie(cm.get(), url_google_, "B=Bar"));
2696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  this->MatchCookieLines("A=Foo; B=Bar", GetCookies(cm.get(), url_google_));
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5u, store->commands().size());
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
270068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Test to assure that cookies with control characters are purged appropriately.
270168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// See http://crbug.com/238041 for background.
270268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(CookieMonsterTest, ControlCharacterPurge) {
270368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const Time now1(Time::Now());
270468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const Time now2(Time::Now() + TimeDelta::FromSeconds(1));
270568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const Time now3(Time::Now() + TimeDelta::FromSeconds(2));
270668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const Time later(now1 + TimeDelta::FromDays(1));
270768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const GURL url("http://host/path");
270868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const std::string domain("host");
270968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const std::string path("/path");
271068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
271168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_refptr<MockPersistentCookieStore> store(
271268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new MockPersistentCookieStore);
271368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
271468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<CanonicalCookie*> initial_cookies;
271568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
271668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddCookieToList(domain,
271768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  "foo=bar; path=" + path,
271868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  now1,
271968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  &initial_cookies);
272068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
272168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // We have to manually build this cookie because it contains a control
272268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // character, and our cookie line parser rejects control characters.
272368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  CanonicalCookie *cc = new CanonicalCookie(url, "baz", "\x05" "boo", domain,
272468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                            path, now2, later, now2, false,
272568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                            false, COOKIE_PRIORITY_DEFAULT);
272668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  initial_cookies.push_back(cc);
272768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
272868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddCookieToList(domain,
272968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  "hello=world; path=" + path,
273068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  now3,
273168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  &initial_cookies);
273268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
273368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Inject our initial cookies into the mock PersistentCookieStore.
273468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  store->SetLoadExpectation(true, initial_cookies);
273568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
273668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_refptr<CookieMonster> cm(new CookieMonster(store.get(), NULL));
273768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
273868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ("foo=bar; hello=world", GetCookies(cm.get(), url));
273968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
274068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
2742