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