From 0bd1f720178d5e380ae7c56c88b14637cfd331ba Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 7 Nov 2024 08:56:18 -0600 Subject: [PATCH] winfsp unit tests and fixes --- .../src/winfsp_drive_delete_test.cpp | 97 +++++++++++++++++++ .../repertory_test/src/winfsp_drive_test.cpp | 1 + 2 files changed, 98 insertions(+) create mode 100644 repertory/repertory_test/src/winfsp_drive_delete_test.cpp diff --git a/repertory/repertory_test/src/winfsp_drive_delete_test.cpp b/repertory/repertory_test/src/winfsp_drive_delete_test.cpp new file mode 100644 index 00000000..de5b9dc7 --- /dev/null +++ b/repertory/repertory_test/src/winfsp_drive_delete_test.cpp @@ -0,0 +1,97 @@ +/* + Copyright <2018-2024> + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#if defined(_WIN32) + +// +// Implemented test cases based on WinFsp tests: +// https://github.com/winfsp/winfsp/blob/v2.0/tst/winfsp-tests +// +#include "fixtures/winfsp_fixture.hpp" + +namespace repertory { +TYPED_TEST_CASE(winfsp_test, winfsp_provider_types); + +TYPED_TEST(winfsp_test, delete_directory_fails_if_directory_not_empty) { + auto dir_path{ + utils::path::combine(this->mount_location, {"test_dir_3"}), + }; + + auto file_path{ + utils::path::combine(dir_path, {"test_file_3"}), + }; + + 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, 0); + ASSERT_NE(INVALID_HANDLE_VALUE, handle); + ::CloseHandle(handle); + + EXPECT_FALSE(::RemoveDirectoryA(dir_path.c_str())); + EXPECT_EQ(ERROR_DIR_NOT_EMPTY, ::GetLastError()); + + EXPECT_TRUE(::DeleteFileA(file_path.c_str())); + EXPECT_FALSE(::DeleteFileA(file_path.c_str())); + EXPECT_EQ(ERROR_FILE_NOT_FOUND, ::GetLastError()); + + EXPECT_TRUE(::RemoveDirectoryA(dir_path.c_str())); + EXPECT_FALSE(::RemoveDirectoryA(dir_path.c_str())); + EXPECT_EQ(ERROR_FILE_NOT_FOUND, ::GetLastError()); +} + +TYPED_TEST(winfsp_test, + delete_read_file_attributes_fails_if_delete_is_pending) { + auto file_path{ + utils::path::combine(this->mount_location, {"test_file_3"}), + }; + + auto handle = ::CreateFileA(file_path.c_str(), GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); + ASSERT_NE(INVALID_HANDLE_VALUE, handle); + ::CloseHandle(handle); + + handle = ::CreateFileA(file_path.c_str(), DELETE, FILE_SHARE_DELETE, nullptr, + OPEN_EXISTING, 0, 0); + ASSERT_NE(INVALID_HANDLE_VALUE, handle); + + typedef struct { + BOOLEAN Disposition; + } MY_FILE_DISPOSITION_INFO; + + MY_FILE_DISPOSITION_INFO disp_info{TRUE}; + EXPECT_TRUE(::SetFileInformationByHandle(handle, FileDispositionInfo, + &disp_info, sizeof disp_info)); + auto handle2 = ::CreateFileA(file_path.c_str(), FILE_READ_ATTRIBUTES, 0, + nullptr, OPEN_EXISTING, 0, 0); + EXPECT_EQ(INVALID_HANDLE_VALUE, handle2); + EXPECT_EQ(ERROR_ACCESS_DENIED, ::GetLastError()); + + ::CloseHandle(handle); + + EXPECT_FALSE(::DeleteFileA(file_path.c_str())); + EXPECT_EQ(ERROR_FILE_NOT_FOUND, ::GetLastError()); +} +} // 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 5db26a55..37e05912 100644 --- a/repertory/repertory_test/src/winfsp_drive_test.cpp +++ b/repertory/repertory_test/src/winfsp_drive_test.cpp @@ -28,6 +28,7 @@ // TODO revisit create_backup // TODO revisit create_restore // TODO revisit create_share +// TODO revisit delete_access_test // TODO revisit getfileattr_test //