Vincent Povirk : kernel32: Add test for pending ReadFileEx/ WriteFileEx calls.

Alexandre Julliard julliard at winehq.org
Fri Jun 15 13:34:38 CDT 2012


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu Jun 14 14:35:27 2012 -0500

kernel32: Add test for pending ReadFileEx/WriteFileEx calls.

---

 dlls/kernel32/tests/pipe.c |  111 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 111 insertions(+), 0 deletions(-)

diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index 7648f80..64af60331 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -1750,6 +1750,116 @@ static void test_NamedPipeHandleState(void)
     CloseHandle(server);
 }
 
+static void test_readfileex_pending(void)
+{
+    HANDLE server, client, event;
+    BOOL ret;
+    DWORD err, wait, num_bytes;
+    OVERLAPPED overlapped;
+    char read_buf[1024];
+    char write_buf[1024];
+    const char *test_string = "test";
+    int i;
+
+    server = CreateNamedPipe(PIPENAME, FILE_FLAG_OVERLAPPED | PIPE_ACCESS_DUPLEX,
+        /* dwOpenMode */ PIPE_TYPE_BYTE | PIPE_WAIT,
+        /* nMaxInstances */ 1,
+        /* nOutBufSize */ 1024,
+        /* nInBufSize */ 1024,
+        /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT,
+        /* lpSecurityAttrib */ NULL);
+    ok(server != INVALID_HANDLE_VALUE, "cf failed\n");
+
+    event = CreateEventA(NULL, TRUE, FALSE, NULL);
+    ok(event != NULL, "CreateEventA failed\n");
+
+    memset(&overlapped, 0, sizeof(overlapped));
+    overlapped.hEvent = event;
+
+    ret = ConnectNamedPipe(server, &overlapped);
+    err = GetLastError();
+    ok(ret == FALSE, "ConnectNamedPipe succeeded\n");
+    ok(err == ERROR_IO_PENDING, "ConnectNamedPipe set error %i\n", err);
+
+    wait = WaitForSingleObject(event, 0);
+    ok(wait == WAIT_TIMEOUT, "WaitForSingleObject returned %x\n", wait);
+
+    client = CreateFileA(PIPENAME, GENERIC_READ|GENERIC_WRITE, 0, NULL,
+        OPEN_EXISTING, 0, NULL);
+    ok(client != INVALID_HANDLE_VALUE, "cf failed\n");
+
+    wait = WaitForSingleObject(event, 0);
+    ok(wait == WAIT_OBJECT_0, "WaitForSingleObject returned %x\n", wait);
+
+    /* Start a read that can't complete immediately. */
+    completion_called = 0;
+    ResetEvent(event);
+    ret = ReadFileEx(server, read_buf, sizeof(read_buf), &overlapped, completion_routine);
+    todo_wine ok(ret == TRUE, "ReadFileEx failed, err=%i\n", GetLastError());
+    ok(completion_called == 0, "completion routine called before ReadFileEx returned\n");
+
+    ret = WriteFile(client, test_string, sizeof(test_string), &num_bytes, NULL);
+    ok(ret == TRUE, "WriteFile failed\n");
+    ok(num_bytes == sizeof(test_string), "only %i bytes written\n", num_bytes);
+
+    ok(completion_called == 0, "completion routine called during WriteFile\n");
+
+    wait = WaitForSingleObjectEx(event, 0, TRUE);
+    ok(wait == WAIT_IO_COMPLETION || wait == WAIT_OBJECT_0, "WaitForSingleObjectEx returned %x\n", wait);
+
+    ok(completion_called == 1, "completion not called after writing pipe\n");
+    ok(completion_errorcode == 0, "completion called with error %x\n", completion_errorcode);
+    ok(completion_num_bytes == sizeof(test_string), "ReadFileEx returned only %d bytes\n", completion_num_bytes);
+    ok(completion_lpoverlapped == &overlapped, "completion called with wrong overlapped pointer\n");
+    ok(!memcmp(test_string, read_buf, sizeof(test_string)), "ReadFileEx read wrong bytes\n");
+
+    /* Make writes until the pipe is full and the write fails */
+    memset(write_buf, 0xaa, sizeof(write_buf));
+    for (i=0; i<256; i++)
+    {
+        completion_called = 0;
+        ResetEvent(event);
+        ret = WriteFileEx(server, write_buf, sizeof(write_buf), &overlapped, completion_routine);
+        err = GetLastError();
+
+        ok(completion_called == 0, "completion routine called during WriteFileEx\n");
+
+        wait = WaitForSingleObjectEx(event, 0, TRUE);
+
+        if (wait == WAIT_TIMEOUT)
+            /* write couldn't complete immediately, presumably the pipe is full */
+            break;
+
+        ok(wait == WAIT_IO_COMPLETION || wait == WAIT_OBJECT_0, "WaitForSingleObject returned %x\n", wait);
+
+        ok(ret == TRUE, "WriteFileEx failed, err=%i\n", err);
+        ok(completion_errorcode == 0, "completion called with error %x\n", completion_errorcode);
+        ok(completion_lpoverlapped == &overlapped, "completion called with wrong overlapped pointer\n");
+    }
+
+    todo_wine ok(ret == TRUE, "WriteFileEx failed, err=%i\n", err);
+    ok(completion_called == 0, "completion routine called but wait timed out\n");
+    ok(completion_errorcode == 0, "completion called with error %x\n", completion_errorcode);
+    ok(completion_lpoverlapped == &overlapped, "completion called with wrong overlapped pointer\n");
+
+    /* free up some space in the pipe */
+    ret = ReadFile(client, read_buf, sizeof(read_buf), &num_bytes, NULL);
+    ok(ret == TRUE, "ReadFile failed\n");
+
+    ok(completion_called == 0, "completion routine called during ReadFile\n");
+
+    wait = WaitForSingleObjectEx(event, 0, TRUE);
+    ok(wait == WAIT_IO_COMPLETION || wait == WAIT_OBJECT_0, "WaitForSingleObject returned %x\n", wait);
+
+    ok(completion_called == 1, "completion routine not called\n");
+    ok(completion_errorcode == 0, "completion called with error %x\n", completion_errorcode);
+    ok(completion_lpoverlapped == &overlapped, "completion called with wrong overlapped pointer\n");
+
+    CloseHandle(client);
+    CloseHandle(server);
+    CloseHandle(event);
+}
+
 START_TEST(pipe)
 {
     HMODULE hmod;
@@ -1769,4 +1879,5 @@ START_TEST(pipe)
     test_impersonation();
     test_overlapped();
     test_NamedPipeHandleState();
+    test_readfileex_pending();
 }




More information about the wine-cvs mailing list