[KERNEL32_APITEST]
authorThomas Faber <thomas.faber@reactos.org>
Fri, 4 May 2012 12:31:47 +0000 (12:31 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Fri, 4 May 2012 12:31:47 +0000 (12:31 +0000)
- Add a test checking that GetModuleFileName returns a full path
See issue #6786 for more details.

svn path=/trunk/; revision=56494

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

index a52c0fd..53beb34 100644 (file)
@@ -4,11 +4,12 @@ add_definitions(-D_DLL -D__USE_CRTIMP)
 list(APPEND SOURCE
     GetCurrentDirectory.c
     GetDriveType.c
+    GetModuleFileName.c
     SetCurrentDirectory.c
     testlist.c)
 
 add_executable(kernel32_apitest ${SOURCE})
 target_link_libraries(kernel32_apitest wine ${PSEH_LIB})
 set_module_type(kernel32_apitest win32cui)
-add_importlibs(kernel32_apitest gdi32 user32 msvcrt kernel32 ntdll)
+add_importlibs(kernel32_apitest gdi32 user32 shlwapi msvcrt kernel32 ntdll)
 add_cd_file(TARGET kernel32_apitest DESTINATION reactos/bin FOR all)
diff --git a/rostests/apitests/kernel32/GetModuleFileName.c b/rostests/apitests/kernel32/GetModuleFileName.c
new file mode 100644 (file)
index 0000000..5c3c00a
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPLv2+ - See COPYING in the top level directory
+ * PURPOSE:         Test for GetModuleFileName
+ * PROGRAMMER:      Thomas Faber <thfabba@gmx.de>
+ */
+
+#define WIN32_NO_STATUS
+#define UNICODE
+#include <stdio.h>
+#include <wine/test.h>
+#include <windows.h>
+#include <shlwapi.h>
+
+static
+VOID
+StartChild(char **argv)
+{
+    BOOL Success;
+    WCHAR Path[MAX_PATH];
+    PWSTR FileName;
+    PWSTR Slash;
+    WCHAR CommandLine[MAX_PATH];
+    STARTUPINFO StartupInfo;
+    PROCESS_INFORMATION ProcessInfo;
+    DWORD Ret;
+    int Length;
+
+    Length = MultiByteToWideChar(CP_ACP,
+                                 0,
+                                 argv[0],
+                                 -1,
+                                 Path,
+                                 sizeof(Path) / sizeof(WCHAR));
+
+    FileName = wcsrchr(Path, '\\');
+    Slash = wcsrchr(Path, L'/');
+    if (Slash && (!FileName || Slash > FileName))
+        FileName = Slash;
+
+    if (FileName)
+    {
+        /* It's an absolute path. Set it as current dir and get the file name */
+        FileName++;
+        FileName[-1] = L'\0';
+
+        Success = SetCurrentDirectory(Path);
+        ok(Success == TRUE, "SetCurrentDirectory failed for path '%ls'\n", Path);
+
+        trace("Starting '%ls' in path '%ls'\n", FileName, Path);
+    }
+    else
+    {
+        FileName = Path;
+        trace("Starting '%ls', which is already relative\n", FileName);
+    }
+
+    swprintf(CommandLine, L"\"%ls\" GetModuleFileName relative", FileName);
+
+    RtlZeroMemory(&StartupInfo, sizeof(StartupInfo));
+    StartupInfo.cb = sizeof(StartupInfo);
+
+    Success = CreateProcess(FileName,
+                            CommandLine,
+                            NULL,
+                            NULL,
+                            FALSE,
+                            0,
+                            NULL,
+                            NULL,
+                            &StartupInfo,
+                            &ProcessInfo);
+    if (!Success)
+    {
+        skip("CreateProcess failed with %lu\n", GetLastError());
+        return;
+    }
+    CloseHandle(ProcessInfo.hThread);
+    Ret = WaitForSingleObject(ProcessInfo.hProcess, 30 * 1000);
+    ok(Ret == WAIT_OBJECT_0, "WaitForSingleObject returns %lu\n", Ret);
+    CloseHandle(ProcessInfo.hProcess);
+}
+
+static
+VOID
+TestGetModuleFileNameA(VOID)
+{
+    CHAR Buffer[MAX_PATH];
+    DWORD Length;
+    BOOL Relative;
+
+    Length = GetModuleFileNameA(NULL, Buffer, sizeof(Buffer));
+    ok(Length != 0, "Length = %lu\n", Length);
+    ok(Length < sizeof(Buffer), "Length = %lu\n", Length);
+    ok(Buffer[Length] == 0, "Buffer not null terminated\n");
+    Relative = PathIsRelativeA(Buffer);
+    ok(Relative == FALSE, "GetModuleFileNameA returned relative path: %s\n", Buffer);
+}
+
+static
+VOID
+TestGetModuleFileNameW(VOID)
+{
+    WCHAR Buffer[MAX_PATH];
+    DWORD Length;
+    BOOL Relative;
+
+    Length = GetModuleFileNameW(NULL, Buffer, sizeof(Buffer) / sizeof(WCHAR));
+    ok(Length != 0, "Length = %lu\n", Length);
+    ok(Length < sizeof(Buffer) / sizeof(WCHAR), "Length = %lu\n", Length);
+    ok(Buffer[Length] == 0, "Buffer not null terminated\n");
+    Relative = PathIsRelativeW(Buffer);
+    ok(Relative == FALSE, "GetModuleFileNameA returned relative path: %ls\n", Buffer);
+}
+
+START_TEST(GetModuleFileName)
+{
+    int argc;
+    char **argv;
+
+    argc = winetest_get_mainargs(&argv);
+    if (argc < 3)
+        StartChild(argv);
+    else
+    {
+        TestGetModuleFileNameA();
+        TestGetModuleFileNameW();
+    }
+}
index 140397d..622c52e 100644 (file)
@@ -7,12 +7,14 @@
 
 extern void func_GetCurrentDirectory(void);
 extern void func_GetDriveType(void);
+extern void func_GetModuleFileName(void);
 extern void func_SetCurrentDirectory(void);
 
 const struct test winetest_testlist[] =
 {
     { "GetCurrentDirectory",    func_GetCurrentDirectory },
     { "GetDriveType",           func_GetDriveType },
+    { "GetModuleFileName",      func_GetModuleFileName },
     { "SetCurrentDirectory",    func_SetCurrentDirectory },
 
     { 0, 0 }