[PATCH v3 7/8] kernel32/tests: Add some tests for completion ports.

Zebediah Figura z.figura12 at gmail.com
Sun Sep 30 16:59:48 CDT 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/kernel32/tests/file.c | 111 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 111 insertions(+)

diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 33cae4b..eb27d55 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -60,6 +60,7 @@ static NTSTATUS (WINAPI *pNtCreateFile)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES
 static BOOL (WINAPI *pRtlDosPathNameToNtPathName_U)(LPCWSTR, PUNICODE_STRING, PWSTR*, CURDIR*);
 static NTSTATUS (WINAPI *pRtlAnsiStringToUnicodeString)(PUNICODE_STRING, PCANSI_STRING, BOOLEAN);
 static BOOL (WINAPI *pSetFileInformationByHandle)(HANDLE, FILE_INFO_BY_HANDLE_CLASS, void*, DWORD);
+static BOOL (WINAPI *pGetQueuedCompletionStatusEx)(HANDLE, OVERLAPPED_ENTRY*, ULONG, ULONG*, DWORD, BOOL);
 
 static const char filename[] = "testfile.xxx";
 static const char sillytext[] =
@@ -105,6 +106,7 @@ static void InitFunctionPointers(void)
     pGetFinalPathNameByHandleA = (void *) GetProcAddress(hkernel32, "GetFinalPathNameByHandleA");
     pGetFinalPathNameByHandleW = (void *) GetProcAddress(hkernel32, "GetFinalPathNameByHandleW");
     pSetFileInformationByHandle = (void *) GetProcAddress(hkernel32, "SetFileInformationByHandle");
+    pGetQueuedCompletionStatusEx = (void *) GetProcAddress(hkernel32, "GetQueuedCompletionStatusEx");
 }
 
 static void test__hread( void )
@@ -4988,6 +4990,114 @@ static void test_GetFileAttributesExW(void)
     ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
 }
 
+static void test_post_completion(void)
+{
+    OVERLAPPED ovl, ovl2, *povl;
+    OVERLAPPED_ENTRY entries[2];
+    ULONG_PTR key;
+    HANDLE port;
+    ULONG count;
+    DWORD size;
+    BOOL ret;
+
+    port = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 999, 0 );
+    ok(port != NULL, "CreateIoCompletionPort failed: %u\n", GetLastError());
+
+    ret = GetQueuedCompletionStatus( port, &size, &key, &povl, 0 );
+    ok(!ret, "GetQueuedCompletionStatus succeeded\n");
+    ok(GetLastError() == WAIT_TIMEOUT, "wrong error %u\n", GetLastError());
+
+    ret = PostQueuedCompletionStatus( port, 123, 456, &ovl );
+    ok(ret, "PostQueuedCompletionStatus failed: %u\n", GetLastError());
+
+    ret = GetQueuedCompletionStatus( port, &size, &key, &povl, 0 );
+    ok(ret, "GetQueuedCompletionStatus failed: %u\n", GetLastError());
+    ok(size == 123, "wrong size %u\n", size);
+    ok(key == 456, "wrong key %lu\n", key);
+    ok(povl == &ovl, "wrong ovl %p\n", povl);
+
+    ret = GetQueuedCompletionStatus( port, &size, &key, &povl, 0 );
+    ok(!ret, "GetQueuedCompletionStatus succeeded\n");
+    ok(GetLastError() == WAIT_TIMEOUT, "wrong error %u\n", GetLastError());
+
+    if (!pGetQueuedCompletionStatusEx)
+    {
+        skip("GetQueuedCompletionStatusEx not available\n");
+        CloseHandle( port );
+        return;
+    }
+
+    count = 0xdeadbeef;
+    ret = pGetQueuedCompletionStatusEx( port, entries, 2, &count, 0, FALSE );
+    ok(!ret, "GetQueuedCompletionStatusEx succeeded\n");
+    ok(GetLastError() == WAIT_TIMEOUT, "wrong error %u\n", GetLastError());
+    ok(count == 1, "wrong count %u\n", count);
+
+    ret = PostQueuedCompletionStatus( port, 123, 456, &ovl );
+    ok(ret, "PostQueuedCompletionStatus failed: %u\n", GetLastError());
+
+    count = 0xdeadbeef;
+    memset( entries, 0xcc, sizeof(entries) );
+    ret = pGetQueuedCompletionStatusEx( port, entries, 2, &count, 0, FALSE );
+    ok(ret, "GetQueuedCompletionStatusEx failed\n");
+    ok(count == 1, "wrong count %u\n", count);
+    ok(entries[0].lpCompletionKey == 456, "wrong key %lu\n", entries[0].lpCompletionKey);
+    ok(entries[0].lpOverlapped == &ovl, "wrong ovl %p\n", entries[0].lpOverlapped);
+    ok(!(ULONG)entries[0].Internal, "wrong internal %#x\n", (ULONG)entries[0].Internal);
+    ok(entries[0].dwNumberOfBytesTransferred == 123, "wrong size %u\n", entries[0].dwNumberOfBytesTransferred);
+
+    ret = PostQueuedCompletionStatus( port, 123, 456, &ovl );
+    ok(ret, "PostQueuedCompletionStatus failed: %u\n", GetLastError());
+
+    ret = PostQueuedCompletionStatus( port, 654, 321, &ovl2 );
+    ok(ret, "PostQueuedCompletionStatus failed: %u\n", GetLastError());
+
+    count = 0xdeadbeef;
+    memset( entries, 0xcc, sizeof(entries) );
+    ret = pGetQueuedCompletionStatusEx( port, entries, 2, &count, 0, FALSE );
+    ok(ret, "GetQueuedCompletionStatusEx failed\n");
+    ok(count == 2, "wrong count %u\n", count);
+    ok(entries[0].lpCompletionKey == 456, "wrong key %lu\n", entries[0].lpCompletionKey);
+    ok(entries[0].lpOverlapped == &ovl, "wrong ovl %p\n", entries[0].lpOverlapped);
+    ok(!(ULONG)entries[0].Internal, "wrong internal %#x\n", (ULONG)entries[0].Internal);
+    ok(entries[0].dwNumberOfBytesTransferred == 123, "wrong size %u\n", entries[0].dwNumberOfBytesTransferred);
+    ok(entries[1].lpCompletionKey == 321, "wrong key %lu\n", entries[1].lpCompletionKey);
+    ok(entries[1].lpOverlapped == &ovl2, "wrong ovl %p\n", entries[1].lpOverlapped);
+    ok(!(ULONG)entries[1].Internal, "wrong internal %#x\n", (ULONG)entries[1].Internal);
+    ok(entries[1].dwNumberOfBytesTransferred == 654, "wrong size %u\n", entries[1].dwNumberOfBytesTransferred);
+
+    user_apc_ran = FALSE;
+    QueueUserAPC( user_apc, GetCurrentThread(), 0 );
+
+    ret = pGetQueuedCompletionStatusEx( port, entries, 2, &count, 0, FALSE );
+    ok(!ret, "GetQueuedCompletionStatusEx succeeded\n");
+    ok(GetLastError() == WAIT_TIMEOUT, "wrong error %u\n", GetLastError());
+    ok(count == 1, "wrong count %u\n", count);
+    ok(!user_apc_ran, "user APC should not have run\n");
+
+    ret = pGetQueuedCompletionStatusEx( port, entries, 2, &count, 0, TRUE );
+    ok(!ret || broken(ret) /* Vista */, "GetQueuedCompletionStatusEx succeeded\n");
+    if (!ret)
+        ok(GetLastError() == WAIT_IO_COMPLETION, "wrong error %u\n", GetLastError());
+    ok(count == 1, "wrong count %u\n", count);
+    ok(user_apc_ran, "user APC should have run\n");
+
+    user_apc_ran = FALSE;
+    QueueUserAPC( user_apc, GetCurrentThread(), 0 );
+
+    ret = PostQueuedCompletionStatus( port, 123, 456, &ovl );
+    ok(ret, "PostQueuedCompletionStatus failed: %u\n", GetLastError());
+
+    ret = pGetQueuedCompletionStatusEx( port, entries, 2, &count, 0, TRUE );
+    ok(ret, "GetQueuedCompletionStatusEx failed\n");
+    ok(count == 1, "wrong count %u\n", count);
+    ok(!user_apc_ran, "user APC should not have run\n");
+
+    SleepEx(0, TRUE);
+
+    CloseHandle( port );
+}
+
 START_TEST(file)
 {
     InitFunctionPointers();
@@ -5046,4 +5156,5 @@ START_TEST(file)
     test_GetFinalPathNameByHandleW();
     test_SetFileInformationByHandle();
     test_GetFileAttributesExW();
+    test_post_completion();
 }
-- 
2.7.4




More information about the wine-devel mailing list