ntoskrnl.exe/tests: Add some tests for synchronization functions.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2018-11-24 22:34:43 -06:00 committed by Alexandre Julliard
parent 05b278675f
commit 0bef15b965
1 changed files with 116 additions and 0 deletions

View File

@ -210,6 +210,121 @@ static void test_load_driver(void)
ok(!ret, "got %#x\n", ret);
}
static NTSTATUS wait_single(void *obj, ULONGLONG timeout)
{
LARGE_INTEGER integer;
integer.QuadPart = timeout;
return KeWaitForSingleObject(obj, Executive, KernelMode, FALSE, &integer);
}
static NTSTATUS wait_multiple(ULONG count, void *objs[], WAIT_TYPE wait_type, ULONGLONG timeout)
{
LARGE_INTEGER integer;
integer.QuadPart = timeout;
return KeWaitForMultipleObjects(count, objs, wait_type, Executive, KernelMode, FALSE, &integer, NULL);
}
static void test_sync(void)
{
KEVENT manual_event, auto_event;
void *objs[2];
NTSTATUS ret;
KeInitializeEvent(&manual_event, NotificationEvent, FALSE);
ret = wait_single(&manual_event, 0);
ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
KeSetEvent(&manual_event, 0, FALSE);
ret = wait_single(&manual_event, 0);
ok(ret == 0, "got %#x\n", ret);
ret = wait_single(&manual_event, 0);
ok(ret == 0, "got %#x\n", ret);
KeResetEvent(&manual_event);
ret = wait_single(&manual_event, 0);
ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
KeInitializeEvent(&auto_event, SynchronizationEvent, FALSE);
ret = wait_single(&auto_event, 0);
ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
KeSetEvent(&auto_event, 0, FALSE);
ret = wait_single(&auto_event, 0);
ok(ret == 0, "got %#x\n", ret);
ret = wait_single(&auto_event, 0);
ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
KeInitializeEvent(&auto_event, SynchronizationEvent, TRUE);
ret = wait_single(&auto_event, 0);
ok(ret == 0, "got %#x\n", ret);
objs[0] = &manual_event;
objs[1] = &auto_event;
ret = wait_multiple(2, objs, WaitAny, 0);
ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
KeSetEvent(&manual_event, 0, FALSE);
KeSetEvent(&auto_event, 0, FALSE);
ret = wait_multiple(2, objs, WaitAny, 0);
ok(ret == 0, "got %#x\n", ret);
ret = wait_single(&auto_event, 0);
ok(ret == 0, "got %#x\n", ret);
KeResetEvent(&manual_event);
KeSetEvent(&auto_event, 0, FALSE);
ret = wait_multiple(2, objs, WaitAny, 0);
ok(ret == 1, "got %#x\n", ret);
ret = wait_multiple(2, objs, WaitAny, 0);
ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
KeSetEvent(&manual_event, 0, FALSE);
KeSetEvent(&auto_event, 0, FALSE);
ret = wait_multiple(2, objs, WaitAll, 0);
ok(ret == 0, "got %#x\n", ret);
ret = wait_multiple(2, objs, WaitAll, 0);
ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
KeSetEvent(&auto_event, 0, FALSE);
KeResetEvent(&manual_event);
ret = wait_multiple(2, objs, WaitAll, 0);
ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
ret = wait_single(&auto_event, 0);
ok(ret == 0, "got %#x\n", ret);
objs[0] = &auto_event;
objs[1] = &manual_event;
KeSetEvent(&manual_event, 0, FALSE);
KeSetEvent(&auto_event, 0, FALSE);
ret = wait_multiple(2, objs, WaitAny, 0);
ok(ret == 0, "got %#x\n", ret);
ret = wait_multiple(2, objs, WaitAny, 0);
ok(ret == 1, "got %#x\n", ret);
ret = wait_multiple(2, objs, WaitAny, 0);
ok(ret == 1, "got %#x\n", ret);
}
static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
{
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
@ -237,6 +352,7 @@ static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
test_mdl_map();
test_init_funcs();
test_load_driver();
test_sync();
/* print process report */
if (test_input->winetest_debug)