test_file_system_backend.cc revision f2477e01787aa58f445919b809d89e252beef54f
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)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner.h"
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "webkit/browser/blob/file_stream_reader.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/copy_or_move_file_validator.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_observers.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_context.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_quota_util.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/local_file_util.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/native_file_util.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "webkit/browser/fileapi/quota/quota_reservation.h"
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/sandbox_file_stream_writer.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/quota_manager.h"
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/fileapi/file_system_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace fileapi {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace {
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class TestFileUtil : public LocalFileUtil {
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  explicit TestFileUtil(const base::FilePath& base_path)
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      : base_path_(base_path) {}
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual ~TestFileUtil() {}
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // LocalFileUtil overrides.
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual base::PlatformFileError GetLocalFilePath(
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      FileSystemOperationContext* context,
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const FileSystemURL& file_system_url,
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::FilePath* local_file_path) OVERRIDE {
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    *local_file_path = base_path_.Append(file_system_url.path());
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return base::PLATFORM_FILE_OK;
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::FilePath base_path_;
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This only supports single origin.
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass TestFileSystemBackend::QuotaUtil
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public FileSystemQuotaUtil,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public FileUpdateObserver {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit QuotaUtil(base::SequencedTaskRunner* task_runner)
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : usage_(0),
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        task_runner_(task_runner) {
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    update_observers_ = update_observers_.AddObserver(this, task_runner_.get());
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuotaUtil() {}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FileSystemQuotaUtil overrides.
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual base::PlatformFileError DeleteOriginDataOnFileThread(
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      FileSystemContext* context,
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      quota::QuotaManagerProxy* proxy,
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const GURL& origin_url,
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      FileSystemType type) OVERRIDE {
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    NOTREACHED();
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return base::PLATFORM_FILE_OK;
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual scoped_refptr<QuotaReservation>
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateQuotaReservationOnFileTaskRunner(
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          const GURL& origin_url,
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          FileSystemType type) OVERRIDE {
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    NOTREACHED();
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return scoped_refptr<QuotaReservation>();
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetOriginsForTypeOnFileThread(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FileSystemType type,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::set<GURL>* origins) OVERRIDE {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetOriginsForHostOnFileThread(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FileSystemType type,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& host,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::set<GURL>* origins) OVERRIDE {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int64 GetOriginUsageOnFileThread(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FileSystemContext* context,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& origin_url,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FileSystemType type) OVERRIDE {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return usage_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AddFileUpdateObserver(
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FileSystemType type,
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FileUpdateObserver* observer,
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::SequencedTaskRunner* task_runner) OVERRIDE {
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NOTIMPLEMENTED();
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AddFileChangeObserver(
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FileSystemType type,
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FileChangeObserver* observer,
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::SequencedTaskRunner* task_runner) OVERRIDE {
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    change_observers_ = change_observers_.AddObserver(observer, task_runner);
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void AddFileAccessObserver(
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FileSystemType type,
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FileAccessObserver* observer,
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::SequencedTaskRunner* task_runner) OVERRIDE {
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NOTIMPLEMENTED();
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual const UpdateObserverList* GetUpdateObservers(
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FileSystemType type) const OVERRIDE {
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return &update_observers_;
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual const ChangeObserverList* GetChangeObservers(
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FileSystemType type) const OVERRIDE {
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return &change_observers_;
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual const AccessObserverList* GetAccessObservers(
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FileSystemType type) const OVERRIDE {
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NOTIMPLEMENTED();
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return NULL;
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FileUpdateObserver overrides.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStartUpdate(const FileSystemURL& url) OVERRIDE {}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnUpdate(const FileSystemURL& url, int64 delta) OVERRIDE {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage_ += delta;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnEndUpdate(const FileSystemURL& url) OVERRIDE {}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::SequencedTaskRunner* task_runner() { return task_runner_.get(); }
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 usage_;
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<base::SequencedTaskRunner> task_runner_;
1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  UpdateObserverList update_observers_;
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ChangeObserverList change_observers_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::TestFileSystemBackend(
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SequencedTaskRunner* task_runner,
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& base_path)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : base_path_(base_path),
160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      file_util_(new AsyncFileUtilAdapter(new TestFileUtil(base_path))),
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      quota_util_(new QuotaUtil(task_runner)),
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      require_copy_or_move_validator_(false) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::~TestFileSystemBackend() {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool TestFileSystemBackend::CanHandleType(FileSystemType type) const {
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return (type == kFileSystemTypeTest);
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
172bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid TestFileSystemBackend::Initialize(FileSystemContext* context) {
173bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
174bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
175bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid TestFileSystemBackend::OpenFileSystem(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin_url,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemType type,
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    OpenFileSystemMode mode,
179bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const OpenFileSystemCallback& callback) {
1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  callback.Run(GetFileSystemRootURI(origin_url, type),
1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               GetFileSystemName(origin_url, type),
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::PLATFORM_FILE_OK);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochAsyncFileUtil* TestFileSystemBackend::GetAsyncFileUtil(FileSystemType type) {
186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return file_util_.get();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)CopyOrMoveFileValidatorFactory*
1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FileSystemType type, base::PlatformFileError* error_code) {
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(error_code);
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *error_code = base::PLATFORM_FILE_OK;
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (require_copy_or_move_validator_) {
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!copy_or_move_file_validator_factory_)
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *error_code = base::PLATFORM_FILE_ERROR_SECURITY;
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return copy_or_move_file_validator_factory_.get();
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestFileSystemBackend::InitializeCopyOrMoveFileValidatorFactory(
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    scoped_ptr<CopyOrMoveFileValidatorFactory> factory) {
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!copy_or_move_file_validator_factory_)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    copy_or_move_file_validator_factory_ = factory.Pass();
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemOperation* TestFileSystemBackend::CreateFileSystemOperation(
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemContext* context,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::PlatformFileError* error_code) const {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> operation_context(
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new FileSystemOperationContext(context));
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_context->set_update_observers(*GetUpdateObservers(url.type()));
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_context->set_change_observers(
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      *quota_util_->GetChangeObservers(url.type()));
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return FileSystemOperation::Create(url, context, operation_context.Pass());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<webkit_blob::FileStreamReader>
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::CreateFileStreamReader(
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 offset,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& expected_modification_time,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemContext* context) const {
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return scoped_ptr<webkit_blob::FileStreamReader>(
227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      webkit_blob::FileStreamReader::CreateForFileSystemFile(
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          context, url, offset, expected_modification_time));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<fileapi::FileStreamWriter>
2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestFileSystemBackend::CreateFileStreamWriter(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 offset,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemContext* context) const {
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return scoped_ptr<fileapi::FileStreamWriter>(
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new SandboxFileStreamWriter(context, url, offset,
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                  *GetUpdateObservers(url.type())));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemQuotaUtil* TestFileSystemBackend::GetQuotaUtil() {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return quota_util_.get();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst UpdateObserverList* TestFileSystemBackend::GetUpdateObservers(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemType type) const {
2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return quota_util_->GetUpdateObservers(type);
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestFileSystemBackend::AddFileChangeObserver(
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    FileChangeObserver* observer) {
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  quota_util_->AddFileChangeObserver(
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kFileSystemTypeTest, observer, quota_util_->task_runner());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace fileapi
257