1// Copyright 2014 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_CHROMEOS_FILE_SYSTEM_PROVIDER_FAKE_PROVIDED_FILE_SYSTEM_H_
6#define CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_FAKE_PROVIDED_FILE_SYSTEM_H_
7
8#include <map>
9#include <string>
10#include <vector>
11
12#include "base/callback.h"
13#include "base/memory/linked_ptr.h"
14#include "base/memory/weak_ptr.h"
15#include "base/task/cancelable_task_tracker.h"
16#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
17#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h"
18
19class Profile;
20
21namespace base {
22class Time;
23}  // namespace base
24
25namespace net {
26class IOBuffer;
27}  // namespace net
28
29namespace chromeos {
30namespace file_system_provider {
31
32class RequestManager;
33
34// Path of a sample fake file, which is added to the fake file system by
35// default.
36extern const char kFakeFilePath[];
37
38// Represents a file or a directory on a fake file system.
39struct FakeEntry {
40  FakeEntry();
41  FakeEntry(scoped_ptr<EntryMetadata> metadata, const std::string& contents);
42  ~FakeEntry();
43
44  scoped_ptr<EntryMetadata> metadata;
45  std::string contents;
46
47 private:
48  DISALLOW_COPY_AND_ASSIGN(FakeEntry);
49};
50
51// Fake provided file system implementation. Does not communicate with target
52// extensions. Used for unit tests.
53class FakeProvidedFileSystem : public ProvidedFileSystemInterface {
54 public:
55  explicit FakeProvidedFileSystem(
56      const ProvidedFileSystemInfo& file_system_info);
57  virtual ~FakeProvidedFileSystem();
58
59  // Adds a fake entry to the fake file system.
60  void AddEntry(const base::FilePath& entry_path,
61                bool is_directory,
62                const std::string& name,
63                int64 size,
64                base::Time modification_time,
65                std::string mime_type,
66                std::string contents);
67
68  // Fetches a pointer to a fake entry registered in the fake file system. If
69  // not found, then returns NULL. The returned pointes is owned by
70  // FakeProvidedFileSystem.
71  const FakeEntry* GetEntry(const base::FilePath& entry_path) const;
72
73  // ProvidedFileSystemInterface overrides.
74  virtual AbortCallback RequestUnmount(
75      const storage::AsyncFileUtil::StatusCallback& callback) OVERRIDE;
76  virtual AbortCallback GetMetadata(
77      const base::FilePath& entry_path,
78      ProvidedFileSystemInterface::MetadataFieldMask fields,
79      const ProvidedFileSystemInterface::GetMetadataCallback& callback)
80      OVERRIDE;
81  virtual AbortCallback ReadDirectory(
82      const base::FilePath& directory_path,
83      const storage::AsyncFileUtil::ReadDirectoryCallback& callback) OVERRIDE;
84  virtual AbortCallback OpenFile(const base::FilePath& file_path,
85                                 OpenFileMode mode,
86                                 const OpenFileCallback& callback) OVERRIDE;
87  virtual AbortCallback CloseFile(
88      int file_handle,
89      const storage::AsyncFileUtil::StatusCallback& callback) OVERRIDE;
90  virtual AbortCallback ReadFile(
91      int file_handle,
92      net::IOBuffer* buffer,
93      int64 offset,
94      int length,
95      const ReadChunkReceivedCallback& callback) OVERRIDE;
96  virtual AbortCallback CreateDirectory(
97      const base::FilePath& directory_path,
98      bool recursive,
99      const storage::AsyncFileUtil::StatusCallback& callback) OVERRIDE;
100  virtual AbortCallback DeleteEntry(
101      const base::FilePath& entry_path,
102      bool recursive,
103      const storage::AsyncFileUtil::StatusCallback& callback) OVERRIDE;
104  virtual AbortCallback CreateFile(
105      const base::FilePath& file_path,
106      const storage::AsyncFileUtil::StatusCallback& callback) OVERRIDE;
107  virtual AbortCallback CopyEntry(
108      const base::FilePath& source_path,
109      const base::FilePath& target_path,
110      const storage::AsyncFileUtil::StatusCallback& callback) OVERRIDE;
111  virtual AbortCallback MoveEntry(
112      const base::FilePath& source_path,
113      const base::FilePath& target_path,
114      const storage::AsyncFileUtil::StatusCallback& callback) OVERRIDE;
115  virtual AbortCallback Truncate(
116      const base::FilePath& file_path,
117      int64 length,
118      const storage::AsyncFileUtil::StatusCallback& callback) OVERRIDE;
119  virtual AbortCallback WriteFile(
120      int file_handle,
121      net::IOBuffer* buffer,
122      int64 offset,
123      int length,
124      const storage::AsyncFileUtil::StatusCallback& callback) OVERRIDE;
125  virtual const ProvidedFileSystemInfo& GetFileSystemInfo() const OVERRIDE;
126  virtual RequestManager* GetRequestManager() OVERRIDE;
127  virtual base::WeakPtr<ProvidedFileSystemInterface> GetWeakPtr() OVERRIDE;
128
129  // Factory callback, to be used in Service::SetFileSystemFactory(). The
130  // |event_router| argument can be NULL.
131  static ProvidedFileSystemInterface* Create(
132      Profile* profile,
133      const ProvidedFileSystemInfo& file_system_info);
134
135 private:
136  typedef std::map<base::FilePath, linked_ptr<FakeEntry> > Entries;
137  typedef std::map<int, base::FilePath> OpenedFilesMap;
138
139  // Utility function for posting a task which can be aborted by calling the
140  // returned callback.
141  AbortCallback PostAbortableTask(const base::Closure& callback);
142
143  // Aborts a request. |task_id| refers to a posted callback returning a
144  // response for the operation, which will be cancelled, hence not called.
145  void Abort(int task_id,
146             const storage::AsyncFileUtil::StatusCallback& callback);
147
148  // Aborts a request. |task_ids| refers to a vector of posted callbacks
149  // returning a response for the operation, which will be cancelled, hence not
150  // called.
151  void AbortMany(const std::vector<int>& task_ids,
152                 const storage::AsyncFileUtil::StatusCallback& callback);
153
154  ProvidedFileSystemInfo file_system_info_;
155  Entries entries_;
156  OpenedFilesMap opened_files_;
157  int last_file_handle_;
158  base::CancelableTaskTracker tracker_;
159
160  base::WeakPtrFactory<FakeProvidedFileSystem> weak_ptr_factory_;
161  DISALLOW_COPY_AND_ASSIGN(FakeProvidedFileSystem);
162};
163
164}  // namespace file_system_provider
165}  // namespace chromeos
166
167#endif  // CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_FAKE_PROVIDED_FILE_SYSTEM_H_
168