Jeff Zaroyko : ntdll: Add some tests for NtDeleteFile.

Alexandre Julliard julliard at winehq.org
Wed Sep 3 07:44:02 CDT 2008


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

Author: Jeff Zaroyko <jeffz at jeffz.name>
Date:   Sun Aug 31 21:54:03 2008 +1000

ntdll: Add some tests for NtDeleteFile.

---

 dlls/ntdll/tests/file.c |   70 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index ae0bcef..b58b1a7 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -2,6 +2,7 @@
  *
  * Copyright 2007 Jeff Latimer
  * Copyright 2007 Andrey Turkin
+ * Copyright 2008 Jeff Zaroyko
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -38,9 +39,12 @@
 #define IO_COMPLETION_ALL_ACCESS 0x001F0003
 #endif
 
+static NTSTATUS (WINAPI *pRtlFreeUnicodeString)( PUNICODE_STRING );
 static VOID     (WINAPI *pRtlInitUnicodeString)( PUNICODE_STRING, LPCWSTR );
+static BOOL     (WINAPI *pRtlDosPathNameToNtPathName_U)( LPCWSTR, PUNICODE_STRING, PWSTR*, CURDIR* );
 static NTSTATUS (WINAPI *pNtCreateMailslotFile)( PHANDLE, ULONG, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK,
                                        ULONG, ULONG, ULONG, PLARGE_INTEGER );
+static NTSTATUS (WINAPI *pNtDeleteFile)(POBJECT_ATTRIBUTES ObjectAttributes);
 static NTSTATUS (WINAPI *pNtReadFile)(HANDLE hFile, HANDLE hEvent,
                                       PIO_APC_ROUTINE apc, void* apc_user,
                                       PIO_STATUS_BLOCK io_status, void* buffer, ULONG length,
@@ -136,6 +140,68 @@ static void WINAPI apc( void *arg, IO_STATUS_BLOCK *iosb, ULONG reserved )
     ok( !reserved, "reserved is not 0: %x\n", reserved );
 }
 
+static void delete_file_test(void)
+{
+    NTSTATUS ret;
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
+    WCHAR pathW[MAX_PATH];
+    WCHAR pathsubW[MAX_PATH];
+    static const WCHAR testdirW[] = {'n','t','d','e','l','e','t','e','f','i','l','e',0};
+    static const WCHAR subdirW[]  = {'\\','s','u','b',0};
+
+    ret = GetTempPathW(MAX_PATH, pathW);
+    if (!ret)
+    {
+	ok(0, "couldn't get temp dir\n");
+	return;
+    }
+    if (ret + sizeof(testdirW)/sizeof(WCHAR)-1 + sizeof(subdirW)/sizeof(WCHAR)-1 >= MAX_PATH)
+    {
+	ok(0, "MAX_PATH exceeded in constructing paths\n");
+	return;
+    }
+
+    lstrcatW(pathW, testdirW);
+    lstrcpyW(pathsubW, pathW);
+    lstrcatW(pathsubW, subdirW);
+
+    ret = CreateDirectoryW(pathW, NULL);
+    ok(ret == TRUE, "couldn't create directory ntdeletefile\n");
+    if (!pRtlDosPathNameToNtPathName_U(pathW, &nameW, NULL, NULL))
+    {
+	ok(0,"RtlDosPathNametoNtPathName_U failed\n");
+	return;
+    }
+
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.Attributes = OBJ_CASE_INSENSITIVE;
+    attr.ObjectName = &nameW;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+
+    /* test NtDeleteFile on an empty directory */
+    ret = pNtDeleteFile(&attr);
+    ok(ret == STATUS_SUCCESS, "NtDeleteFile should succeed in removing an empty directory\n");
+    ret = RemoveDirectoryW(pathW);
+    ok(ret == FALSE, "expected to fail removing directory, NtDeleteFile should have removed it\n");
+
+    /* test NtDeleteFile on a non-empty directory */
+    ret = CreateDirectoryW(pathW, NULL);
+    ok(ret == TRUE, "couldn't create directory ntdeletefile ?!\n");
+    ret = CreateDirectoryW(pathsubW, NULL);
+    ok(ret == TRUE, "couldn't create directory subdir\n");
+    ret = pNtDeleteFile(&attr);
+    ok(ret == STATUS_SUCCESS, "expected NtDeleteFile to ret STATUS_SUCCESS\n");
+    ret = RemoveDirectoryW(pathsubW);
+    ok(ret == TRUE, "expected to remove directory ntdeletefile\\sub\n");
+    ret = RemoveDirectoryW(pathW);
+    ok(ret == TRUE, "expected to remove directory ntdeletefile, NtDeleteFile failed.\n");
+
+    pRtlFreeUnicodeString( &nameW );
+}
+
 static void read_file_test(void)
 {
     const char text[] = "foobar";
@@ -623,8 +689,11 @@ START_TEST(file)
         return;
     }
 
+    pRtlFreeUnicodeString   = (void *)GetProcAddress(hntdll, "RtlFreeUnicodeString");
     pRtlInitUnicodeString   = (void *)GetProcAddress(hntdll, "RtlInitUnicodeString");
+    pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(hntdll, "RtlDosPathNameToNtPathName_U");
     pNtCreateMailslotFile   = (void *)GetProcAddress(hntdll, "NtCreateMailslotFile");
+    pNtDeleteFile           = (void *)GetProcAddress(hntdll, "NtDeleteFile");
     pNtReadFile             = (void *)GetProcAddress(hntdll, "NtReadFile");
     pNtWriteFile            = (void *)GetProcAddress(hntdll, "NtWriteFile");
     pNtClose                = (void *)GetProcAddress(hntdll, "NtClose");
@@ -635,6 +704,7 @@ START_TEST(file)
     pNtSetIoCompletion      = (void *)GetProcAddress(hntdll, "NtSetIoCompletion");
     pNtSetInformationFile   = (void *)GetProcAddress(hntdll, "NtSetInformationFile");
 
+    delete_file_test();
     read_file_test();
     nt_mailslot_test();
     test_iocompletion();




More information about the wine-cvs mailing list