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

Alexandre Julliard julliard at winehq.org
Mon Nov 26 16:20:11 CST 2018


Module: wine
Branch: master
Commit: 0bef15b96522f1c50e235e8ad97273d34e28c625
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0bef15b96522f1c50e235e8ad97273d34e28c625

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Sat Nov 24 22:34:43 2018 -0600

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

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/tests/driver.c | 116 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 116 insertions(+)

diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 68b6730..07a0adb 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -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)




More information about the wine-cvs mailing list