| Index: webkit/fileapi/syncable/local_file_sync_context_unittest.cc
|
| diff --git a/webkit/fileapi/syncable/local_file_sync_context_unittest.cc b/webkit/fileapi/syncable/local_file_sync_context_unittest.cc
|
| deleted file mode 100644
|
| index 4a719e4e3b0338102899e440feaef4ff9f45c822..0000000000000000000000000000000000000000
|
| --- a/webkit/fileapi/syncable/local_file_sync_context_unittest.cc
|
| +++ /dev/null
|
| @@ -1,681 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "webkit/fileapi/syncable/local_file_sync_context.h"
|
| -
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/file_util.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/platform_file.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/stl_util.h"
|
| -#include "base/threading/thread.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "webkit/blob/mock_blob_url_request_context.h"
|
| -#include "webkit/fileapi/file_system_context.h"
|
| -#include "webkit/fileapi/file_system_operation.h"
|
| -#include "webkit/fileapi/isolated_context.h"
|
| -#include "webkit/fileapi/syncable/canned_syncable_file_system.h"
|
| -#include "webkit/fileapi/syncable/file_change.h"
|
| -#include "webkit/fileapi/syncable/local_file_change_tracker.h"
|
| -#include "webkit/fileapi/syncable/sync_file_metadata.h"
|
| -#include "webkit/fileapi/syncable/sync_status_code.h"
|
| -#include "webkit/fileapi/syncable/syncable_file_system_util.h"
|
| -
|
| -#define FPL FILE_PATH_LITERAL
|
| -
|
| -using fileapi::FileSystemContext;
|
| -using fileapi::FileSystemURL;
|
| -using fileapi::FileSystemURLSet;
|
| -
|
| -// This tests LocalFileSyncContext behavior in multi-thread /
|
| -// multi-file-system-context environment.
|
| -// Basic combined tests (single-thread / single-file-system-context)
|
| -// that involve LocalFileSyncContext are also in
|
| -// syncable_file_system_unittests.cc.
|
| -
|
| -namespace sync_file_system {
|
| -
|
| -namespace {
|
| -const char kOrigin1[] = "http://example.com";
|
| -const char kOrigin2[] = "http://chromium.org";
|
| -const char kServiceName[] = "test";
|
| -}
|
| -
|
| -class LocalFileSyncContextTest : public testing::Test {
|
| - protected:
|
| - LocalFileSyncContextTest()
|
| - : status_(SYNC_FILE_ERROR_FAILED),
|
| - file_error_(base::PLATFORM_FILE_ERROR_FAILED),
|
| - async_modify_finished_(false),
|
| - has_inflight_prepare_for_sync_(false) {}
|
| -
|
| - virtual void SetUp() OVERRIDE {
|
| - EXPECT_TRUE(RegisterSyncableFileSystem(kServiceName));
|
| -
|
| - io_thread_.reset(new base::Thread("Thread_IO"));
|
| - io_thread_->StartWithOptions(
|
| - base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
|
| -
|
| - file_thread_.reset(new base::Thread("Thread_File"));
|
| - file_thread_->Start();
|
| -
|
| - ui_task_runner_ = base::MessageLoop::current()->message_loop_proxy();
|
| - io_task_runner_ = io_thread_->message_loop_proxy();
|
| - file_task_runner_ = file_thread_->message_loop_proxy();
|
| - }
|
| -
|
| - virtual void TearDown() OVERRIDE {
|
| - EXPECT_TRUE(RevokeSyncableFileSystem(kServiceName));
|
| - io_thread_->Stop();
|
| - file_thread_->Stop();
|
| - }
|
| -
|
| - void StartPrepareForSync(FileSystemContext* file_system_context,
|
| - const FileSystemURL& url,
|
| - SyncFileMetadata* metadata,
|
| - FileChangeList* changes) {
|
| - ASSERT_TRUE(changes != NULL);
|
| - ASSERT_FALSE(has_inflight_prepare_for_sync_);
|
| - status_ = SYNC_STATUS_UNKNOWN;
|
| - has_inflight_prepare_for_sync_ = true;
|
| - sync_context_->PrepareForSync(
|
| - file_system_context,
|
| - url,
|
| - base::Bind(&LocalFileSyncContextTest::DidPrepareForSync,
|
| - base::Unretained(this), metadata, changes));
|
| - }
|
| -
|
| - SyncStatusCode PrepareForSync(FileSystemContext* file_system_context,
|
| - const FileSystemURL& url,
|
| - SyncFileMetadata* metadata,
|
| - FileChangeList* changes) {
|
| - StartPrepareForSync(file_system_context, url, metadata, changes);
|
| - base::MessageLoop::current()->Run();
|
| - return status_;
|
| - }
|
| -
|
| - base::Closure GetPrepareForSyncClosure(FileSystemContext* file_system_context,
|
| - const FileSystemURL& url,
|
| - SyncFileMetadata* metadata,
|
| - FileChangeList* changes) {
|
| - return base::Bind(&LocalFileSyncContextTest::StartPrepareForSync,
|
| - base::Unretained(this),
|
| - base::Unretained(file_system_context),
|
| - url, metadata, changes);
|
| - }
|
| -
|
| - void DidPrepareForSync(SyncFileMetadata* metadata_out,
|
| - FileChangeList* changes_out,
|
| - SyncStatusCode status,
|
| - const LocalFileSyncInfo& sync_file_info) {
|
| - ASSERT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread());
|
| - has_inflight_prepare_for_sync_ = false;
|
| - status_ = status;
|
| - *metadata_out = sync_file_info.metadata;
|
| - *changes_out = sync_file_info.changes;
|
| - base::MessageLoop::current()->Quit();
|
| - }
|
| -
|
| - SyncStatusCode ApplyRemoteChange(FileSystemContext* file_system_context,
|
| - const FileChange& change,
|
| - const base::FilePath& local_path,
|
| - const FileSystemURL& url,
|
| - SyncFileType expected_file_type) {
|
| - SCOPED_TRACE(testing::Message() << "ApplyChange for " <<
|
| - url.DebugString());
|
| -
|
| - // First we should call PrepareForSync to disable writing.
|
| - SyncFileMetadata metadata;
|
| - FileChangeList changes;
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - PrepareForSync(file_system_context, url, &metadata, &changes));
|
| - EXPECT_EQ(expected_file_type, metadata.file_type);
|
| -
|
| - status_ = SYNC_STATUS_UNKNOWN;
|
| - sync_context_->ApplyRemoteChange(
|
| - file_system_context, change, local_path, url,
|
| - base::Bind(&LocalFileSyncContextTest::DidApplyRemoteChange,
|
| - base::Unretained(this)));
|
| - base::MessageLoop::current()->Run();
|
| - return status_;
|
| - }
|
| -
|
| - void DidApplyRemoteChange(SyncStatusCode status) {
|
| - base::MessageLoop::current()->Quit();
|
| - status_ = status;
|
| - }
|
| -
|
| - void StartModifyFileOnIOThread(CannedSyncableFileSystem* file_system,
|
| - const FileSystemURL& url) {
|
| - async_modify_finished_ = false;
|
| - ASSERT_TRUE(file_system != NULL);
|
| - if (!io_task_runner_->RunsTasksOnCurrentThread()) {
|
| - ASSERT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread());
|
| - io_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&LocalFileSyncContextTest::StartModifyFileOnIOThread,
|
| - base::Unretained(this), file_system, url));
|
| - return;
|
| - }
|
| - ASSERT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
|
| - file_error_ = base::PLATFORM_FILE_ERROR_FAILED;
|
| - file_system->NewOperation()->Truncate(
|
| - url, 1, base::Bind(&LocalFileSyncContextTest::DidModifyFile,
|
| - base::Unretained(this)));
|
| - }
|
| -
|
| - base::PlatformFileError WaitUntilModifyFileIsDone() {
|
| - while (!async_modify_finished_)
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - return file_error_;
|
| - }
|
| -
|
| - void DidModifyFile(base::PlatformFileError error) {
|
| - if (!ui_task_runner_->RunsTasksOnCurrentThread()) {
|
| - ASSERT_TRUE(io_task_runner_->RunsTasksOnCurrentThread());
|
| - ui_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&LocalFileSyncContextTest::DidModifyFile,
|
| - base::Unretained(this), error));
|
| - return;
|
| - }
|
| - ASSERT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread());
|
| - file_error_ = error;
|
| - async_modify_finished_ = true;
|
| - }
|
| -
|
| - // These need to remain until the very end.
|
| - scoped_ptr<base::Thread> io_thread_;
|
| - scoped_ptr<base::Thread> file_thread_;
|
| - base::MessageLoop loop_;
|
| -
|
| - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
|
| - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
|
| - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
|
| -
|
| - scoped_refptr<LocalFileSyncContext> sync_context_;
|
| -
|
| - SyncStatusCode status_;
|
| - base::PlatformFileError file_error_;
|
| - bool async_modify_finished_;
|
| - bool has_inflight_prepare_for_sync_;
|
| -};
|
| -
|
| -TEST_F(LocalFileSyncContextTest, ConstructAndDestruct) {
|
| - sync_context_ = new LocalFileSyncContext(
|
| - ui_task_runner_, io_task_runner_);
|
| - sync_context_->ShutdownOnUIThread();
|
| -}
|
| -
|
| -TEST_F(LocalFileSyncContextTest, InitializeFileSystemContext) {
|
| - CannedSyncableFileSystem file_system(GURL(kOrigin1), kServiceName,
|
| - io_task_runner_, file_task_runner_);
|
| - file_system.SetUp();
|
| -
|
| - sync_context_ = new LocalFileSyncContext(ui_task_runner_, io_task_runner_);
|
| -
|
| - // Initializes file_system using |sync_context_|.
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - file_system.MaybeInitializeFileSystemContext(sync_context_));
|
| -
|
| - // Make sure everything's set up for file_system to be able to handle
|
| - // syncable file system operations.
|
| - EXPECT_TRUE(file_system.file_system_context()->sync_context() != NULL);
|
| - EXPECT_TRUE(file_system.file_system_context()->change_tracker() != NULL);
|
| - EXPECT_EQ(sync_context_.get(),
|
| - file_system.file_system_context()->sync_context());
|
| -
|
| - // Calling MaybeInitialize for the same context multiple times must be ok.
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - file_system.MaybeInitializeFileSystemContext(sync_context_));
|
| - EXPECT_EQ(sync_context_.get(),
|
| - file_system.file_system_context()->sync_context());
|
| -
|
| - // Opens the file_system, perform some operation and see if the change tracker
|
| - // correctly captures the change.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.OpenFileSystem());
|
| -
|
| - const FileSystemURL kURL(file_system.URL("foo"));
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.CreateFile(kURL));
|
| -
|
| - FileSystemURLSet urls;
|
| - file_system.GetChangedURLsInTracker(&urls);
|
| - ASSERT_EQ(1U, urls.size());
|
| - EXPECT_TRUE(ContainsKey(urls, kURL));
|
| -
|
| - // Finishing the test.
|
| - sync_context_->ShutdownOnUIThread();
|
| - file_system.TearDown();
|
| -}
|
| -
|
| -TEST_F(LocalFileSyncContextTest, MultipleFileSystemContexts) {
|
| - CannedSyncableFileSystem file_system1(GURL(kOrigin1), kServiceName,
|
| - io_task_runner_, file_task_runner_);
|
| - CannedSyncableFileSystem file_system2(GURL(kOrigin2), kServiceName,
|
| - io_task_runner_, file_task_runner_);
|
| - file_system1.SetUp();
|
| - file_system2.SetUp();
|
| -
|
| - sync_context_ = new LocalFileSyncContext(ui_task_runner_, io_task_runner_);
|
| -
|
| - // Initializes file_system1 and file_system2.
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - file_system1.MaybeInitializeFileSystemContext(sync_context_));
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - file_system2.MaybeInitializeFileSystemContext(sync_context_));
|
| -
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system1.OpenFileSystem());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system2.OpenFileSystem());
|
| -
|
| - const FileSystemURL kURL1(file_system1.URL("foo"));
|
| - const FileSystemURL kURL2(file_system2.URL("bar"));
|
| -
|
| - // Creates a file in file_system1.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system1.CreateFile(kURL1));
|
| -
|
| - // file_system1's tracker must have recorded the change.
|
| - FileSystemURLSet urls;
|
| - file_system1.GetChangedURLsInTracker(&urls);
|
| - ASSERT_EQ(1U, urls.size());
|
| - EXPECT_TRUE(ContainsKey(urls, kURL1));
|
| -
|
| - // file_system1's tracker must have no change.
|
| - urls.clear();
|
| - file_system2.GetChangedURLsInTracker(&urls);
|
| - ASSERT_TRUE(urls.empty());
|
| -
|
| - // Creates a directory in file_system2.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system2.CreateDirectory(kURL2));
|
| -
|
| - // file_system1's tracker must have the change for kURL1 as before.
|
| - urls.clear();
|
| - file_system1.GetChangedURLsInTracker(&urls);
|
| - ASSERT_EQ(1U, urls.size());
|
| - EXPECT_TRUE(ContainsKey(urls, kURL1));
|
| -
|
| - // file_system2's tracker now must have the change for kURL2.
|
| - urls.clear();
|
| - file_system2.GetChangedURLsInTracker(&urls);
|
| - ASSERT_EQ(1U, urls.size());
|
| - EXPECT_TRUE(ContainsKey(urls, kURL2));
|
| -
|
| - SyncFileMetadata metadata;
|
| - FileChangeList changes;
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - PrepareForSync(file_system1.file_system_context(), kURL1,
|
| - &metadata, &changes));
|
| - EXPECT_EQ(1U, changes.size());
|
| - EXPECT_TRUE(changes.list().back().IsFile());
|
| - EXPECT_TRUE(changes.list().back().IsAddOrUpdate());
|
| - EXPECT_EQ(SYNC_FILE_TYPE_FILE, metadata.file_type);
|
| - EXPECT_EQ(0, metadata.size);
|
| -
|
| - changes.clear();
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - PrepareForSync(file_system2.file_system_context(), kURL2,
|
| - &metadata, &changes));
|
| - EXPECT_EQ(1U, changes.size());
|
| - EXPECT_FALSE(changes.list().back().IsFile());
|
| - EXPECT_TRUE(changes.list().back().IsAddOrUpdate());
|
| - EXPECT_EQ(SYNC_FILE_TYPE_DIRECTORY, metadata.file_type);
|
| - EXPECT_EQ(0, metadata.size);
|
| -
|
| - sync_context_->ShutdownOnUIThread();
|
| - sync_context_ = NULL;
|
| -
|
| - file_system1.TearDown();
|
| - file_system2.TearDown();
|
| -}
|
| -
|
| -// LocalFileSyncContextTest.PrepareSyncWhileWriting is flaky on android.
|
| -// http://crbug.com/239793
|
| -#if defined(OS_ANDROID)
|
| -#define MAYBE_PrepareSyncWhileWriting DISABLED_PrepareSyncWhileWriting
|
| -#else
|
| -#define MAYBE_PrepareSyncWhileWriting PrepareSyncWhileWriting
|
| -#endif
|
| -TEST_F(LocalFileSyncContextTest, MAYBE_PrepareSyncWhileWriting) {
|
| - CannedSyncableFileSystem file_system(GURL(kOrigin1), kServiceName,
|
| - io_task_runner_, file_task_runner_);
|
| - file_system.SetUp();
|
| - sync_context_ = new LocalFileSyncContext(ui_task_runner_, io_task_runner_);
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - file_system.MaybeInitializeFileSystemContext(sync_context_));
|
| -
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.OpenFileSystem());
|
| -
|
| - const FileSystemURL kURL1(file_system.URL("foo"));
|
| -
|
| - // Creates a file in file_system.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.CreateFile(kURL1));
|
| -
|
| - // Kick file write on IO thread.
|
| - StartModifyFileOnIOThread(&file_system, kURL1);
|
| -
|
| - // Until the operation finishes PrepareForSync should return BUSY error.
|
| - SyncFileMetadata metadata;
|
| - metadata.file_type = SYNC_FILE_TYPE_UNKNOWN;
|
| - FileChangeList changes;
|
| - EXPECT_EQ(SYNC_STATUS_FILE_BUSY,
|
| - PrepareForSync(file_system.file_system_context(),
|
| - kURL1, &metadata, &changes));
|
| - EXPECT_EQ(SYNC_FILE_TYPE_FILE, metadata.file_type);
|
| -
|
| - // Register PrepareForSync method to be invoked when kURL1 becomes
|
| - // syncable. (Actually this may be done after all operations are done
|
| - // on IO thread in this test.)
|
| - metadata.file_type = SYNC_FILE_TYPE_UNKNOWN;
|
| - changes.clear();
|
| - sync_context_->RegisterURLForWaitingSync(
|
| - kURL1, GetPrepareForSyncClosure(file_system.file_system_context(),
|
| - kURL1, &metadata, &changes));
|
| -
|
| - // Wait for the completion.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, WaitUntilModifyFileIsDone());
|
| -
|
| - // The PrepareForSync must have been started; wait until DidPrepareForSync
|
| - // is done.
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_FALSE(has_inflight_prepare_for_sync_);
|
| -
|
| - // Now PrepareForSync should have run and returned OK.
|
| - EXPECT_EQ(SYNC_STATUS_OK, status_);
|
| - EXPECT_EQ(1U, changes.size());
|
| - EXPECT_TRUE(changes.list().back().IsFile());
|
| - EXPECT_TRUE(changes.list().back().IsAddOrUpdate());
|
| - EXPECT_EQ(SYNC_FILE_TYPE_FILE, metadata.file_type);
|
| - EXPECT_EQ(1, metadata.size);
|
| -
|
| - sync_context_->ShutdownOnUIThread();
|
| - sync_context_ = NULL;
|
| - file_system.TearDown();
|
| -}
|
| -
|
| -TEST_F(LocalFileSyncContextTest, ApplyRemoteChangeForDeletion) {
|
| - CannedSyncableFileSystem file_system(GURL(kOrigin1), kServiceName,
|
| - io_task_runner_, file_task_runner_);
|
| - file_system.SetUp();
|
| -
|
| - sync_context_ = new LocalFileSyncContext(ui_task_runner_, io_task_runner_);
|
| - ASSERT_EQ(SYNC_STATUS_OK,
|
| - file_system.MaybeInitializeFileSystemContext(sync_context_));
|
| - ASSERT_EQ(base::PLATFORM_FILE_OK, file_system.OpenFileSystem());
|
| -
|
| - // Record the initial usage (likely 0).
|
| - int64 initial_usage = -1;
|
| - int64 quota = -1;
|
| - EXPECT_EQ(quota::kQuotaStatusOk,
|
| - file_system.GetUsageAndQuota(&initial_usage, "a));
|
| -
|
| - // Create a file and directory in the file_system.
|
| - const FileSystemURL kFile(file_system.URL("file"));
|
| - const FileSystemURL kDir(file_system.URL("dir"));
|
| - const FileSystemURL kChild(file_system.URL("dir/child"));
|
| -
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.CreateFile(kFile));
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.CreateDirectory(kDir));
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.CreateFile(kChild));
|
| -
|
| - // file_system's change tracker must have recorded the creation.
|
| - FileSystemURLSet urls;
|
| - file_system.GetChangedURLsInTracker(&urls);
|
| - ASSERT_EQ(3U, urls.size());
|
| - ASSERT_TRUE(ContainsKey(urls, kFile));
|
| - ASSERT_TRUE(ContainsKey(urls, kDir));
|
| - ASSERT_TRUE(ContainsKey(urls, kChild));
|
| - for (FileSystemURLSet::iterator iter = urls.begin();
|
| - iter != urls.end(); ++iter) {
|
| - file_system.ClearChangeForURLInTracker(*iter);
|
| - }
|
| -
|
| - // At this point the usage must be greater than the initial usage.
|
| - int64 new_usage = -1;
|
| - EXPECT_EQ(quota::kQuotaStatusOk,
|
| - file_system.GetUsageAndQuota(&new_usage, "a));
|
| - EXPECT_GT(new_usage, initial_usage);
|
| -
|
| - // Now let's apply remote deletion changes.
|
| - FileChange change(FileChange::FILE_CHANGE_DELETE,
|
| - SYNC_FILE_TYPE_FILE);
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - ApplyRemoteChange(file_system.file_system_context(),
|
| - change, base::FilePath(), kFile,
|
| - SYNC_FILE_TYPE_FILE));
|
| -
|
| - // The implementation doesn't check file type for deletion, and it must be ok
|
| - // even if we don't know if the deletion change was for a file or a directory.
|
| - change = FileChange(FileChange::FILE_CHANGE_DELETE,
|
| - SYNC_FILE_TYPE_UNKNOWN);
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - ApplyRemoteChange(file_system.file_system_context(),
|
| - change, base::FilePath(), kDir,
|
| - SYNC_FILE_TYPE_DIRECTORY));
|
| -
|
| - // Check the directory/files are deleted successfully.
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - file_system.FileExists(kFile));
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - file_system.DirectoryExists(kDir));
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - file_system.FileExists(kChild));
|
| -
|
| - // The changes applied by ApplyRemoteChange should not be recorded in
|
| - // the change tracker.
|
| - urls.clear();
|
| - file_system.GetChangedURLsInTracker(&urls);
|
| - EXPECT_TRUE(urls.empty());
|
| -
|
| - // The quota usage data must have reflected the deletion.
|
| - EXPECT_EQ(quota::kQuotaStatusOk,
|
| - file_system.GetUsageAndQuota(&new_usage, "a));
|
| - EXPECT_EQ(new_usage, initial_usage);
|
| -
|
| - sync_context_->ShutdownOnUIThread();
|
| - sync_context_ = NULL;
|
| - file_system.TearDown();
|
| -}
|
| -
|
| -TEST_F(LocalFileSyncContextTest, ApplyRemoteChangeForAddOrUpdate) {
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - CannedSyncableFileSystem file_system(GURL(kOrigin1), kServiceName,
|
| - io_task_runner_, file_task_runner_);
|
| - file_system.SetUp();
|
| -
|
| - sync_context_ = new LocalFileSyncContext(ui_task_runner_, io_task_runner_);
|
| - ASSERT_EQ(SYNC_STATUS_OK,
|
| - file_system.MaybeInitializeFileSystemContext(sync_context_));
|
| - ASSERT_EQ(base::PLATFORM_FILE_OK, file_system.OpenFileSystem());
|
| -
|
| - const FileSystemURL kFile1(file_system.URL("file1"));
|
| - const FileSystemURL kFile2(file_system.URL("file2"));
|
| - const FileSystemURL kDir(file_system.URL("dir"));
|
| -
|
| - const char kTestFileData0[] = "0123456789";
|
| - const char kTestFileData1[] = "Lorem ipsum!";
|
| - const char kTestFileData2[] = "This is sample test data.";
|
| -
|
| - // Create kFile1 and populate it with kTestFileData0.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.CreateFile(kFile1));
|
| - EXPECT_EQ(static_cast<int64>(arraysize(kTestFileData0) - 1),
|
| - file_system.WriteString(kFile1, kTestFileData0));
|
| -
|
| - // kFile2 and kDir are not there yet.
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - file_system.FileExists(kFile2));
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - file_system.DirectoryExists(kDir));
|
| -
|
| - // file_system's change tracker must have recorded the creation.
|
| - FileSystemURLSet urls;
|
| - file_system.GetChangedURLsInTracker(&urls);
|
| - ASSERT_EQ(1U, urls.size());
|
| - EXPECT_TRUE(ContainsKey(urls, kFile1));
|
| - file_system.ClearChangeForURLInTracker(*urls.begin());
|
| -
|
| - // Prepare temporary files which represent the remote file data.
|
| - const base::FilePath kFilePath1(temp_dir.path().Append(FPL("file1")));
|
| - const base::FilePath kFilePath2(temp_dir.path().Append(FPL("file2")));
|
| -
|
| - ASSERT_EQ(static_cast<int>(arraysize(kTestFileData1) - 1),
|
| - file_util::WriteFile(kFilePath1, kTestFileData1,
|
| - arraysize(kTestFileData1) - 1));
|
| - ASSERT_EQ(static_cast<int>(arraysize(kTestFileData2) - 1),
|
| - file_util::WriteFile(kFilePath2, kTestFileData2,
|
| - arraysize(kTestFileData2) - 1));
|
| -
|
| - // Record the usage.
|
| - int64 usage = -1, new_usage = -1;
|
| - int64 quota = -1;
|
| - EXPECT_EQ(quota::kQuotaStatusOk,
|
| - file_system.GetUsageAndQuota(&usage, "a));
|
| -
|
| - // Here in the local filesystem we have:
|
| - // * kFile1 with kTestFileData0
|
| - //
|
| - // In the remote side let's assume we have:
|
| - // * kFile1 with kTestFileData1
|
| - // * kFile2 with kTestFileData2
|
| - // * kDir
|
| - //
|
| - // By calling ApplyChange's:
|
| - // * kFile1 will be updated to have kTestFileData1
|
| - // * kFile2 will be created
|
| - // * kDir will be created
|
| -
|
| - // Apply the remote change to kFile1 (which will update the file).
|
| - FileChange change(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
|
| - SYNC_FILE_TYPE_FILE);
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - ApplyRemoteChange(file_system.file_system_context(),
|
| - change, kFilePath1, kFile1,
|
| - SYNC_FILE_TYPE_FILE));
|
| -
|
| - // Check if the usage has been increased by (kTestFileData1 - kTestFileData0).
|
| - const int updated_size =
|
| - arraysize(kTestFileData1) - arraysize(kTestFileData0);
|
| - EXPECT_EQ(quota::kQuotaStatusOk,
|
| - file_system.GetUsageAndQuota(&new_usage, "a));
|
| - EXPECT_EQ(updated_size, new_usage - usage);
|
| -
|
| - // Apply remote changes to kFile2 and kDir (should create a file and
|
| - // directory respectively).
|
| - // They are non-existent yet so their expected file type (the last
|
| - // parameter of ApplyRemoteChange) are
|
| - // SYNC_FILE_TYPE_UNKNOWN.
|
| - change = FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
|
| - SYNC_FILE_TYPE_FILE);
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - ApplyRemoteChange(file_system.file_system_context(),
|
| - change, kFilePath2, kFile2,
|
| - SYNC_FILE_TYPE_UNKNOWN));
|
| -
|
| - change = FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
|
| - SYNC_FILE_TYPE_DIRECTORY);
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - ApplyRemoteChange(file_system.file_system_context(),
|
| - change, base::FilePath(), kDir,
|
| - SYNC_FILE_TYPE_UNKNOWN));
|
| -
|
| - // Calling ApplyRemoteChange with different file type should be handled as
|
| - // overwrite.
|
| - change =
|
| - FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, SYNC_FILE_TYPE_FILE);
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - ApplyRemoteChange(file_system.file_system_context(),
|
| - change,
|
| - kFilePath1,
|
| - kDir,
|
| - SYNC_FILE_TYPE_DIRECTORY));
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.FileExists(kDir));
|
| -
|
| - change = FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
|
| - SYNC_FILE_TYPE_DIRECTORY);
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - ApplyRemoteChange(file_system.file_system_context(),
|
| - change,
|
| - kFilePath1,
|
| - kDir,
|
| - SYNC_FILE_TYPE_FILE));
|
| -
|
| - // Creating a file/directory must have increased the usage more than
|
| - // the size of kTestFileData2.
|
| - new_usage = usage;
|
| - EXPECT_EQ(quota::kQuotaStatusOk,
|
| - file_system.GetUsageAndQuota(&new_usage, "a));
|
| - EXPECT_GT(new_usage,
|
| - static_cast<int64>(usage + arraysize(kTestFileData2) - 1));
|
| -
|
| - // The changes applied by ApplyRemoteChange should not be recorded in
|
| - // the change tracker.
|
| - urls.clear();
|
| - file_system.GetChangedURLsInTracker(&urls);
|
| - EXPECT_TRUE(urls.empty());
|
| -
|
| - // Make sure all three files/directory exist.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.FileExists(kFile1));
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.FileExists(kFile2));
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.DirectoryExists(kDir));
|
| -
|
| - sync_context_->ShutdownOnUIThread();
|
| - file_system.TearDown();
|
| -}
|
| -
|
| -TEST_F(LocalFileSyncContextTest, ApplyRemoteChangeForAddOrUpdate_NoParent) {
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - CannedSyncableFileSystem file_system(GURL(kOrigin1), kServiceName,
|
| - io_task_runner_, file_task_runner_);
|
| - file_system.SetUp();
|
| -
|
| - sync_context_ = new LocalFileSyncContext(ui_task_runner_, io_task_runner_);
|
| - ASSERT_EQ(SYNC_STATUS_OK,
|
| - file_system.MaybeInitializeFileSystemContext(sync_context_));
|
| - ASSERT_EQ(base::PLATFORM_FILE_OK, file_system.OpenFileSystem());
|
| -
|
| - const char kTestFileData[] = "Lorem ipsum!";
|
| - const FileSystemURL kDir(file_system.URL("dir"));
|
| - const FileSystemURL kFile(file_system.URL("dir/file"));
|
| -
|
| - // Either kDir or kFile not exist yet.
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, file_system.FileExists(kDir));
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, file_system.FileExists(kFile));
|
| -
|
| - // Prepare a temporary file which represents remote file data.
|
| - const base::FilePath kFilePath(temp_dir.path().Append(FPL("file")));
|
| - ASSERT_EQ(static_cast<int>(arraysize(kTestFileData) - 1),
|
| - file_util::WriteFile(kFilePath, kTestFileData,
|
| - arraysize(kTestFileData) - 1));
|
| -
|
| - // Calling ApplyChange's with kFilePath should create
|
| - // kFile along with kDir.
|
| - FileChange change(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
|
| - SYNC_FILE_TYPE_FILE);
|
| - EXPECT_EQ(SYNC_STATUS_OK,
|
| - ApplyRemoteChange(file_system.file_system_context(),
|
| - change, kFilePath, kFile,
|
| - SYNC_FILE_TYPE_UNKNOWN));
|
| -
|
| - // The changes applied by ApplyRemoteChange should not be recorded in
|
| - // the change tracker.
|
| - FileSystemURLSet urls;
|
| - urls.clear();
|
| - file_system.GetChangedURLsInTracker(&urls);
|
| - EXPECT_TRUE(urls.empty());
|
| -
|
| - // Make sure kDir and kFile are created by ApplyRemoteChange.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.FileExists(kFile));
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system.DirectoryExists(kDir));
|
| -
|
| - sync_context_->ShutdownOnUIThread();
|
| - file_system.TearDown();
|
| -}
|
| -
|
| -} // namespace sync_file_system
|
|
|