Nikolay Sivov : kernel32/tests: Added some activation context tests for SearchPath().

Alexandre Julliard julliard at winehq.org
Fri Sep 6 12:39:53 CDT 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Sep  6 18:39:48 2013 +0400

kernel32/tests: Added some activation context tests for SearchPath().

---

 dlls/kernel32/tests/path.c |  179 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 177 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c
index c49a76f..fd40547 100644
--- a/dlls/kernel32/tests/path.c
+++ b/dlls/kernel32/tests/path.c
@@ -42,6 +42,14 @@
 
 #define NOT_A_VALID_DRIVE '@'
 
+#ifdef __i386__
+#define ARCH "x86"
+#elif defined __x86_64__
+#define ARCH "amd64"
+#else
+#define ARCH "none"
+#endif
+
 /* the following characters don't work well with GetFullPathNameA
    in Win98.  I don't know if this is a FAT thing, or if it is an OS thing
    but I don't test these characters now.
@@ -61,6 +69,12 @@ static BOOL  (WINAPI *pNeedCurrentDirectoryForExePathW)(LPCWSTR);
 static DWORD (WINAPI *pSearchPathA)(LPCSTR,LPCSTR,LPCSTR,DWORD,LPSTR,LPSTR*);
 static DWORD (WINAPI *pSearchPathW)(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*);
 
+static BOOL   (WINAPI *pActivateActCtx)(HANDLE,ULONG_PTR*);
+static HANDLE (WINAPI *pCreateActCtxW)(PCACTCTXW);
+static BOOL   (WINAPI *pDeactivateActCtx)(DWORD,ULONG_PTR);
+static BOOL   (WINAPI *pGetCurrentActCtx)(HANDLE *);
+static void   (WINAPI *pReleaseActCtx)(HANDLE);
+
 /* a structure to deal with wine todos somewhat cleanly */
 typedef struct {
   DWORD shortlen;
@@ -1549,10 +1563,89 @@ static void test_drive_letter_case(void)
 #undef is_upper_case_letter
 }
 
+static const char manifest_dep[] =
+"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
+"<assemblyIdentity version=\"1.2.3.4\"  name=\"testdep1\" type=\"win32\" processorArchitecture=\"" ARCH "\"/>"
+"    <file name=\"testdep.dll\" />"
+"    <file name=\"kernel32.dll\" />"
+"</assembly>";
+
+static const char manifest_main[] =
+"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
+"<assemblyIdentity version=\"1.2.3.4\" name=\"Wine.Test\" type=\"win32\" />"
+"<dependency>"
+" <dependentAssembly>"
+"  <assemblyIdentity type=\"win32\" name=\"testdep1\" version=\"1.2.3.4\" processorArchitecture=\"" ARCH "\" />"
+" </dependentAssembly>"
+"</dependency>"
+"</assembly>";
+
+static void create_manifest_file(const char *filename, const char *manifest)
+{
+    WCHAR path[MAX_PATH], manifest_path[MAX_PATH];
+    HANDLE file;
+    DWORD size;
+
+    MultiByteToWideChar( CP_ACP, 0, filename, -1, path, MAX_PATH );
+
+    GetTempPathW(sizeof(manifest_path)/sizeof(WCHAR), manifest_path);
+    lstrcatW(manifest_path, path);
+
+    file = CreateFileW(manifest_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+    ok(file != INVALID_HANDLE_VALUE, "CreateFile failed: %u\n", GetLastError());
+    WriteFile(file, manifest, strlen(manifest), &size, NULL);
+    CloseHandle(file);
+}
+
+static void delete_manifest_file(const char *filename)
+{
+    CHAR path[MAX_PATH];
+
+    GetTempPathA(sizeof(path), path);
+    strcat(path, filename);
+    DeleteFileA(path);
+}
+
+static HANDLE test_create(const char *file)
+{
+    WCHAR path[MAX_PATH], manifest_path[MAX_PATH];
+    ACTCTXW actctx;
+    HANDLE handle;
+
+    MultiByteToWideChar(CP_ACP, 0, file, -1, path, MAX_PATH);
+    GetTempPathW(sizeof(manifest_path)/sizeof(WCHAR), manifest_path);
+    lstrcatW(manifest_path, path);
+
+    memset(&actctx, 0, sizeof(ACTCTXW));
+    actctx.cbSize = sizeof(ACTCTXW);
+    actctx.lpSource = manifest_path;
+
+    handle = pCreateActCtxW(&actctx);
+todo_wine
+    ok(handle != INVALID_HANDLE_VALUE, "failed to create context, error %u\n", GetLastError());
+
+    ok(actctx.cbSize == sizeof(actctx), "cbSize=%d\n", actctx.cbSize);
+    ok(actctx.dwFlags == 0, "dwFlags=%d\n", actctx.dwFlags);
+    ok(actctx.lpSource == manifest_path, "lpSource=%p\n", actctx.lpSource);
+    ok(actctx.wProcessorArchitecture == 0, "wProcessorArchitecture=%d\n", actctx.wProcessorArchitecture);
+    ok(actctx.wLangId == 0, "wLangId=%d\n", actctx.wLangId);
+    ok(actctx.lpAssemblyDirectory == NULL, "lpAssemblyDirectory=%p\n", actctx.lpAssemblyDirectory);
+    ok(actctx.lpResourceName == NULL, "lpResourceName=%p\n", actctx.lpResourceName);
+    ok(actctx.lpApplicationName == NULL, "lpApplicationName=%p\n", actctx.lpApplicationName);
+    ok(actctx.hModule == NULL, "hModule=%p\n", actctx.hModule);
+
+    return handle;
+}
+
 static void test_SearchPathA(void)
 {
-    CHAR pathA[MAX_PATH], fileA[] = "", buffA[MAX_PATH];
+    static const CHAR testdepA[] = "testdep.dll";
+    static const CHAR kernel32A[] = "kernel32.dll";
+    static const CHAR fileA[] = "";
+    CHAR pathA[MAX_PATH], buffA[MAX_PATH], path2A[MAX_PATH];
     CHAR *ptrA = NULL;
+    ULONG_PTR cookie;
+    HANDLE handle;
     DWORD ret;
 
     if (!pSearchPathA)
@@ -1576,12 +1669,52 @@ static void test_SearchPathA(void)
     ok(ret == 0, "Expected failure, got %d\n", ret);
     ok(GetLastError() == ERROR_INVALID_PARAMETER,
       "Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
+
+    if (!pActivateActCtx)
+        return;
+
+    create_manifest_file("testdep1.manifest", manifest_dep);
+    create_manifest_file("main.manifest", manifest_main);
+
+    handle = test_create("main.manifest");
+    delete_manifest_file("testdep1.manifest");
+    delete_manifest_file("main.manifest");
+
+    /* search fails without active context */
+    ret = pSearchPathA(NULL, testdepA, NULL, sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+    ok(ret == 0, "got %d\n", ret);
+
+    ret = pSearchPathA(NULL, kernel32A, NULL, sizeof(path2A)/sizeof(CHAR), path2A, NULL);
+    ok(ret && ret == strlen(path2A), "got %d\n", ret);
+
+    ret = pActivateActCtx(handle, &cookie);
+    ok(ret, "failed to activate context, %u\n", GetLastError());
+
+    /* works when activated */
+    ret = pSearchPathA(NULL, testdepA, NULL, sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+todo_wine
+    ok(ret && ret == strlen(buffA), "got %d\n", ret);
+
+    /* path is redirect for wellknown names too */
+    ret = pSearchPathA(NULL, kernel32A, NULL, sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+    ok(ret && ret == strlen(buffA), "got %d\n", ret);
+todo_wine
+    ok(strcmp(buffA, path2A), "got wrong path %s, %s\n", buffA, path2A);
+
+    ret = pDeactivateActCtx(0, cookie);
+    ok(ret, "failed to deactivate context, %u\n", GetLastError());
+    pReleaseActCtx(handle);
 }
 
 static void test_SearchPathW(void)
 {
-    WCHAR pathW[MAX_PATH], fileW[] = { 0 }, buffW[MAX_PATH];
+    static const WCHAR testdepW[] = {'t','e','s','t','d','e','p','.','d','l','l',0};
+    static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2','.','d','l','l',0};
+    static const WCHAR fileW[] = { 0 };
+    WCHAR pathW[MAX_PATH], buffW[MAX_PATH], path2W[MAX_PATH];
     WCHAR *ptrW = NULL;
+    ULONG_PTR cookie;
+    HANDLE handle;
     DWORD ret;
 
     if (!pSearchPathW)
@@ -1602,6 +1735,41 @@ if (0)
     ok(ret == 0, "Expected failure, got %d\n", ret);
     ok(GetLastError() == ERROR_INVALID_PARAMETER,
       "Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
+
+    if (!pActivateActCtx)
+        return;
+
+    create_manifest_file("testdep1.manifest", manifest_dep);
+    create_manifest_file("main.manifest", manifest_main);
+
+    handle = test_create("main.manifest");
+    delete_manifest_file("testdep1.manifest");
+    delete_manifest_file("main.manifest");
+
+    /* search fails without active context */
+    ret = pSearchPathW(NULL, testdepW, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+    ok(ret == 0, "got %d\n", ret);
+
+    ret = pSearchPathW(NULL, kernel32W, NULL, sizeof(path2W)/sizeof(WCHAR), path2W, NULL);
+    ok(ret && ret == lstrlenW(path2W), "got %d\n", ret);
+
+    ret = pActivateActCtx(handle, &cookie);
+    ok(ret, "failed to activate context, %u\n", GetLastError());
+
+    /* works when activated */
+    ret = pSearchPathW(NULL, testdepW, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+todo_wine
+    ok(ret && ret == lstrlenW(buffW), "got %d\n", ret);
+
+    /* path is redirect for wellknown names too */
+    ret = pSearchPathW(NULL, kernel32W, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+    ok(ret && ret == lstrlenW(buffW), "got %d\n", ret);
+todo_wine
+    ok(lstrcmpW(buffW, path2W), "got wrong path %s, %s\n", wine_dbgstr_w(buffW), wine_dbgstr_w(path2W));
+
+    ret = pDeactivateActCtx(0, cookie);
+    ok(ret, "failed to deactivate context, %u\n", GetLastError());
+    pReleaseActCtx(handle);
 }
 
 static void test_GetFullPathNameA(void)
@@ -1717,6 +1885,11 @@ static void init_pointers(void)
     MAKEFUNC(NeedCurrentDirectoryForExePathW);
     MAKEFUNC(SearchPathA);
     MAKEFUNC(SearchPathW);
+    MAKEFUNC(ActivateActCtx);
+    MAKEFUNC(CreateActCtxW);
+    MAKEFUNC(DeactivateActCtx);
+    MAKEFUNC(GetCurrentActCtx);
+    MAKEFUNC(ReleaseActCtx);
 #undef MAKEFUNC
 }
 
@@ -1731,6 +1904,8 @@ START_TEST(path)
         win_skip("GetLongPathNameA is not available\n");
     if (!pGetLongPathNameW)
         win_skip("GetLongPathNameW is not available\n");
+    if (!pActivateActCtx)
+        win_skip("Activation contexts not supported, some tests will be skipped\n");
 
     test_InitPathA(curdir, &curDrive, &otherDrive);
     test_CurrentDirectoryA(origdir,curdir);




More information about the wine-cvs mailing list