[v2 PATCH 1/2] ntdll/tests: Add some tests for thread suspend/resume.

Nikolay Sivov nsivov at codeweavers.com
Fri Apr 12 02:51:21 CDT 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/ntdll/tests/exception.c | 57 ++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index accb5d8646..b7bf2748b5 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -3135,6 +3135,61 @@ static void test_vectored_continue_handler(void)
 }
 #endif /* defined(__i386__) || defined(__x86_64__) */
 
+static DWORD WINAPI suspend_thread_test( void *arg )
+{
+    HANDLE event = arg;
+    WaitForSingleObject(event, INFINITE);
+    return 0;
+}
+
+static void test_suspend_thread(void)
+{
+    HANDLE thread, event;
+    NTSTATUS status;
+    ULONG count;
+    DWORD ret;
+
+    status = NtSuspendThread(0, NULL);
+    ok(status == STATUS_INVALID_HANDLE, "Unexpected return value %#x.\n", status);
+
+    status = NtResumeThread(0, NULL);
+    ok(status == STATUS_INVALID_HANDLE, "Unexpected return value %#x.\n", status);
+
+    event = CreateEventW(NULL, FALSE, FALSE, NULL);
+
+    thread = CreateThread(NULL, 0, suspend_thread_test, event, 0, NULL);
+    ok(thread != NULL, "Failed to create a thread.\n");
+
+    ret = WaitForSingleObject(thread, 0);
+    ok(ret == WAIT_TIMEOUT, "Unexpected status %d.\n", ret);
+
+    status = NtResumeThread(thread, NULL);
+    ok(!status, "Unexpected status %#x.\n", status);
+
+    status = NtResumeThread(thread, &count);
+    ok(!status, "Unexpected status %#x.\n", status);
+    ok(count == 0, "Unexpected suspended count %u.\n", count);
+
+    status = NtSuspendThread(thread, NULL);
+    ok(!status, "Failed to suspend a thread, status %#x.\n", status);
+
+    status = NtSuspendThread(thread, &count);
+    ok(!status, "Failed to suspend a thread, status %#x.\n", status);
+    ok(count == 1, "Unexpected suspended count %u.\n", count);
+
+    status = NtResumeThread(thread, &count);
+    ok(!status, "Failed to resume a thread, status %#x.\n", status);
+    ok(count == 2, "Unexpected suspended count %u.\n", count);
+
+    status = NtResumeThread(thread, NULL);
+    ok(!status, "Failed to resume a thread, status %#x.\n", status);
+
+    SetEvent(event);
+    WaitForSingleObject(thread, INFINITE);
+
+    CloseHandle(thread);
+}
+
 START_TEST(exception)
 {
     HMODULE hntdll = GetModuleHandleA("ntdll.dll");
@@ -3253,6 +3308,7 @@ START_TEST(exception)
     test_dpe_exceptions();
     test_prot_fault();
     test_thread_context();
+    test_suspend_thread();
 
 #elif defined(__x86_64__)
     pRtlAddFunctionTable               = (void *)GetProcAddress( hntdll,
@@ -3294,6 +3350,7 @@ START_TEST(exception)
     test_prot_fault();
     test_dpe_exceptions();
     test_wow64_context();
+    test_suspend_thread();
 
     if (pRtlAddFunctionTable && pRtlDeleteFunctionTable && pRtlInstallFunctionTableCallback && pRtlLookupFunctionEntry)
       test_dynamic_unwind();
-- 
2.20.1




More information about the wine-devel mailing list