[1/2] kernel32/tests: Add tests for calling wait functions with pseudo handles.
Sebastian Lackner
sebastian at fds-team.de
Wed Nov 25 18:46:24 CST 2015
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
dlls/kernel32/tests/sync.c | 59 ++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 53 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c
index 4ac6a99..7d714d0 100644
--- a/dlls/kernel32/tests/sync.c
+++ b/dlls/kernel32/tests/sync.c
@@ -59,6 +59,7 @@ static BOOLEAN (WINAPI *pTryAcquireSRWLockShared)(PSRWLOCK);
static NTSTATUS (WINAPI *pNtAllocateVirtualMemory)(HANDLE, PVOID *, ULONG, SIZE_T *, ULONG, ULONG);
static NTSTATUS (WINAPI *pNtFreeVirtualMemory)(HANDLE, PVOID *, SIZE_T *, ULONG);
+static NTSTATUS (WINAPI *pNtWaitForSingleObject)(HANDLE, BOOLEAN, const LARGE_INTEGER *);
static NTSTATUS (WINAPI *pNtWaitForMultipleObjects)(ULONG,const HANDLE*,BOOLEAN,BOOLEAN,const LARGE_INTEGER*);
static void test_signalandwait(void)
@@ -1075,6 +1076,8 @@ static HANDLE modify_handle(HANDLE handle, DWORD modify)
static void test_WaitForSingleObject(void)
{
HANDLE signaled, nonsignaled, invalid;
+ LARGE_INTEGER timeout;
+ NTSTATUS status;
DWORD ret;
signaled = CreateEventW(NULL, TRUE, TRUE, NULL);
@@ -1144,12 +1147,29 @@ static void test_WaitForSingleObject(void)
ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %d\n", ret);
ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
+ /* pseudo handles are allowed in WaitForSingleObject and NtWaitForSingleObject */
+ ret = WaitForSingleObject(GetCurrentProcess(), 100);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %u\n", ret);
+
+ ret = WaitForSingleObject(GetCurrentThread(), 100);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %u\n", ret);
+
+ timeout.QuadPart = -1000000;
+ status = pNtWaitForSingleObject(GetCurrentProcess(), FALSE, &timeout);
+ ok(status == STATUS_TIMEOUT, "expected STATUS_TIMEOUT, got %08x\n", status);
+
+ timeout.QuadPart = -1000000;
+ status = pNtWaitForSingleObject(GetCurrentThread(), FALSE, &timeout);
+ ok(status == STATUS_TIMEOUT, "expected STATUS_TIMEOUT, got %08x\n", status);
+
CloseHandle(signaled);
CloseHandle(nonsignaled);
}
static void test_WaitForMultipleObjects(void)
{
+ LARGE_INTEGER timeout;
+ NTSTATUS status;
DWORD r;
int i;
HANDLE maxevents[MAXIMUM_WAIT_OBJECTS];
@@ -1180,20 +1200,46 @@ static void test_WaitForMultipleObjects(void)
SetEvent(maxevents[i]);
/* a manual-reset event remains signaled, an auto-reset event is cleared */
- r = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL);
- ok( r == WAIT_OBJECT_0, "should signal lowest handle first, got %d\n", r);
- r = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL);
- ok( r == WAIT_OBJECT_0, "should signal handle #0 first, got %d\n", r);
+ status = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL);
+ ok(status == STATUS_WAIT_0, "should signal lowest handle first, got %08x\n", status);
+ status = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL);
+ ok(status == STATUS_WAIT_0, "should signal handle #0 first, got %08x\n", status);
ok(ResetEvent(maxevents[0]), "ResetEvent\n");
for (i=1; i<MAXIMUM_WAIT_OBJECTS; i++)
{
/* the lowest index is checked first and remaining events are untouched */
- r = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL);
- ok( r == WAIT_OBJECT_0+i, "should signal handle #%d first, got %d\n", i, r);
+ status = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL);
+ ok(status == STATUS_WAIT_0 + i, "should signal handle #%d first, got %08x\n", i, status);
}
for (i=0; i<MAXIMUM_WAIT_OBJECTS; i++)
if (maxevents[i]) CloseHandle(maxevents[i]);
+
+ /* in contrast to WaitForSingleObject, pseudo handles are not allowed in
+ * WaitForMultipleObjects and NtWaitForMultipleObjects */
+ maxevents[0] = GetCurrentProcess();
+ SetLastError(0xdeadbeef);
+ r = WaitForMultipleObjects(1, maxevents, FALSE, 100);
+ todo_wine ok(r == WAIT_FAILED, "expected WAIT_FAILED, got %u\n", r);
+ todo_wine ok(GetLastError() == ERROR_INVALID_HANDLE,
+ "expected ERROR_INVALID_HANDLE, got %u\n", GetLastError());
+
+ maxevents[0] = GetCurrentThread();
+ SetLastError(0xdeadbeef);
+ r = WaitForMultipleObjects(1, maxevents, FALSE, 100);
+ todo_wine ok(r == WAIT_FAILED, "expected WAIT_FAILED, got %u\n", r);
+ todo_wine ok(GetLastError() == ERROR_INVALID_HANDLE,
+ "expected ERROR_INVALID_HANDLE, got %u\n", GetLastError());
+
+ timeout.QuadPart = -1000000;
+ maxevents[0] = GetCurrentProcess();
+ status = pNtWaitForMultipleObjects(1, maxevents, TRUE, FALSE, &timeout);
+ todo_wine ok(status == STATUS_INVALID_HANDLE, "expected STATUS_INVALID_HANDLE, got %08x\n", status);
+
+ timeout.QuadPart = -1000000;
+ maxevents[0] = GetCurrentThread();
+ status = pNtWaitForMultipleObjects(1, maxevents, TRUE, FALSE, &timeout);
+ todo_wine ok(status == STATUS_INVALID_HANDLE, "expected STATUS_INVALID_HANDLE, got %08x\n", status);
}
static BOOL g_initcallback_ret, g_initcallback_called;
@@ -2526,6 +2572,7 @@ START_TEST(sync)
pTryAcquireSRWLockShared = (void *)GetProcAddress(hdll, "TryAcquireSRWLockShared");
pNtAllocateVirtualMemory = (void *)GetProcAddress(hntdll, "NtAllocateVirtualMemory");
pNtFreeVirtualMemory = (void *)GetProcAddress(hntdll, "NtFreeVirtualMemory");
+ pNtWaitForSingleObject = (void *)GetProcAddress(hntdll, "NtWaitForSingleObject");
pNtWaitForMultipleObjects = (void *)GetProcAddress(hntdll, "NtWaitForMultipleObjects");
argc = winetest_get_mainargs( &argv );
--
2.6.2
More information about the wine-patches
mailing list