[PATCH] ntdll/tests: Add basic tests for NtSetInformationThread(), class ThreadAffinityMask
Roger Zoellner
zoellner.roger at gmail.com
Sun Sep 9 13:16:01 CDT 2018
Related to https://source.winehq.org/patches/data/150818
---
dlls/ntdll/tests/Makefile.in | 1 +
dlls/ntdll/tests/thread.c | 83 ++++++++++++++++++++++++++++++++++++
2 files changed, 84 insertions(+)
create mode 100644 dlls/ntdll/tests/thread.c
diff --git a/dlls/ntdll/tests/Makefile.in b/dlls/ntdll/tests/Makefile.in
index 5c70f3f01a..26b7f8cd09 100644
--- a/dlls/ntdll/tests/Makefile.in
+++ b/dlls/ntdll/tests/Makefile.in
@@ -22,4 +22,5 @@ C_SRCS = \
rtlstr.c \
string.c \
threadpool.c \
+ thread.c \
time.c
diff --git a/dlls/ntdll/tests/thread.c b/dlls/ntdll/tests/thread.c
new file mode 100644
index 0000000000..740d64fff5
--- /dev/null
+++ b/dlls/ntdll/tests/thread.c
@@ -0,0 +1,83 @@
+/*
+ * Unit test suite for ntdll thread functions
+ *
+ * Copyright 2018 Roger Zoellner
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "ntdll_test.h"
+
+static NTSTATUS (WINAPI *pNtSetInformationThread)(HANDLE handle, THREADINFOCLASS class, LPCVOID data, ULONG length);
+
+static DWORD WINAPI thread_main(LPVOID lpParam)
+{
+ /* Thread is created with CREATE_SUSPENDED flag set and isn't doing anything */
+}
+
+static void test_NtSetInformationThread(HANDLE thread)
+{
+ /* class ThreadAffinityMask */
+ THREADINFOCLASS class = ThreadAffinityMask;
+ DWORD_PTR req_aff;
+ ULONG req_aff_length = sizeof(req_aff);
+ NTSTATUS status;
+
+ HANDLE process = GetCurrentProcess();
+ DWORD_PTR system_aff;
+ DWORD_PTR process_aff;
+ BOOL success = GetProcessAffinityMask(process, &process_aff, &system_aff);
+ ok(success == TRUE, "GetProcessAffinityMask failed. Expected TRUE, got FALSE\n");
+
+ if (success == FALSE) return;
+
+ /* Test required affinity mask, no bits set */
+ req_aff = 0;
+ status = pNtSetInformationThread(thread, class, &req_aff, req_aff_length);
+ ok(status == STATUS_INVALID_PARAMETER, "NtSetInformationThread failed. Expected STATUS_INVALID_PARAMETER, got %08x (class=ThreadAffinityMask, case 1, req_aff=%08x, process_aff=%08x)\n", status, req_aff, process_aff);
+
+ /* Test required affinity mask, all bits set */
+ req_aff = ~0u;
+ status = pNtSetInformationThread(thread, class, &req_aff, req_aff_length);
+ ok(status == STATUS_SUCCESS, "NtSetInformationThread failed. Expected STATUS_SUCCESS, got %08x (class=ThreadAffinityMask, case 2, req_aff=%08x, process_aff=%08x)\n", status, req_aff, process_aff);
+
+ /* Test required affinity mask = process affinity mask */
+ req_aff = process_aff;
+ status = pNtSetInformationThread(thread, class, &req_aff, req_aff_length);
+ ok(status == STATUS_SUCCESS, "NtSetInformationThread failed. Expected STATUS_SUCCESS, got %08x (class=ThreadAffinityMask, case 3, req_aff=%08x, process_aff=%08x)\n", status, req_aff, process_aff);
+
+ /* Test required affinity mask = process affinity mask with a prepended bit set */
+ req_aff = (process_aff << 1) | process_aff;
+ status = pNtSetInformationThread(thread, class, &req_aff, req_aff_length);
+ ok(status == STATUS_SUCCESS, "NtSetInformationThread failed. Expected STATUS_SUCCESS, got %08x (class=ThreadAffinityMask, case 4, req_aff=%08x, process_aff=%08x)\n", status, req_aff, process_aff);
+}
+
+START_TEST(thread)
+{
+ HMODULE mod = GetModuleHandleA("ntdll.dll");
+ pNtSetInformationThread = (void *) GetProcAddress(mod ,"NtSetInformationThread");
+ HANDLE thread;
+
+ thread = CreateThread(NULL, 0, thread_main, NULL, CREATE_SUSPENDED, NULL);
+ ok(thread != NULL, "dlls/ntdll/tests/: Could not create new thread\n");
+
+ if (thread != NULL)
+ {
+ test_NtSetInformationThread(thread);
+ TerminateThread(thread, 0);
+ CloseHandle(thread);
+ }
+}
+
--
2.18.0
More information about the wine-devel
mailing list