10a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_DISK_CACHE_DISK_CACHE_TEST_BASE_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_DISK_CACHE_DISK_CACHE_TEST_BASE_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h"
103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/cache_type.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/platform_test.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass FilePath;
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace net {
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass IOBuffer;
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace net
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace disk_cache {
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Backend;
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass BackendImpl;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Entry;
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass MemBackendImpl;
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace disk_cache
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// These tests can use the path service, which uses autoreleased objects on the
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Mac, so this needs to be a PlatformTest.  Even tests that do not require a
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// cache (and that do not need to be a DiskCacheTestWithCache) are susceptible
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// to this problem; all such tests should use TEST_F(DiskCacheTest, ...).
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass DiskCacheTest : public PlatformTest {
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void TearDown();
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Provides basic support for cache related tests.
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass DiskCacheTestWithCache : public DiskCacheTest {
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DiskCacheTestWithCache();
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~DiskCacheTestWithCache();
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void InitCache();
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void SimulateCrash();
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void SetTestMode();
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void SetMemoryOnlyMode() {
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    memory_only_ = true;
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Use the implementation directly instead of the factory provided object.
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void SetDirectMode() {
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    implementation_ = true;
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void SetMask(uint32 mask) {
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    mask_ = mask;
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void SetMaxSize(int size);
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Deletes and re-creates the files on initialization errors.
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void SetForceCreation() {
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    force_creation_ = true;
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void SetNewEviction() {
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    new_eviction_ = true;
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void DisableFirstCleanup() {
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    first_cleanup_ = false;
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void DisableIntegrityCheck() {
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    integrity_ = false;
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UseCurrentThread() {
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    use_current_thread_ = true;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetCacheType(net::CacheType type) {
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    type_ = type;
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Utility methods to access the cache and wait for each operation to finish.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int OpenEntry(const std::string& key, disk_cache::Entry** entry);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int CreateEntry(const std::string& key, disk_cache::Entry** entry);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoomEntry(const std::string& key);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoomAllEntries();
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoomEntriesBetween(const base::Time initial_time,
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const base::Time end_time);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoomEntriesSince(const base::Time initial_time);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int OpenNextEntry(void** iter, disk_cache::Entry** next_entry);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void FlushQueueForTest();
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void RunTaskForTest(Task* task);
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int ReadData(disk_cache::Entry* entry, int index, int offset,
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               net::IOBuffer* buf, int len);
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int WriteData(disk_cache::Entry* entry, int index, int offset,
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                net::IOBuffer* buf, int len, bool truncate);
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int ReadSparseData(disk_cache::Entry* entry, int64 offset, net::IOBuffer* buf,
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     int len);
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int WriteSparseData(disk_cache::Entry* entry, int64 offset,
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                      net::IOBuffer* buf, int len);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1100a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  // Asks the cache to trim an entry. If |empty| is true, the whole cache is
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // deleted.
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void TrimForTest(bool empty);
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1140a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  // Asks the cache to trim an entry from the deleted list. If |empty| is
1150a9239c3bca6d8a7147c80243b17a02340fe6d31Kristian Monsen  // true, the whole list is deleted.
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void TrimDeletedListForTest(bool empty);
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // DiskCacheTest:
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void TearDown();
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // cache_ will always have a valid object, regardless of how the cache was
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // initialized. The implementation pointers can be NULL.
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::Backend* cache_;
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::BackendImpl* cache_impl_;
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  disk_cache::MemBackendImpl* mem_cache_;
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  uint32 mask_;
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int size_;
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::CacheType type_;
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool memory_only_;
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool implementation_;
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool force_creation_;
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool new_eviction_;
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool first_cleanup_;
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool integrity_;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool use_current_thread_;
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This is intentionally left uninitialized, to be used by any test.
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool success_;
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void InitMemoryCache();
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void InitDiskCache();
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void InitDiskCacheImpl(const FilePath& path);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Thread cache_thread_;
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DiskCacheTestWithCache);
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_DISK_CACHE_DISK_CACHE_TEST_BASE_H_
150