Module: wine Branch: master Commit: 88c2a189fe3dd770fc2c50507ad1d1aab007a22f URL: http://source.winehq.org/git/wine.git/?a=commit;h=88c2a189fe3dd770fc2c50507a...
Author: Nikolay Sivov nsivov@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);