From 55762f9c924d5e7c2ae76210526e1072d6f3d321 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 30 Oct 2024 09:26:45 -0500 Subject: [PATCH] winfsp unit tests and fixes --- ..._test.cpp => winfsp_drive_create_test.cpp} | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) rename repertory/repertory_test/src/{winfsp_drive_test.cpp => winfsp_drive_create_test.cpp} (52%) diff --git a/repertory/repertory_test/src/winfsp_drive_test.cpp b/repertory/repertory_test/src/winfsp_drive_create_test.cpp similarity index 52% rename from repertory/repertory_test/src/winfsp_drive_test.cpp rename to repertory/repertory_test/src/winfsp_drive_create_test.cpp index 033c2d55..2aaa0e46 100644 --- a/repertory/repertory_test/src/winfsp_drive_test.cpp +++ b/repertory/repertory_test/src/winfsp_drive_create_test.cpp @@ -90,6 +90,99 @@ TYPED_TEST(winfsp_test, can_delete_file_after_close) { FILE_FLAG_DELETE_ON_CLOSE, 0); EXPECT_EQ(INVALID_HANDLE_VALUE, handle); EXPECT_EQ(ERROR_FILE_NOT_FOUND, ::GetLastError()); + + // EXPECT file not found +} + +TYPED_TEST(winfsp_test, cannot_create_files_with_invalid_characters_in_path) { + for (auto &&invalid_char : std::array{ + {"*", ":", "<", ">", "?", "|", "\""}, + }) { + auto handle = ::CreateFileA( + (this->mount_location + "\\" + invalid_char + "\\test_file_1").c_str(), + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); + EXPECT_EQ(INVALID_HANDLE_VALUE, handle); + if (handle != INVALID_HANDLE_VALUE) { + std::cout << "char: " << invalid_char << std::endl; + } + EXPECT_EQ(ERROR_INVALID_NAME, ::GetLastError()); + } +} + +TYPED_TEST(winfsp_test, + cannot_create_stream_files_with_extra_component_in_path) { + auto file_path{ + utils::path::combine(this->mount_location, + { + "test_file_1:test", + "moose", + }), + }; + auto handle = ::CreateFileA(file_path.c_str(), GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_NEW, + FILE_ATTRIBUTE_NORMAL, 0); + EXPECT_EQ(INVALID_HANDLE_VALUE, handle); + EXPECT_EQ(ERROR_INVALID_NAME, ::GetLastError()); +} + +TYPED_TEST(winfsp_test, can_create_directory) { + auto dir_path{ + utils::path::combine(this->mount_location, + { + "test_dir_0", + }), + }; + EXPECT_TRUE(::CreateDirectoryA(dir_path.c_str(), nullptr)); + EXPECT_FALSE(::CreateDirectoryA(dir_path.c_str(), nullptr)); +} + +TYPED_TEST(winfsp_test, directory_delete_fails_if_not_empty) { + auto dir_path{ + utils::path::combine(this->mount_location, + { + "test_dir_0", + }), + }; + auto file_path{ + utils::path::combine(dir_path, + { + "test_file_0", + }), + }; + + auto handle = ::CreateFileA(file_path.c_str(), GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_NEW, + FILE_ATTRIBUTE_NORMAL, 0); + EXPECT_NE(INVALID_HANDLE_VALUE, handle); + ::CloseHandle(handle); + + handle = + ::CreateFileA(dir_path.c_str(), GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_DELETE_ON_CLOSE, 0); + EXPECT_NE(INVALID_HANDLE_VALUE, handle); + ::CloseHandle(handle); + + handle = ::CreateFileA(file_path.c_str(), GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, + FILE_FLAG_DELETE_ON_CLOSE, 0); + EXPECT_NE(INVALID_HANDLE_VALUE, handle); + ::CloseHandle(handle); + + handle = + ::CreateFileA(dir_path.c_str(), GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_DELETE_ON_CLOSE, 0); + EXPECT_NE(INVALID_HANDLE_VALUE, handle); + ::CloseHandle(handle); + + handle = + ::CreateFileA(dir_path.c_str(), GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_DELETE_ON_CLOSE, 0); + EXPECT_EQ(INVALID_HANDLE_VALUE, handle); + EXPECT_EQ(ERROR_FILE_NOT_FOUND, ::GetLastError()); } } // namespace repertory