fsbench: expand on read/write tests and fixes

This commit is contained in:
Bill Zissimopoulos 2016-12-04 14:41:38 -08:00
parent a1af8ff921
commit ac6f024715

View File

@ -21,8 +21,10 @@
static ULONG OptFileCount = 1000; static ULONG OptFileCount = 1000;
static ULONG OptListCount = 100; static ULONG OptListCount = 100;
static ULONG OptRdwrFileSize = 4096 * 1024;
static ULONG OptRdwrCcCount = 100; static ULONG OptRdwrCcCount = 100;
static ULONG OptRdwrNcCount = 100; static ULONG OptRdwrNcCount = 100;
static ULONG OptMmapFileSize = 4096 * 1024;
static ULONG OptMmapCount = 100; static ULONG OptMmapCount = 100;
static void file_create_dotest(ULONG CreateDisposition) static void file_create_dotest(ULONG CreateDisposition)
@ -85,16 +87,7 @@ static void file_delete_test(void)
ASSERT(Success); ASSERT(Success);
} }
} }
static void file_tests(void) static void file_mkdir_test(void)
{
TEST(file_create_test);
TEST(file_open_test);
TEST(file_overwrite_test);
TEST(file_list_test);
TEST(file_delete_test);
}
static void dir_mkdir_test(void)
{ {
BOOL Success; BOOL Success;
WCHAR FileName[MAX_PATH]; WCHAR FileName[MAX_PATH];
@ -106,7 +99,7 @@ static void dir_mkdir_test(void)
ASSERT(Success); ASSERT(Success);
} }
} }
static void dir_rmdir_test(void) static void file_rmdir_test(void)
{ {
BOOL Success; BOOL Success;
WCHAR FileName[MAX_PATH]; WCHAR FileName[MAX_PATH];
@ -118,27 +111,29 @@ static void dir_rmdir_test(void)
ASSERT(Success); ASSERT(Success);
} }
} }
static void dir_tests(void) static void file_tests(void)
{ {
TEST(dir_mkdir_test); TEST(file_create_test);
TEST(dir_rmdir_test); TEST(file_open_test);
TEST(file_overwrite_test);
TEST(file_list_test);
TEST(file_delete_test);
TEST(file_mkdir_test);
TEST(file_rmdir_test);
} }
static void rdwr_dotest(ULONG CreateDisposition, ULONG CreateFlags, ULONG Count) static void rdwr_dotest(ULONG CreateDisposition, ULONG CreateFlags,
ULONG FileSize, ULONG BufferSize, ULONG Count)
{ {
SYSTEM_INFO SystemInfo; WCHAR FileName[MAX_PATH];
PVOID Buffer;
HANDLE Handle; HANDLE Handle;
BOOL Success; BOOL Success;
PVOID Buffer;
DWORD BytesTransferred; DWORD BytesTransferred;
WCHAR FileName[MAX_PATH];
ULONG Iterations = 1000;
Buffer = _aligned_malloc(BufferSize, BufferSize);
GetSystemInfo(&SystemInfo);
Buffer = _aligned_malloc(SystemInfo.dwPageSize, SystemInfo.dwPageSize);
ASSERT(0 != Buffer); ASSERT(0 != Buffer);
memset(Buffer, 0, SystemInfo.dwPageSize); memset(Buffer, 0, BufferSize);
StringCbPrintfW(FileName, sizeof FileName, L"fsbench-file"); StringCbPrintfW(FileName, sizeof FileName, L"fsbench-file");
Handle = CreateFileW(FileName, Handle = CreateFileW(FileName,
@ -151,8 +146,8 @@ static void rdwr_dotest(ULONG CreateDisposition, ULONG CreateFlags, ULONG Count)
if (CREATE_NEW == CreateDisposition) if (CREATE_NEW == CreateDisposition)
{ {
BytesTransferred = SetFilePointer(Handle, Iterations * SystemInfo.dwPageSize, 0, FILE_BEGIN); BytesTransferred = SetFilePointer(Handle, FileSize, 0, FILE_BEGIN);
ASSERT(Iterations * SystemInfo.dwPageSize == BytesTransferred); ASSERT(FileSize == BytesTransferred);
SetEndOfFile(Handle); SetEndOfFile(Handle);
} }
@ -160,14 +155,14 @@ static void rdwr_dotest(ULONG CreateDisposition, ULONG CreateFlags, ULONG Count)
{ {
BytesTransferred = SetFilePointer(Handle, 0, 0, FILE_BEGIN); BytesTransferred = SetFilePointer(Handle, 0, 0, FILE_BEGIN);
ASSERT(0 == BytesTransferred); ASSERT(0 == BytesTransferred);
for (ULONG I = 0; Iterations > I; I++) for (ULONG I = 0, N = FileSize / BufferSize; N > I; I++)
{ {
if (CREATE_NEW == CreateDisposition) if (CREATE_NEW == CreateDisposition)
Success = WriteFile(Handle, Buffer, SystemInfo.dwPageSize, &BytesTransferred, 0); Success = WriteFile(Handle, Buffer, BufferSize, &BytesTransferred, 0);
else else
Success = ReadFile(Handle, Buffer, SystemInfo.dwPageSize, &BytesTransferred, 0); Success = ReadFile(Handle, Buffer, BufferSize, &BytesTransferred, 0);
ASSERT(Success); ASSERT(Success);
ASSERT(SystemInfo.dwPageSize == BytesTransferred); ASSERT(BufferSize == BytesTransferred);
} }
} }
@ -176,42 +171,114 @@ static void rdwr_dotest(ULONG CreateDisposition, ULONG CreateFlags, ULONG Count)
_aligned_free(Buffer); _aligned_free(Buffer);
} }
static void rdwr_cc_write_test(void) static void rdwr_cc_write_sector_test(void)
{ {
rdwr_dotest(CREATE_NEW, 0, OptRdwrCcCount); DWORD SC, BS, FC, TC;
ASSERT(GetDiskFreeSpaceW(0, &SC, &BS, &FC, &TC));
rdwr_dotest(CREATE_NEW, 0,
OptRdwrFileSize, BS, OptRdwrCcCount);
} }
static void rdwr_cc_read_test(void) static void rdwr_cc_read_sector_test(void)
{ {
rdwr_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, OptRdwrCcCount); DWORD SC, BS, FC, TC;
ASSERT(GetDiskFreeSpaceW(0, &SC, &BS, &FC, &TC));
rdwr_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE,
OptRdwrFileSize, BS, OptRdwrCcCount);
} }
static void rdwr_nc_write_test(void) static void rdwr_nc_write_sector_test(void)
{ {
rdwr_dotest(CREATE_NEW, 0 | FILE_FLAG_NO_BUFFERING, OptRdwrNcCount); DWORD SC, BS, FC, TC;
ASSERT(GetDiskFreeSpaceW(0, &SC, &BS, &FC, &TC));
rdwr_dotest(CREATE_NEW, 0 | FILE_FLAG_NO_BUFFERING,
OptRdwrFileSize, BS, OptRdwrNcCount);
} }
static void rdwr_nc_read_test(void) static void rdwr_nc_read_sector_test(void)
{ {
DWORD SC, BS, FC, TC;
ASSERT(GetDiskFreeSpaceW(0, &SC, &BS, &FC, &TC));
rdwr_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_NO_BUFFERING, rdwr_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_NO_BUFFERING,
OptRdwrNcCount); OptRdwrFileSize, BS, OptRdwrNcCount);
}
static void rdwr_cc_write_page_test(void)
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
rdwr_dotest(CREATE_NEW, 0,
OptRdwrFileSize, SystemInfo.dwPageSize, OptRdwrCcCount);
}
static void rdwr_cc_read_page_test(void)
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
rdwr_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE,
OptRdwrFileSize, SystemInfo.dwPageSize, OptRdwrCcCount);
}
static void rdwr_nc_write_page_test(void)
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
rdwr_dotest(CREATE_NEW, 0 | FILE_FLAG_NO_BUFFERING,
OptRdwrFileSize, SystemInfo.dwPageSize, OptRdwrNcCount);
}
static void rdwr_nc_read_page_test(void)
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
rdwr_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_NO_BUFFERING,
OptRdwrFileSize, SystemInfo.dwPageSize, OptRdwrNcCount);
}
static void rdwr_cc_write_large_test(void)
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
rdwr_dotest(CREATE_NEW, 0,
OptRdwrFileSize, 16 * SystemInfo.dwPageSize, OptRdwrCcCount);
}
static void rdwr_cc_read_large_test(void)
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
rdwr_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE,
OptRdwrFileSize, 16 * SystemInfo.dwPageSize, OptRdwrCcCount);
}
static void rdwr_nc_write_large_test(void)
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
rdwr_dotest(CREATE_NEW, 0 | FILE_FLAG_NO_BUFFERING,
OptRdwrFileSize, 16 * SystemInfo.dwPageSize, OptRdwrNcCount);
}
static void rdwr_nc_read_large_test(void)
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
rdwr_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_NO_BUFFERING,
OptRdwrFileSize, 16 * SystemInfo.dwPageSize, OptRdwrNcCount);
} }
static void rdwr_tests(void) static void rdwr_tests(void)
{ {
TEST(rdwr_cc_write_test); TEST(rdwr_cc_write_sector_test);
TEST(rdwr_cc_read_test); TEST(rdwr_cc_read_sector_test);
TEST(rdwr_nc_write_test); TEST(rdwr_cc_write_page_test);
TEST(rdwr_nc_read_test); TEST(rdwr_cc_read_page_test);
TEST(rdwr_cc_write_large_test);
TEST(rdwr_cc_read_large_test);
TEST(rdwr_nc_write_sector_test);
TEST(rdwr_nc_read_sector_test);
TEST(rdwr_nc_write_page_test);
TEST(rdwr_nc_read_page_test);
TEST(rdwr_nc_write_large_test);
TEST(rdwr_nc_read_large_test);
} }
static void mmap_dotest(ULONG CreateDisposition, ULONG CreateFlags, ULONG Count) static void mmap_dotest(ULONG CreateDisposition, ULONG CreateFlags,
ULONG FileSize, ULONG BufferSize, ULONG Count)
{ {
SYSTEM_INFO SystemInfo; WCHAR FileName[MAX_PATH];
HANDLE Handle, Mapping; HANDLE Handle, Mapping;
BOOL Success; BOOL Success;
WCHAR FileName[MAX_PATH];
ULONG Iterations = 1000;
PUINT8 MappedView; PUINT8 MappedView;
GetSystemInfo(&SystemInfo);
StringCbPrintfW(FileName, sizeof FileName, L"fsbench-file"); StringCbPrintfW(FileName, sizeof FileName, L"fsbench-file");
Handle = CreateFileW(FileName, Handle = CreateFileW(FileName,
GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
@ -222,7 +289,7 @@ static void mmap_dotest(ULONG CreateDisposition, ULONG CreateFlags, ULONG Count)
ASSERT(INVALID_HANDLE_VALUE != Handle); ASSERT(INVALID_HANDLE_VALUE != Handle);
Mapping = CreateFileMappingW(Handle, 0, PAGE_READWRITE, Mapping = CreateFileMappingW(Handle, 0, PAGE_READWRITE,
0, Iterations * SystemInfo.dwPageSize, 0); 0, FileSize, 0);
ASSERT(0 != Mapping); ASSERT(0 != Mapping);
MappedView = MapViewOfFile(Mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); MappedView = MapViewOfFile(Mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
@ -230,18 +297,18 @@ static void mmap_dotest(ULONG CreateDisposition, ULONG CreateFlags, ULONG Count)
for (ULONG Index = 0; Count > Index; Index++) for (ULONG Index = 0; Count > Index; Index++)
{ {
for (ULONG I = 0; Iterations > I; I++) for (ULONG I = 0, N = FileSize / BufferSize; N > I; I++)
{ {
if (CREATE_NEW == CreateDisposition) if (CREATE_NEW == CreateDisposition)
{ {
for (ULONG J = 0; SystemInfo.dwPageSize > J; J++) for (ULONG J = 0; BufferSize > J; J++)
MappedView[J] = 0; MappedView[I * BufferSize + J] = 0;
} }
else else
{ {
ULONG Total = 0; ULONG Total = 0;
for (ULONG J = 0; SystemInfo.dwPageSize > J; J++) for (ULONG J = 0; BufferSize > J; J++)
Total += MappedView[J]; Total += MappedView[I * BufferSize + J];
ASSERT(0 == Total); ASSERT(0 == Total);
} }
} }
@ -258,11 +325,17 @@ static void mmap_dotest(ULONG CreateDisposition, ULONG CreateFlags, ULONG Count)
} }
static void mmap_write_test(void) static void mmap_write_test(void)
{ {
mmap_dotest(CREATE_NEW, 0, OptMmapCount); SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
mmap_dotest(CREATE_NEW, 0,
OptMmapFileSize, SystemInfo.dwPageSize, OptMmapCount);
} }
static void mmap_read_test(void) static void mmap_read_test(void)
{ {
mmap_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, OptMmapCount); SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
mmap_dotest(OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE,
OptMmapFileSize, SystemInfo.dwPageSize, OptMmapCount);
} }
static void mmap_tests(void) static void mmap_tests(void)
{ {
@ -278,7 +351,6 @@ static void mmap_tests(void)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
TESTSUITE(file_tests); TESTSUITE(file_tests);
TESTSUITE(dir_tests);
TESTSUITE(rdwr_tests); TESTSUITE(rdwr_tests);
TESTSUITE(mmap_tests); TESTSUITE(mmap_tests);