[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