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
12namespace base {
13class Time;
14}
15
16namespace net {
17
18// Describes a call to one of the 3 functions of PersistentCookieStore.
19struct CookieStoreCommand {
20  enum Type {
21    ADD,
22    UPDATE_ACCESS_TIME,
23    REMOVE,
24  };
25
26  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().
38class 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
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
81class MockCookieMonsterDelegate : public CookieMonster::Delegate {
82 public:
83  typedef std::pair<CookieMonster::CanonicalCookie, bool>
84      CookieNotification;
85
86  MockCookieMonsterDelegate();
87
88  const std::vector<CookieNotification>& changes() const { return changes_; }
89
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.
106void 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.
114class 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.
151CookieMonster* CreateMonsterFromStoreForGC(
152    int num_cookies,
153    int num_old_cookies,
154    int days_old);
155
156}  // namespace net
157