canned_syncable_file_system.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (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)
52385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/canned_syncable_file_system.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <algorithm>
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <iterator>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/guid.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/single_thread_task_runner.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/task_runner_util.h"
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/sync_file_system/file_change.h"
192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/local_file_change_tracker.h"
202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/local_file_sync_context.h"
212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/syncable_file_system_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/blob/mock_blob_url_request_context.h"
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/external_mount_points.h"
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "webkit/browser/fileapi/file_system_backend.h"
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h"
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_context.h"
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_runner.h"
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/mock_file_system_options.h"
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "webkit/browser/fileapi/sandbox_file_system_backend.h"
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/mock_special_storage_policy.h"
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/quota_manager.h"
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/common/blob/shareable_file_reference.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::PlatformFileError;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using fileapi::FileSystemContext;
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using fileapi::FileSystemOperationRunner;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using fileapi::FileSystemURL;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using fileapi::FileSystemURLSet;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using quota::QuotaManager;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit_blob::MockBlobURLRequestContext;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit_blob::ScopedTextBlob;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace sync_file_system {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void Quit() { base::MessageLoop::current()->Quit(); }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R>
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssignAndQuit(base::TaskRunner* original_task_runner,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   R* result_out, R result) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(result_out);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_out = result;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_task_runner->PostTask(FROM_HERE, base::Bind(&Quit));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R>
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)R RunOnThread(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* task_runner,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const tracked_objects::Location& location,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Callback<void(const base::Callback<void(R)>& callback)>& task) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R result;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_runner->PostTask(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(task, base::Bind(&AssignAndQuit<R>,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  base::MessageLoopProxy::current(),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  &result)));
70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->Run();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunOnThread(base::SingleThreadTaskRunner* task_runner,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const tracked_objects::Location& location,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const base::Closure& task) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_runner->PostTaskAndReply(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location, task,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&base::MessageLoopProxy::PostTask,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::MessageLoopProxy::current(),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     FROM_HERE, base::Bind(&Quit)))));
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->Run();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EnsureRunningOn(base::SingleThreadTaskRunner* runner) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VerifySameTaskRunner(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* runner1,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* runner2) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(runner1 != NULL);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(runner2 != NULL);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  runner1->PostTask(FROM_HERE,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::Bind(&EnsureRunningOn, make_scoped_refptr(runner2)));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void OnCreateSnapshotFileAndVerifyData(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_data,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CannedSyncableFileSystem::StatusCallback& callback,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::PlatformFileError result,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::PlatformFileInfo& file_info,
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::FilePath& platform_path,
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const scoped_refptr<webkit_blob::ShareableFileReference>& /* file_ref */) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result != base::PLATFORM_FILE_OK) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(result);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_data.size(), static_cast<size_t>(file_info.size));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data;
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const bool read_status = base::ReadFileToString(platform_path, &data);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_status);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_data, data);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(result);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void OnCreateSnapshotFile(
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::PlatformFileInfo* file_info_out,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath* platform_path_out,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CannedSyncableFileSystem::StatusCallback& callback,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::PlatformFileError result,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::PlatformFileInfo& file_info,
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::FilePath& platform_path,
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) {
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(!file_ref.get());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(file_info_out);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(platform_path_out);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *file_info_out = file_info;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *platform_path_out = platform_path;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run(result);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid OnReadDirectory(
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CannedSyncableFileSystem::FileEntryList* entries_out,
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const CannedSyncableFileSystem::StatusCallback& callback,
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::PlatformFileError error,
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const fileapi::FileSystemOperation::FileEntryList& entries,
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool has_more) {
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(entries_out);
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  entries_out->reserve(entries_out->size() + entries.size());
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::copy(entries.begin(), entries.end(), std::back_inserter(*entries_out));
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!has_more)
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    callback.Run(error);
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WriteHelper {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteHelper() : bytes_written_(0) {}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteHelper(MockBlobURLRequestContext* request_context,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const std::string& blob_data)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : bytes_written_(0),
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_context_(request_context),
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        blob_data_(new ScopedTextBlob(*request_context,
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                      base::GenerateGUID(),
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                      blob_data)) {
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~WriteHelper() {
161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (request_context_) {
162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::MessageLoop::current()->DeleteSoon(FROM_HERE,
163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                               request_context_.release());
164b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedTextBlob* scoped_text_blob() const { return blob_data_.get(); }
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidWrite(const base::Callback<void(int64 result)>& completion_callback,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                PlatformFileError error, int64 bytes, bool complete) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (error == base::PLATFORM_FILE_OK) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bytes_written_ += bytes;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!complete)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    completion_callback.Run(error == base::PLATFORM_FILE_OK
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ? bytes_written_ : static_cast<int64>(error));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 bytes_written_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockBlobURLRequestContext> request_context_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScopedTextBlob> blob_data_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WriteHelper);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidGetUsageAndQuota(const quota::StatusCallback& callback,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int64* usage_out, int64* quota_out,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         quota::QuotaStatusCode status,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int64 usage, int64 quota) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *usage_out = usage;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *quota_out = quota;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(status);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EnsureLastTaskRuns(base::SingleThreadTaskRunner* runner) {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::RunLoop run_loop;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  runner->PostTaskAndReply(
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE, base::Bind(&base::DoNothing), run_loop.QuitClosure());
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  run_loop.Run();
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedSyncableFileSystem::CannedSyncableFileSystem(
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const GURL& origin,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* io_task_runner,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* file_task_runner)
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : origin_(origin),
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      type_(fileapi::kFileSystemTypeSyncable),
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(base::PLATFORM_FILE_OK),
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sync_status_(sync_file_system::SYNC_STATUS_OK),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_task_runner_(io_task_runner),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_task_runner_(file_task_runner),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_filesystem_set_up_(false),
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_filesystem_opened_(false),
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sync_status_observers_(new ObserverList) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedSyncableFileSystem::~CannedSyncableFileSystem() {}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::SetUp() {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(is_filesystem_set_up_);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<quota::SpecialStoragePolicy> storage_policy =
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new quota::MockSpecialStoragePolicy();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  quota_manager_ = new QuotaManager(false /* is_incognito */,
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    data_dir_.path(),
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    io_task_runner_.get(),
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    base::MessageLoopProxy::current().get(),
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    storage_policy.get());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string> additional_allowed_schemes;
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  additional_allowed_schemes.push_back(origin_.scheme());
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fileapi::FileSystemOptions options(
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      fileapi::FileSystemOptions::PROFILE_MODE_NORMAL,
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      additional_allowed_schemes);
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ScopedVector<fileapi::FileSystemBackend> additional_backends;
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  additional_backends.push_back(SyncFileSystemBackend::CreateForTesting());
244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_system_context_ = new FileSystemContext(
246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      io_task_runner_.get(),
247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      file_task_runner_.get(),
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fileapi::ExternalMountPoints::CreateRefCounted().get(),
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      storage_policy.get(),
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota_manager_->proxy(),
251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      additional_backends.Pass(),
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      data_dir_.path(), options);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_filesystem_set_up_ = true;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::TearDown() {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_ = NULL;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_system_context_ = NULL;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure we give some more time to finish tasks on other threads.
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnsureLastTaskRuns(io_task_runner_.get());
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnsureLastTaskRuns(file_task_runner_.get());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileSystemURL CannedSyncableFileSystem::URL(const std::string& path) const {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_set_up_);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(root_url_.spec() + path);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return file_system_context_->CrackURL(url);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::OpenFileSystem() {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_set_up_);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_filesystem_opened_);
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  file_system_context_->OpenFileSystem(
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      origin_, type_,
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DidOpenFileSystem,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
282b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->Run();
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (backend()->sync_context()) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Register 'this' as a sync status observer.
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    RunOnThread(
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        io_task_runner_.get(),
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        FROM_HERE,
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::Bind(&CannedSyncableFileSystem::InitializeSyncStatusObserver,
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   base::Unretained(this)));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result_;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::AddSyncStatusObserver(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocalFileSyncStatus::Observer* observer) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_observers_->AddObserver(observer);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::RemoveSyncStatusObserver(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocalFileSyncStatus::Observer* observer) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_observers_->RemoveObserver(observer);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncStatusCode CannedSyncableFileSystem::MaybeInitializeFileSystemContext(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocalFileSyncContext* sync_context) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(sync_context);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_status_ = sync_file_system::SYNC_STATUS_UNKNOWN;
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VerifySameTaskRunner(io_task_runner_.get(),
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       sync_context->io_task_runner_.get());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_context->MaybeInitializeFileSystemContext(
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      origin_,
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file_system_context_.get(),
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DidInitializeFileSystemContext,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
315b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->Run();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_status_;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::CreateDirectory(
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoCreateDirectory,
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::CreateFile(
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoCreateFile,
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::Copy(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& src_url, const FileSystemURL& dest_url) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoCopy,
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 src_url,
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 dest_url));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::Move(
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& src_url, const FileSystemURL& dest_url) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoMove,
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 src_url,
358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 dest_url));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::TruncateFile(
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, int64 size) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoTruncateFile,
367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 size));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::TouchFile(
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& last_access_time,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& last_modified_time) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoTouchFile,
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 last_access_time,
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 last_modified_time));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::Remove(
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, bool recursive) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoRemove,
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 recursive));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::FileExists(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoFileExists,
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::DirectoryExists(
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoDirectoryExists,
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::VerifyFile(
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_data) {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoVerifyFile,
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 expected_data));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::GetMetadataAndPlatformPath(
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL& url,
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::PlatformFileInfo* info,
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath* platform_path) {
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RunOnThread<PlatformFileError>(
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoGetMetadataAndPlatformPath,
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 info,
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 platform_path));
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPlatformFileError CannedSyncableFileSystem::ReadDirectory(
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const fileapi::FileSystemURL& url,
445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FileEntryList* entries) {
446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return RunOnThread<PlatformFileError>(
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      io_task_runner_.get(),
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FROM_HERE,
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&CannedSyncableFileSystem::DoReadDirectory,
450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          base::Unretained(this),
451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          url,
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          entries));
453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 CannedSyncableFileSystem::Write(
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContext* url_request_context,
45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const FileSystemURL& url,
45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle) {
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return RunOnThread<int64>(io_task_runner_.get(),
460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            FROM_HERE,
461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            base::Bind(&CannedSyncableFileSystem::DoWrite,
462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       base::Unretained(this),
463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       url_request_context,
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       url,
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       base::Passed(&blob_data_handle)));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 CannedSyncableFileSystem::WriteString(
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, const std::string& data) {
470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return RunOnThread<int64>(io_task_runner_.get(),
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            FROM_HERE,
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            base::Bind(&CannedSyncableFileSystem::DoWriteString,
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       base::Unretained(this),
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       url,
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       data));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError CannedSyncableFileSystem::DeleteFileSystem() {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_set_up_);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<PlatformFileError>(
481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&FileSystemContext::DeleteFileSystem,
484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 file_system_context_,
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 origin_,
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 type_));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)quota::QuotaStatusCode CannedSyncableFileSystem::GetUsageAndQuota(
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* usage, int64* quota) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RunOnThread<quota::QuotaStatusCode>(
492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      io_task_runner_.get(),
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoGetUsageAndQuota,
495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 usage,
497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 quota));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::GetChangedURLsInTracker(
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemURLSet* urls) {
502d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RunOnThread(
503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file_task_runner_.get(),
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&LocalFileChangeTracker::GetAllChangedURLs,
506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                 base::Unretained(backend()->change_tracker()),
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 urls));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::ClearChangeForURLInTracker(
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url) {
512d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RunOnThread(
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file_task_runner_.get(),
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&LocalFileChangeTracker::ClearChangesForURL,
516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                 base::Unretained(backend()->change_tracker()),
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 url));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
520d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void CannedSyncableFileSystem::GetChangesForURLInTracker(
521d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const FileSystemURL& url,
522d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    FileChangeList* changes) {
523d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RunOnThread(
524d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      file_task_runner_.get(),
525d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      FROM_HERE,
526d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(&LocalFileChangeTracker::GetChangesForURL,
527d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 base::Unretained(backend()->change_tracker()),
528d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 url, changes));
529d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
530d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SyncFileSystemBackend* CannedSyncableFileSystem::backend() {
532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return SyncFileSystemBackend::GetBackend(file_system_context_);
533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
534a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)FileSystemOperationRunner* CannedSyncableFileSystem::operation_runner() {
536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return file_system_context_->operation_runner();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::OnSyncEnabled(const FileSystemURL& url) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_observers_->Notify(&LocalFileSyncStatus::Observer::OnSyncEnabled,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 url);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::OnWriteEnabled(const FileSystemURL& url) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_observers_->Notify(&LocalFileSyncStatus::Observer::OnWriteEnabled,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 url);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoCreateDirectory(
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->CreateDirectory(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, false /* exclusive */, false /* recursive */, callback);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoCreateFile(
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->CreateFile(url, false /* exclusive */, callback);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoCopy(
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& src_url,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& dest_url,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  operation_runner()->Copy(
57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      src_url, dest_url,
57168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      fileapi::FileSystemOperation::OPTION_NONE,
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      fileapi::FileSystemOperationRunner::CopyProgressCallback(), callback);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoMove(
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& src_url,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& dest_url,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
58068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  operation_runner()->Move(
58168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      src_url, dest_url, fileapi::FileSystemOperation::OPTION_NONE, callback);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoTruncateFile(
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, int64 size,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->Truncate(url, size, callback);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoTouchFile(
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& last_access_time,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& last_modified_time,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->TouchFile(url, last_access_time,
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                last_modified_time, callback);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoRemove(
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, bool recursive,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->Remove(url, recursive, callback);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoFileExists(
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, const StatusCallback& callback) {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->FileExists(url, callback);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoDirectoryExists(
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, const StatusCallback& callback) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->DirectoryExists(url, callback);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoVerifyFile(
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_data,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
6257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  operation_runner()->CreateSnapshotFile(
6267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      url,
627424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&OnCreateSnapshotFileAndVerifyData, expected_data, callback));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void CannedSyncableFileSystem::DoGetMetadataAndPlatformPath(
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL& url,
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::PlatformFileInfo* info,
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath* platform_path,
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const StatusCallback& callback) {
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
6367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  operation_runner()->CreateSnapshotFile(
6377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      url, base::Bind(&OnCreateSnapshotFile, info, platform_path, callback));
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid CannedSyncableFileSystem::DoReadDirectory(
641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const FileSystemURL& url,
642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FileEntryList* entries,
643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const StatusCallback& callback) {
644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(is_filesystem_opened_);
645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  operation_runner()->ReadDirectory(
646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      url, base::Bind(&OnReadDirectory, entries, callback));
647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoWrite(
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContext* url_request_context,
65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const FileSystemURL& url,
65258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle,
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WriteCallback& callback) {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteHelper* helper = new WriteHelper;
65658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  operation_runner()->Write(url_request_context, url,
65758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            blob_data_handle.Pass(), 0,
658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            base::Bind(&WriteHelper::DidWrite,
659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       base::Owned(helper), callback));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoWriteString(
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WriteCallback& callback) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockBlobURLRequestContext* url_request_context(
667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new MockBlobURLRequestContext(file_system_context_.get()));
66858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WriteHelper* helper = new WriteHelper(url_request_context, data);
66958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  operation_runner()->Write(url_request_context, url,
67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            helper->scoped_text_blob()->GetBlobDataHandle(), 0,
671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            base::Bind(&WriteHelper::DidWrite,
672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       base::Owned(helper), callback));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoGetUsageAndQuota(
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* usage,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* quota,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const quota::StatusCallback& callback) {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->GetUsageAndQuota(
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_, storage_type(),
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&DidGetUsageAndQuota, callback, usage, quota));
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DidOpenFileSystem(
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PlatformFileError result, const std::string& name, const GURL& root) {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_ = result;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_url_ = root;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_filesystem_opened_ = true;
689b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->Quit();
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DidInitializeFileSystemContext(
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncStatusCode status) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_ = status;
695b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->Quit();
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::InitializeSyncStatusObserver() {
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
700a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  backend()->sync_context()->sync_status()->AddObserver(this);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace sync_file_system
704