conformance test for named pipes

Dan Kegel dank at kegel.com
Thu Feb 13 11:38:15 CST 2003


Somebody said that the reason recent Wine can't run
installshield 6 is because named pipes were broken,
so I wrote a little test that just verifies a couple
error conditions, and does a functional test of a
subset of the named pipe stuff Wine uses itself internally.
Runs fine on Windows 2000 Professional, I think.
Doesn't work on Wine yet -- CreateFile fails.
I don't know if it's my fault or Wine's...

Modified files:
	dlls/kernel   : sync.c
	dlls/kernel/tests : Makefile.in pipe.c

Log message:
	Dan Kegel <dank at kegel.com>
	Added check for illegal pipe names in sync.c
         Added tests/pipe.c.  Note that Wine fails this test currently.

-- 
Dan Kegel
http://www.kegel.com
http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=78045
-------------- next part --------------
Index: dlls/kernel/sync.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/sync.c,v
retrieving revision 1.26
diff -u -p -u -r1.26 sync.c
--- dlls/kernel/sync.c	25 Oct 2002 21:02:30 -0000	1.26
+++ dlls/kernel/sync.c	13 Feb 2003 16:54:45 -0000
@@ -507,16 +507,28 @@ HANDLE WINAPI CreateNamedPipeW( LPCWSTR 
                                 DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES attr )
 {
     HANDLE ret;
-    DWORD len = name ? strlenW(name) : 0;
+    DWORD len;
+    static const WCHAR leadin[] = {'\\','\\','.','\\','P','I','P','E'};
 
     TRACE("(%s, %#08lx, %#08lx, %ld, %ld, %ld, %ld, %p)\n",
           debugstr_w(name), dwOpenMode, dwPipeMode, nMaxInstances,
           nOutBufferSize, nInBufferSize, nDefaultTimeOut, attr );
 
+    if (!name)
+    {
+        SetLastError( ERROR_PATH_NOT_FOUND );
+        return INVALID_HANDLE_VALUE;
+    }
+    len = strlenW(name);
     if (len >= MAX_PATH)
     {
         SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
+        return INVALID_HANDLE_VALUE;
+    }
+    if (strncmpiW(name, leadin, sizeof(leadin)/sizeof(leadin[0])))
+    {
+        SetLastError( ERROR_INVALID_NAME );
+        return INVALID_HANDLE_VALUE;
     }
     SERVER_START_REQ( create_named_pipe )
     {
Index: dlls/kernel/tests/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/kernel/tests/Makefile.in,v
retrieving revision 1.6
diff -u -p -u -r1.6 Makefile.in
--- dlls/kernel/tests/Makefile.in	4 Oct 2002 17:42:27 -0000	1.6
+++ dlls/kernel/tests/Makefile.in	13 Feb 2003 16:54:45 -0000
@@ -17,6 +17,7 @@ CTESTS = \
 	generated.c \
 	locale.c \
 	path.c \
+	pipe.c \
 	process.c \
 	thread.c
 
--- /dev/null	2002-08-30 16:31:37.000000000 -0700
+++ dlls/kernel/tests/pipe.c	2003-02-13 08:50:24.000000000 -0800
@@ -0,0 +1,115 @@
+/*
+ * Unit tests for named pipe functions in Wine
+ *
+ * Copyright (c) 2002 Dan Kegel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+
+#ifndef STANDALONE
+#include "wine/test.h"
+#else
+#include <assert.h>
+#define START_TEST(name) main(int argc, char **argv)
+#define ok(condition, msg) assert(condition)
+#endif
+
+#include <windef.h>
+#include <winbase.h>
+#include <winerror.h>
+#include <wtypes.h>
+
+#define PIPENAME "\\\\.\\PiPe\\tests_" __FILE__
+
+void test_CreateNamedPipeA(void)
+{
+    HANDLE hnp;
+    HANDLE hFile;
+    const char obuf[] = "Bit Bucket";
+    char ibuf[32];
+    DWORD written;
+    DWORD gelesen;
+
+    /* Bad parameter checks */
+    hnp = CreateNamedPipeA("not a named pipe", 
+        PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE|PIPE_WAIT, 
+        /* nMaxInstances */ 1,
+        /* nOutBufSize */ 1024,
+        /* nInBufSize */ 1024,
+        /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT,
+        /* lpSecurityAttrib */ NULL);
+
+    if (hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) {
+        /* Is this the right way to notify user of skipped tests? */
+        ok(hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, 
+	    "CreateNamedPipe not supported on this platform, skipping tests.");
+        return;
+    }
+    ok(hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_INVALID_NAME,
+        "CreateNamedPipe should fail if name doesn't start with \\\\.\\pipe");
+
+    hnp = CreateNamedPipeA(NULL, 
+        PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE|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");
+
+    /* Functional checks */
+
+    hnp = CreateNamedPipeA(PIPENAME,
+        PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE|PIPE_WAIT, 
+        /* nMaxInstances */ 1,
+        /* nOutBufSize */ 1024,
+        /* nInBufSize */ 1024,
+        /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT,
+        /* lpSecurityAttrib */ NULL);
+    ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed");
+
+    hFile = CreateFileA(PIPENAME, GENERIC_READ|GENERIC_WRITE, 0, 
+            NULL, OPEN_EXISTING, 0, 0);
+    ok(hFile != INVALID_HANDLE_VALUE, "CreateFile failed");
+
+    /* don't try to do i/o if one side couldn't be opened, as it hangs */
+    if (hFile != INVALID_HANDLE_VALUE) {
+	/* 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");
+	ok(written == sizeof(obuf), "write file len");
+	ok(ReadFile(hFile, ibuf, sizeof(obuf), &gelesen, NULL), "ReadFile");
+	ok(gelesen == sizeof(obuf), "read file len");
+	ok(memcmp(obuf, ibuf, written) == 0, "content check");
+
+	memset(ibuf, 0, sizeof(ibuf));
+	ok(WriteFile(hFile, obuf, sizeof(obuf), &written, NULL), "WriteFile");
+	ok(written == sizeof(obuf), "write file len");
+	ok(ReadFile(hnp, ibuf, sizeof(obuf), &gelesen, NULL), "ReadFile");
+	ok(gelesen == sizeof(obuf), "read file len");
+	ok(memcmp(obuf, ibuf, written) == 0, "content check");
+
+	CloseHandle(hFile);
+    }
+
+    CloseHandle(hnp);
+}
+
+START_TEST(pipe)
+{
+    test_CreateNamedPipeA();
+}
+


More information about the wine-patches mailing list