test_file_system_backend.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
1// Copyright 2013 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#include "content/public/test/test_file_system_backend.h"
6
7#include <set>
8#include <string>
9#include <vector>
10
11#include "base/file_util.h"
12#include "base/sequenced_task_runner.h"
13#include "webkit/browser/blob/file_stream_reader.h"
14#include "webkit/browser/fileapi/copy_or_move_file_validator.h"
15#include "webkit/browser/fileapi/file_observers.h"
16#include "webkit/browser/fileapi/file_system_operation.h"
17#include "webkit/browser/fileapi/file_system_operation_context.h"
18#include "webkit/browser/fileapi/file_system_quota_util.h"
19#include "webkit/browser/fileapi/local_file_util.h"
20#include "webkit/browser/fileapi/native_file_util.h"
21#include "webkit/browser/fileapi/quota/quota_reservation.h"
22#include "webkit/browser/fileapi/sandbox_file_stream_writer.h"
23#include "webkit/browser/quota/quota_manager.h"
24#include "webkit/common/fileapi/file_system_util.h"
25
26using storage::FileSystemContext;
27using storage::FileSystemOperation;
28using storage::FileSystemOperationContext;
29using storage::FileSystemURL;
30
31namespace content {
32
33namespace {
34
35class TestFileUtil : public storage::LocalFileUtil {
36 public:
37  explicit TestFileUtil(const base::FilePath& base_path)
38      : base_path_(base_path) {}
39  virtual ~TestFileUtil() {}
40
41  // LocalFileUtil overrides.
42  virtual base::File::Error GetLocalFilePath(
43      FileSystemOperationContext* context,
44      const FileSystemURL& file_system_url,
45      base::FilePath* local_file_path) OVERRIDE {
46    *local_file_path = base_path_.Append(file_system_url.path());
47    return base::File::FILE_OK;
48  }
49
50 private:
51  base::FilePath base_path_;
52};
53
54}  // namespace
55
56// This only supports single origin.
57class TestFileSystemBackend::QuotaUtil : public storage::FileSystemQuotaUtil,
58                                         public storage::FileUpdateObserver {
59 public:
60  explicit QuotaUtil(base::SequencedTaskRunner* task_runner)
61      : usage_(0),
62        task_runner_(task_runner) {
63    update_observers_ = update_observers_.AddObserver(this, task_runner_.get());
64  }
65  virtual ~QuotaUtil() {}
66
67  // FileSystemQuotaUtil overrides.
68  virtual base::File::Error DeleteOriginDataOnFileTaskRunner(
69      FileSystemContext* context,
70      storage::QuotaManagerProxy* proxy,
71      const GURL& origin_url,
72      storage::FileSystemType type) OVERRIDE {
73    NOTREACHED();
74    return base::File::FILE_OK;
75  }
76
77  virtual scoped_refptr<storage::QuotaReservation>
78  CreateQuotaReservationOnFileTaskRunner(
79      const GURL& origin_url,
80      storage::FileSystemType type) OVERRIDE {
81    NOTREACHED();
82    return scoped_refptr<storage::QuotaReservation>();
83  }
84
85  virtual void GetOriginsForTypeOnFileTaskRunner(
86      storage::FileSystemType type,
87      std::set<GURL>* origins) OVERRIDE {
88    NOTREACHED();
89  }
90
91  virtual void GetOriginsForHostOnFileTaskRunner(
92      storage::FileSystemType type,
93      const std::string& host,
94      std::set<GURL>* origins) OVERRIDE {
95    NOTREACHED();
96  }
97
98  virtual int64 GetOriginUsageOnFileTaskRunner(
99      FileSystemContext* context,
100      const GURL& origin_url,
101      storage::FileSystemType type) OVERRIDE {
102    return usage_;
103  }
104
105  virtual void AddFileUpdateObserver(
106      storage::FileSystemType type,
107      FileUpdateObserver* observer,
108      base::SequencedTaskRunner* task_runner) OVERRIDE {
109    NOTIMPLEMENTED();
110  }
111
112  virtual void AddFileChangeObserver(
113      storage::FileSystemType type,
114      storage::FileChangeObserver* observer,
115      base::SequencedTaskRunner* task_runner) OVERRIDE {
116    change_observers_ = change_observers_.AddObserver(observer, task_runner);
117  }
118
119  virtual void AddFileAccessObserver(
120      storage::FileSystemType type,
121      storage::FileAccessObserver* observer,
122      base::SequencedTaskRunner* task_runner) OVERRIDE {
123    NOTIMPLEMENTED();
124  }
125
126  virtual const storage::UpdateObserverList* GetUpdateObservers(
127      storage::FileSystemType type) const OVERRIDE {
128    return &update_observers_;
129  }
130
131  virtual const storage::ChangeObserverList* GetChangeObservers(
132      storage::FileSystemType type) const OVERRIDE {
133    return &change_observers_;
134  }
135
136  virtual const storage::AccessObserverList* GetAccessObservers(
137      storage::FileSystemType type) const OVERRIDE {
138    return NULL;
139  }
140
141  // FileUpdateObserver overrides.
142  virtual void OnStartUpdate(const FileSystemURL& url) OVERRIDE {}
143  virtual void OnUpdate(const FileSystemURL& url, int64 delta) OVERRIDE {
144    usage_ += delta;
145  }
146  virtual void OnEndUpdate(const FileSystemURL& url) OVERRIDE {}
147
148  base::SequencedTaskRunner* task_runner() { return task_runner_.get(); }
149
150 private:
151  int64 usage_;
152
153  scoped_refptr<base::SequencedTaskRunner> task_runner_;
154
155  storage::UpdateObserverList update_observers_;
156  storage::ChangeObserverList change_observers_;
157};
158
159TestFileSystemBackend::TestFileSystemBackend(
160    base::SequencedTaskRunner* task_runner,
161    const base::FilePath& base_path)
162    : base_path_(base_path),
163      file_util_(
164          new storage::AsyncFileUtilAdapter(new TestFileUtil(base_path))),
165      quota_util_(new QuotaUtil(task_runner)),
166      require_copy_or_move_validator_(false) {
167}
168
169TestFileSystemBackend::~TestFileSystemBackend() {
170}
171
172bool TestFileSystemBackend::CanHandleType(storage::FileSystemType type) const {
173  return (type == storage::kFileSystemTypeTest);
174}
175
176void TestFileSystemBackend::Initialize(FileSystemContext* context) {
177}
178
179void TestFileSystemBackend::ResolveURL(const FileSystemURL& url,
180                                       storage::OpenFileSystemMode mode,
181                                       const OpenFileSystemCallback& callback) {
182  callback.Run(GetFileSystemRootURI(url.origin(), url.type()),
183               GetFileSystemName(url.origin(), url.type()),
184               base::File::FILE_OK);
185}
186
187storage::AsyncFileUtil* TestFileSystemBackend::GetAsyncFileUtil(
188    storage::FileSystemType type) {
189  return file_util_.get();
190}
191
192storage::CopyOrMoveFileValidatorFactory*
193TestFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
194    storage::FileSystemType type,
195    base::File::Error* error_code) {
196  DCHECK(error_code);
197  *error_code = base::File::FILE_OK;
198  if (require_copy_or_move_validator_) {
199    if (!copy_or_move_file_validator_factory_)
200      *error_code = base::File::FILE_ERROR_SECURITY;
201    return copy_or_move_file_validator_factory_.get();
202  }
203  return NULL;
204}
205
206void TestFileSystemBackend::InitializeCopyOrMoveFileValidatorFactory(
207    scoped_ptr<storage::CopyOrMoveFileValidatorFactory> factory) {
208  if (!copy_or_move_file_validator_factory_)
209    copy_or_move_file_validator_factory_ = factory.Pass();
210}
211
212FileSystemOperation* TestFileSystemBackend::CreateFileSystemOperation(
213    const FileSystemURL& url,
214    FileSystemContext* context,
215    base::File::Error* error_code) const {
216  scoped_ptr<FileSystemOperationContext> operation_context(
217      new FileSystemOperationContext(context));
218  operation_context->set_update_observers(*GetUpdateObservers(url.type()));
219  operation_context->set_change_observers(
220      *quota_util_->GetChangeObservers(url.type()));
221  return FileSystemOperation::Create(url, context, operation_context.Pass());
222}
223
224bool TestFileSystemBackend::SupportsStreaming(
225    const storage::FileSystemURL& url) const {
226  return false;
227}
228
229bool TestFileSystemBackend::HasInplaceCopyImplementation(
230    storage::FileSystemType type) const {
231  return true;
232}
233
234scoped_ptr<storage::FileStreamReader>
235TestFileSystemBackend::CreateFileStreamReader(
236    const FileSystemURL& url,
237    int64 offset,
238    const base::Time& expected_modification_time,
239    FileSystemContext* context) const {
240  return scoped_ptr<storage::FileStreamReader>(
241      storage::FileStreamReader::CreateForFileSystemFile(
242          context, url, offset, expected_modification_time));
243}
244
245scoped_ptr<storage::FileStreamWriter>
246TestFileSystemBackend::CreateFileStreamWriter(
247    const FileSystemURL& url,
248    int64 offset,
249    FileSystemContext* context) const {
250  return scoped_ptr<storage::FileStreamWriter>(
251      new storage::SandboxFileStreamWriter(
252          context, url, offset, *GetUpdateObservers(url.type())));
253}
254
255storage::FileSystemQuotaUtil* TestFileSystemBackend::GetQuotaUtil() {
256  return quota_util_.get();
257}
258
259const storage::UpdateObserverList* TestFileSystemBackend::GetUpdateObservers(
260    storage::FileSystemType type) const {
261  return quota_util_->GetUpdateObservers(type);
262}
263
264void TestFileSystemBackend::AddFileChangeObserver(
265    storage::FileChangeObserver* observer) {
266  quota_util_->AddFileChangeObserver(
267      storage::kFileSystemTypeTest, observer, quota_util_->task_runner());
268}
269
270}  // namespace content
271