PeekNamedPipe test, take 2

Duane Clark dclark at akamail.com
Sun Apr 25 15:38:21 CDT 2004


This is a much more comprehensive version of the PeekNamedPipe tests. 
Also added are tests of the pipe in message mode. It demonstrates a 
broken behavior of PeekNamedPipe, and broken behavior in message mode 
(byte mode is probably more commonly used than message mode).

Changelog:
	Add testing of PeekNamedPipe, multiple writes, and message mode.



-------------- next part --------------
Index: dlls/kernel/tests/pipe.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/tests/pipe.c,v
retrieving revision 1.9
diff -u -r1.9 pipe.c
--- dlls/kernel/tests/pipe.c	6 Feb 2004 05:24:34 -0000	1.9
+++ dlls/kernel/tests/pipe.c	25 Apr 2004 20:31:42 -0000
@@ -50,18 +50,24 @@
 
 #define PIPENAME "\\\\.\\PiPe\\tests_" __FILE__
 
-void test_CreateNamedPipe(void)
+void test_CreateNamedPipe(pipemode)
 {
     HANDLE hnp;
     HANDLE hFile;
     const char obuf[] = "Bit Bucket";
-    char ibuf[32];
+    const char obuf2[] = "More bits";
+    char ibuf[32], *pbuf;
     DWORD written;
     DWORD readden;
+    DWORD avail;
+    DWORD lpmode;
 
-    trace("test_CreateNamedPipe starting\n");
+    if (pipemode == PIPE_TYPE_BYTE)
+        trace("test_CreateNamedPipe starting in byte mode\n");
+    else
+        trace("test_CreateNamedPipe starting in message mode\n");
     /* Bad parameter checks */
-    hnp = CreateNamedPipe("not a named pipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT,
+    hnp = CreateNamedPipe("not a named pipe", PIPE_ACCESS_DUPLEX, pipemode | PIPE_WAIT,
         /* nMaxInstances */ 1,
         /* nOutBufSize */ 1024,
         /* nInBufSize */ 1024,
@@ -78,7 +84,7 @@
         "CreateNamedPipe should fail if name doesn't start with \\\\.\\pipe\n");
 
     hnp = CreateNamedPipe(NULL,
-        PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT,
+        PIPE_ACCESS_DUPLEX, pipemode | PIPE_WAIT,
         1, 1024, 1024, NMPWAIT_USE_DEFAULT_WAIT, NULL);
     ok(hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND,
         "CreateNamedPipe should fail if name is NULL\n");
@@ -90,7 +96,7 @@
 
     /* Functional checks */
 
-    hnp = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT,
+    hnp = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, pipemode | PIPE_WAIT,
         /* nMaxInstances */ 1,
         /* nOutBufSize */ 1024,
         /* nInBufSize */ 1024,
@@ -108,17 +114,160 @@
         /* Make sure we can read and write a few bytes in both directions */
         memset(ibuf, 0, sizeof(ibuf));
         ok(WriteFile(hnp, obuf, sizeof(obuf), &written, NULL), "WriteFile\n");
-        ok(written == sizeof(obuf), "write file len\n");
-        ok(ReadFile(hFile, ibuf, sizeof(obuf), &readden, NULL), "ReadFile\n");
-        ok(readden == sizeof(obuf), "read file len\n");
-        ok(memcmp(obuf, ibuf, written) == 0, "content check\n");
+        ok(written == sizeof(obuf), "write file len 1\n");
+        ok(PeekNamedPipe(hFile, NULL, 0, NULL, &readden, NULL), "Peek\n");
+        ok(readden == sizeof(obuf), "peek 1 got %ld bytes\n", readden);
+        ok(ReadFile(hFile, ibuf, sizeof(ibuf), &readden, NULL), "ReadFile\n");
+        ok(readden == sizeof(obuf), "read 1 got %ld bytes\n", readden);
+        ok(memcmp(obuf, ibuf, written) == 0, "content 1 check\n");
 
         memset(ibuf, 0, sizeof(ibuf));
-        ok(WriteFile(hFile, obuf, sizeof(obuf), &written, NULL), "WriteFile\n");
-        ok(written == sizeof(obuf), "write file len\n");
-        ok(ReadFile(hnp, ibuf, sizeof(obuf), &readden, NULL), "ReadFile\n");
-        ok(readden == sizeof(obuf), "read file len\n");
-        ok(memcmp(obuf, ibuf, written) == 0, "content check\n");
+        ok(WriteFile(hFile, obuf2, sizeof(obuf2), &written, NULL), "WriteFile\n");
+        ok(written == sizeof(obuf2), "write file len 2\n");
+        ok(PeekNamedPipe(hnp, NULL, 0, NULL, &readden, NULL), "Peek\n");
+        ok(readden == sizeof(obuf2), "peek 2 got %ld bytes\n", readden);
+        ok(ReadFile(hnp, ibuf, sizeof(ibuf), &readden, NULL), "ReadFile\n");
+        ok(readden == sizeof(obuf2), "read 2 got %ld bytes\n", readden);
+        ok(memcmp(obuf2, ibuf, written) == 0, "content 2 check\n");
+
+        /* Test reading of multiple writes */
+        memset(ibuf, 0, sizeof(ibuf));
+        ok(WriteFile(hnp, obuf, sizeof(obuf), &written, NULL), "WriteFile3a\n");
+        ok(written == sizeof(obuf), "write file len 3a\n");
+        ok(WriteFile(hnp, obuf2, sizeof(obuf2), &written, NULL), " WriteFile3b\n");
+        ok(written == sizeof(obuf2), "write file len 3b\n");
+        ok(PeekNamedPipe(hFile, ibuf, sizeof(ibuf), &readden, &avail, NULL), "Peek3\n");
+        if (pipemode == PIPE_TYPE_BYTE) {
+            todo_wine {
+                /* should return all 23 bytes */
+                ok(readden == sizeof(obuf) + sizeof(obuf2), "peek3 got %ld bytes\n", readden);
+            }
+        }
+        else
+            ok(readden == sizeof(obuf), "peek3 got %ld bytes\n", readden);
+        todo_wine {
+            ok(avail == sizeof(obuf) + sizeof(obuf2), "peek3 got %ld bytes available\n", avail);
+        }
+        pbuf = ibuf;
+        ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "pipe content 3a check\n");
+        if (pipemode == PIPE_TYPE_BYTE) {
+            todo_wine {
+                pbuf += sizeof(obuf);
+                ok(memcmp(obuf2, pbuf, sizeof(obuf2)) == 0, "pipe content 3b check\n");
+            }
+        }
+        ok(ReadFile(hFile, ibuf, sizeof(ibuf), &readden, NULL), "ReadFile\n");
+        ok(readden == sizeof(obuf) + sizeof(obuf2), "read 3 got %ld bytes\n", readden);
+        pbuf = ibuf;
+        ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "content 3a check\n");
+        pbuf += sizeof(obuf);
+        ok(memcmp(obuf2, pbuf, sizeof(obuf2)) == 0, "content 3b check\n");
+
+        /* Multiple writes in the reverse direction */
+        memset(ibuf, 0, sizeof(ibuf));
+        ok(WriteFile(hFile, obuf, sizeof(obuf), &written, NULL), "WriteFile4a\n");
+        ok(written == sizeof(obuf), "write file len 4a\n");
+        ok(WriteFile(hFile, obuf2, sizeof(obuf2), &written, NULL), " WriteFile4b\n");
+        ok(written == sizeof(obuf2), "write file len 4b\n");
+        ok(PeekNamedPipe(hnp, ibuf, sizeof(ibuf), &readden, &avail, NULL), "Peek4\n");
+        if (pipemode == PIPE_TYPE_BYTE) {
+            todo_wine {
+                /* should return all 23 bytes */
+                ok(readden == sizeof(obuf) + sizeof(obuf2), "peek4 got %ld bytes\n", readden);
+            }
+        }
+        else
+            ok(readden == sizeof(obuf), "peek4 got %ld bytes\n", readden);
+        todo_wine {
+            ok(avail == sizeof(obuf) + sizeof(obuf2), "peek4 got %ld bytes available\n", avail);
+        }
+        pbuf = ibuf;
+        ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "pipe content 4a check\n");
+        if (pipemode == PIPE_TYPE_BYTE) {
+            todo_wine {
+                pbuf += sizeof(obuf);
+                ok(memcmp(obuf2, pbuf, sizeof(obuf2)) == 0, "pipe content 4b check\n");
+            }
+        }
+        ok(ReadFile(hnp, ibuf, sizeof(ibuf), &readden, NULL), "ReadFile\n");
+        if (pipemode == PIPE_TYPE_BYTE) {
+            ok(readden == sizeof(obuf) + sizeof(obuf2), "read 4 got %ld bytes\n", readden);
+        }
+        else {
+            todo_wine {
+                ok(readden == sizeof(obuf), "read 4 got %ld bytes\n", readden);
+            }
+        }
+        pbuf = ibuf;
+        ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "content 4a check\n");
+        if (pipemode == PIPE_TYPE_BYTE) {
+            pbuf += sizeof(obuf);
+            ok(memcmp(obuf2, pbuf, sizeof(obuf2)) == 0, "content 4b check\n");
+        }
+
+        /* Test reading of multiple writes after a mode change
+          (CreateFile always creates a byte mode pipe) */
+        lpmode = PIPE_READMODE_MESSAGE;
+        if (pipemode == PIPE_TYPE_BYTE) {
+            /* trying to change the client end of a byte pipe to message mode should fail */
+            ok(!SetNamedPipeHandleState(hFile, &lpmode, NULL, NULL), "Change mode\n");
+        }
+        else {
+            todo_wine {
+                ok(SetNamedPipeHandleState(hFile, &lpmode, NULL, NULL), "Change mode\n");
+            }
+        
+            memset(ibuf, 0, sizeof(ibuf));
+            ok(WriteFile(hnp, obuf, sizeof(obuf), &written, NULL), "WriteFile5a\n");
+            ok(written == sizeof(obuf), "write file len 3a\n");
+            ok(WriteFile(hnp, obuf2, sizeof(obuf2), &written, NULL), " WriteFile5b\n");
+            ok(written == sizeof(obuf2), "write file len 3b\n");
+            ok(PeekNamedPipe(hFile, ibuf, sizeof(ibuf), &readden, &avail, NULL), "Peek5\n");
+            ok(readden == sizeof(obuf), "peek5 got %ld bytes\n", readden);
+            todo_wine {
+                ok(avail == sizeof(obuf) + sizeof(obuf2), "peek5 got %ld bytes available\n", avail);
+            }
+            pbuf = ibuf;
+            ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "content 5a check\n");
+            ok(ReadFile(hFile, ibuf, sizeof(ibuf), &readden, NULL), "ReadFile\n");
+            todo_wine {
+                ok(readden == sizeof(obuf), "read 5 got %ld bytes\n", readden);
+            }
+            pbuf = ibuf;
+            ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "content 5a check\n");
+    
+            /* Multiple writes in the reverse direction */
+            /* the write of obuf2 from write4 should still be in the buffer */
+            ok(PeekNamedPipe(hnp, ibuf, sizeof(ibuf), &readden, &avail, NULL), "Peek6a\n");
+            todo_wine {
+                ok(readden == sizeof(obuf2), "peek6a got %ld bytes\n", readden);
+                ok(avail == sizeof(obuf2), "peek6a got %ld bytes available\n", avail);
+            }
+            if (avail > 0) {
+                ok(ReadFile(hnp, ibuf, sizeof(ibuf), &readden, NULL), "ReadFile\n");
+                ok(readden == sizeof(obuf2), "read 6a got %ld bytes\n", readden);
+                pbuf = ibuf;
+                ok(memcmp(obuf2, pbuf, sizeof(obuf2)) == 0, "content 6a check\n");
+            }
+            memset(ibuf, 0, sizeof(ibuf));
+            ok(WriteFile(hFile, obuf, sizeof(obuf), &written, NULL), "WriteFile6a\n");
+            ok(written == sizeof(obuf), "write file len 6a\n");
+            ok(WriteFile(hFile, obuf2, sizeof(obuf2), &written, NULL), " WriteFile6b\n");
+            ok(written == sizeof(obuf2), "write file len 6b\n");
+            ok(PeekNamedPipe(hnp, ibuf, sizeof(ibuf), &readden, &avail, NULL), "Peek6\n");
+            ok(readden == sizeof(obuf), "peek6 got %ld bytes\n", readden);
+            todo_wine {
+                ok(avail == sizeof(obuf) + sizeof(obuf2), "peek6b got %ld bytes available\n", avail);
+            }
+            pbuf = ibuf;
+            ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "content 6a check\n");
+            ok(ReadFile(hnp, ibuf, sizeof(ibuf), &readden, NULL), "ReadFile\n");
+            todo_wine {
+                ok(readden == sizeof(obuf), "read 6b got %ld bytes\n", readden);
+            }
+            pbuf = ibuf;
+            ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "content 6a check\n");
+        }
 
         /* Picky conformance tests */
 
@@ -596,6 +745,8 @@
     trace("test 3 of 4:\n");
     test_NamedPipe_2();
     trace("test 4 of 4:\n");
-    test_CreateNamedPipe();
+    test_CreateNamedPipe(PIPE_TYPE_BYTE);
+    trace("all tests done\n");
+    test_CreateNamedPipe(PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE);
     trace("all tests done\n");
 }


More information about the wine-patches mailing list