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