Index: webkit/fileapi/file_system_operation_unittest.cc |
diff --git a/webkit/fileapi/file_system_operation_unittest.cc b/webkit/fileapi/file_system_operation_unittest.cc |
index 93680a04af87963f0037bcc6ee2c4ccdf3cace38..2f6016ce1989069fc4335b0433dbc685cd915db6 100644 |
--- a/webkit/fileapi/file_system_operation_unittest.cc |
+++ b/webkit/fileapi/file_system_operation_unittest.cc |
@@ -85,9 +85,7 @@ class FileSystemOperationTest : public testing::Test { |
} |
protected: |
- // Common temp base for all non-existing file/dir path test cases. |
- // This is in case a dir on test machine exists. It's better to |
- // create temp and then create non-existing file paths under it. |
+ // Common temp base for nondestructive uses. |
ScopedTempDir base_; |
int request_id_; |
@@ -110,9 +108,12 @@ TEST_F(FileSystemOperationTest, TestMoveFailureSrcDoesntExist) { |
TEST_F(FileSystemOperationTest, TestMoveFailureContainsPath) { |
- ScopedTempDir dir_under_base; |
- dir_under_base.CreateUniqueTempDirUnderPath(base_.path()); |
- operation()->Move(base_.path(), dir_under_base.path()); |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ FilePath dest_dir_path; |
+ ASSERT_TRUE(file_util::CreateTemporaryFileInDir(src_dir.path(), |
+ &dest_dir_path)); |
+ operation()->Move(src_dir.path(), dest_dir_path); |
MessageLoop::current()->RunAllPending(); |
EXPECT_EQ(base::PLATFORM_FILE_ERROR_INVALID_OPERATION, |
mock_dispatcher_->status()); |
@@ -121,14 +122,51 @@ TEST_F(FileSystemOperationTest, TestMoveFailureContainsPath) { |
TEST_F(FileSystemOperationTest, TestMoveFailureSrcDirExistsDestFile) { |
// Src exists and is dir. Dest is a file. |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ |
ScopedTempDir dest_dir; |
ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); |
FilePath dest_file; |
file_util::CreateTemporaryFileInDir(dest_dir.path(), &dest_file); |
- operation()->Move(base_.path(), dest_file); |
+ operation()->Move(src_dir.path(), dest_file); |
MessageLoop::current()->RunAllPending(); |
- EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, mock_dispatcher_->status()); |
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY, |
+ mock_dispatcher_->status()); |
+ EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+} |
+ |
+TEST_F(FileSystemOperationTest, TestMoveFailureSrcFileExistsDestNonEmptyDir) { |
+ // Src exists and is a directory. Dest is a non-empty directory. |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ |
+ ScopedTempDir dest_dir; |
+ ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); |
+ FilePath child_file; |
+ file_util::CreateTemporaryFileInDir(dest_dir.path(), &child_file); |
+ |
+ operation()->Move(src_dir.path(), dest_dir.path()); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_EMPTY, mock_dispatcher_->status()); |
+ EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+} |
+ |
+TEST_F(FileSystemOperationTest, TestMoveFailureSrcFileExistsDestDir) { |
+ // Src exists and is a file. Dest is a directory. |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ FilePath src_file; |
+ file_util::CreateTemporaryFileInDir(src_dir.path(), &src_file); |
+ |
+ ScopedTempDir dest_dir; |
+ ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); |
+ |
+ operation()->Move(src_file, dest_dir.path()); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_A_FILE, |
+ mock_dispatcher_->status()); |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
} |
@@ -138,7 +176,7 @@ TEST_F(FileSystemOperationTest, TestMoveFailureDestParentDoesntExist) { |
ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
FilePath nonexisting_file = base_.path().Append( |
FILE_PATH_LITERAL("NonexistingDir")).Append( |
- FILE_PATH_LITERAL("NonexistingFile"));; |
+ FILE_PATH_LITERAL("NonexistingFile")); |
operation()->Move(src_dir.path(), nonexisting_file); |
MessageLoop::current()->RunAllPending(); |
@@ -181,6 +219,57 @@ TEST_F(FileSystemOperationTest, TestMoveSuccessSrcFileAndNew) { |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
} |
+TEST_F(FileSystemOperationTest, TestMoveSuccessSrcDirAndOverwrite) { |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ |
+ ScopedTempDir dest_dir; |
+ ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); |
+ |
+ operation()->Move(src_dir.path(), dest_dir.path()); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(kFileOperationSucceeded, mock_dispatcher_->status()); |
+ EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+ EXPECT_FALSE(file_util::DirectoryExists(src_dir.path())); |
+ |
+ // Make sure we've overwritten but not moved the source under the |dest_dir|. |
+ EXPECT_TRUE(file_util::DirectoryExists(dest_dir.path())); |
+ EXPECT_FALSE(file_util::DirectoryExists( |
+ dest_dir.path().Append(src_dir.path().BaseName()))); |
+} |
+ |
+TEST_F(FileSystemOperationTest, TestMoveSuccessSrcDirAndNew) { |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ |
+ ScopedTempDir dir; |
+ ASSERT_TRUE(dir.CreateUniqueTempDir()); |
+ FilePath dest_dir_path(dir.path().Append(FILE_PATH_LITERAL("NewDirectory"))); |
+ |
+ operation()->Move(src_dir.path(), dest_dir_path); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(kFileOperationSucceeded, mock_dispatcher_->status()); |
+ EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+ EXPECT_FALSE(file_util::DirectoryExists(src_dir.path())); |
+ EXPECT_TRUE(file_util::DirectoryExists(dest_dir_path)); |
+} |
+ |
+TEST_F(FileSystemOperationTest, TestMoveSuccessSrcDirRecursive) { |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ FilePath child_file; |
+ file_util::CreateTemporaryFileInDir(src_dir.path(), &child_file); |
+ |
+ ScopedTempDir dest_dir; |
+ ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); |
+ |
+ operation()->Move(src_dir.path(), dest_dir.path()); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(kFileOperationSucceeded, mock_dispatcher_->status()); |
+ EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+ EXPECT_TRUE(FileExists(dest_dir.path().Append(child_file.BaseName()))); |
+} |
+ |
TEST_F(FileSystemOperationTest, TestCopyFailureSrcDoesntExist) { |
FilePath src(base_.path().Append(FILE_PATH_LITERAL("a"))); |
FilePath dest(base_.path().Append(FILE_PATH_LITERAL("b"))); |
@@ -191,27 +280,68 @@ TEST_F(FileSystemOperationTest, TestCopyFailureSrcDoesntExist) { |
} |
TEST_F(FileSystemOperationTest, TestCopyFailureContainsPath) { |
- FilePath file_under_base = base_.path().Append(FILE_PATH_LITERAL("b")); |
- operation()->Copy(base_.path(), file_under_base); |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ FilePath dest_dir_path; |
+ ASSERT_TRUE(file_util::CreateTemporaryFileInDir(src_dir.path(), |
+ &dest_dir_path)); |
+ operation()->Copy(src_dir.path(), dest_dir_path); |
MessageLoop::current()->RunAllPending(); |
- EXPECT_EQ(base::PLATFORM_FILE_ERROR_FAILED, mock_dispatcher_->status()); |
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_INVALID_OPERATION, |
+ mock_dispatcher_->status()); |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
} |
TEST_F(FileSystemOperationTest, TestCopyFailureSrcDirExistsDestFile) { |
// Src exists and is dir. Dest is a file. |
- ScopedTempDir dir; |
- ASSERT_TRUE(dir.CreateUniqueTempDir()); |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ |
+ ScopedTempDir dest_dir; |
+ ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); |
FilePath dest_file; |
- file_util::CreateTemporaryFileInDir(dir.path(), &dest_file); |
+ file_util::CreateTemporaryFileInDir(dest_dir.path(), &dest_file); |
- operation()->Copy(base_.path(), dest_file); |
+ operation()->Copy(src_dir.path(), dest_file); |
MessageLoop::current()->RunAllPending(); |
EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY, |
mock_dispatcher_->status()); |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
} |
+TEST_F(FileSystemOperationTest, TestCopyFailureSrcFileExistsDestNonEmptyDir) { |
+ // Src exists and is a directory. Dest is a non-empty directory. |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ |
+ ScopedTempDir dest_dir; |
+ ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); |
+ FilePath child_file; |
+ file_util::CreateTemporaryFileInDir(dest_dir.path(), &child_file); |
+ |
+ operation()->Copy(src_dir.path(), dest_dir.path()); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_EMPTY, mock_dispatcher_->status()); |
+ EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+} |
+ |
+TEST_F(FileSystemOperationTest, TestCopyFailureSrcFileExistsDestDir) { |
+ // Src exists and is a file. Dest is a directory. |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ FilePath src_file; |
+ file_util::CreateTemporaryFileInDir(src_dir.path(), &src_file); |
+ |
+ ScopedTempDir dest_dir; |
+ ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); |
+ |
+ operation()->Copy(src_file, dest_dir.path()); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_A_FILE, |
+ mock_dispatcher_->status()); |
+ EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+} |
+ |
TEST_F(FileSystemOperationTest, TestCopyFailureDestParentDoesntExist) { |
// Dest. parent path does not exist. |
ScopedTempDir dir; |
@@ -264,7 +394,7 @@ TEST_F(FileSystemOperationTest, TestCopySuccessSrcFileAndNew) { |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
} |
-TEST_F(FileSystemOperationTest, TestCopySuccessSrcDir) { |
+TEST_F(FileSystemOperationTest, TestCopySuccessSrcDirAndOverwrite) { |
ScopedTempDir src_dir; |
ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
@@ -275,24 +405,42 @@ TEST_F(FileSystemOperationTest, TestCopySuccessSrcDir) { |
MessageLoop::current()->RunAllPending(); |
EXPECT_EQ(kFileOperationSucceeded, mock_dispatcher_->status()); |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+ |
+ // Make sure we've overwritten but not copied the source under the |dest_dir|. |
+ EXPECT_TRUE(file_util::DirectoryExists(dest_dir.path())); |
+ EXPECT_FALSE(file_util::DirectoryExists( |
+ dest_dir.path().Append(src_dir.path().BaseName()))); |
} |
-TEST_F(FileSystemOperationTest, TestCopyDestParentExistsSuccess) { |
+TEST_F(FileSystemOperationTest, TestCopySuccessSrcDirAndNew) { |
ScopedTempDir src_dir; |
ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
- FilePath src_file; |
- file_util::CreateTemporaryFileInDir(src_dir.path(), &src_file); |
+ |
+ ScopedTempDir dir; |
+ ASSERT_TRUE(dir.CreateUniqueTempDir()); |
+ FilePath dest_dir(dir.path().Append(FILE_PATH_LITERAL("NewDirectory"))); |
+ |
+ operation()->Copy(src_dir.path(), dest_dir); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(kFileOperationSucceeded, mock_dispatcher_->status()); |
+ EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+ EXPECT_TRUE(file_util::DirectoryExists(dest_dir)); |
+} |
+ |
+TEST_F(FileSystemOperationTest, TestCopySuccessSrcDirRecursive) { |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ FilePath child_file; |
+ file_util::CreateTemporaryFileInDir(src_dir.path(), &child_file); |
ScopedTempDir dest_dir; |
ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); |
- operation()->Copy(src_file, dest_dir.path()); |
+ operation()->Copy(src_dir.path(), dest_dir.path()); |
MessageLoop::current()->RunAllPending(); |
EXPECT_EQ(kFileOperationSucceeded, mock_dispatcher_->status()); |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
- |
- FilePath src_filename(src_file.BaseName()); |
- EXPECT_TRUE(FileExists(dest_dir.path().Append(src_filename))); |
+ EXPECT_TRUE(FileExists(dest_dir.path().Append(child_file.BaseName()))); |
} |
TEST_F(FileSystemOperationTest, TestCreateFileFailure) { |
@@ -350,7 +498,6 @@ TEST_F(FileSystemOperationTest, |
// Dest. parent path does not exist. |
FilePath nonexisting(base_.path().Append( |
FILE_PATH_LITERAL("DirDoesntExist"))); |
- file_util::EnsureEndsWithSeparator(&nonexisting); |
FilePath nonexisting_file = nonexisting.Append( |
FILE_PATH_LITERAL("FileDoesntExist")); |
operation()->CreateDirectory(nonexisting_file, false, false); |
@@ -361,7 +508,9 @@ TEST_F(FileSystemOperationTest, |
TEST_F(FileSystemOperationTest, TestCreateDirFailureDirExists) { |
// Exclusive and dir existing at path. |
- operation()->CreateDirectory(base_.path(), true, false); |
+ ScopedTempDir src_dir; |
+ ASSERT_TRUE(src_dir.CreateUniqueTempDir()); |
+ operation()->CreateDirectory(src_dir.path(), true, false); |
MessageLoop::current()->RunAllPending(); |
EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, mock_dispatcher_->status()); |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
@@ -389,7 +538,8 @@ TEST_F(FileSystemOperationTest, TestCreateDirSuccess) { |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
// Dir doesn't exist. |
- FilePath nonexisting_dir_path(FILE_PATH_LITERAL("nonexistingdir")); |
+ FilePath nonexisting_dir_path(base_.path().Append( |
+ FILE_PATH_LITERAL("nonexistingdir"))); |
operation()->CreateDirectory(nonexisting_dir_path, false, false); |
MessageLoop::current()->RunAllPending(); |
EXPECT_EQ(kFileOperationSucceeded, mock_dispatcher_->status()); |
@@ -399,9 +549,7 @@ TEST_F(FileSystemOperationTest, TestCreateDirSuccess) { |
TEST_F(FileSystemOperationTest, TestCreateDirSuccessExclusive) { |
// Dir doesn't exist. |
- ScopedTempDir dir; |
- ASSERT_TRUE(dir.CreateUniqueTempDir()); |
- FilePath nonexisting_dir_path(dir.path().Append( |
+ FilePath nonexisting_dir_path(base_.path().Append( |
FILE_PATH_LITERAL("nonexistingdir"))); |
operation()->CreateDirectory(nonexisting_dir_path, true, false); |
@@ -517,12 +665,13 @@ TEST_F(FileSystemOperationTest, TestRemoveFailure) { |
FILE_PATH_LITERAL("NonExistingDir"))); |
file_util::EnsureEndsWithSeparator(&nonexisting); |
- operation()->Remove(nonexisting); |
+ operation()->Remove(nonexisting, false /* recursive */); |
MessageLoop::current()->RunAllPending(); |
EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, mock_dispatcher_->status()); |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
- // By spec recursive is always false. Non-empty dir should fail. |
+ // It's an error to try to remove a non-empty directory if recursive flag |
+ // is false. |
// parent_dir |
// | | |
// child_dir child_file |
@@ -535,9 +684,9 @@ TEST_F(FileSystemOperationTest, TestRemoveFailure) { |
ASSERT_TRUE(file_util::CreateTemporaryDirInDir( |
parent_dir.path(), FILE_PATH_LITERAL("child_dir"), &child_dir)); |
- operation()->Remove(parent_dir.path()); |
+ operation()->Remove(parent_dir.path(), false /* recursive */); |
MessageLoop::current()->RunAllPending(); |
- EXPECT_EQ(base::PLATFORM_FILE_ERROR_INVALID_OPERATION, |
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_EMPTY, |
mock_dispatcher_->status()); |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
} |
@@ -547,9 +696,28 @@ TEST_F(FileSystemOperationTest, TestRemoveSuccess) { |
ASSERT_TRUE(empty_dir.CreateUniqueTempDir()); |
EXPECT_TRUE(file_util::DirectoryExists(empty_dir.path())); |
- operation()->Remove(empty_dir.path()); |
+ operation()->Remove(empty_dir.path(), false /* recursive */); |
MessageLoop::current()->RunAllPending(); |
EXPECT_EQ(kFileOperationSucceeded, mock_dispatcher_->status()); |
EXPECT_FALSE(file_util::DirectoryExists(empty_dir.path())); |
EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
+ |
+ // Removing a non-empty directory with recursive flag == true should be ok. |
+ // parent_dir |
+ // | | |
+ // child_dir child_file |
+ // Verify deleting parent_dir. |
+ ScopedTempDir parent_dir; |
+ ASSERT_TRUE(parent_dir.CreateUniqueTempDir()); |
+ FilePath child_file; |
+ file_util::CreateTemporaryFileInDir(parent_dir.path(), &child_file); |
+ FilePath child_dir; |
+ ASSERT_TRUE(file_util::CreateTemporaryDirInDir( |
+ parent_dir.path(), FILE_PATH_LITERAL("child_dir"), &child_dir)); |
+ |
+ operation()->Remove(parent_dir.path(), true /* recursive */); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(kFileOperationSucceeded, mock_dispatcher_->status()); |
+ EXPECT_FALSE(file_util::DirectoryExists(parent_dir.path())); |
+ EXPECT_EQ(request_id_, mock_dispatcher_->request_id()); |
} |