canned_syncable_file_system.h revision 58537e28ecd584eab876aee8be7156509866d23a
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#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_CANNED_SYNCABLE_FILE_SYSTEM_H_
6#define CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_CANNED_SYNCABLE_FILE_SYSTEM_H_
7
8#include <string>
9#include <vector>
10
11#include "base/callback_forward.h"
12#include "base/files/scoped_temp_dir.h"
13#include "base/message_loop/message_loop.h"
14#include "base/observer_list_threadsafe.h"
15#include "base/platform_file.h"
16#include "chrome/browser/sync_file_system/local/local_file_sync_status.h"
17#include "chrome/browser/sync_file_system/sync_status_code.h"
18#include "webkit/browser/blob/blob_data_handle.h"
19#include "webkit/browser/fileapi/file_system_operation.h"
20#include "webkit/browser/fileapi/file_system_url.h"
21#include "webkit/browser/quota/quota_callbacks.h"
22#include "webkit/common/fileapi/file_system_types.h"
23#include "webkit/common/fileapi/file_system_util.h"
24#include "webkit/common/quota/quota_types.h"
25
26namespace base {
27class MessageLoopProxy;
28class SingleThreadTaskRunner;
29class Thread;
30}
31
32namespace fileapi {
33class FileSystemContext;
34class FileSystemOperationRunner;
35class FileSystemURL;
36}
37
38namespace net {
39class URLRequestContext;
40}
41
42namespace quota {
43class QuotaManager;
44}
45
46namespace sync_file_system {
47
48class LocalFileSyncContext;
49class SyncFileSystemBackend;
50
51// A canned syncable filesystem for testing.
52// This internally creates its own QuotaManager and FileSystemContext
53// (as we do so for each isolated application).
54class CannedSyncableFileSystem
55    : public LocalFileSyncStatus::Observer {
56 public:
57  typedef base::Callback<void(base::PlatformFileError)> StatusCallback;
58  typedef base::Callback<void(int64)> WriteCallback;
59  typedef fileapi::FileSystemOperation::FileEntryList FileEntryList;
60
61  CannedSyncableFileSystem(const GURL& origin,
62                           base::SingleThreadTaskRunner* io_task_runner,
63                           base::SingleThreadTaskRunner* file_task_runner);
64  virtual ~CannedSyncableFileSystem();
65
66  // SetUp must be called before using this instance.
67  void SetUp();
68
69  // TearDown must be called before destructing this instance.
70  void TearDown();
71
72  // Creates a FileSystemURL for the given (utf8) path string.
73  fileapi::FileSystemURL URL(const std::string& path) const;
74
75  // Initialize this with given |sync_context| if it hasn't
76  // been initialized.
77  sync_file_system::SyncStatusCode MaybeInitializeFileSystemContext(
78      LocalFileSyncContext* sync_context);
79
80  // Opens a new syncable file system.
81  base::PlatformFileError OpenFileSystem();
82
83  // Register sync status observers. Unlike original
84  // LocalFileSyncStatus::Observer implementation the observer methods
85  // are called on the same thread where AddSyncStatusObserver were called.
86  void AddSyncStatusObserver(LocalFileSyncStatus::Observer* observer);
87  void RemoveSyncStatusObserver(LocalFileSyncStatus::Observer* observer);
88
89  // Accessors.
90  fileapi::FileSystemContext* file_system_context() {
91    return file_system_context_.get();
92  }
93  quota::QuotaManager* quota_manager() { return quota_manager_.get(); }
94  GURL origin() const { return origin_; }
95  fileapi::FileSystemType type() const { return type_; }
96  quota::StorageType storage_type() const {
97    return FileSystemTypeToQuotaStorageType(type_);
98  }
99
100  // Helper routines to perform file system operations.
101  // OpenFileSystem() must have been called before calling any of them.
102  // They create an operation and run it on IO task runner, and the operation
103  // posts a task on file runner.
104  base::PlatformFileError CreateDirectory(const fileapi::FileSystemURL& url);
105  base::PlatformFileError CreateFile(const fileapi::FileSystemURL& url);
106  base::PlatformFileError Copy(const fileapi::FileSystemURL& src_url,
107                               const fileapi::FileSystemURL& dest_url);
108  base::PlatformFileError Move(const fileapi::FileSystemURL& src_url,
109                               const fileapi::FileSystemURL& dest_url);
110  base::PlatformFileError TruncateFile(const fileapi::FileSystemURL& url,
111                                       int64 size);
112  base::PlatformFileError TouchFile(const fileapi::FileSystemURL& url,
113                                    const base::Time& last_access_time,
114                                    const base::Time& last_modified_time);
115  base::PlatformFileError Remove(const fileapi::FileSystemURL& url,
116                                 bool recursive);
117  base::PlatformFileError FileExists(const fileapi::FileSystemURL& url);
118  base::PlatformFileError DirectoryExists(const fileapi::FileSystemURL& url);
119  base::PlatformFileError VerifyFile(const fileapi::FileSystemURL& url,
120                                     const std::string& expected_data);
121  base::PlatformFileError GetMetadataAndPlatformPath(
122      const fileapi::FileSystemURL& url,
123      base::PlatformFileInfo* info,
124      base::FilePath* platform_path);
125  base::PlatformFileError ReadDirectory(const fileapi::FileSystemURL& url,
126                                        FileEntryList* entries);
127
128  // Returns the # of bytes written (>=0) or an error code (<0).
129  int64 Write(net::URLRequestContext* url_request_context,
130              const fileapi::FileSystemURL& url,
131              scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle);
132  int64 WriteString(const fileapi::FileSystemURL& url, const std::string& data);
133
134  // Purges the file system local storage.
135  base::PlatformFileError DeleteFileSystem();
136
137  // Retrieves the quota and usage.
138  quota::QuotaStatusCode GetUsageAndQuota(int64* usage, int64* quota);
139
140  // ChangeTracker related methods. They run on file task runner.
141  void GetChangedURLsInTracker(fileapi::FileSystemURLSet* urls);
142  void ClearChangeForURLInTracker(const fileapi::FileSystemURL& url);
143
144  SyncFileSystemBackend* backend();
145  fileapi::FileSystemOperationRunner* operation_runner();
146
147  // LocalFileSyncStatus::Observer overrides.
148  virtual void OnSyncEnabled(const fileapi::FileSystemURL& url) OVERRIDE;
149  virtual void OnWriteEnabled(const fileapi::FileSystemURL& url) OVERRIDE;
150
151  // Operation methods body.
152  // They can be also called directly if the caller is already on IO thread.
153  void DoCreateDirectory(const fileapi::FileSystemURL& url,
154                         const StatusCallback& callback);
155  void DoCreateFile(const fileapi::FileSystemURL& url,
156                    const StatusCallback& callback);
157  void DoCopy(const fileapi::FileSystemURL& src_url,
158              const fileapi::FileSystemURL& dest_url,
159              const StatusCallback& callback);
160  void DoMove(const fileapi::FileSystemURL& src_url,
161              const fileapi::FileSystemURL& dest_url,
162              const StatusCallback& callback);
163  void DoTruncateFile(const fileapi::FileSystemURL& url,
164                      int64 size,
165                      const StatusCallback& callback);
166  void DoTouchFile(const fileapi::FileSystemURL& url,
167                   const base::Time& last_access_time,
168                   const base::Time& last_modified_time,
169                   const StatusCallback& callback);
170  void DoRemove(const fileapi::FileSystemURL& url,
171                bool recursive,
172                const StatusCallback& callback);
173  void DoFileExists(const fileapi::FileSystemURL& url,
174                    const StatusCallback& callback);
175  void DoDirectoryExists(const fileapi::FileSystemURL& url,
176                         const StatusCallback& callback);
177  void DoVerifyFile(const fileapi::FileSystemURL& url,
178                    const std::string& expected_data,
179                    const StatusCallback& callback);
180  void DoGetMetadataAndPlatformPath(const fileapi::FileSystemURL& url,
181                                    base::PlatformFileInfo* info,
182                                    base::FilePath* platform_path,
183                                    const StatusCallback& callback);
184  void DoReadDirectory(const fileapi::FileSystemURL& url,
185                       FileEntryList* entries,
186                       const StatusCallback& callback);
187  void DoWrite(net::URLRequestContext* url_request_context,
188               const fileapi::FileSystemURL& url,
189               scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle,
190               const WriteCallback& callback);
191  void DoWriteString(const fileapi::FileSystemURL& url,
192                     const std::string& data,
193                     const WriteCallback& callback);
194  void DoGetUsageAndQuota(int64* usage,
195                          int64* quota,
196                          const quota::StatusCallback& callback);
197
198 private:
199  typedef ObserverListThreadSafe<LocalFileSyncStatus::Observer> ObserverList;
200
201  // Callbacks.
202  void DidOpenFileSystem(base::PlatformFileError result,
203                         const std::string& name,
204                         const GURL& root);
205  void DidInitializeFileSystemContext(sync_file_system::SyncStatusCode status);
206
207  void InitializeSyncStatusObserver();
208
209  base::ScopedTempDir data_dir_;
210  const std::string service_name_;
211
212  scoped_refptr<quota::QuotaManager> quota_manager_;
213  scoped_refptr<fileapi::FileSystemContext> file_system_context_;
214  const GURL origin_;
215  const fileapi::FileSystemType type_;
216  GURL root_url_;
217  base::PlatformFileError result_;
218  sync_file_system::SyncStatusCode sync_status_;
219
220  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
221  scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
222
223  // Boolean flags mainly for helping debug.
224  bool is_filesystem_set_up_;
225  bool is_filesystem_opened_;
226
227  scoped_refptr<ObserverList> sync_status_observers_;
228
229  DISALLOW_COPY_AND_ASSIGN(CannedSyncableFileSystem);
230};
231
232}  // namespace sync_file_system
233
234#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_CANNED_SYNCABLE_FILE_SYSTEM_H_
235