diff options
author | calvinlo@chromium.org <calvinlo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-14 04:30:02 +0000 |
---|---|---|
committer | calvinlo@chromium.org <calvinlo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-14 04:30:02 +0000 |
commit | dd68456b1e554972c87cb3e7491c1d0bf315d509 (patch) | |
tree | 9271bb1223d3dbed8560cb3a031e1a875a64ec02 | |
parent | f31cb8663c7b38c39bf8875decc57c128a35db6d (diff) | |
download | chromium_src-dd68456b1e554972c87cb3e7491c1d0bf315d509.zip chromium_src-dd68456b1e554972c87cb3e7491c1d0bf315d509.tar.gz chromium_src-dd68456b1e554972c87cb3e7491c1d0bf315d509.tar.bz2 |
Exposed CopyInForeignFile to LocalFileSystemOperation. Also added positive and negative test cases.
BUG=146318
Review URL: https://chromiumcodereview.appspot.com/10917210
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@156745 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | webkit/fileapi/file_system_file_util_proxy.cc | 14 | ||||
-rw-r--r-- | webkit/fileapi/file_system_file_util_proxy.h | 9 | ||||
-rw-r--r-- | webkit/fileapi/file_system_operation.h | 1 | ||||
-rw-r--r-- | webkit/fileapi/local_file_system_operation.cc | 34 | ||||
-rw-r--r-- | webkit/fileapi/local_file_system_operation.h | 6 | ||||
-rw-r--r-- | webkit/fileapi/local_file_system_operation_unittest.cc | 60 | ||||
-rw-r--r-- | webkit/fileapi/local_file_util.h | 6 |
7 files changed, 126 insertions, 4 deletions
diff --git a/webkit/fileapi/file_system_file_util_proxy.cc b/webkit/fileapi/file_system_file_util_proxy.cc index 11fd441..d2dd021 100644 --- a/webkit/fileapi/file_system_file_util_proxy.cc +++ b/webkit/fileapi/file_system_file_util_proxy.cc @@ -151,6 +151,20 @@ bool FileSystemFileUtilProxy::Copy( } // static +bool FileSystemFileUtilProxy::CopyInForeignFile( + FileSystemOperationContext* context, + FileSystemFileUtil* dest_util, + const FilePath& src_local_disk_file_path, + const FileSystemURL& dest_url, + const StatusCallback& callback) { + return base::FileUtilProxy::RelayFileTask( + context->task_runner(), FROM_HERE, + Bind(&FileSystemFileUtil::CopyInForeignFile, Unretained(dest_util), + context, src_local_disk_file_path, dest_url), + callback); +} + +// static bool FileSystemFileUtilProxy::Move( FileSystemOperationContext* context, FileSystemFileUtil* src_util, diff --git a/webkit/fileapi/file_system_file_util_proxy.h b/webkit/fileapi/file_system_file_util_proxy.h index f6ff686..9798542 100644 --- a/webkit/fileapi/file_system_file_util_proxy.h +++ b/webkit/fileapi/file_system_file_util_proxy.h @@ -88,6 +88,15 @@ class FileSystemFileUtilProxy { const FileSystemURL& dest_url, const StatusCallback& callback); + // Copies a file from local disk to the given filesystem destination. + // Primarily used for the Syncable filesystem type (e.g. GDrive). + static bool CopyInForeignFile( + FileSystemOperationContext* context, + FileSystemFileUtil* dest_util, + const FilePath& src_local_disk_file_path, + const FileSystemURL& dest_url, + const StatusCallback& callback); + // Moves a file or a directory from |src_url| to |dest_url| by calling // FileSystemFileUtil's following methods on the given context's // task_runner. diff --git a/webkit/fileapi/file_system_operation.h b/webkit/fileapi/file_system_operation.h index 26db793..ab4bb80 100644 --- a/webkit/fileapi/file_system_operation.h +++ b/webkit/fileapi/file_system_operation.h @@ -259,6 +259,7 @@ class FileSystemOperation { kOperationCreateDirectory, kOperationCreateSnapshotFile, kOperationCopy, + kOperationCopyInForeignFile, kOperationMove, kOperationDirectoryExists, kOperationFileExists, diff --git a/webkit/fileapi/local_file_system_operation.cc b/webkit/fileapi/local_file_system_operation.cc index 1107257..ff46be5 100644 --- a/webkit/fileapi/local_file_system_operation.cc +++ b/webkit/fileapi/local_file_system_operation.cc @@ -138,6 +138,28 @@ void LocalFileSystemOperation::Copy(const FileSystemURL& src_url, base::Bind(callback, base::PLATFORM_FILE_ERROR_FAILED)); } +void LocalFileSystemOperation::CopyInForeignFile( + const FilePath& src_local_disk_file_path, + const FileSystemURL& dest_url, + const StatusCallback& callback) { + DCHECK(SetPendingOperationType(kOperationCopyInForeignFile)); + + base::PlatformFileError result = SetUp( + dest_url, &dest_util_, SETUP_FOR_CREATE); + if (result != base::PLATFORM_FILE_OK) { + callback.Run(result); + delete this; + return; + } + + GetUsageAndQuotaThenRunTask( + dest_url, + base::Bind(&LocalFileSystemOperation::DoCopyInForeignFile, + base::Unretained(this), src_local_disk_file_path, dest_url, + callback), + base::Bind(callback, base::PLATFORM_FILE_ERROR_FAILED)); +} + void LocalFileSystemOperation::Move(const FileSystemURL& src_url, const FileSystemURL& dest_url, const StatusCallback& callback) { @@ -547,6 +569,18 @@ void LocalFileSystemOperation::DoCopy(const FileSystemURL& src_url, base::Owned(this), callback)); } +void LocalFileSystemOperation::DoCopyInForeignFile( + const FilePath& src_local_disk_file_path, + const FileSystemURL& dest_url, + const StatusCallback& callback) { + FileSystemFileUtilProxy::CopyInForeignFile( + operation_context_.get(), + dest_util_, + src_local_disk_file_path, dest_url, + base::Bind(&LocalFileSystemOperation::DidFinishFileOperation, + base::Owned(this), callback)); +} + void LocalFileSystemOperation::DoMove(const FileSystemURL& src_url, const FileSystemURL& dest_url, const StatusCallback& callback) { diff --git a/webkit/fileapi/local_file_system_operation.h b/webkit/fileapi/local_file_system_operation.h index 10dd19d..e4ba541 100644 --- a/webkit/fileapi/local_file_system_operation.h +++ b/webkit/fileapi/local_file_system_operation.h @@ -60,6 +60,9 @@ class FILEAPI_EXPORT LocalFileSystemOperation virtual void Copy(const FileSystemURL& src_url, const FileSystemURL& dest_url, const StatusCallback& callback) OVERRIDE; + virtual void CopyInForeignFile(const FilePath& src_local_disk_path, + const FileSystemURL& dest_url, + const StatusCallback& callback); virtual void Move(const FileSystemURL& src_url, const FileSystemURL& dest_url, const StatusCallback& callback) OVERRIDE; @@ -170,6 +173,9 @@ class FILEAPI_EXPORT LocalFileSystemOperation void DoCopy(const FileSystemURL& src, const FileSystemURL& dest, const StatusCallback& callback); + void DoCopyInForeignFile(const FilePath& src_local_disk_file_path, + const FileSystemURL& dest, + const StatusCallback& callback); void DoMove(const FileSystemURL& src, const FileSystemURL& dest, const StatusCallback& callback); diff --git a/webkit/fileapi/local_file_system_operation_unittest.cc b/webkit/fileapi/local_file_system_operation_unittest.cc index d2aa935..44a1bf9 100644 --- a/webkit/fileapi/local_file_system_operation_unittest.cc +++ b/webkit/fileapi/local_file_system_operation_unittest.cc @@ -786,7 +786,6 @@ TEST_F(LocalFileSystemOperationTest, TestCopySuccessSrcDirRecursive) { CreateUniqueFileInDir(child_dir_path)); FilePath dest_dir_path(CreateUniqueDir()); - operation()->Copy(URLForPath(src_dir_path), URLForPath(dest_dir_path), RecordStatusCallback()); MessageLoop::current()->RunAllPending(); @@ -804,6 +803,65 @@ TEST_F(LocalFileSystemOperationTest, TestCopySuccessSrcDirRecursive) { EXPECT_TRUE(change_observer()->HasNoChange()); } +TEST_F(LocalFileSystemOperationTest, TestCopyInForeignFileSuccess) { + FilePath src_local_disk_file_path; + file_util::CreateTemporaryFile(&src_local_disk_file_path); + const char test_data[] = "foo"; + int data_size = ARRAYSIZE_UNSAFE(test_data); + file_util::WriteFile(src_local_disk_file_path, test_data, data_size); + FilePath dest_dir_path(CreateUniqueDir()); + FilePath dest_file_path(dest_dir_path.Append( + src_local_disk_file_path.BaseName())); + FileSystemURL dest_file_url = URLForPath(dest_file_path); + int64 before_usage; + GetUsageAndQuota(&before_usage, NULL); + + // Check that the file copied and corresponding usage increased. + operation()->CopyInForeignFile(src_local_disk_file_path, + dest_file_url, + RecordStatusCallback()); + MessageLoop::current()->RunAllPending(); + EXPECT_EQ(1, change_observer()->create_file_count()); + EXPECT_EQ(base::PLATFORM_FILE_OK, status()); + EXPECT_TRUE(FileExists(dest_file_path)); + int64 after_usage; + GetUsageAndQuota(&after_usage, NULL); + EXPECT_GT(after_usage, before_usage); + + // Compare contents of src and copied file. + char buffer[100]; + EXPECT_EQ(data_size, file_util::ReadFile(PlatformPath(dest_file_path), + buffer, data_size)); + for (int i = 0; i < data_size; ++i) + EXPECT_EQ(test_data[i], buffer[i]); +} + +TEST_F(LocalFileSystemOperationTest, TestCopyInForeignFileFailureByQuota) { + FilePath src_local_disk_file_path; + file_util::CreateTemporaryFile(&src_local_disk_file_path); + const char test_data[] = "foo"; + file_util::WriteFile(src_local_disk_file_path, test_data, + ARRAYSIZE_UNSAFE(test_data)); + + FilePath dest_dir_path(CreateUniqueDir()); + FilePath dest_file_path(dest_dir_path.Append( + src_local_disk_file_path.BaseName())); + FileSystemURL dest_file_url = URLForPath(dest_file_path); + + // Set quota of 0 which should force copy to fail by quota. + quota_manager_proxy()->SetQuota(dest_file_url.origin(), + test_helper_.storage_type(), + static_cast<int64>(0)); + operation()->CopyInForeignFile(src_local_disk_file_path, + dest_file_url, + RecordStatusCallback()); + MessageLoop::current()->RunAllPending(); + + EXPECT_TRUE(!FileExists(dest_file_path)); + EXPECT_EQ(0, change_observer()->create_file_count()); + EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status()); +} + TEST_F(LocalFileSystemOperationTest, TestCreateFileFailure) { // Already existing file and exclusive true. FilePath dir_path(CreateUniqueDir()); diff --git a/webkit/fileapi/local_file_util.h b/webkit/fileapi/local_file_util.h index 5de2a06..4eaf2fa 100644 --- a/webkit/fileapi/local_file_util.h +++ b/webkit/fileapi/local_file_util.h @@ -88,9 +88,9 @@ class FILEAPI_EXPORT_PRIVATE LocalFileUtil : public FileSystemFileUtil { const FileSystemURL& dest_url, bool copy) OVERRIDE; virtual PlatformFileError CopyInForeignFile( - FileSystemOperationContext* context, - const FilePath& src_file_path, - const FileSystemURL& dest_url) OVERRIDE; + FileSystemOperationContext* context, + const FilePath& src_file_path, + const FileSystemURL& dest_url) OVERRIDE; virtual PlatformFileError DeleteFile( FileSystemOperationContext* context, const FileSystemURL& url) OVERRIDE; |