winfsp unit tests and fixes

This commit is contained in:
Scott E. Graves 2024-11-07 11:14:38 -06:00
parent 876a1e9cd8
commit 2df84f53ed

View File

@ -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<unsigned>(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)