Huw Davies : kernel32: Overlapped pipe tests.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 16 08:23:39 CDT 2007


Module: wine
Branch: master
Commit: e59a947c8860a07db11b047a75d897d2a0007217
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e59a947c8860a07db11b047a75d897d2a0007217

Author: Huw Davies <huw at codeweavers.com>
Date:   Mon Jul 16 12:12:18 2007 +0100

kernel32: Overlapped pipe tests.

---

 dlls/kernel32/tests/pipe.c |   85 +++++++++++++++++++++++++++++++++++++++----
 1 files changed, 77 insertions(+), 8 deletions(-)

diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index 1850e77..ccb72ba 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -1257,6 +1257,82 @@ static void test_impersonation(void)
     CloseHandle(hClientToken);
 }
 
+struct overlapped_server_args
+{
+    HANDLE pipe_created;
+};
+
+static DWORD CALLBACK overlapped_server(LPVOID arg)
+{
+    OVERLAPPED ol;
+    HANDLE pipe;
+    int ret, err;
+    struct overlapped_server_args *a = (struct overlapped_server_args*)arg;
+    DWORD num;
+    char buf[100];
+
+    pipe = CreateNamedPipeA("\\\\.\\pipe\\my pipe", FILE_FLAG_OVERLAPPED | PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, 1, 0, 0, 100000, NULL);
+    ok(pipe != NULL, "pipe NULL\n");
+
+    ol.hEvent = CreateEventA(0, 1, 0, 0);
+    ok(ol.hEvent != NULL, "event NULL\n");
+    ret = ConnectNamedPipe(pipe, &ol);
+    err = GetLastError();
+    ok(ret == 0, "ret %d\n", ret);
+    ok(err == ERROR_IO_PENDING, "gle %d\n", err);
+    SetEvent(a->pipe_created);
+
+    ret = WaitForSingleObjectEx(ol.hEvent, INFINITE, 1);
+    if(ret == WAIT_IO_COMPLETION)
+        todo_wine ok(ret == WAIT_OBJECT_0, "ret %x\n", ret);
+    else
+        ok(ret == WAIT_OBJECT_0, "ret %x\n", ret);
+
+    ret = GetOverlappedResult(pipe, &ol, &num, 1);
+    ok(ret == 1, "ret %d\n", ret);
+
+    /* This should block */
+    ret = ReadFile(pipe, buf, sizeof(buf), &num, NULL);
+    if(ret == 0)
+        todo_wine ok(ret == 1, "ret %d\n", ret);
+    else
+        ok(ret == 1, "ret %d\n", ret);
+
+    DisconnectNamedPipe(pipe);
+    CloseHandle(ol.hEvent);
+    CloseHandle(pipe);
+    return 1;
+}
+
+static void test_overlapped(void)
+{
+    DWORD tid, num;
+    HANDLE thread, pipe;
+    int ret;
+    struct overlapped_server_args args;
+
+    args.pipe_created = CreateEventA(0, 1, 0, 0);
+    thread = CreateThread(NULL, 0, overlapped_server, &args, 0, &tid);
+
+    WaitForSingleObject(args.pipe_created, INFINITE);
+    pipe = CreateFileA("\\\\.\\pipe\\my pipe", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+    ok(pipe != INVALID_HANDLE_VALUE, "cf failed\n");
+
+    /* Sleep to try to get the ReadFile in the server to occur before the following WriteFile */
+    Sleep(1);
+
+    ret = WriteFile(pipe, "x", 1, &num, NULL);
+    if(ret == 0)
+        todo_wine ok(ret == 1, "ret %d\n", ret);
+    else
+        ok(ret == 1, "ret %d\n", ret);
+
+    WaitForSingleObject(thread, INFINITE);
+    CloseHandle(pipe);
+    CloseHandle(args.pipe_created);
+    CloseHandle(thread);
+}
+
 START_TEST(pipe)
 {
     HMODULE hmod;
@@ -1264,20 +1340,13 @@ START_TEST(pipe)
     hmod = GetModuleHandle("advapi32.dll");
     pDuplicateTokenEx = (void *) GetProcAddress(hmod, "DuplicateTokenEx");
 
-    trace("test 1 of 7:\n");
     if (test_DisconnectNamedPipe())
         return;
-    trace("test 2 of 7:\n");
     test_CreateNamedPipe_instances_must_match();
-    trace("test 3 of 7:\n");
     test_NamedPipe_2();
-    trace("test 4 of 7:\n");
     test_CreateNamedPipe(PIPE_TYPE_BYTE);
-    trace("test 5 of 7\n");
     test_CreateNamedPipe(PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE);
-    trace("test 6 of 7\n");
     test_CreatePipe();
-    trace("test 7 of 7\n");
     test_impersonation();
-    trace("all tests done\n");
+    test_overlapped();
 }




More information about the wine-cvs mailing list