| Index: webkit/fileapi/syncable/syncable_file_operation_runner_unittest.cc
|
| diff --git a/webkit/fileapi/syncable/syncable_file_operation_runner_unittest.cc b/webkit/fileapi/syncable/syncable_file_operation_runner_unittest.cc
|
| deleted file mode 100644
|
| index d5878eb756d3f62bad652d5abdc39c727520e35b..0000000000000000000000000000000000000000
|
| --- a/webkit/fileapi/syncable/syncable_file_operation_runner_unittest.cc
|
| +++ /dev/null
|
| @@ -1,371 +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 <string>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/file_util.h"
|
| -#include "base/location.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "webkit/blob/mock_blob_url_request_context.h"
|
| -#include "webkit/browser/fileapi/file_system_context.h"
|
| -#include "webkit/fileapi/syncable/canned_syncable_file_system.h"
|
| -#include "webkit/fileapi/syncable/local_file_change_tracker.h"
|
| -#include "webkit/fileapi/syncable/local_file_sync_context.h"
|
| -#include "webkit/fileapi/syncable/local_file_sync_status.h"
|
| -#include "webkit/fileapi/syncable/syncable_file_operation_runner.h"
|
| -#include "webkit/fileapi/syncable/syncable_file_system_operation.h"
|
| -#include "webkit/fileapi/syncable/syncable_file_system_util.h"
|
| -
|
| -using fileapi::FileSystemOperation;
|
| -using fileapi::FileSystemURL;
|
| -using webkit_blob::MockBlobURLRequestContext;
|
| -using webkit_blob::ScopedTextBlob;
|
| -using base::PlatformFileError;
|
| -
|
| -namespace sync_file_system {
|
| -
|
| -namespace {
|
| -const std::string kServiceName = "test";
|
| -const std::string kParent = "foo";
|
| -const std::string kFile = "foo/file";
|
| -const std::string kDir = "foo/dir";
|
| -const std::string kChild = "foo/dir/bar";
|
| -const std::string kOther = "bar";
|
| -} // namespace
|
| -
|
| -class SyncableFileOperationRunnerTest : public testing::Test {
|
| - protected:
|
| - typedef FileSystemOperation::StatusCallback StatusCallback;
|
| -
|
| - // Use the current thread as IO thread so that we can directly call
|
| - // operations in the tests.
|
| - SyncableFileOperationRunnerTest()
|
| - : message_loop_(base::MessageLoop::TYPE_IO),
|
| - file_system_(GURL("http://example.com"), kServiceName,
|
| - base::MessageLoopProxy::current(),
|
| - base::MessageLoopProxy::current()),
|
| - callback_count_(0),
|
| - write_status_(base::PLATFORM_FILE_ERROR_FAILED),
|
| - write_bytes_(0),
|
| - write_complete_(false),
|
| - url_request_context_(file_system_.file_system_context()),
|
| - weak_factory_(this) {}
|
| -
|
| - virtual void SetUp() OVERRIDE {
|
| - ASSERT_TRUE(dir_.CreateUniqueTempDir());
|
| - file_system_.SetUp();
|
| - sync_context_ = new LocalFileSyncContext(base::MessageLoopProxy::current(),
|
| - base::MessageLoopProxy::current());
|
| - ASSERT_EQ(SYNC_STATUS_OK,
|
| - file_system_.MaybeInitializeFileSystemContext(sync_context_));
|
| -
|
| - ASSERT_EQ(base::PLATFORM_FILE_OK, file_system_.OpenFileSystem());
|
| - ASSERT_EQ(base::PLATFORM_FILE_OK,
|
| - file_system_.CreateDirectory(URL(kParent)));
|
| - }
|
| -
|
| - virtual void TearDown() OVERRIDE {
|
| - if (sync_context_)
|
| - sync_context_->ShutdownOnUIThread();
|
| - sync_context_ = NULL;
|
| -
|
| - file_system_.TearDown();
|
| - message_loop_.RunUntilIdle();
|
| - RevokeSyncableFileSystem(kServiceName);
|
| - }
|
| -
|
| - FileSystemURL URL(const std::string& path) {
|
| - return file_system_.URL(path);
|
| - }
|
| -
|
| - LocalFileSyncStatus* sync_status() {
|
| - return file_system_.file_system_context()->sync_context()->sync_status();
|
| - }
|
| -
|
| - void ResetCallbackStatus() {
|
| - write_status_ = base::PLATFORM_FILE_ERROR_FAILED;
|
| - write_bytes_ = 0;
|
| - write_complete_ = false;
|
| - callback_count_ = 0;
|
| - }
|
| -
|
| - StatusCallback ExpectStatus(const tracked_objects::Location& location,
|
| - PlatformFileError expect) {
|
| - return base::Bind(&SyncableFileOperationRunnerTest::DidFinish,
|
| - weak_factory_.GetWeakPtr(), location, expect);
|
| - }
|
| -
|
| - FileSystemOperation::WriteCallback GetWriteCallback(
|
| - const tracked_objects::Location& location) {
|
| - return base::Bind(&SyncableFileOperationRunnerTest::DidWrite,
|
| - weak_factory_.GetWeakPtr(), location);
|
| - }
|
| -
|
| - void DidWrite(const tracked_objects::Location& location,
|
| - PlatformFileError status, int64 bytes, bool complete) {
|
| - SCOPED_TRACE(testing::Message() << location.ToString());
|
| - write_status_ = status;
|
| - write_bytes_ += bytes;
|
| - write_complete_ = complete;
|
| - ++callback_count_;
|
| - }
|
| -
|
| - void DidFinish(const tracked_objects::Location& location,
|
| - PlatformFileError expect, PlatformFileError status) {
|
| - SCOPED_TRACE(testing::Message() << location.ToString());
|
| - EXPECT_EQ(expect, status);
|
| - ++callback_count_;
|
| - }
|
| -
|
| - bool CreateTempFile(base::FilePath* path) {
|
| - return file_util::CreateTemporaryFileInDir(dir_.path(), path);
|
| - }
|
| -
|
| - base::ScopedTempDir dir_;
|
| -
|
| - base::MessageLoop message_loop_;
|
| - CannedSyncableFileSystem file_system_;
|
| - scoped_refptr<LocalFileSyncContext> sync_context_;
|
| -
|
| - int callback_count_;
|
| - PlatformFileError write_status_;
|
| - size_t write_bytes_;
|
| - bool write_complete_;
|
| -
|
| - MockBlobURLRequestContext url_request_context_;
|
| -
|
| - base::WeakPtrFactory<SyncableFileOperationRunnerTest> weak_factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(SyncableFileOperationRunnerTest);
|
| -};
|
| -
|
| -TEST_F(SyncableFileOperationRunnerTest, SimpleQueue) {
|
| - sync_status()->StartSyncing(URL(kFile));
|
| - ASSERT_FALSE(sync_status()->IsWritable(URL(kFile)));
|
| -
|
| - // The URL is in syncing so the write operations won't run.
|
| - ResetCallbackStatus();
|
| - file_system_.NewOperation()->CreateFile(
|
| - URL(kFile), false /* exclusive */,
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - file_system_.NewOperation()->Truncate(
|
| - URL(kFile), 1,
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(0, callback_count_);
|
| -
|
| - // Read operations are not blocked (and are executed before queued ones).
|
| - file_system_.NewOperation()->FileExists(
|
| - URL(kFile), ExpectStatus(FROM_HERE, base::PLATFORM_FILE_ERROR_NOT_FOUND));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(1, callback_count_);
|
| -
|
| - // End syncing (to enable write).
|
| - sync_status()->EndSyncing(URL(kFile));
|
| - ASSERT_TRUE(sync_status()->IsWritable(URL(kFile)));
|
| -
|
| - ResetCallbackStatus();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(2, callback_count_);
|
| -
|
| - // Now the file must have been created and updated.
|
| - ResetCallbackStatus();
|
| - file_system_.NewOperation()->FileExists(
|
| - URL(kFile), ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(1, callback_count_);
|
| -}
|
| -
|
| -TEST_F(SyncableFileOperationRunnerTest, WriteToParentAndChild) {
|
| - // First create the kDir directory and kChild in the dir.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.CreateDirectory(URL(kDir)));
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.CreateFile(URL(kChild)));
|
| -
|
| - // Start syncing the kDir directory.
|
| - sync_status()->StartSyncing(URL(kDir));
|
| - ASSERT_FALSE(sync_status()->IsWritable(URL(kDir)));
|
| -
|
| - // Writes to kParent and kChild should be all queued up.
|
| - ResetCallbackStatus();
|
| - file_system_.NewOperation()->Truncate(
|
| - URL(kChild), 1, ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - file_system_.NewOperation()->Remove(
|
| - URL(kParent), true /* recursive */,
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(0, callback_count_);
|
| -
|
| - // Read operations are not blocked (and are executed before queued ones).
|
| - file_system_.NewOperation()->DirectoryExists(
|
| - URL(kDir), ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(1, callback_count_);
|
| -
|
| - // Writes to unrelated files must succeed as well.
|
| - ResetCallbackStatus();
|
| - file_system_.NewOperation()->CreateDirectory(
|
| - URL(kOther), false /* exclusive */, false /* recursive */,
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(1, callback_count_);
|
| -
|
| - // End syncing (to enable write).
|
| - sync_status()->EndSyncing(URL(kDir));
|
| - ASSERT_TRUE(sync_status()->IsWritable(URL(kDir)));
|
| -
|
| - ResetCallbackStatus();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(2, callback_count_);
|
| -}
|
| -
|
| -TEST_F(SyncableFileOperationRunnerTest, CopyAndMove) {
|
| - // First create the kDir directory and kChild in the dir.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.CreateDirectory(URL(kDir)));
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.CreateFile(URL(kChild)));
|
| -
|
| - // Start syncing the kParent directory.
|
| - sync_status()->StartSyncing(URL(kParent));
|
| -
|
| - // Copying kDir to other directory should succeed, while moving would fail
|
| - // (since the source directory is in syncing).
|
| - ResetCallbackStatus();
|
| - file_system_.NewOperation()->Copy(
|
| - URL(kDir), URL("dest-copy"),
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - file_system_.NewOperation()->Move(
|
| - URL(kDir), URL("dest-move"),
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(1, callback_count_);
|
| -
|
| - // Only "dest-copy1" should exist.
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK,
|
| - file_system_.DirectoryExists(URL("dest-copy")));
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - file_system_.DirectoryExists(URL("dest-move")));
|
| -
|
| - // Start syncing the "dest-copy2" directory.
|
| - sync_status()->StartSyncing(URL("dest-copy2"));
|
| -
|
| - // Now the destination is also locked copying kDir should be queued.
|
| - ResetCallbackStatus();
|
| - file_system_.NewOperation()->Copy(
|
| - URL(kDir), URL("dest-copy2"),
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(0, callback_count_);
|
| -
|
| - // Finish syncing the "dest-copy2" directory to unlock Copy.
|
| - sync_status()->EndSyncing(URL("dest-copy2"));
|
| - ResetCallbackStatus();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(1, callback_count_);
|
| -
|
| - // Now we should have "dest-copy2".
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK,
|
| - file_system_.DirectoryExists(URL("dest-copy2")));
|
| -
|
| - // Finish syncing the kParent to unlock Move.
|
| - sync_status()->EndSyncing(URL(kParent));
|
| - ResetCallbackStatus();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(1, callback_count_);
|
| -
|
| - // Now we should have "dest-move".
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK,
|
| - file_system_.DirectoryExists(URL("dest-move")));
|
| -}
|
| -
|
| -TEST_F(SyncableFileOperationRunnerTest, Write) {
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.CreateFile(URL(kFile)));
|
| - const GURL kBlobURL("blob:foo");
|
| - const std::string kData("Lorem ipsum.");
|
| - ScopedTextBlob blob(url_request_context_, kBlobURL, kData);
|
| -
|
| - sync_status()->StartSyncing(URL(kFile));
|
| -
|
| - ResetCallbackStatus();
|
| - file_system_.NewOperation()->Write(
|
| - &url_request_context_,
|
| - URL(kFile), kBlobURL, 0, GetWriteCallback(FROM_HERE));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(0, callback_count_);
|
| -
|
| - sync_status()->EndSyncing(URL(kFile));
|
| - ResetCallbackStatus();
|
| -
|
| - while (!write_complete_)
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, write_status_);
|
| - EXPECT_EQ(kData.size(), write_bytes_);
|
| - EXPECT_TRUE(write_complete_);
|
| -}
|
| -
|
| -TEST_F(SyncableFileOperationRunnerTest, QueueAndCancel) {
|
| - sync_status()->StartSyncing(URL(kFile));
|
| - ASSERT_FALSE(sync_status()->IsWritable(URL(kFile)));
|
| -
|
| - ResetCallbackStatus();
|
| - file_system_.NewOperation()->CreateFile(
|
| - URL(kFile), false /* exclusive */,
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_ERROR_ABORT));
|
| - file_system_.NewOperation()->Truncate(
|
| - URL(kFile), 1,
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_ERROR_ABORT));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(0, callback_count_);
|
| -
|
| - ResetCallbackStatus();
|
| -
|
| - // This shouldn't crash nor leak memory.
|
| - sync_context_->ShutdownOnUIThread();
|
| - sync_context_ = NULL;
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(2, callback_count_);
|
| -}
|
| -
|
| -// Test if CopyInForeignFile runs cooperatively with other Sync operations
|
| -// when it is called directly via AsLocalFileSystemOperation.
|
| -TEST_F(SyncableFileOperationRunnerTest, CopyInForeignFile) {
|
| - const std::string kTestData("test data");
|
| -
|
| - base::FilePath temp_path;
|
| - ASSERT_TRUE(CreateTempFile(&temp_path));
|
| - ASSERT_EQ(static_cast<int>(kTestData.size()),
|
| - file_util::WriteFile(
|
| - temp_path, kTestData.data(), kTestData.size()));
|
| -
|
| - sync_status()->StartSyncing(URL(kFile));
|
| - ASSERT_FALSE(sync_status()->IsWritable(URL(kFile)));
|
| -
|
| - // The URL is in syncing so CopyIn (which is a write operation) won't run.
|
| - ResetCallbackStatus();
|
| - file_system_.NewOperation()->AsLocalFileSystemOperation()->CopyInForeignFile(
|
| - temp_path, URL(kFile),
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(0, callback_count_);
|
| -
|
| - // End syncing (to enable write).
|
| - sync_status()->EndSyncing(URL(kFile));
|
| - ASSERT_TRUE(sync_status()->IsWritable(URL(kFile)));
|
| -
|
| - ResetCallbackStatus();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(1, callback_count_);
|
| -
|
| - // Now the file must have been created and have the same content as temp_path.
|
| - ResetCallbackStatus();
|
| - file_system_.DoVerifyFile(
|
| - URL(kFile), kTestData,
|
| - ExpectStatus(FROM_HERE, base::PLATFORM_FILE_OK));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(1, callback_count_);
|
| -}
|
| -
|
| -} // namespace sync_file_system
|
|
|