ole32/tests: Add tests to show that CoLockObjectExternal() calls ReleaseConnection() with the appropriate value for fLastReleaseCloses.

This commit is contained in:
Huw Davies 2013-10-18 12:52:46 +01:00 committed by Alexandre Julliard
parent b528e01d85
commit 29c6e10fd8
1 changed files with 59 additions and 0 deletions

View File

@ -106,6 +106,52 @@ static void UnlockModule(void)
InterlockedDecrement(&cLocks);
}
static BOOL with_external_conn;
static DWORD external_connections;
static BOOL last_release_closes;
static HRESULT WINAPI ExternalConnection_QueryInterface(IExternalConnection *iface, REFIID riid, void **ppv)
{
ok(0, "unxpected call\n");
*ppv = NULL;
return E_NOINTERFACE;
}
static ULONG WINAPI ExternalConnection_AddRef(IExternalConnection *iface)
{
return 2;
}
static ULONG WINAPI ExternalConnection_Release(IExternalConnection *iface)
{
return 1;
}
static DWORD WINAPI ExternalConnection_AddConnection(IExternalConnection *iface, DWORD extconn, DWORD reserved)
{
trace("add connection\n");
return ++external_connections;
}
static DWORD WINAPI ExternalConnection_ReleaseConnection(IExternalConnection *iface, DWORD extconn,
DWORD reserved, BOOL fLastReleaseCloses)
{
trace("release connection %d\n", fLastReleaseCloses);
last_release_closes = fLastReleaseCloses;
return --external_connections;
}
static const IExternalConnectionVtbl ExternalConnectionVtbl = {
ExternalConnection_QueryInterface,
ExternalConnection_AddRef,
ExternalConnection_Release,
ExternalConnection_AddConnection,
ExternalConnection_ReleaseConnection
};
static IExternalConnection ExternalConnection = { &ExternalConnectionVtbl };
static HRESULT WINAPI Test_IUnknown_QueryInterface(
LPUNKNOWN iface,
@ -164,6 +210,12 @@ static HRESULT WINAPI Test_IClassFactory_QueryInterface(
return S_OK;
}
if (with_external_conn && IsEqualGUID(riid, &IID_IExternalConnection))
{
*ppvObj = &ExternalConnection;
return S_OK;
}
*ppvObj = NULL;
return E_NOINTERFACE;
}
@ -1232,6 +1284,7 @@ static void test_lock_object_external(void)
IStream *pStream = NULL;
cLocks = 0;
with_external_conn = TRUE;
/* test the stub manager creation aspect of CoLockObjectExternal when the
* object hasn't been marshaled yet */
@ -1270,6 +1323,7 @@ static void test_lock_object_external(void)
CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, TRUE);
ok_no_locks();
ok(last_release_closes, "last_release_closes FALSE\n");
/* test CoLockObjectExternal releases reference to object with
* fLastUnlockReleases as TRUE and there are only strong references on
@ -1281,6 +1335,8 @@ static void test_lock_object_external(void)
CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, FALSE);
ok_no_locks();
todo_wine
ok(!last_release_closes, "last_release_closes TRUE\n");
/* test CoLockObjectExternal doesn't release the last reference to an
* object with fLastUnlockReleases as TRUE and there is a weak reference
@ -1301,8 +1357,11 @@ static void test_lock_object_external(void)
CoDisconnectObject((IUnknown*)&Test_ClassFactory, 0);
ok_no_locks();
todo_wine
ok(!last_release_closes, "last_release_closes TRUE\n");
IStream_Release(pStream);
with_external_conn = FALSE;
}
/* tests disconnecting stubs */