tst: winfsp-tests: oplock testing

This commit is contained in:
Bill Zissimopoulos 2016-11-23 16:11:24 -08:00
parent a894e4a2af
commit 1d3423d5fb

View File

@ -128,18 +128,27 @@ static VOID RequestOplock(PWSTR FileName, ULONG RequestCode, ULONG BreakCode, HA
ASSERT(Success); ASSERT(Success);
} }
static void oplock_dotest(ULONG Flags, PWSTR Prefix, static void oplock_dotest2(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout,
ULONG RequestCode, ULONG BreakCode, ULONG WaitFlags) ULONG RequestCode, ULONG BreakCode, ULONG WaitFlags,
ULONG CreateFlags)
{ {
void *memfs = memfs_start(Flags); void *memfs = memfs_start_ex(Flags, FileInfoTimeout);
HANDLE Semaphore; HANDLE Semaphore;
HANDLE Handle; HANDLE Handle;
BOOLEAN Success; BOOLEAN Success;
WCHAR FilePath[MAX_PATH]; WCHAR FilePath[MAX_PATH];
SYSTEM_INFO SystemInfo;
PVOID Buffer;
ULONG BufferSize;
DWORD BytesTransferred; DWORD BytesTransferred;
DWORD WaitResult; DWORD WaitResult;
GetSystemInfo(&SystemInfo);
BufferSize = 16 * SystemInfo.dwPageSize;
Buffer = _aligned_malloc(BufferSize, BufferSize);
ASSERT(0 != Buffer);
Semaphore = CreateSemaphoreW(0, 0, 2, 0); Semaphore = CreateSemaphoreW(0, 0, 2, 0);
ASSERT(0 != Semaphore); ASSERT(0 != Semaphore);
@ -156,7 +165,7 @@ static void oplock_dotest(ULONG Flags, PWSTR Prefix,
Handle = CreateFileW(FilePath, Handle = CreateFileW(FilePath,
GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
OPEN_EXISTING, 0, 0); OPEN_EXISTING, CreateFlags, 0);
ASSERT(INVALID_HANDLE_VALUE != Handle); ASSERT(INVALID_HANDLE_VALUE != Handle);
if (WaitFlags & 1) if (WaitFlags & 1)
@ -172,8 +181,20 @@ static void oplock_dotest(ULONG Flags, PWSTR Prefix,
ASSERT(WAIT_TIMEOUT == WaitResult); ASSERT(WAIT_TIMEOUT == WaitResult);
} }
Success = WriteFile(Handle, L"foobar", 6, &BytesTransferred, 0); if (FILE_FLAG_OVERLAPPED & CreateFlags)
ASSERT(Success); {
OVERLAPPED Overlapped;
memset(&Overlapped, 0, sizeof Overlapped);
Success = WriteFile(Handle, Buffer, BufferSize, &BytesTransferred, &Overlapped);
ASSERT(Success || ERROR_IO_PENDING == GetLastError());
Success = GetOverlappedResult(Handle, &Overlapped, &BytesTransferred, TRUE);
ASSERT(Success);
}
else
{
Success = WriteFile(Handle, Buffer, BufferSize, &BytesTransferred, 0);
ASSERT(Success);
}
if (WaitFlags & 2) if (WaitFlags & 2)
{ {
@ -195,9 +216,27 @@ static void oplock_dotest(ULONG Flags, PWSTR Prefix,
Success = CloseHandle(Semaphore); Success = CloseHandle(Semaphore);
ASSERT(Success); ASSERT(Success);
_aligned_free(Buffer);
memfs_stop(memfs); memfs_stop(memfs);
} }
static void oplock_dotest(ULONG Flags, PWSTR Prefix,
ULONG RequestCode, ULONG BreakCode, ULONG WaitFlags)
{
oplock_dotest2(Flags, Prefix, 0, RequestCode, BreakCode, WaitFlags, 0);
oplock_dotest2(Flags, Prefix, 0, RequestCode, BreakCode, WaitFlags, FILE_FLAG_NO_BUFFERING);
oplock_dotest2(Flags, Prefix, 0, RequestCode, BreakCode, WaitFlags, FILE_FLAG_OVERLAPPED);
oplock_dotest2(Flags, Prefix, 0, RequestCode, BreakCode, WaitFlags, FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING);
if (-1 != Flags)
{
oplock_dotest2(Flags, Prefix, INFINITE, RequestCode, BreakCode, WaitFlags, 0);
oplock_dotest2(Flags, Prefix, INFINITE, RequestCode, BreakCode, WaitFlags, FILE_FLAG_NO_BUFFERING);
oplock_dotest2(Flags, Prefix, INFINITE, RequestCode, BreakCode, WaitFlags, FILE_FLAG_OVERLAPPED);
oplock_dotest2(Flags, Prefix, INFINITE, RequestCode, BreakCode, WaitFlags, FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING);
}
}
static void oplock_level1_test(void) static void oplock_level1_test(void)
{ {
if (OptShareName || OptOplock) if (OptShareName || OptOplock)