diff --git a/repertory/repertory_test/src/winfsp_drive_rename_test.cpp b/repertory/repertory_test/src/winfsp_drive_rename_test.cpp index 87c98f4d..b5a2bb6e 100644 --- a/repertory/repertory_test/src/winfsp_drive_rename_test.cpp +++ b/repertory/repertory_test/src/winfsp_drive_rename_test.cpp @@ -128,6 +128,133 @@ TYPED_TEST(winfsp_test, rename_succeeds_if_dest_exists_and_replace_is_true) { EXPECT_TRUE(::DeleteFileA(file_path2.c_str())); EXPECT_TRUE(::RemoveDirectoryA(dir_path.c_str())); } + +TYPED_TEST(winfsp_test, rename_can_rename_dir_if_dest_does_not_exist) { + if (this->current_provider == provider_type::s3) { + return; + } + + auto dir_path{ + utils::path::combine(this->mount_location, {"test_dir_4"}), + }; + auto dir_path2{ + utils::path::combine(this->mount_location, {"test_dir2_4"}), + }; + + ASSERT_TRUE(::CreateDirectoryA(dir_path.c_str(), nullptr)); + + EXPECT_TRUE(::MoveFileExA(dir_path.c_str(), dir_path2.c_str(), 0)); + + EXPECT_TRUE(::RemoveDirectoryA(dir2_path.c_str())); +} + +TYPED_TEST(winfsp_test, rename_dir_fails_if_dest_exists_and_replace_is_false) { + if (this->current_provider == provider_type::s3) { + return; + } + + auto dir_path{ + utils::path::combine(this->mount_location, {"test_dir_4"}), + }; + auto dir_path2{ + utils::path::combine(this->mount_location, {"test_dir2_4"}), + }; + + ASSERT_TRUE(::CreateDirectoryA(dir_path.c_str(), nullptr)); + ASSERT_TRUE(::CreateDirectoryA(dir_path2.c_str(), nullptr)); + + EXPECT_FALSE(::MoveFileExA(dir_path.c_str(), dir_path2.c_str(), 0)); + EXPECT_EQ(ERROR_ACCESS_DENIED, ::GetLastError()); + + EXPECT_TRUE(::RemoveDirectoryA(dir_path.c_str())); + EXPECT_TRUE(::RemoveDirectoryA(dir2_path.c_str())); +} + +TYPED_TEST(winfsp_test, rename_dir_fails_if_dest_exists_and_replace_is_true) { + if (this->current_provider == provider_type::s3) { + return; + } + + auto dir_path{ + utils::path::combine(this->mount_location, {"test_dir_4"}), + }; + auto dir_path2{ + utils::path::combine(this->mount_location, {"test_dir2_4"}), + }; + + ASSERT_TRUE(::CreateDirectoryA(dir_path.c_str(), nullptr)); + ASSERT_TRUE(::CreateDirectoryA(dir_path2.c_str(), nullptr)); + + EXPECT_FALSE(::MoveFileExA(dir_path.c_str(), dir_path2.c_str(), + MOVEFILE_REPLACE_EXISTING)); + EXPECT_EQ(ERROR_ACCESS_DENIED, ::GetLastError()); + + EXPECT_TRUE(::RemoveDirectoryA(dir_path.c_str())); + EXPECT_TRUE(::RemoveDirectoryA(dir2_path.c_str())); +} + +TYPED_TEST(winfsp_test, + rename_dir_fails_directory_is_not_empty_and_replace_is_false) { + if (this->current_provider == provider_type::s3) { + return; + } + + auto dir_path{ + utils::path::combine(this->mount_location, {"test_dir_4"}), + }; + auto dir_path2{ + utils::path::combine(this->mount_location, {"test_dir2_4"}), + }; + auto file_path{ + utils::path::combine(dir_path, {"test_file_4"}), + }; + + ASSERT_TRUE(::CreateDirectoryA(dir_path.c_str(), nullptr)); + + auto handle = ::CreateFileA(file_path.c_str(), GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr); + ASSERT_NE(INVALID_HANDLE_VALUE, handle); + ::CloseHandle(handle); + + EXPECT_FALSE(::MoveFileExA(dir_path.c_str(), dir_path2.c_str(), 0)); + EXPECT_EQ(ERROR_ACCESS_DENIED, ::GetLastError()); + + EXPECT_TRUE(::DeleteFileA(file_path.c_str())); + EXPECT_TRUE(::RemoveDirectoryA(dir_path.c_str())); +} + +TYPED_TEST(winfsp_test, winfsp_test, + rename_dir_fails_directory_is_not_empty_and_replace_is_true) { + if (this->current_provider == provider_type::s3) { + return; + } + + auto dir_path{ + utils::path::combine(this->mount_location, {"test_dir_4"}), + }; + auto dir_path2{ + utils::path::combine(this->mount_location, {"test_dir2_4"}), + }; + auto file_path{ + utils::path::combine(dir_path, {"test_file_4"}), + }; + + ASSERT_TRUE(::CreateDirectoryA(dir_path.c_str(), nullptr)); + + auto handle = ::CreateFileA(file_path.c_str(), GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr); + ASSERT_NE(INVALID_HANDLE_VALUE, handle); + ::CloseHandle(handle); + + EXPECT_FALSE(::MoveFileExA(dir_path.c_str(), dir_path2.c_str(), + MOVEFILE_REPLACE_EXISTING)); + EXPECT_EQ(ERROR_ACCESS_DENIED, ::GetLastError()); + + EXPECT_TRUE(::DeleteFileA(file_path.c_str())); + EXPECT_TRUE(::RemoveDirectoryA(dir_path.c_str())); +} } // namespace repertory #endif // defined(_WIN32) diff --git a/repertory/repertory_test/src/winfsp_drive_test.cpp b/repertory/repertory_test/src/winfsp_drive_test.cpp index 9d9a0f11..8764a21d 100644 --- a/repertory/repertory_test/src/winfsp_drive_test.cpp +++ b/repertory/repertory_test/src/winfsp_drive_test.cpp @@ -31,6 +31,7 @@ // TODO revisit delete_access_test // TODO revisit getfileattr_test // TODO revisit delete_ex_test +// TODO revisit rename_backslash_dotest // // Implemented test cases based on WinFsp tests: