[PATCH 4/6] sxs: Add tests for SxsLookupClrGuid
Nikolay Sivov
nsivov at codeweavers.com
Tue Aug 7 13:19:41 CDT 2018
On 08/07/2018 08:45 PM, Fabian Maurer wrote:
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=43270
> Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
> ---
> dlls/sxs/tests/Makefile.in | 8 +-
> dlls/sxs/tests/comtest_dll.manifest | 16 ++
> dlls/sxs/tests/comtest_exe.manifest | 11 ++
> dlls/sxs/tests/interfaces.idl | 33 ++++
> dlls/sxs/tests/resource.rc | 27 ++++
> dlls/sxs/tests/sxs.c | 228 ++++++++++++++++++++++++++++
> 6 files changed, 321 insertions(+), 2 deletions(-)
> create mode 100644 dlls/sxs/tests/comtest_dll.manifest
> create mode 100644 dlls/sxs/tests/comtest_exe.manifest
> create mode 100644 dlls/sxs/tests/interfaces.idl
> create mode 100644 dlls/sxs/tests/resource.rc
> create mode 100644 dlls/sxs/tests/sxs.c
>
> diff --git a/dlls/sxs/tests/Makefile.in b/dlls/sxs/tests/Makefile.in
> index 34609a14ae..46b5485d29 100644
> --- a/dlls/sxs/tests/Makefile.in
> +++ b/dlls/sxs/tests/Makefile.in
> @@ -1,6 +1,10 @@
> TESTDLL = sxs.dll
> -IMPORTS = sxs
> +IMPORTS = sxs shlwapi
>
> C_SRCS = \
> cache.c \
> - name.c
> + name.c \
> + sxs.c
> +
> +RC_SRCS = resource.rc
> +IDL_SRCS = interfaces.idl
> \ No newline at end of file
> diff --git a/dlls/sxs/tests/comtest_dll.manifest b/dlls/sxs/tests/comtest_dll.manifest
> new file mode 100644
> index 0000000000..ef6924de9e
> --- /dev/null
> +++ b/dlls/sxs/tests/comtest_dll.manifest
> @@ -0,0 +1,16 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
> + <assemblyIdentity
> + name="comtest"
> + version="1.0.0.0"
> + type="win32"
> + />
> + <clrClass
> + clsid="{2e106e50-e7a4-4489-8538-83643f100fdc}"
> + threadingModel="Both"
> + name="DLL.Test"
> + runtimeVersion="v4.0.0.0">
> + </clrClass>
> + <file name="comtest.dll">
> + </file>
> +</assembly>
> diff --git a/dlls/sxs/tests/comtest_exe.manifest b/dlls/sxs/tests/comtest_exe.manifest
> new file mode 100644
> index 0000000000..bc9ce4c045
> --- /dev/null
> +++ b/dlls/sxs/tests/comtest_exe.manifest
> @@ -0,0 +1,11 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
> + <dependency>
> + <dependentAssembly>
> + <assemblyIdentity
> + name="comtest"
> + version="1.0.0.0"
> + type="win32"/>
> + </dependentAssembly>
> + </dependency>
> +</assembly>
> diff --git a/dlls/sxs/tests/interfaces.idl b/dlls/sxs/tests/interfaces.idl
> new file mode 100644
> index 0000000000..9e64988197
> --- /dev/null
> +++ b/dlls/sxs/tests/interfaces.idl
> @@ -0,0 +1,33 @@
> +/*
> + * Copyright 2018 Fabian Maurer
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> + */
> +
> +#include "unknwn.idl"
> +
> +[
> + object,
> + uuid(1dbc4491-080d-45c5-a15d-1e3c4610bdd9),
> + local
> +]
> +interface ITest : IUnknown {
> + HRESULT Func([in, out] int *i);
> +};
> +
> +[
> + uuid(2e106e50-e7a4-4489-8538-83643f100fdc),
> +]
> +coclass Test { interface ITest; };
> diff --git a/dlls/sxs/tests/resource.rc b/dlls/sxs/tests/resource.rc
> new file mode 100644
> index 0000000000..dd2c25bf37
> --- /dev/null
> +++ b/dlls/sxs/tests/resource.rc
> @@ -0,0 +1,27 @@
> +/*
> + * Resources for sxs test suite.
> + *
> + * Copyright 2018 Fabian Maurer
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> + */
> +
> +#include "windef.h"
> +
> +/* @makedep: comtest_exe.manifest */
> +comtest_exe.manifest RCDATA comtest_exe.manifest
> +
> +/* @makedep: comtest_dll.manifest */
> +comtest_dll.manifest RCDATA comtest_dll.manifest
> diff --git a/dlls/sxs/tests/sxs.c b/dlls/sxs/tests/sxs.c
> new file mode 100644
> index 0000000000..a68876d422
> --- /dev/null
> +++ b/dlls/sxs/tests/sxs.c
> @@ -0,0 +1,228 @@
> +/*
> + * Copyright 2018 Fabian Maurer
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> + */
> +
> +#include <stdio.h>
> +
> +#define COBJMACROS
> +
> +#include <windows.h>
> +#include <winsxs.h>
> +#include <corerror.h>
> +#include "shlwapi.h"
> +
> +#include "wine/test.h"
> +#include "wine/heap.h"
> +
> +#include "initguid.h"
> +#include "interfaces.h"
> +
> +BOOL (WINAPI *SxsLookupClrGuid)(DWORD dwFlags, LPGUID pClsid, HANDLE hActCtx, VOID *pvOutputBuffer, SIZE_T cbOutputBuffer, PSIZE_T pcbOutputBuffer);
Please use usual naming conventions for function pointer, and argument
types.
> +
> +#define SXS_LOOKUP_CLR_GUID_USE_ACTCTX 0x00000001
> +#define SXS_LOOKUP_CLR_GUID_FIND_SURROGATE 0x00010000
> +#define SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS 0x00020000
> +#define SXS_LOOKUP_CLR_GUID_FIND_ANY (SXS_LOOKUP_CLR_GUID_FIND_SURROGATE | SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS)
> +
> +#define SXS_GUID_INFORMATION_CLR_FLAG_IS_SURROGATE 0x00000001
> +#define SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS 0x00000002
> +
> +typedef struct _SXS_GUID_INFORMATION_CLR
> +{
> + DWORD cbSize;
> + DWORD dwFlags;
> + PCWSTR pcwszRuntimeVersion;
> + PCWSTR pcwszTypeName;
> + PCWSTR pcwszAssemblyIdentity;
> +} SXS_GUID_INFORMATION_CLR, *PSXS_GUID_INFORMATION_CLR;
Pointer type is not used.
> +
> +static BOOL write_resource_file(const char *path_tmp, const char *name_res, const char *name_file, char *path_file)
> +{
> + HRSRC rsrc;
> + void *rsrc_data;
> + DWORD rsrc_size;
> + BOOL ret;
> + HANDLE hfile;
> +
> + rsrc = FindResourceA(GetModuleHandleA(NULL), name_res, (LPCSTR)RT_RCDATA);
> + if (!rsrc) return FALSE;
> +
> + rsrc_data = LockResource(LoadResource(GetModuleHandleA(NULL), rsrc));
> + if (!rsrc_data) return FALSE;
> +
> + rsrc_size = SizeofResource(GetModuleHandleA(NULL), rsrc);
> + if (!rsrc_size) return FALSE;
> +
> + strcpy(path_file, path_tmp);
> + PathAppendA(path_file, name_file);
> + hfile = CreateFileA(path_file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
> + if (hfile == INVALID_HANDLE_VALUE) return FALSE;
> +
> + ret = WriteFile(hfile, rsrc_data, rsrc_size, &rsrc_size, NULL);
> +
> + CloseHandle(hfile);
> + return ret;
> +}
> +
> +static void run_test(int run)
> +{
> + SIZE_T buffer_size;
> + BOOL ret;
> + SXS_GUID_INFORMATION_CLR *info;
> + WCHAR expected_type_name[] = {'D','L','L','.','T','e','s','t',0};
> + WCHAR expected_runtime_version[] = {'v','4','.','0','.','0','.','0',0};
> + WCHAR expected_assembly_identity[] = {'c','o','m','t','e','s','t',',','t','y','p','e','=','"','w','i','n','3','2','"',',','v','e','r','s','i','o','n','=','"','1','.','0','.','0','.','0','"',0};
> +
> + ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS, (GUID*)&CLSID_Test, NULL, NULL, 0, &buffer_size);
> + ok(ret == FALSE, "Got %d\n", ret);
> + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got %d\n", GetLastError());
> +
> + info = heap_alloc(buffer_size);
> + ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS, (GUID*)&CLSID_Test, NULL, info, buffer_size, &buffer_size);
> + ok(ret == TRUE, "Got %d\n", ret);
> + ok(GetLastError() == 0, "Got %d\n", GetLastError());
> +
> + ok(info->dwFlags == SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS, "Got %d\n", info->dwFlags);
> + ok(lstrcmpW(info->pcwszTypeName, expected_type_name) == 0, "Got %s\n", wine_dbgstr_w(info->pcwszTypeName));
> + ok(lstrcmpW(info->pcwszAssemblyIdentity, expected_assembly_identity) == 0, "Got %s\n", wine_dbgstr_w(info->pcwszAssemblyIdentity));
> + ok(lstrcmpW(info->pcwszRuntimeVersion, expected_runtime_version) == 0, "Got %s\n", wine_dbgstr_w(info->pcwszRuntimeVersion));
> +
> + heap_free(info);
> +}
> +
> +static void prepare_and_run_test(int run)
> +{
> + char path_tmp[MAX_PATH] = {0};
> + char path_manifest_dll[MAX_PATH] = {0};
> + char path_manifest_exe[MAX_PATH] = {0};
> + BOOL success;
> + ACTCTXA context = {0};
> + ULONG_PTR cookie;
> + HANDLE handle_context = 0;
> +
> + GetTempPathA(MAX_PATH, path_tmp);
> +
> + if (!write_resource_file(path_tmp, "comtest_exe.manifest", "exe.manifest", path_manifest_exe))
> + {
> + skip("run %d: Failed to create file for testing\n", run);
> + goto cleanup;
> + }
> +
> + if (!write_resource_file(path_tmp, "comtest_dll.manifest", "comtest.manifest", path_manifest_dll))
> + {
> + skip("run %d: Failed to create file for testing\n", run);
> + goto cleanup;
> + }
> +
> + context.cbSize = sizeof(ACTCTXA);
> + context.lpSource = path_manifest_exe;
> + context.lpAssemblyDirectory = path_tmp;
> + context.dwFlags = ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID;
> +
> + handle_context = CreateActCtxA(&context);
> + ok(handle_context != NULL && handle_context != INVALID_HANDLE_VALUE, "run %d: CreateActCtxA failed: %d\n", run, GetLastError());
> +
> + if (handle_context == NULL || handle_context == INVALID_HANDLE_VALUE)
> + {
> + skip("Failed to create activation context\n");
> + goto cleanup;
> + }
> +
> + success = ActivateActCtx(handle_context, &cookie);
> + ok(success, "run %d: ActivateActCtx failed: %d\n", run, GetLastError());
> +
> + run_test(run);
> +
> +cleanup:
> + if (handle_context != NULL && handle_context != INVALID_HANDLE_VALUE)
> + {
> + success = DeactivateActCtx(0, cookie);
> + ok(success, "run %d: DeactivateActCtx failed: %d\n", run, GetLastError());
> + ReleaseActCtx(handle_context);
> + }
> + if (*path_manifest_exe)
> + {
> + success = DeleteFileA(path_manifest_exe);
> + ok(success, "run %d: DeleteFileA failed: %d\n", run, GetLastError());
> + }
> + if(*path_manifest_dll)
> + {
> + success = DeleteFileA(path_manifest_dll);
> + ok(success, "run %d: DeleteFileA failed: %d\n", run, GetLastError());
> + }
> +}
> +
> +static void run_child_process(int run)
> +{
> + char cmdline[MAX_PATH];
> + char exe[MAX_PATH];
> + char **argv;
> + PROCESS_INFORMATION pi;
> + STARTUPINFOA si = { 0 };
> + BOOL ret;
> +
> + winetest_get_mainargs(&argv);
> +
> + if (strstr(argv[0], ".exe"))
> + sprintf(exe, "%s", argv[0]);
> + else
> + sprintf(exe, "%s.exe", argv[0]);
> + sprintf(cmdline, "\"%s\" %s %d", argv[0], argv[1], run);
> +
> + si.cb = sizeof(si);
> + ret = CreateProcessA(exe, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
> + ok(ret, "Could not create process: %u\n", GetLastError());
> +
> + winetest_wait_child_process(pi.hProcess);
> +
> + CloseHandle(pi.hThread);
> + CloseHandle(pi.hProcess);
> +}
> +
> +static void test_SxsLookupClrGuid(void)
> +{
> + SIZE_T buffer_size;
> + BOOL ret;
> +
> + ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS, (GUID*)&CLSID_Test, NULL, NULL, 0, &buffer_size);
> + ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
> + ok(GetLastError() == ERROR_NOT_FOUND, "Expected ERROR_NOT_FOUND, got %d\n", GetLastError());
> +
> + run_child_process(1);
> +}
> +
> +START_TEST(sxs)
> +{
> + int argc;
> + char **argv;
> +
> + SxsLookupClrGuid = (void *)GetProcAddress(LoadLibraryA("sxs.dll"), "SxsLookupClrGuid");
> +
> + argc = winetest_get_mainargs(&argv);
> + if (argc > 2)
> + {
> + int run = atoi(argv[2]);
> + prepare_and_run_test(run);
> +
> + return;
> + }
> +
> + todo_wine
> + ok(SxsLookupClrGuid != NULL, "SxsLookupClrGuid doesn't exist\n");
> + if( SxsLookupClrGuid)
> + test_SxsLookupClrGuid();
What's a point of pointer test, is it missing on some Windows versions?
> +}
More information about the wine-devel
mailing list