Adam Martinson : kernel32/tests: Add tests for closing named pipes with CloseHandle.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 23 09:59:46 CST 2015


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

Author: Adam Martinson <adam.r.martinson at gmail.com>
Date:   Mon Nov 23 07:22:27 2015 +0100

kernel32/tests: Add tests for closing named pipes with CloseHandle.

Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/pipe.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 93 insertions(+)

diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index ae09ef6..7ce6ae3 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -1384,6 +1384,98 @@ static void test_CreatePipe(void)
     SleepEx(0, TRUE); /* get rid of apc */
 }
 
+static void test_CloseHandle(void)
+{
+    static const char testdata[] = "Hello World";
+    HANDLE hpipe, hfile;
+    char buffer[32];
+    DWORD numbytes;
+    BOOL ret;
+
+    hpipe = CreateNamedPipeA(PIPENAME, PIPE_ACCESS_DUPLEX,
+                             PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
+                             1, 1024, 1024, NMPWAIT_USE_DEFAULT_WAIT, NULL);
+    ok(hpipe != INVALID_HANDLE_VALUE, "CreateNamedPipe failed with %u\n", GetLastError());
+
+    hfile = CreateFileA(PIPENAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
+    ok(hfile != INVALID_HANDLE_VALUE, "CreateFile failed with %u\n", GetLastError());
+
+    numbytes = 0xdeadbeef;
+    ret = WriteFile(hpipe, testdata, sizeof(testdata), &numbytes, NULL);
+    ok(ret, "WriteFile failed with %u\n", GetLastError());
+    ok(numbytes == sizeof(testdata), "expected sizeof(testdata), got %u\n", numbytes);
+
+    numbytes = 0xdeadbeef;
+    ret = PeekNamedPipe(hfile, NULL, 0, NULL, &numbytes, NULL);
+    ok(ret, "PeekNamedPipe failed with %u\n", GetLastError());
+    ok(numbytes == sizeof(testdata), "expected sizeof(testdata), got %u\n", numbytes);
+
+    ret = CloseHandle(hpipe);
+    ok(ret, "CloseHandle failed with %u\n", GetLastError());
+
+    numbytes = 0xdeadbeef;
+    memset(buffer, 0, sizeof(buffer));
+    ret = ReadFile(hfile, buffer, 0, &numbytes, NULL);
+    todo_wine ok(ret, "ReadFile failed with %u\n", GetLastError());
+    ok(numbytes == 0, "expected 0, got %u\n", numbytes);
+
+    numbytes = 0xdeadbeef;
+    memset(buffer, 0, sizeof(buffer));
+    ret = ReadFile(hfile, buffer, sizeof(buffer), &numbytes, NULL);
+    ok(ret, "ReadFile failed with %u\n", GetLastError());
+    ok(numbytes == sizeof(testdata), "expected sizeof(testdata), got %u\n", numbytes);
+
+    SetLastError(0xdeadbeef);
+    ret = ReadFile(hfile, buffer, 0, &numbytes, NULL);
+    ok(!ret, "ReadFile unexpectedly succeeded\n");
+    ok(GetLastError() == ERROR_BROKEN_PIPE, "expected ERROR_BROKEN_PIPE, got %u\n", GetLastError());
+
+    CloseHandle(hfile);
+
+    /* repeat test with hpipe <-> hfile swapped */
+
+    hpipe = CreateNamedPipeA(PIPENAME, PIPE_ACCESS_DUPLEX,
+                             PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
+                             1, 1024, 1024, NMPWAIT_USE_DEFAULT_WAIT, NULL);
+    ok(hpipe != INVALID_HANDLE_VALUE, "CreateNamedPipe failed with %u\n", GetLastError());
+
+    hfile = CreateFileA(PIPENAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
+    ok(hfile != INVALID_HANDLE_VALUE, "CreateFile failed with %u\n", GetLastError());
+
+    numbytes = 0xdeadbeef;
+    ret = WriteFile(hfile, testdata, sizeof(testdata), &numbytes, NULL);
+    ok(ret, "WriteFile failed with %u\n", GetLastError());
+    ok(numbytes == sizeof(testdata), "expected sizeof(testdata), got %u\n", numbytes);
+
+    numbytes = 0xdeadbeef;
+    ret = PeekNamedPipe(hpipe, NULL, 0, NULL, &numbytes, NULL);
+    ok(ret, "PeekNamedPipe failed with %u\n", GetLastError());
+    ok(numbytes == sizeof(testdata), "expected sizeof(testdata), got %u\n", numbytes);
+
+    ret = CloseHandle(hfile);
+    ok(ret, "CloseHandle failed with %u\n", GetLastError());
+
+    numbytes = 0xdeadbeef;
+    memset(buffer, 0, sizeof(buffer));
+    ret = ReadFile(hpipe, buffer, 0, &numbytes, NULL);
+    todo_wine ok(ret || broken(GetLastError() == ERROR_MORE_DATA) /* >= Win 8 */,
+                 "ReadFile failed with %u\n", GetLastError());
+    ok(numbytes == 0, "expected 0, got %u\n", numbytes);
+
+    numbytes = 0xdeadbeef;
+    memset(buffer, 0, sizeof(buffer));
+    ret = ReadFile(hpipe, buffer, sizeof(buffer), &numbytes, NULL);
+    ok(ret, "ReadFile failed with %u\n", GetLastError());
+    ok(numbytes == sizeof(testdata), "expected sizeof(testdata), got %u\n", numbytes);
+
+    SetLastError(0xdeadbeef);
+    ret = ReadFile(hpipe, buffer, 0, &numbytes, NULL);
+    ok(!ret, "ReadFile unexpectedly succeeded\n");
+    ok(GetLastError() == ERROR_BROKEN_PIPE, "expected ERROR_BROKEN_PIPE, got %u\n", GetLastError());
+
+    CloseHandle(hpipe);
+}
+
 struct named_pipe_client_params
 {
     DWORD security_flags;
@@ -2175,6 +2267,7 @@ START_TEST(pipe)
     test_CreateNamedPipe(PIPE_TYPE_BYTE);
     test_CreateNamedPipe(PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE);
     test_CreatePipe();
+    test_CloseHandle();
     test_impersonation();
     test_overlapped();
     test_NamedPipeHandleState();




More information about the wine-cvs mailing list