• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #include "net/base/cookie_monster.h"
11 
12 namespace base {
13 class Time;
14 }
15 
16 namespace net {
17 
18 // Describes a call to one of the 3 functions of PersistentCookieStore.
19 struct CookieStoreCommand {
20   enum Type {
21     ADD,
22     UPDATE_ACCESS_TIME,
23     REMOVE,
24   };
25 
CookieStoreCommandCookieStoreCommand26   CookieStoreCommand(Type type,
27                      const CookieMonster::CanonicalCookie& cookie)
28       : type(type),
29         cookie(cookie) {}
30 
31   Type type;
32   CookieMonster::CanonicalCookie cookie;
33 };
34 
35 // Implementation of PersistentCookieStore that captures the
36 // received commands and saves them to a list.
37 // The result of calls to Load() can be configured using SetLoadExpectation().
38 class MockPersistentCookieStore
39     : public CookieMonster::PersistentCookieStore {
40  public:
41   typedef std::vector<CookieStoreCommand> CommandList;
42 
43   MockPersistentCookieStore();
44   virtual ~MockPersistentCookieStore();
45 
46   void SetLoadExpectation(
47       bool return_value,
48       const std::vector<CookieMonster::CanonicalCookie*>& result);
49 
commands()50   const CommandList& commands() const {
51     return commands_;
52   }
53 
54   virtual bool Load(
55       std::vector<CookieMonster::CanonicalCookie*>* out_cookies);
56 
57   virtual void AddCookie(const CookieMonster::CanonicalCookie& cookie);
58 
59   virtual void UpdateCookieAccessTime(
60       const CookieMonster::CanonicalCookie& cookie);
61 
62   virtual void DeleteCookie(
63       const CookieMonster::CanonicalCookie& cookie);
64 
65   virtual void Flush(Task* completion_task);
66 
67   // No files are created so nothing to clear either
68   virtual void SetClearLocalStateOnExit(bool clear_local_state);
69 
70  private:
71   CommandList commands_;
72 
73   // Deferred result to use when Load() is called.
74   bool load_return_value_;
75   std::vector<CookieMonster::CanonicalCookie*> load_result_;
76 
77   DISALLOW_COPY_AND_ASSIGN(MockPersistentCookieStore);
78 };
79 
80 // Mock for CookieMonster::Delegate
81 class MockCookieMonsterDelegate : public CookieMonster::Delegate {
82  public:
83   typedef std::pair<CookieMonster::CanonicalCookie, bool>
84       CookieNotification;
85 
86   MockCookieMonsterDelegate();
87 
changes()88   const std::vector<CookieNotification>& changes() const { return changes_; }
89 
reset()90   void reset() { changes_.clear(); }
91 
92   virtual void OnCookieChanged(
93       const CookieMonster::CanonicalCookie& cookie,
94       bool removed,
95       CookieMonster::Delegate::ChangeCause cause);
96 
97  private:
98   virtual ~MockCookieMonsterDelegate();
99 
100   std::vector<CookieNotification> changes_;
101 
102   DISALLOW_COPY_AND_ASSIGN(MockCookieMonsterDelegate);
103 };
104 
105 // Helper to build a list of CanonicalCookie*s.
106 void AddCookieToList(
107     const std::string& key,
108     const std::string& cookie_line,
109     const base::Time& creation_time,
110     std::vector<CookieMonster::CanonicalCookie*>* out_list);
111 
112 // Just act like a backing database.  Keep cookie information from
113 // Add/Update/Delete and regurgitate it when Load is called.
114 class MockSimplePersistentCookieStore
115     : public CookieMonster::PersistentCookieStore {
116  public:
117   MockSimplePersistentCookieStore();
118   virtual ~MockSimplePersistentCookieStore();
119 
120   virtual bool Load(
121       std::vector<CookieMonster::CanonicalCookie*>* out_cookies);
122 
123   virtual void AddCookie(
124       const CookieMonster::CanonicalCookie& cookie);
125 
126   virtual void UpdateCookieAccessTime(
127       const CookieMonster::CanonicalCookie& cookie);
128 
129   virtual void DeleteCookie(
130       const CookieMonster::CanonicalCookie& cookie);
131 
132   virtual void Flush(Task* completion_task);
133 
134   virtual void SetClearLocalStateOnExit(bool clear_local_state);
135 
136  private:
137   typedef std::map<int64, CookieMonster::CanonicalCookie>
138       CanonicalCookieMap;
139 
140   CanonicalCookieMap cookies_;
141 };
142 
143 // Helper function for creating a CookieMonster backed by a
144 // MockSimplePersistentCookieStore for garbage collection testing.
145 //
146 // Fill the store through import with |num_cookies| cookies, |num_old_cookies|
147 // with access time Now()-days_old, the rest with access time Now().
148 // Do two SetCookies().  Return whether each of the two SetCookies() took
149 // longer than |gc_perf_micros| to complete, and how many cookie were
150 // left in the store afterwards.
151 CookieMonster* CreateMonsterFromStoreForGC(
152     int num_cookies,
153     int num_old_cookies,
154     int days_old);
155 
156 }  // namespace net
157