14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_file_system_backend.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/weak_ptr.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/observer_list.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/thread_task_runner_handle.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/blob/file_stream_reader.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/copy_or_move_file_validator.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_observers.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_quota_util.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/local_file_util.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/native_file_util.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/quota/quota_reservation.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/sandbox_file_stream_writer.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/watcher_manager.h"
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_util.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemContext;
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemOperation;
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemOperationContext;
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemURL;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace {
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Stub implementation of storage::LocalFileUtil.
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class TestFileUtil : public storage::LocalFileUtil {
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  explicit TestFileUtil(const base::FilePath& base_path)
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      : base_path_(base_path) {}
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual ~TestFileUtil() {}
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // LocalFileUtil overrides.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual base::File::Error GetLocalFilePath(
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      FileSystemOperationContext* context,
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const FileSystemURL& file_system_url,
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::FilePath* local_file_path) OVERRIDE {
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    *local_file_path = base_path_.Append(file_system_url.path());
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::File::FILE_OK;
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::FilePath base_path_;
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Stub implementation of storage::WatcherManager. Emits a fake notification
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// after a directory watcher is set successfully.
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestWatcherManager : public storage::WatcherManager {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWatcherManager() : weak_ptr_factory_(this) {}
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~TestWatcherManager() {}
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // storage::WatcherManager overrides.
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void AddObserver(Observer* observer) OVERRIDE {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    observers_.AddObserver(observer);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void RemoveObserver(Observer* observer) OVERRIDE {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    observers_.RemoveObserver(observer);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool HasObserver(Observer* observer) const OVERRIDE {
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return observers_.HasObserver(observer);
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void WatchDirectory(const storage::FileSystemURL& url,
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              bool recursive,
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              const StatusCallback& callback) OVERRIDE {
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (recursive) {
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::ThreadTaskRunnerHandle::Get()->PostTask(
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          FROM_HERE,
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(callback, base::File::FILE_ERROR_INVALID_OPERATION));
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL gurl = url.ToGURL();
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (watched_urls_.find(gurl) != watched_urls_.end()) {
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::ThreadTaskRunnerHandle::Get()->PostTask(
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          FROM_HERE, base::Bind(callback, base::File::FILE_ERROR_EXISTS));
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    watched_urls_.insert(gurl);
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::ThreadTaskRunnerHandle::Get()->PostTask(
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FROM_HERE, base::Bind(callback, base::File::FILE_OK));
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Send a fake changed notification.
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::ThreadTaskRunnerHandle::Get()->PostTask(
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FROM_HERE,
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&TestWatcherManager::SendFakeChangeNotification,
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   weak_ptr_factory_.GetWeakPtr(),
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   url));
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Send a fake removed notification.
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::ThreadTaskRunnerHandle::Get()->PostTask(
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FROM_HERE,
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&TestWatcherManager::SendFakeRemoveNotification,
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   weak_ptr_factory_.GetWeakPtr(),
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   url));
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void UnwatchEntry(const storage::FileSystemURL& url,
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const StatusCallback& callback) OVERRIDE {
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL gurl = url.ToGURL();
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (watched_urls_.find(gurl) == watched_urls_.end()) {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::ThreadTaskRunnerHandle::Get()->PostTask(
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          FROM_HERE, base::Bind(callback, base::File::FILE_ERROR_NOT_FOUND));
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    watched_urls_.erase(gurl);
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::ThreadTaskRunnerHandle::Get()->PostTask(
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FROM_HERE, base::Bind(callback, base::File::FILE_OK));
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Sends a fake notification to each observer about a changed entry
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // represented by |url|, as long as it is still being watched.
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SendFakeChangeNotification(const storage::FileSystemURL& url) {
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (watched_urls_.find(url.ToGURL()) == watched_urls_.end())
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FOR_EACH_OBSERVER(Observer, observers_, OnEntryChanged(url));
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Sends a fake notification to each observer about a removed entry
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // represented by |url|, as long as it is still being watched.
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SendFakeRemoveNotification(const storage::FileSystemURL& url) {
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (watched_urls_.find(url.ToGURL()) == watched_urls_.end())
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FOR_EACH_OBSERVER(Observer, observers_, OnEntryRemoved(url));
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ObserverList<Observer> observers_;
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::set<GURL> watched_urls_;
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<TestWatcherManager> weak_ptr_factory_;
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This only supports single origin.
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class TestFileSystemBackend::QuotaUtil : public storage::FileSystemQuotaUtil,
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                         public storage::FileUpdateObserver {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  QuotaUtil() : usage_(0) {}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuotaUtil() {}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FileSystemQuotaUtil overrides.
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual base::File::Error DeleteOriginDataOnFileTaskRunner(
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      FileSystemContext* context,
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::QuotaManagerProxy* proxy,
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const GURL& origin_url,
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemType type) OVERRIDE {
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    NOTREACHED();
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::File::FILE_OK;
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual scoped_refptr<storage::QuotaReservation>
1756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CreateQuotaReservationOnFileTaskRunner(
1766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const GURL& origin_url,
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemType type) OVERRIDE {
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    NOTREACHED();
17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return scoped_refptr<storage::QuotaReservation>();
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void GetOriginsForTypeOnFileTaskRunner(
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemType type,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::set<GURL>* origins) OVERRIDE {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void GetOriginsForHostOnFileTaskRunner(
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemType type,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& host,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::set<GURL>* origins) OVERRIDE {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual int64 GetOriginUsageOnFileTaskRunner(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FileSystemContext* context,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& origin_url,
19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemType type) OVERRIDE {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return usage_;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FileUpdateObserver overrides.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStartUpdate(const FileSystemURL& url) OVERRIDE {}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnUpdate(const FileSystemURL& url, int64 delta) OVERRIDE {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ += delta;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnEndUpdate(const FileSystemURL& url) OVERRIDE {}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 usage_;
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(QuotaUtil);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::TestFileSystemBackend(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SequencedTaskRunner* task_runner,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& base_path)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : base_path_(base_path),
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      task_runner_(task_runner),
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file_util_(
22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          new storage::AsyncFileUtilAdapter(new TestFileUtil(base_path))),
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      watcher_manager_(new TestWatcherManager()),
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quota_util_(new QuotaUtil),
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      require_copy_or_move_validator_(false) {
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  update_observers_ =
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      update_observers_.AddObserver(quota_util_.get(), task_runner_.get());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::~TestFileSystemBackend() {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool TestFileSystemBackend::CanHandleType(storage::FileSystemType type) const {
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return (type == storage::kFileSystemTypeTest);
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid TestFileSystemBackend::Initialize(FileSystemContext* context) {
236bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
237bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TestFileSystemBackend::ResolveURL(const FileSystemURL& url,
23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                       storage::OpenFileSystemMode mode,
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       const OpenFileSystemCallback& callback) {
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  callback.Run(GetFileSystemRootURI(url.origin(), url.type()),
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               GetFileSystemName(url.origin(), url.type()),
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               base::File::FILE_OK);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::AsyncFileUtil* TestFileSystemBackend::GetAsyncFileUtil(
24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemType type) {
248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return file_util_.get();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistorage::WatcherManager* TestFileSystemBackend::GetWatcherManager(
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    storage::FileSystemType type) {
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return watcher_manager_.get();
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
25603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::CopyOrMoveFileValidatorFactory*
2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
25803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemType type,
2596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    base::File::Error* error_code) {
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(error_code);
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *error_code = base::File::FILE_OK;
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (require_copy_or_move_validator_) {
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!copy_or_move_file_validator_factory_)
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      *error_code = base::File::FILE_ERROR_SECURITY;
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return copy_or_move_file_validator_factory_.get();
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestFileSystemBackend::InitializeCopyOrMoveFileValidatorFactory(
27103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::CopyOrMoveFileValidatorFactory> factory) {
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!copy_or_move_file_validator_factory_)
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    copy_or_move_file_validator_factory_ = factory.Pass();
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemOperation* TestFileSystemBackend::CreateFileSystemOperation(
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemContext* context,
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error* error_code) const {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> operation_context(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new FileSystemOperationContext(context));
2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_context->set_update_observers(*GetUpdateObservers(url.type()));
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  operation_context->set_change_observers(*GetChangeObservers(url.type()));
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return FileSystemOperation::Create(url, context, operation_context.Pass());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool TestFileSystemBackend::SupportsStreaming(
28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url) const {
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool TestFileSystemBackend::HasInplaceCopyImplementation(
29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemType type) const {
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return true;
29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_ptr<storage::FileStreamReader>
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::CreateFileStreamReader(
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 offset,
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int64 max_bytes_to_read,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& expected_modification_time,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemContext* context) const {
30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return scoped_ptr<storage::FileStreamReader>(
30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileStreamReader::CreateForFileSystemFile(
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          context, url, offset, expected_modification_time));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_ptr<storage::FileStreamWriter>
3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::CreateFileStreamWriter(
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 offset,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemContext* context) const {
31403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return scoped_ptr<storage::FileStreamWriter>(
31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new storage::SandboxFileStreamWriter(
31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          context, url, offset, *GetUpdateObservers(url.type())));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::FileSystemQuotaUtil* TestFileSystemBackend::GetQuotaUtil() {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return quota_util_.get();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const storage::UpdateObserverList* TestFileSystemBackend::GetUpdateObservers(
32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemType type) const {
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return &update_observers_;
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst storage::ChangeObserverList* TestFileSystemBackend::GetChangeObservers(
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    storage::FileSystemType type) const {
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return &change_observers_;
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst storage::AccessObserverList* TestFileSystemBackend::GetAccessObservers(
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    storage::FileSystemType type) const {
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestFileSystemBackend::AddFileChangeObserver(
33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileChangeObserver* observer) {
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  change_observers_ =
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      change_observers_.AddObserver(observer, task_runner_.get());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace content
345