Home | History | Annotate | Download | only in file_system_provider
      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 
     19 class Profile;
     20 
     21 namespace base {
     22 class Time;
     23 }  // namespace base
     24 
     25 namespace net {
     26 class IOBuffer;
     27 }  // namespace net
     28 
     29 namespace chromeos {
     30 namespace file_system_provider {
     31 
     32 class RequestManager;
     33 
     34 // Path of a sample fake file, which is added to the fake file system by
     35 // default.
     36 extern const char kFakeFilePath[];
     37 
     38 // Represents a file or a directory on a fake file system.
     39 struct 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.
     53 class 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