From 2df84f53ede22a222e659c3159b4006d7d260b57 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 7 Nov 2024 11:14:38 -0600 Subject: [PATCH] winfsp unit tests and fixes --- .../src/winfsp_drive_delete_test.cpp | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/repertory/repertory_test/src/winfsp_drive_delete_test.cpp b/repertory/repertory_test/src/winfsp_drive_delete_test.cpp index faf2e5fa..f5797fd9 100644 --- a/repertory/repertory_test/src/winfsp_drive_delete_test.cpp +++ b/repertory/repertory_test/src/winfsp_drive_delete_test.cpp @@ -121,6 +121,77 @@ TYPED_TEST(winfsp_test, delete_can_handle_mmap_after_file_deletion) { EXPECT_TRUE(::CloseHandle(mapping)); } + +TYPED_TEST(winfsp_test, delete_can_delete_after_mapping) { + auto dir_path{ + utils::path::combine(this->mount_location, {"test_dir_3"}), + }; + auto file_path{ + utils::path::combine(dir_path, {"test_file_3"}), + }; + auto file_path2{ + utils::path::combine(dir_path, {"test_file2_3"}), + }; + + ASSERT_TRUE(::CreateDirectoryA(dir_path.c_str(), nullptr)); + + auto seed = static_cast(std::time(nullptr)); + srand(seed); + + 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); + + SYSTEM_INFO sys_info{}; + ::GetSystemInfo(&sys_info); + + auto *mapping = + ::CreateFileMappingA(handle, nullptr, PAGE_READWRITE, 0, + 16U * sys_info.dwAllocationGranularity, nullptr); + EXPECT_TRUE(::CloseHandle(handle)); + ASSERT_TRUE(mapping != nullptr); + + auto *view = ::MapViewOfFile(mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); + ASSERT_TRUE(view != nullptr); + + for (PUINT8 ptr = view, end = ptr + 16U * sys_info.dwAllocationGranularity; + end > ptr; ++ptr) { + *ptr = rand() & 0xFF; + } + + EXPECT_TRUE(::UnmapViewOfFile(view)); + EXPECT_TRUE(::CloseHandle(mapping)); + + auto handle = ::CreateFileA(file_path2.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); + + mapping = + ::CreateFileMappingA(handle, nullptr, PAGE_READWRITE, 0, + 16U * sys_info.dwAllocationGranularity, nullptr); + EXPECT_TRUE(::CloseHandle(handle)); + ASSERT_TRUE(mapping != nullptr); + + view = ::MapViewOfFile(mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); + EXPECT_TRUE(view != nullptr); + + for (PUINT8 ptr = view, end = ptr + 16U * sys_info.dwAllocationGranularity; + end > ptr; ++ptr) { + *ptr = rand() & 0xff; + } + + EXPECT_TRUE(::UnmapViewOfFile(view)); + EXPECT_TRUE(::CloseHandle(mapping)); + + EXPECT_TRUE(::DeleteFileA(file_path.c_str())); + EXPECT_TRUE(::DeleteFileA(file_path2.c_str())); + + EXPECT_TRUE(::RemoveDirectoryA(dir_path.c_str())); + EXPECT_FALSE(::RemoveDirectoryA(dir_path.c_str())); + EXPECT_EQ(ERROR_FILE_NOT_FOUND, ::GetLastError()); +} } // namespace repertory #endif // defined(_WIN32)