ntdll: Add few tests for object manager (with more tests)
Vitaliy Margolen
wine-patch at kievinfo.com
Thu Sep 29 13:16:30 CDT 2005
Added several tests for named pipes. It shows that named pipe's name space is
case-insensitive. Also replaced all static imports with dynamic ones.
Most of them are to-dos. Thanks to Robert Shearman for examples. ;-)
Vitaliy Margolen
changelog:
Add few tests for object manager
-------------- next part --------------
Index: dlls/ntdll/tests/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/tests/Makefile.in,v
retrieving revision 1.14
diff -u -p -r1.14 Makefile.in
--- dlls/ntdll/tests/Makefile.in 11 May 2005 15:56:09 -0000 1.14
+++ dlls/ntdll/tests/Makefile.in 29 Sep 2005 18:10:55 -0000
@@ -13,6 +13,7 @@ CTESTS = \
info.c \
large_int.c \
path.c \
+ om.c \
reg.c \
rtl.c \
rtlbitmap.c \
--- /dev/null 2005-03-19 12:36:14.000000000 -0700
+++ dlls/ntdll/tests/om.c 2005-09-29 12:08:21.000000000 -0600
@@ -0,0 +1,158 @@
+/*
+ * Unit test suite for object manager functions
+ *
+ * Copyright 2005 Robert Shearman
+ * Copyright 2005 Vitaliy Margolen
+ *
+ * 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 "ntdll_test.h"
+#include "winternl.h"
+#include "stdio.h"
+#include "winnt.h"
+#include "stdlib.h"
+
+static NTSTATUS (WINAPI *pNtCreateEvent) ( PHANDLE, ACCESS_MASK, const POBJECT_ATTRIBUTES, BOOLEAN, BOOLEAN);
+static NTSTATUS (WINAPI *pNtCreateMutant)( PHANDLE, ACCESS_MASK, const POBJECT_ATTRIBUTES, BOOLEAN );
+static NTSTATUS (WINAPI *pNtOpenMutant) ( PHANDLE, ACCESS_MASK, const POBJECT_ATTRIBUTES );
+static NTSTATUS (WINAPI *pNtOpenFile) ( PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, ULONG, ULONG );
+static NTSTATUS (WINAPI *pNtClose) ( HANDLE );
+static VOID (WINAPI *pRtlInitUnicodeString)( PUNICODE_STRING, LPCWSTR );
+static NTSTATUS (WINAPI *pNtCreateNamedPipeFile)( PHANDLE, ULONG, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK,
+ ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, PLARGE_INTEGER );
+
+
+void test_case_sensitive (void)
+{
+ static const WCHAR buffer1[] = {'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\\','t','e','s','t',0};
+ static const WCHAR buffer2[] = {'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\\','T','e','s','t',0};
+ static const WCHAR buffer3[] = {'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\\','T','E','s','t',0};
+ static const WCHAR buffer4[] = {'\\','B','A','S','E','N','a','m','e','d','O','b','j','e','c','t','s','\\','t','e','s','t',0};
+ NTSTATUS status;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING str;
+ HANDLE Event, Mutant, h;
+
+ pRtlInitUnicodeString(&str, buffer1);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtCreateMutant(&Mutant, GENERIC_ALL, &attr, FALSE);
+ ok(status == STATUS_SUCCESS, "Failed to create Mutant(%08lx)\n", status);
+
+ status = pNtCreateEvent(&Event, GENERIC_ALL, &attr, FALSE, FALSE);
+ ok(status == STATUS_OBJECT_NAME_COLLISION,
+ "NtCreateEvent should have failed with STATUS_OBJECT_NAME_COLLISION got(%08lx)\n", status);
+
+ pRtlInitUnicodeString(&str, buffer2);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtCreateEvent(&Event, GENERIC_ALL, &attr, FALSE, FALSE);
+ ok(status == STATUS_SUCCESS, "Failed to create Event(%08lx)\n", status);
+
+ pRtlInitUnicodeString(&str, buffer3);
+ InitializeObjectAttributes(&attr, &str, OBJ_CASE_INSENSITIVE, 0, NULL);
+ status = pNtOpenMutant(&h, GENERIC_ALL, &attr);
+ todo_wine ok(status == STATUS_OBJECT_TYPE_MISMATCH,
+ "NtOpenMutant should have failed with STATUS_OBJECT_TYPE_MISMATCH got(%08lx)\n", status);
+
+ pNtClose(Mutant);
+
+ pRtlInitUnicodeString(&str, buffer4);
+ InitializeObjectAttributes(&attr, &str, OBJ_CASE_INSENSITIVE, 0, NULL);
+ status = pNtCreateMutant(&Mutant, GENERIC_ALL, &attr, FALSE);
+ todo_wine ok(status == STATUS_OBJECT_NAME_COLLISION,
+ "NtCreateMutant should have failed with STATUS_OBJECT_NAME_COLLISION got(%08lx)\n", status);
+
+ status = pNtCreateEvent(&h, GENERIC_ALL, &attr, FALSE, FALSE);
+ ok(status == STATUS_OBJECT_NAME_COLLISION,
+ "NtCreateEvent should have failed with STATUS_OBJECT_NAME_COLLISION got(%08lx)\n", status);
+
+ attr.Attributes = 0;
+ status = pNtCreateMutant(&Mutant, GENERIC_ALL, &attr, FALSE);
+ todo_wine ok(status == STATUS_OBJECT_PATH_NOT_FOUND,
+ "NtCreateMutant should have failed with STATUS_OBJECT_PATH_NOT_FOUND got(%08lx)\n", status);
+
+ pNtClose(Event);
+}
+
+void test_namespace_pipe(void)
+{
+ static const WCHAR buffer1[] = {'\\','?','?','\\','P','I','P','E','\\','t','e','s','t','\\','p','i','p','e',0};
+ static const WCHAR buffer2[] = {'\\','?','?','\\','P','I','P','E','\\','T','E','S','T','\\','P','I','P','E',0};
+ static const WCHAR buffer3[] = {'\\','?','?','\\','p','i','p','e','\\','t','e','s','t','\\','p','i','p','e',0};
+ static const WCHAR buffer4[] = {'\\','?','?','\\','p','i','p','e','\\','t','e','s','t',0};
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING str;
+ IO_STATUS_BLOCK iosb;
+ NTSTATUS status;
+ LARGE_INTEGER timeout;
+ HANDLE pipe, h;
+
+ timeout.QuadPart = -10000;
+
+ pRtlInitUnicodeString(&str, buffer1);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtCreateNamedPipeFile(&pipe, GENERIC_READ|GENERIC_WRITE, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ FILE_CREATE, FILE_PIPE_FULL_DUPLEX, FALSE, FALSE, FALSE, 1, 256, 256, &timeout);
+ ok(status == STATUS_SUCCESS, "Failed to create NamedPipe(%08lx)\n", status);
+
+ status = pNtCreateNamedPipeFile(&pipe, GENERIC_READ|GENERIC_WRITE, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ FILE_CREATE, FILE_PIPE_FULL_DUPLEX, FALSE, FALSE, FALSE, 1, 256, 256, &timeout);
+ todo_wine ok(status == STATUS_INSTANCE_NOT_AVAILABLE,
+ "NtCreateNamedPipeFile should have failed with STATUS_INSTANCE_NOT_AVAILABLE got(%08lx)\n", status);
+
+ pRtlInitUnicodeString(&str, buffer2);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtCreateNamedPipeFile(&pipe, GENERIC_READ|GENERIC_WRITE, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ FILE_CREATE, FILE_PIPE_FULL_DUPLEX, FALSE, FALSE, FALSE, 1, 256, 256, &timeout);
+ todo_wine ok(status == STATUS_INSTANCE_NOT_AVAILABLE,
+ "NtCreateNamedPipeFile should have failed with STATUS_INSTANCE_NOT_AVAILABLE got(%08lx)\n", status);
+
+ attr.Attributes = OBJ_CASE_INSENSITIVE;
+ status = pNtOpenFile(&h, GENERIC_READ, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN);
+ ok(status == STATUS_SUCCESS, "Failed to open NamedPipe(%08lx)\n", status);
+ pNtClose(h);
+
+ pRtlInitUnicodeString(&str, buffer3);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtOpenFile(&h, GENERIC_READ, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN);
+ todo_wine ok(status == STATUS_OBJECT_PATH_NOT_FOUND,
+ "pNtOpenFile should have failed with STATUS_OBJECT_PATH_NOT_FOUND got(%08lx)\n", status);
+
+ pRtlInitUnicodeString(&str, buffer4);
+ InitializeObjectAttributes(&attr, &str, OBJ_CASE_INSENSITIVE, 0, NULL);
+ status = pNtOpenFile(&h, GENERIC_READ, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN);
+ todo_wine ok(status == STATUS_OBJECT_NAME_NOT_FOUND,
+ "pNtOpenFile should have failed with STATUS_OBJECT_NAME_NOT_FOUND got(%08lx)\n", status);
+
+ pNtClose(pipe);
+}
+
+START_TEST(om)
+{
+ HMODULE hntdll = GetModuleHandleA("ntdll.dll");
+ if (hntdll)
+ {
+ pNtCreateEvent = (void *)GetProcAddress(hntdll, "NtCreateEvent");
+ pNtCreateMutant = (void *)GetProcAddress(hntdll, "NtCreateMutant");
+ pNtOpenMutant = (void *)GetProcAddress(hntdll, "NtOpenMutant");
+ pNtOpenFile = (void *)GetProcAddress(hntdll, "NtOpenFile");
+ pNtClose = (void *)GetProcAddress(hntdll, "NtClose");
+ pRtlInitUnicodeString = (void *)GetProcAddress(hntdll, "RtlInitUnicodeString");
+ pNtCreateNamedPipeFile = (void *)GetProcAddress(hntdll, "NtCreateNamedPipeFile");
+
+ test_case_sensitive();
+ test_namespace_pipe();
+ }
+}
More information about the wine-patches
mailing list