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"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/guid.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"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/thread_task_runner_handle.h"
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/sync_file_system/file_change.h"
202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/local_file_change_tracker.h"
212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/local_file_sync_context.h"
222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/syncable_file_system_util.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/mock_blob_url_request_context.h"
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/test/mock_special_storage_policy.h"
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_file_system_options.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/external_mount_points.h"
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_backend.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h"
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h"
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_runner.h"
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager.h"
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/shareable_file_reference.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::File;
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemContext;
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemOperationRunner;
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemURL;
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemURLSet;
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::QuotaManager;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::MockBlobURLRequestContext;
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::ScopedTextBlob;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace sync_file_system {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R>
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssignAndQuit(base::TaskRunner* original_task_runner,
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   const base::Closure& quit_closure,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   R* result_out, R result) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(result_out);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_out = result;
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  original_task_runner->PostTask(FROM_HERE, quit_closure);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R>
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)R RunOnThread(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* task_runner,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const tracked_objects::Location& location,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Callback<void(const base::Callback<void(R)>& callback)>& task) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R result;
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop run_loop;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_runner->PostTask(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(task, base::Bind(&AssignAndQuit<R>,
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  base::ThreadTaskRunnerHandle::Get(),
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  run_loop.QuitClosure(),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  &result)));
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  run_loop.Run();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunOnThread(base::SingleThreadTaskRunner* task_runner,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const tracked_objects::Location& location,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const base::Closure& task) {
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop run_loop;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_runner->PostTaskAndReply(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location, task,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          base::Bind(&base::SingleThreadTaskRunner::PostTask,
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     base::ThreadTaskRunnerHandle::Get(),
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     FROM_HERE, run_loop.QuitClosure()))));
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  run_loop.Run();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EnsureRunningOn(base::SingleThreadTaskRunner* runner) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VerifySameTaskRunner(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* runner1,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* runner2) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(runner1 != NULL);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(runner2 != NULL);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  runner1->PostTask(FROM_HERE,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::Bind(&EnsureRunningOn, make_scoped_refptr(runner2)));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void OnCreateSnapshotFileAndVerifyData(
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_data,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CannedSyncableFileSystem::StatusCallback& callback,
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error result,
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::File::Info& file_info,
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::FilePath& platform_path,
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const scoped_refptr<storage::ShareableFileReference>& /* file_ref */) {
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (result != base::File::FILE_OK) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(result);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_data.size(), static_cast<size_t>(file_info.size));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data;
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const bool read_status = base::ReadFileToString(platform_path, &data);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_status);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_data, data);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(result);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void OnCreateSnapshotFile(
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info* file_info_out,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath* platform_path_out,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CannedSyncableFileSystem::StatusCallback& callback,
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error result,
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::File::Info& file_info,
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::FilePath& platform_path,
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const scoped_refptr<storage::ShareableFileReference>& file_ref) {
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(!file_ref.get());
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(file_info_out);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(platform_path_out);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *file_info_out = file_info;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *platform_path_out = platform_path;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run(result);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void OnReadDirectory(CannedSyncableFileSystem::FileEntryList* entries_out,
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                     const CannedSyncableFileSystem::StatusCallback& callback,
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                     base::File::Error error,
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                     const storage::FileSystemOperation::FileEntryList& entries,
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                     bool has_more) {
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(entries_out);
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  entries_out->reserve(entries_out->size() + entries.size());
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::copy(entries.begin(), entries.end(), std::back_inserter(*entries_out));
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!has_more)
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    callback.Run(error);
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WriteHelper {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteHelper() : bytes_written_(0) {}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteHelper(MockBlobURLRequestContext* request_context,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const std::string& blob_data)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : bytes_written_(0),
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_context_(request_context),
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        blob_data_(new ScopedTextBlob(*request_context,
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                      base::GenerateGUID(),
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                      blob_data)) {
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~WriteHelper() {
162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (request_context_) {
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::ThreadTaskRunnerHandle::Get()->DeleteSoon(
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          FROM_HERE, request_context_.release());
165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedTextBlob* scoped_text_blob() const { return blob_data_.get(); }
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidWrite(const base::Callback<void(int64 result)>& completion_callback,
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                File::Error error, int64 bytes, bool complete) {
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (error == base::File::FILE_OK) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bytes_written_ += bytes;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!complete)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    completion_callback.Run(error == base::File::FILE_OK ?
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            bytes_written_ : static_cast<int64>(error));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 bytes_written_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockBlobURLRequestContext> request_context_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScopedTextBlob> blob_data_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WriteHelper);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DidGetUsageAndQuota(const storage::StatusCallback& callback,
19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                         int64* usage_out,
19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                         int64* quota_out,
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                         storage::QuotaStatusCode status,
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                         int64 usage,
19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                         int64 quota) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *usage_out = usage;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *quota_out = quota;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(status);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EnsureLastTaskRuns(base::SingleThreadTaskRunner* runner) {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::RunLoop run_loop;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  runner->PostTaskAndReply(
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE, base::Bind(&base::DoNothing), run_loop.QuitClosure());
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  run_loop.Run();
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedSyncableFileSystem::CannedSyncableFileSystem(
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const GURL& origin,
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    leveldb::Env* env_override,
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : origin_(origin),
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      type_(storage::kFileSystemTypeSyncable),
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      result_(base::File::FILE_OK),
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sync_status_(sync_file_system::SYNC_STATUS_OK),
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      env_override_(env_override),
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_task_runner_(io_task_runner),
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_task_runner_(file_task_runner),
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_filesystem_set_up_(false),
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_filesystem_opened_(false),
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sync_status_observers_(new ObserverList) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedSyncableFileSystem::~CannedSyncableFileSystem() {}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CannedSyncableFileSystem::SetUp(QuotaMode quota_mode) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(is_filesystem_set_up_);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<storage::SpecialStoragePolicy> storage_policy =
2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      new content::MockSpecialStoragePolicy();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (quota_mode == QUOTA_ENABLED) {
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    quota_manager_ = new QuotaManager(false /* is_incognito */,
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      data_dir_.path(),
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      io_task_runner_.get(),
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      base::ThreadTaskRunnerHandle::Get().get(),
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      storage_policy.get());
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string> additional_allowed_schemes;
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  additional_allowed_schemes.push_back(origin_.scheme());
24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemOptions options(
24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemOptions::PROFILE_MODE_NORMAL,
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      additional_allowed_schemes,
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      env_override_);
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ScopedVector<storage::FileSystemBackend> additional_backends;
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  additional_backends.push_back(SyncFileSystemBackend::CreateForTesting());
252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_system_context_ = new FileSystemContext(
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      file_task_runner_.get(),
25603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::ExternalMountPoints::CreateRefCounted().get(),
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      storage_policy.get(),
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quota_manager_.get() ? quota_manager_->proxy() : NULL,
259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      additional_backends.Pass(),
26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      std::vector<storage::URLRequestAutoMountHandler>(),
26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      data_dir_.path(),
26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      options);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_filesystem_set_up_ = true;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::TearDown() {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_ = NULL;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_system_context_ = NULL;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure we give some more time to finish tasks on other threads.
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EnsureLastTaskRuns(io_task_runner_.get());
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EnsureLastTaskRuns(file_task_runner_.get());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileSystemURL CannedSyncableFileSystem::URL(const std::string& path) const {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_set_up_);
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(root_url_.is_empty());
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(root_url_.spec() + path);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return file_system_context_->CrackURL(url);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::OpenFileSystem() {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_set_up_);
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop run_loop;
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  io_task_runner_->PostTask(
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      FROM_HERE,
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoOpenFileSystem,
2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Unretained(this),
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Bind(&CannedSyncableFileSystem::DidOpenFileSystem,
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            base::Unretained(this),
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            base::ThreadTaskRunnerHandle::Get(),
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            run_loop.QuitClosure())));
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  run_loop.Run();
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (backend()->sync_context()) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Register 'this' as a sync status observer.
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    RunOnThread(
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        io_task_runner_.get(),
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        FROM_HERE,
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::Bind(&CannedSyncableFileSystem::InitializeSyncStatusObserver,
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   base::Unretained(this)));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result_;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::AddSyncStatusObserver(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocalFileSyncStatus::Observer* observer) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_observers_->AddObserver(observer);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::RemoveSyncStatusObserver(
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocalFileSyncStatus::Observer* observer) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_observers_->RemoveObserver(observer);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncStatusCode CannedSyncableFileSystem::MaybeInitializeFileSystemContext(
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocalFileSyncContext* sync_context) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(sync_context);
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop run_loop;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_status_ = sync_file_system::SYNC_STATUS_UNKNOWN;
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  VerifySameTaskRunner(io_task_runner_.get(),
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       sync_context->io_task_runner_.get());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_context->MaybeInitializeFileSystemContext(
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      origin_,
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file_system_context_.get(),
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DidInitializeFileSystemContext,
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(this),
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 run_loop.QuitClosure()));
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  run_loop.Run();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_status_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::CreateDirectory(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url) {
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoCreateDirectory,
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::CreateFile(const FileSystemURL& url) {
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoCreateFile,
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::Copy(
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& src_url, const FileSystemURL& dest_url) {
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return RunOnThread<File::Error>(io_task_runner_.get(),
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  FROM_HERE,
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  base::Bind(&CannedSyncableFileSystem::DoCopy,
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             base::Unretained(this),
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             src_url,
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             dest_url));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::Move(
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& src_url, const FileSystemURL& dest_url) {
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return RunOnThread<File::Error>(io_task_runner_.get(),
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  FROM_HERE,
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  base::Bind(&CannedSyncableFileSystem::DoMove,
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             base::Unretained(this),
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             src_url,
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             dest_url));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::TruncateFile(
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, int64 size) {
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoTruncateFile,
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 size));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::TouchFile(
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& last_access_time,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& last_modified_time) {
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoTouchFile,
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 last_access_time,
397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 last_modified_time));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::Remove(
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, bool recursive) {
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoRemove,
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 recursive));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::FileExists(
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url) {
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoFileExists,
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::DirectoryExists(
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url) {
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoDirectoryExists,
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::VerifyFile(
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_data) {
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoVerifyFile,
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 expected_data));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::GetMetadataAndPlatformPath(
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL& url,
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info* info,
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath* platform_path) {
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoGetMetadataAndPlatformPath,
451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 url,
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 info,
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 platform_path));
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::ReadDirectory(
45803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FileEntryList* entries) {
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FROM_HERE,
463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&CannedSyncableFileSystem::DoReadDirectory,
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this),
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 url,
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 entries));
467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 CannedSyncableFileSystem::Write(
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContext* url_request_context,
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const FileSystemURL& url,
47203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::BlobDataHandle> blob_data_handle) {
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return RunOnThread<int64>(io_task_runner_.get(),
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            FROM_HERE,
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            base::Bind(&CannedSyncableFileSystem::DoWrite,
476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       base::Unretained(this),
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       url_request_context,
478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       url,
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       base::Passed(&blob_data_handle)));
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 CannedSyncableFileSystem::WriteString(
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, const std::string& data) {
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return RunOnThread<int64>(io_task_runner_.get(),
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            FROM_HERE,
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            base::Bind(&CannedSyncableFileSystem::DoWriteString,
487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       base::Unretained(this),
488868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       url,
489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       data));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error CannedSyncableFileSystem::DeleteFileSystem() {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_set_up_);
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunOnThread<File::Error>(
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&FileSystemContext::DeleteFileSystem,
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 file_system_context_,
499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 origin_,
500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 type_));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::QuotaStatusCode CannedSyncableFileSystem::GetUsageAndQuota(
50403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int64* usage,
50503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int64* quota) {
50603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return RunOnThread<storage::QuotaStatusCode>(
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_.get(),
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CannedSyncableFileSystem::DoGetUsageAndQuota,
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this),
511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 usage,
512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 quota));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::GetChangedURLsInTracker(
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemURLSet* urls) {
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunOnThread(file_task_runner_.get(),
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              FROM_HERE,
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              base::Bind(&LocalFileChangeTracker::GetAllChangedURLs,
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         base::Unretained(backend()->change_tracker()),
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         urls));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::ClearChangeForURLInTracker(
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url) {
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunOnThread(file_task_runner_.get(),
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              FROM_HERE,
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              base::Bind(&LocalFileChangeTracker::ClearChangesForURL,
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         base::Unretained(backend()->change_tracker()),
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         url));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
533d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void CannedSyncableFileSystem::GetChangesForURLInTracker(
534d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const FileSystemURL& url,
535d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    FileChangeList* changes) {
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunOnThread(file_task_runner_.get(),
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              FROM_HERE,
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              base::Bind(&LocalFileChangeTracker::GetChangesForURL,
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         base::Unretained(backend()->change_tracker()),
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         url,
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         changes));
542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SyncFileSystemBackend* CannedSyncableFileSystem::backend() {
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return SyncFileSystemBackend::GetBackend(file_system_context_.get());
546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)FileSystemOperationRunner* CannedSyncableFileSystem::operation_runner() {
549868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return file_system_context_->operation_runner();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::OnSyncEnabled(const FileSystemURL& url) {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_observers_->Notify(&LocalFileSyncStatus::Observer::OnSyncEnabled,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 url);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::OnWriteEnabled(const FileSystemURL& url) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_observers_->Notify(&LocalFileSyncStatus::Observer::OnWriteEnabled,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 url);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void CannedSyncableFileSystem::DoOpenFileSystem(
5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const OpenFileSystemCallback& callback) {
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(is_filesystem_opened_);
5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  file_system_context_->OpenFileSystem(
56703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      origin_,
56803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      type_,
56903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      callback);
5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoCreateDirectory(
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->CreateDirectory(
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, false /* exclusive */, false /* recursive */, callback);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoCreateFile(
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
5854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->CreateFile(url, false /* exclusive */, callback);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoCopy(
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& src_url,
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& dest_url,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  operation_runner()->Copy(
59703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      src_url,
59803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      dest_url,
59903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemOperation::OPTION_NONE,
60003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemOperationRunner::CopyProgressCallback(),
60103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      callback);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoMove(
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& src_url,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& dest_url,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
61068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  operation_runner()->Move(
61103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      src_url, dest_url, storage::FileSystemOperation::OPTION_NONE, callback);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoTruncateFile(
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, int64 size,
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->Truncate(url, size, callback);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoTouchFile(
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& last_access_time,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& last_modified_time,
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
6274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->TouchFile(url, last_access_time,
630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                last_modified_time, callback);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoRemove(
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, bool recursive,
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
6364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->Remove(url, recursive, callback);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoFileExists(
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, const StatusCallback& callback) {
6434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->FileExists(url, callback);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoDirectoryExists(
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url, const StatusCallback& callback) {
6504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  operation_runner()->DirectoryExists(url, callback);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoVerifyFile(
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_data,
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
6594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
6617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  operation_runner()->CreateSnapshotFile(
6627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      url,
663424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&OnCreateSnapshotFileAndVerifyData, expected_data, callback));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void CannedSyncableFileSystem::DoGetMetadataAndPlatformPath(
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL& url,
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info* info,
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath* platform_path,
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const StatusCallback& callback) {
6714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
6737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  operation_runner()->CreateSnapshotFile(
6747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      url, base::Bind(&OnCreateSnapshotFile, info, platform_path, callback));
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid CannedSyncableFileSystem::DoReadDirectory(
678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const FileSystemURL& url,
679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FileEntryList* entries,
680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const StatusCallback& callback) {
6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(is_filesystem_opened_);
683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  operation_runner()->ReadDirectory(
684eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      url, base::Bind(&OnReadDirectory, entries, callback));
685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
686eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoWrite(
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContext* url_request_context,
68958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const FileSystemURL& url,
69003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::BlobDataHandle> blob_data_handle,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WriteCallback& callback) {
6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteHelper* helper = new WriteHelper;
69558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  operation_runner()->Write(url_request_context, url,
69658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            blob_data_handle.Pass(), 0,
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            base::Bind(&WriteHelper::DidWrite,
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       base::Owned(helper), callback));
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoWriteString(
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data,
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WriteCallback& callback) {
7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockBlobURLRequestContext* url_request_context(
708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new MockBlobURLRequestContext(file_system_context_.get()));
70958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WriteHelper* helper = new WriteHelper(url_request_context, data);
71058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  operation_runner()->Write(url_request_context, url,
71158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            helper->scoped_text_blob()->GetBlobDataHandle(), 0,
712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            base::Bind(&WriteHelper::DidWrite,
713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       base::Owned(helper), callback));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DoGetUsageAndQuota(
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* usage,
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* quota,
71903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::StatusCallback& callback) {
7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
7214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(is_filesystem_opened_);
7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(quota_manager_.get());
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->GetUsageAndQuota(
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_, storage_type(),
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&DidGetUsageAndQuota, callback, usage, quota));
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DidOpenFileSystem(
7294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::SingleThreadTaskRunner* original_task_runner,
7305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::Closure& quit_closure,
7314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const GURL& root,
7324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string& name,
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    File::Error result) {
7344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (io_task_runner_->RunsTasksOnCurrentThread()) {
7354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_FALSE(is_filesystem_opened_);
7364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    is_filesystem_opened_ = true;
7374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!original_task_runner->RunsTasksOnCurrentThread()) {
7394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    original_task_runner->PostTask(
7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        FROM_HERE,
7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        base::Bind(&CannedSyncableFileSystem::DidOpenFileSystem,
7434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   base::Unretained(this),
7444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   make_scoped_refptr(original_task_runner),
7455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   quit_closure,
7464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   root, name, result));
7474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
7484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_ = result;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_url_ = root;
7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  quit_closure.Run();
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::DidInitializeFileSystemContext(
7555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::Closure& quit_closure,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncStatusCode status) {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_status_ = status;
7585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  quit_closure.Run();
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedSyncableFileSystem::InitializeSyncStatusObserver() {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
763a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  backend()->sync_context()->sync_status()->AddObserver(this);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace sync_file_system
767