[KERNEL32_APITEST]
authorPierre Schweitzer <pierre@reactos.org>
Sat, 18 Apr 2015 19:46:57 +0000 (19:46 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Sat, 18 Apr 2015 19:46:57 +0000 (19:46 +0000)
Add tests for PrivMoveFileIdentityW().

Tested on w2k3 by Thomas

svn path=/trunk/; revision=67273

rostests/apitests/kernel32/CMakeLists.txt
rostests/apitests/kernel32/PrivMoveFileIdentityW.c [new file with mode: 0644]
rostests/apitests/kernel32/testlist.c

index e699ce5..ac6cae8 100644 (file)
@@ -8,6 +8,7 @@ list(APPEND SOURCE
     interlck.c
     lstrcpynW.c
     MultiByteToWideChar.c
     interlck.c
     lstrcpynW.c
     MultiByteToWideChar.c
+    PrivMoveFileIdentityW.c
     SetCurrentDirectory.c
     SetUnhandledExceptionFilter.c
     TerminateProcess.c
     SetCurrentDirectory.c
     SetUnhandledExceptionFilter.c
     TerminateProcess.c
diff --git a/rostests/apitests/kernel32/PrivMoveFileIdentityW.c b/rostests/apitests/kernel32/PrivMoveFileIdentityW.c
new file mode 100644 (file)
index 0000000..f4270e0
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPLv2+ - See COPYING in the top level directory
+ * PURPOSE:         Test for PrivMoveFileIdentityW
+ * PROGRAMMER:      Pierre Schweitzer <pierre@reactos.org>
+ */
+
+#include <apitest.h>
+
+#define WIN32_NO_STATUS
+#include <stdio.h>
+#include <ndk/iofuncs.h>
+#include <ndk/rtltypes.h>
+
+static const WCHAR FileName[] = L"TestFile.xxx";
+static const WCHAR Self[] = L"kernel32_apitest.exe";
+
+static BOOL (WINAPI * pPrivMoveFileIdentityW)(LPCWSTR, LPCWSTR, DWORD);
+
+static
+BOOL
+QueryFileInfo(
+    LPCWSTR File,
+    PFILE_BASIC_INFORMATION FileBasicInfo,
+    PFILE_STANDARD_INFORMATION FileStandardInfo)
+{
+    HANDLE hFile;
+    IO_STATUS_BLOCK IoStatusBlock;
+    NTSTATUS Status;
+
+    hFile = CreateFileW(File, FILE_READ_ATTRIBUTES | SYNCHRONIZE,
+                        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_SYNCHRONOUS_IO_NONALERT,
+                        NULL);
+    if (hFile == INVALID_HANDLE_VALUE)
+    {
+        return FALSE;
+    }
+
+    Status = NtQueryInformationFile(hFile, &IoStatusBlock, FileBasicInfo,
+                                    sizeof(FILE_BASIC_INFORMATION), FileBasicInformation);
+    if (!NT_SUCCESS(Status))
+    {
+        CloseHandle(hFile);
+        return FALSE;
+    }
+
+    Status = NtQueryInformationFile(hFile, &IoStatusBlock, FileStandardInfo,
+                                    sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation);
+
+    CloseHandle(hFile);
+    return NT_SUCCESS(Status);
+}
+
+static
+VOID
+TestPrivMoveFileIdentityW(VOID)
+{
+    FILE_BASIC_INFORMATION FileBasicInfo;
+    FILE_STANDARD_INFORMATION FileStandardInfo;
+    LARGE_INTEGER CreationTime, EndOfFile;
+    HANDLE hDest;
+    NTSTATUS Status;
+
+    DeleteFileW(FileName);
+
+    if (!QueryFileInfo(Self, &FileBasicInfo, &FileStandardInfo))
+    {
+        win_skip("Failed querying self\n");
+        return;
+    }
+
+    CreationTime = FileBasicInfo.CreationTime;
+    EndOfFile = FileStandardInfo.EndOfFile;
+
+    Sleep(150);
+
+    hDest = CreateFileW(FileName, GENERIC_WRITE | SYNCHRONIZE,
+                        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_SYNCHRONOUS_IO_NONALERT,
+                        NULL);
+    if (hDest == INVALID_HANDLE_VALUE)
+    {
+        win_skip("Failed creating new\n");
+        return;
+    }
+
+    CloseHandle(hDest);
+
+    ok(QueryFileInfo(FileName, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n");
+    ok(FileBasicInfo.CreationTime.QuadPart != CreationTime.QuadPart, "Equal creation times\n");
+    ok(FileStandardInfo.EndOfFile.QuadPart == 0LL, "File wasn't created empty: %I64d\n", FileStandardInfo.EndOfFile.QuadPart);
+    Status = (NTSTATUS)pPrivMoveFileIdentityW(Self, FileName, 0);
+    ok(Status == STATUS_SUCCESS, "PrivMoveFileIdentityW failed with %lx\n", Status);
+    ok(QueryFileInfo(FileName, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n");
+    ok(FileBasicInfo.CreationTime.QuadPart == CreationTime.QuadPart, "Creation time didn't change\n");
+    ok(FileStandardInfo.EndOfFile.QuadPart == 0LL, "File not empty anymore: %I64d\n", FileStandardInfo.EndOfFile.QuadPart);
+    ok(QueryFileInfo(Self, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n");
+    ok(FileBasicInfo.CreationTime.QuadPart == CreationTime.QuadPart, "Creation time changed\n");
+    ok(FileStandardInfo.EndOfFile.QuadPart == EndOfFile.QuadPart, "File size changed: %I64d\n", FileStandardInfo.EndOfFile.QuadPart);
+
+    DeleteFileW(FileName);
+}
+
+START_TEST(PrivMoveFileIdentityW)
+{
+    HMODULE hKern = GetModuleHandleA("kernel32.dll");
+    pPrivMoveFileIdentityW = (void *)GetProcAddress(hKern, "PrivMoveFileIdentityW");
+
+    TestPrivMoveFileIdentityW();
+}
index 850ccff..a6afd8c 100644 (file)
@@ -11,6 +11,7 @@ extern void func_GetModuleFileName(void);
 extern void func_interlck(void);
 extern void func_lstrcpynW(void);
 extern void func_MultiByteToWideChar(void);
 extern void func_interlck(void);
 extern void func_lstrcpynW(void);
 extern void func_MultiByteToWideChar(void);
+extern void func_PrivMoveFileIdentityW(void);
 extern void func_SetCurrentDirectory(void);
 extern void func_SetUnhandledExceptionFilter(void);
 extern void func_TerminateProcess(void);
 extern void func_SetCurrentDirectory(void);
 extern void func_SetUnhandledExceptionFilter(void);
 extern void func_TerminateProcess(void);
@@ -25,6 +26,7 @@ const struct test winetest_testlist[] =
     { "interlck",                    func_interlck },
     { "lstrcpynW",                   func_lstrcpynW },
     { "MultiByteToWideChar",         func_MultiByteToWideChar },
     { "interlck",                    func_interlck },
     { "lstrcpynW",                   func_lstrcpynW },
     { "MultiByteToWideChar",         func_MultiByteToWideChar },
+    { "PrivMoveFileIdentityW",       func_PrivMoveFileIdentityW },
     { "SetCurrentDirectory",         func_SetCurrentDirectory },
     { "SetUnhandledExceptionFilter", func_SetUnhandledExceptionFilter },
     { "TerminateProcess",            func_TerminateProcess },
     { "SetCurrentDirectory",         func_SetCurrentDirectory },
     { "SetUnhandledExceptionFilter", func_SetUnhandledExceptionFilter },
     { "TerminateProcess",            func_TerminateProcess },