Home | History | Annotate | Download | only in cookies
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // This file contains test infrastructure for multiple files
      6 // (current cookie_monster_unittest.cc and cookie_monster_perftest.cc)
      7 // that need to test out CookieMonster interactions with the backing store.
      8 // It should only be included by test code.
      9 
     10 #ifndef NET_COOKIES_COOKIE_MONSTER_STORE_TEST_H_
     11 #define NET_COOKIES_COOKIE_MONSTER_STORE_TEST_H_
     12 
     13 #include <map>
     14 #include <string>
     15 #include <utility>
     16 #include <vector>
     17 #include "net/cookies/canonical_cookie.h"
     18 #include "net/cookies/cookie_monster.h"
     19 
     20 namespace base {
     21 class Time;
     22 }
     23 
     24 namespace net {
     25 
     26 // Wrapper class for posting a loaded callback. Since the Callback class is not
     27 // reference counted, we cannot post a callback to the message loop directly,
     28 // instead we post a LoadedCallbackTask.
     29 class LoadedCallbackTask
     30     : public base::RefCountedThreadSafe<LoadedCallbackTask> {
     31  public:
     32   typedef CookieMonster::PersistentCookieStore::LoadedCallback LoadedCallback;
     33 
     34   LoadedCallbackTask(LoadedCallback loaded_callback,
     35                      std::vector<CanonicalCookie*> cookies);
     36 
     37   void Run() {
     38     loaded_callback_.Run(cookies_);
     39   }
     40 
     41  private:
     42   friend class base::RefCountedThreadSafe<LoadedCallbackTask>;
     43   ~LoadedCallbackTask();
     44 
     45   LoadedCallback loaded_callback_;
     46   std::vector<CanonicalCookie*> cookies_;
     47 
     48   DISALLOW_COPY_AND_ASSIGN(LoadedCallbackTask);
     49 };  // Wrapper class LoadedCallbackTask
     50 
     51 // Describes a call to one of the 3 functions of PersistentCookieStore.
     52 struct CookieStoreCommand {
     53   enum Type {
     54     ADD,
     55     UPDATE_ACCESS_TIME,
     56     REMOVE,
     57   };
     58 
     59   CookieStoreCommand(Type type, const CanonicalCookie& cookie)
     60       : type(type),
     61         cookie(cookie) {}
     62 
     63   Type type;
     64   CanonicalCookie cookie;
     65 };
     66 
     67 // Implementation of PersistentCookieStore that captures the
     68 // received commands and saves them to a list.
     69 // The result of calls to Load() can be configured using SetLoadExpectation().
     70 class MockPersistentCookieStore
     71     : public CookieMonster::PersistentCookieStore {
     72  public:
     73   typedef std::vector<CookieStoreCommand> CommandList;
     74 
     75   MockPersistentCookieStore();
     76 
     77   void SetLoadExpectation(
     78       bool return_value,
     79       const std::vector<CanonicalCookie*>& result);
     80 
     81   const CommandList& commands() const {
     82     return commands_;
     83   }
     84 
     85   virtual void Load(const LoadedCallback& loaded_callback) OVERRIDE;
     86 
     87   virtual void LoadCookiesForKey(const std::string& key,
     88     const LoadedCallback& loaded_callback) OVERRIDE;
     89 
     90   virtual void AddCookie(const CanonicalCookie& cookie) OVERRIDE;
     91 
     92   virtual void UpdateCookieAccessTime(
     93       const CanonicalCookie& cookie) OVERRIDE;
     94 
     95   virtual void DeleteCookie(
     96       const CanonicalCookie& cookie) OVERRIDE;
     97 
     98   virtual void Flush(const base::Closure& callback) OVERRIDE;
     99 
    100   virtual void SetForceKeepSessionState() OVERRIDE;
    101 
    102  protected:
    103   virtual ~MockPersistentCookieStore();
    104 
    105  private:
    106   CommandList commands_;
    107 
    108   // Deferred result to use when Load() is called.
    109   bool load_return_value_;
    110   std::vector<CanonicalCookie*> load_result_;
    111   // Indicates if the store has been fully loaded to avoid returning duplicate
    112   // cookies.
    113   bool loaded_;
    114 
    115   DISALLOW_COPY_AND_ASSIGN(MockPersistentCookieStore);
    116 };
    117 
    118 // Mock for CookieMonsterDelegate
    119 class MockCookieMonsterDelegate : public CookieMonsterDelegate {
    120  public:
    121   typedef std::pair<CanonicalCookie, bool>
    122       CookieNotification;
    123 
    124   MockCookieMonsterDelegate();
    125 
    126   const std::vector<CookieNotification>& changes() const { return changes_; }
    127 
    128   void reset() { changes_.clear(); }
    129 
    130   virtual void OnCookieChanged(
    131       const CanonicalCookie& cookie,
    132       bool removed,
    133       CookieMonsterDelegate::ChangeCause cause) OVERRIDE;
    134 
    135   virtual void OnLoaded() OVERRIDE;
    136 
    137  private:
    138   virtual ~MockCookieMonsterDelegate();
    139 
    140   std::vector<CookieNotification> changes_;
    141 
    142   DISALLOW_COPY_AND_ASSIGN(MockCookieMonsterDelegate);
    143 };
    144 
    145 // Helper to build a single CanonicalCookie.
    146 CanonicalCookie BuildCanonicalCookie(const std::string& key,
    147                                      const std::string& cookie_line,
    148                                      const base::Time& creation_time);
    149 
    150 // Helper to build a list of CanonicalCookie*s.
    151 void AddCookieToList(
    152     const std::string& key,
    153     const std::string& cookie_line,
    154     const base::Time& creation_time,
    155     std::vector<CanonicalCookie*>* out_list);
    156 
    157 // Just act like a backing database.  Keep cookie information from
    158 // Add/Update/Delete and regurgitate it when Load is called.
    159 class MockSimplePersistentCookieStore
    160     : public CookieMonster::PersistentCookieStore {
    161  public:
    162   MockSimplePersistentCookieStore();
    163 
    164   virtual void Load(const LoadedCallback& loaded_callback) OVERRIDE;
    165 
    166   virtual void LoadCookiesForKey(const std::string& key,
    167       const LoadedCallback& loaded_callback) OVERRIDE;
    168 
    169   virtual void AddCookie(const CanonicalCookie& cookie) OVERRIDE;
    170 
    171   virtual void UpdateCookieAccessTime(const CanonicalCookie& cookie) OVERRIDE;
    172 
    173   virtual void DeleteCookie(const CanonicalCookie& cookie) OVERRIDE;
    174 
    175   virtual void Flush(const base::Closure& callback) OVERRIDE;
    176 
    177   virtual void SetForceKeepSessionState() OVERRIDE;
    178 
    179  protected:
    180   virtual ~MockSimplePersistentCookieStore();
    181 
    182  private:
    183   typedef std::map<int64, CanonicalCookie> CanonicalCookieMap;
    184 
    185   CanonicalCookieMap cookies_;
    186 
    187   // Indicates if the store has been fully loaded to avoid return duplicate
    188   // cookies in subsequent load requests
    189   bool loaded_;
    190 };
    191 
    192 // Helper function for creating a CookieMonster backed by a
    193 // MockSimplePersistentCookieStore for garbage collection testing.
    194 //
    195 // Fill the store through import with |num_cookies| cookies, |num_old_cookies|
    196 // with access time Now()-days_old, the rest with access time Now().
    197 // Do two SetCookies().  Return whether each of the two SetCookies() took
    198 // longer than |gc_perf_micros| to complete, and how many cookie were
    199 // left in the store afterwards.
    200 CookieMonster* CreateMonsterFromStoreForGC(
    201     int num_cookies,
    202     int num_old_cookies,
    203     int days_old);
    204 
    205 }  // namespace net
    206 
    207 #endif  // NET_COOKIES_COOKIE_MONSTER_STORE_TEST_H_
    208