ole32/tests: Get rid of some global variables in moniker tests.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2021-09-20 13:08:43 +03:00 committed by Alexandre Julliard
parent aa63f9c940
commit 9253ef3963
1 changed files with 114 additions and 111 deletions

View File

@ -36,8 +36,6 @@
#include "wine/test.h"
#include "wine/heap.h"
#define ok_more_than_one_lock() ok(cLocks > 0, "Number of locks should be > 0, but actually is %d\n", cLocks)
#define ok_no_locks() ok(cLocks == 0, "Number of locks should be 0, but actually is %d\n", cLocks)
#define ok_ole_success(hr, func) ok(hr == S_OK, #func " failed with error 0x%08x\n", hr)
#define CHECK_EXPECTED_METHOD(method_name) \
@ -138,18 +136,6 @@ static IMoniker *create_antimoniker(DWORD level)
return moniker;
}
static LONG cLocks;
static void LockModule(void)
{
InterlockedIncrement(&cLocks);
}
static void UnlockModule(void)
{
InterlockedDecrement(&cLocks);
}
static SIZE_T round_global_size(SIZE_T size)
{
static SIZE_T global_size_alignment = -1;
@ -163,7 +149,23 @@ static SIZE_T round_global_size(SIZE_T size)
return ((size + global_size_alignment - 1) & ~(global_size_alignment - 1));
}
static DWORD external_connections;
struct test_factory
{
IClassFactory IClassFactory_iface;
IExternalConnection IExternalConnection_iface;
LONG refcount;
unsigned int external_connections;
};
static struct test_factory *impl_from_IClassFactory(IClassFactory *iface)
{
return CONTAINING_RECORD(iface, struct test_factory, IClassFactory_iface);
}
static struct test_factory *impl_from_IExternalConnection(IExternalConnection *iface)
{
return CONTAINING_RECORD(iface, struct test_factory, IExternalConnection_iface);
}
static HRESULT WINAPI ExternalConnection_QueryInterface(IExternalConnection *iface, REFIID riid, void **ppv)
{
@ -174,28 +176,31 @@ static HRESULT WINAPI ExternalConnection_QueryInterface(IExternalConnection *ifa
static ULONG WINAPI ExternalConnection_AddRef(IExternalConnection *iface)
{
return 2;
struct test_factory *factory = impl_from_IExternalConnection(iface);
return IClassFactory_AddRef(&factory->IClassFactory_iface);
}
static ULONG WINAPI ExternalConnection_Release(IExternalConnection *iface)
{
return 1;
struct test_factory *factory = impl_from_IExternalConnection(iface);
return IClassFactory_Release(&factory->IClassFactory_iface);
}
static DWORD WINAPI ExternalConnection_AddConnection(IExternalConnection *iface, DWORD extconn, DWORD reserved)
{
ok(extconn == EXTCONN_STRONG, "extconn = %d\n", extconn);
struct test_factory *factory = impl_from_IExternalConnection(iface);
ok(extconn == EXTCONN_STRONG, "Unexpected connection type %d\n", extconn);
ok(!reserved, "reserved = %x\n", reserved);
return ++external_connections;
return ++factory->external_connections;
}
static DWORD WINAPI ExternalConnection_ReleaseConnection(IExternalConnection *iface, DWORD extconn,
DWORD reserved, BOOL fLastReleaseCloses)
{
ok(extconn == EXTCONN_STRONG, "extconn = %d\n", extconn);
struct test_factory *factory = impl_from_IExternalConnection(iface);
ok(extconn == EXTCONN_STRONG, "Unexpected connection type %d\n", extconn);
ok(!reserved, "reserved = %x\n", reserved);
return --external_connections;
return --factory->external_connections;
}
static const IExternalConnectionVtbl ExternalConnectionVtbl = {
@ -206,70 +211,70 @@ static const IExternalConnectionVtbl ExternalConnectionVtbl = {
ExternalConnection_ReleaseConnection
};
static IExternalConnection ExternalConnection = { &ExternalConnectionVtbl };
static HRESULT WINAPI Test_IClassFactory_QueryInterface(
LPCLASSFACTORY iface,
REFIID riid,
LPVOID *ppvObj)
static HRESULT WINAPI test_factory_QueryInterface(IClassFactory *iface, REFIID riid, void **obj)
{
if (ppvObj == NULL) return E_POINTER;
struct test_factory *factory = impl_from_IClassFactory(iface);
if (!obj) return E_POINTER;
if (IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_IClassFactory))
{
*ppvObj = iface;
IClassFactory_AddRef(iface);
return S_OK;
*obj = iface;
}
else if (IsEqualGUID(riid, &IID_IExternalConnection))
{
*obj = &factory->IExternalConnection_iface;
}
else
{
*obj = NULL;
return E_NOINTERFACE;
}
if(IsEqualGUID(riid, &IID_IExternalConnection)) {
*ppvObj = &ExternalConnection;
return S_OK;
}
*ppvObj = NULL;
return E_NOINTERFACE;
IUnknown_AddRef((IUnknown *)*obj);
return S_OK;
}
static ULONG WINAPI Test_IClassFactory_AddRef(LPCLASSFACTORY iface)
static ULONG WINAPI test_factory_AddRef(IClassFactory *iface)
{
LockModule();
return 2; /* non-heap-based object */
struct test_factory *factory = impl_from_IClassFactory(iface);
return InterlockedIncrement(&factory->refcount);
}
static ULONG WINAPI Test_IClassFactory_Release(LPCLASSFACTORY iface)
static ULONG WINAPI test_factory_Release(IClassFactory *iface)
{
UnlockModule();
return 1; /* non-heap-based object */
struct test_factory *factory = impl_from_IClassFactory(iface);
return InterlockedDecrement(&factory->refcount);
}
static HRESULT WINAPI Test_IClassFactory_CreateInstance(
LPCLASSFACTORY iface,
LPUNKNOWN pUnkOuter,
REFIID riid,
LPVOID *ppvObj)
static HRESULT WINAPI test_factory_CreateInstance(IClassFactory *iface, IUnknown *outer,
REFIID riid, void **obj)
{
return E_NOTIMPL;
}
static HRESULT WINAPI Test_IClassFactory_LockServer(
LPCLASSFACTORY iface,
BOOL fLock)
static HRESULT WINAPI test_factory_LockServer(IClassFactory *iface, BOOL lock)
{
return S_OK;
}
static const IClassFactoryVtbl TestClassFactory_Vtbl =
static const IClassFactoryVtbl test_factory_vtbl =
{
Test_IClassFactory_QueryInterface,
Test_IClassFactory_AddRef,
Test_IClassFactory_Release,
Test_IClassFactory_CreateInstance,
Test_IClassFactory_LockServer
test_factory_QueryInterface,
test_factory_AddRef,
test_factory_Release,
test_factory_CreateInstance,
test_factory_LockServer
};
static IClassFactory Test_ClassFactory = { &TestClassFactory_Vtbl };
static void test_factory_init(struct test_factory *factory)
{
factory->IClassFactory_iface.lpVtbl = &test_factory_vtbl;
factory->IExternalConnection_iface.lpVtbl = &ExternalConnectionVtbl;
factory->refcount = 1;
factory->external_connections = 0;
}
typedef struct
{
@ -796,6 +801,7 @@ static void test_ROT(void)
IMoniker *pMoniker = NULL;
struct test_moniker *test_moniker;
IRunningObjectTable *pROT = NULL;
struct test_factory factory;
DWORD dwCookie;
static const char *methods_register_no_ROTData[] =
{
@ -830,7 +836,7 @@ static void test_ROT(void)
NULL
};
cLocks = 0;
test_factory_init(&factory);
hr = GetRunningObjectTable(0, &pROT);
ok_ole_success(hr, GetRunningObjectTable);
@ -839,15 +845,13 @@ static void test_ROT(void)
test_moniker->no_IROTData = TRUE;
expected_method_list = methods_register_no_ROTData;
external_connections = 0;
/* try with our own moniker that doesn't support IROTData */
hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE, (IUnknown *)&Test_ClassFactory,
hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE, (IUnknown *)&factory.IClassFactory_iface,
&test_moniker->IMoniker_iface, &dwCookie);
ok(hr == S_OK, "Failed to register interface, hr %#x.\n", hr);
ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
ok(external_connections == 1, "external_connections = %d\n", external_connections);
ok_more_than_one_lock();
ok(factory.external_connections == 1, "external_connections = %d\n", factory.external_connections);
ok(factory.refcount > 1, "Unexpected factory refcount %u.\n", factory.refcount);
expected_method_list = methods_isrunning_no_ROTData;
hr = IRunningObjectTable_IsRunning(pROT, &test_moniker->IMoniker_iface);
@ -856,19 +860,17 @@ static void test_ROT(void)
hr = IRunningObjectTable_Revoke(pROT, dwCookie);
ok_ole_success(hr, IRunningObjectTable_Revoke);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
ok_no_locks();
ok(!factory.external_connections, "external_connections = %d\n", factory.external_connections);
ok(factory.refcount == 1, "Unexpected factory refcount %u.\n", factory.refcount);
expected_method_list = methods_register;
/* try with our own moniker */
test_moniker->no_IROTData = FALSE;
hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE,
(IUnknown *)&Test_ClassFactory, &test_moniker->IMoniker_iface, &dwCookie);
hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE, (IUnknown *)&factory.IClassFactory_iface,
&test_moniker->IMoniker_iface, &dwCookie);
ok_ole_success(hr, IRunningObjectTable_Register);
ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
ok_more_than_one_lock();
ok(factory.refcount > 1, "Unexpected factory refcount %u.\n", factory.refcount);
expected_method_list = methods_isrunning;
hr = IRunningObjectTable_IsRunning(pROT, &test_moniker->IMoniker_iface);
@ -877,50 +879,47 @@ static void test_ROT(void)
hr = IRunningObjectTable_Revoke(pROT, dwCookie);
ok_ole_success(hr, IRunningObjectTable_Revoke);
ok_no_locks();
ok(factory.refcount == 1, "Unexpected factory refcount %u.\n", factory.refcount);
hr = CreateFileMoniker(wszFileName, &pMoniker);
ok_ole_success(hr, CreateClassMoniker);
/* test flags: 0 */
external_connections = 0;
hr = IRunningObjectTable_Register(pROT, 0, (IUnknown*)&Test_ClassFactory,
pMoniker, &dwCookie);
factory.external_connections = 0;
hr = IRunningObjectTable_Register(pROT, 0, (IUnknown *)&factory.IClassFactory_iface, pMoniker, &dwCookie);
ok_ole_success(hr, IRunningObjectTable_Register);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
ok_more_than_one_lock();
ok(!factory.external_connections, "external_connections = %d\n", factory.external_connections);
ok(factory.refcount > 1, "Unexpected factory refcount %u.\n", factory.refcount);
hr = IRunningObjectTable_Revoke(pROT, dwCookie);
ok_ole_success(hr, IRunningObjectTable_Revoke);
ok_no_locks();
ok(factory.refcount == 1, "Unexpected factory refcount %u.\n", factory.refcount);
/* test flags: ROTFLAGS_REGISTRATIONKEEPSALIVE */
hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE,
(IUnknown*)&Test_ClassFactory, pMoniker, &dwCookie);
hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE, (IUnknown *)&factory.IClassFactory_iface,
pMoniker, &dwCookie);
ok_ole_success(hr, IRunningObjectTable_Register);
ok_more_than_one_lock();
ok(factory.refcount > 1, "Unexpected factory refcount %u.\n", factory.refcount);
hr = IRunningObjectTable_Revoke(pROT, dwCookie);
ok_ole_success(hr, IRunningObjectTable_Revoke);
ok_no_locks();
ok(factory.refcount == 1, "Unexpected factory refcount %u.\n", factory.refcount);
/* test flags: ROTFLAGS_REGISTRATIONKEEPSALIVE|ROTFLAGS_ALLOWANYCLIENT */
/* only succeeds when process is started by SCM and has LocalService
* or RunAs AppId values */
hr = IRunningObjectTable_Register(pROT,
ROTFLAGS_REGISTRATIONKEEPSALIVE|ROTFLAGS_ALLOWANYCLIENT,
(IUnknown*)&Test_ClassFactory, pMoniker, &dwCookie);
hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE | ROTFLAGS_ALLOWANYCLIENT,
(IUnknown *)&factory.IClassFactory_iface, pMoniker, &dwCookie);
todo_wine {
ok(hr == CO_E_WRONG_SERVER_IDENTITY, "Unexpected hr %#x.\n", hr);
}
if (SUCCEEDED(hr))
{
hr = IRunningObjectTable_Revoke(pROT, dwCookie);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
}
hr = IRunningObjectTable_Register(pROT, 0xdeadbeef,
(IUnknown*)&Test_ClassFactory, pMoniker, &dwCookie);
hr = IRunningObjectTable_Register(pROT, 0xdeadbeef, (IUnknown *)&factory.IClassFactory_iface, pMoniker, &dwCookie);
ok(hr == E_INVALIDARG, "IRunningObjectTable_Register should have returned E_INVALIDARG instead of 0x%08x\n", hr);
IMoniker_Release(pMoniker);
@ -938,6 +937,9 @@ static void test_ROT_multiple_entries(void)
IUnknown *pObject = NULL;
static const WCHAR moniker_path[] =
{'\\', 'w','i','n','d','o','w','s','\\','s','y','s','t','e','m','\\','t','e','s','t','1','.','d','o','c',0};
struct test_factory factory;
test_factory_init(&factory);
hr = GetRunningObjectTable(0, &pROT);
ok_ole_success(hr, GetRunningObjectTable);
@ -945,10 +947,10 @@ static void test_ROT_multiple_entries(void)
hr = CreateFileMoniker(moniker_path, &pMoniker);
ok_ole_success(hr, CreateFileMoniker);
hr = IRunningObjectTable_Register(pROT, 0, (IUnknown *)&Test_ClassFactory, pMoniker, &dwCookie1);
hr = IRunningObjectTable_Register(pROT, 0, (IUnknown *)&factory.IClassFactory_iface, pMoniker, &dwCookie1);
ok_ole_success(hr, IRunningObjectTable_Register);
hr = IRunningObjectTable_Register(pROT, 0, (IUnknown *)&Test_ClassFactory, pMoniker, &dwCookie2);
hr = IRunningObjectTable_Register(pROT, 0, (IUnknown *)&factory.IClassFactory_iface, pMoniker, &dwCookie2);
ok(hr == MK_S_MONIKERALREADYREGISTERED, "IRunningObjectTable_Register should have returned MK_S_MONIKERALREADYREGISTERED instead of 0x%08x\n", hr);
ok(dwCookie1 != dwCookie2, "cookie returned for registering duplicate object shouldn't match cookie of original object (0x%x)\n", dwCookie1);
@ -1103,6 +1105,9 @@ static void test_MkParseDisplayName(void)
{&pbc, wszEmpty, &eaten, NULL},
{&pbc, wszEmpty, &eaten, &pmk},
};
struct test_factory factory;
test_factory_init(&factory);
hr = CreateBindCtx(0, &pbc);
ok_ole_success(hr, CreateBindCtx);
@ -1143,7 +1148,7 @@ todo_wine
ok_ole_success(hr, CreateFileMoniker);
hr = IBindCtx_GetRunningObjectTable(pbc, &pprot);
ok_ole_success(hr, IBindCtx_GetRunningObjectTable);
hr = IRunningObjectTable_Register(pprot, 0, (IUnknown *)&Test_ClassFactory, pmk, &pdwReg1);
hr = IRunningObjectTable_Register(pprot, 0, (IUnknown *)&factory.IClassFactory_iface, pmk, &pdwReg1);
ok_ole_success(hr, IRunningObjectTable_Register);
IMoniker_Release(pmk);
pmk = NULL;
@ -1164,7 +1169,7 @@ todo_wine
ok_ole_success(hr, CreateFileMoniker);
hr = IBindCtx_GetRunningObjectTable(pbc, &pprot);
ok_ole_success(hr, IBindCtx_GetRunningObjectTable);
hr = IRunningObjectTable_Register(pprot, 0, (IUnknown *)&Test_ClassFactory, pmk, &pdwReg1);
hr = IRunningObjectTable_Register(pprot, 0, (IUnknown *)&factory.IClassFactory_iface, pmk, &pdwReg1);
ok_ole_success(hr, IRunningObjectTable_Register);
IMoniker_Release(pmk);
pmk = NULL;
@ -3032,6 +3037,7 @@ todo_wine
static void test_pointer_moniker(void)
{
IMoniker *moniker, *moniker2, *prefix, *inverse, *anti;
struct test_factory factory;
IEnumMoniker *enummoniker;
DWORD hash, size;
HRESULT hr;
@ -3045,13 +3051,13 @@ static void test_pointer_moniker(void)
LARGE_INTEGER pos;
CLSID clsid;
cLocks = 0;
test_factory_init(&factory);
hr = CreatePointerMoniker((IUnknown *)&Test_ClassFactory, NULL);
ok(hr == E_INVALIDARG, "CreatePointerMoniker(x, NULL) should have returned E_INVALIDARG instead of 0x%08x\n", hr);
hr = CreatePointerMoniker((IUnknown *)&factory.IClassFactory_iface, NULL);
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
hr = CreatePointerMoniker((IUnknown *)&Test_ClassFactory, &moniker);
ok_ole_success(hr, CreatePointerMoniker);
hr = CreatePointerMoniker((IUnknown *)&factory.IClassFactory_iface, &moniker);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMoniker_QueryInterface(moniker, &IID_IMoniker, NULL);
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
@ -3089,7 +3095,7 @@ static void test_pointer_moniker(void)
IMarshal_Release(marshal);
ok_more_than_one_lock();
ok(factory.refcount > 1, "Unexpected factory refcount %u.\n", factory.refcount);
/* Display Name */
@ -3122,9 +3128,7 @@ static void test_pointer_moniker(void)
/* Hashing */
hr = IMoniker_Hash(moniker, &hash);
ok_ole_success(hr, IMoniker_Hash);
ok(hash == PtrToUlong(&Test_ClassFactory),
"Hash value should have been 0x%08x, instead of 0x%08x\n",
PtrToUlong(&Test_ClassFactory), hash);
ok(hash == PtrToUlong(&factory.IClassFactory_iface), "Unexpected hash value %#x.\n", hash);
/* IsSystemMoniker test */
TEST_MONIKER_TYPE(moniker, MKSYS_POINTERMONIKER);
@ -3154,8 +3158,7 @@ static void test_pointer_moniker(void)
IMoniker_Release(moniker);
todo_wine
ok(cLocks == 0, "Number of locks should be 0, but actually is %d.\n", cLocks);
ok(factory.refcount == 1, "Unexpected factory refcount %u.\n", factory.refcount);
hr = CreatePointerMoniker(NULL, &moniker);
ok_ole_success(hr, CreatePointerMoniker);
@ -3178,10 +3181,10 @@ todo_wine
IMoniker_Release(moniker);
/* CommonPrefixWith() */
hr = CreatePointerMoniker((IUnknown *)&Test_ClassFactory, &moniker);
hr = CreatePointerMoniker((IUnknown *)&factory.IClassFactory_iface, &moniker);
ok(hr == S_OK, "Failed to create moniker, hr %#x.\n", hr);
hr = CreatePointerMoniker((IUnknown *)&Test_ClassFactory, &moniker2);
hr = CreatePointerMoniker((IUnknown *)&factory.IClassFactory_iface, &moniker2);
ok(hr == S_OK, "Failed to create moniker, hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker, NULL);