From bcf0be6a995f5b336d7287d9111336ff531a7755 Mon Sep 17 00:00:00 2001 From: Rob Shearman Date: Mon, 23 Nov 2009 15:07:20 +0000 Subject: [PATCH] ole32: Add test for CoLockObjectExternal with fLastUnlockReleases as FALSE. --- dlls/ole32/tests/marshal.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c index 4239b55ddc3..93fd9a646cb 100644 --- a/dlls/ole32/tests/marshal.c +++ b/dlls/ole32/tests/marshal.c @@ -1257,7 +1257,7 @@ static void test_lock_object_external(void) IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL); hr = CoReleaseMarshalData(pStream); ok_ole_success(hr, CoReleaseMarshalData); - IStream_Release(pStream); + IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL); ok_more_than_one_lock(); @@ -1268,6 +1268,42 @@ static void test_lock_object_external(void) CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, TRUE); ok_no_locks(); + + /* test CoLockObjectExternal releases reference to object with + * fLastUnlockReleases as TRUE and there are only strong references on + * the object */ + CoLockObjectExternal((IUnknown*)&Test_ClassFactory, TRUE, FALSE); + + ok_more_than_one_lock(); + + CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, FALSE); + + todo_wine + ok_no_locks(); + if (cLocks > 0) + CoDisconnectObject((IUnknown*)&Test_ClassFactory, 0); + + /* test CoLockObjectExternal doesn't release the last reference to an + * object with fLastUnlockReleases as TRUE and there is a weak reference + * on the object */ + hr = CoMarshalInterface(pStream, &IID_IClassFactory, (IUnknown*)&Test_ClassFactory, MSHCTX_INPROC, NULL, MSHLFLAGS_TABLEWEAK); + ok_ole_success(hr, CoMarshalInterface); + + ok_more_than_one_lock(); + + CoLockObjectExternal((IUnknown*)&Test_ClassFactory, TRUE, FALSE); + + ok_more_than_one_lock(); + + CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, FALSE); + + ok_more_than_one_lock(); + + CoDisconnectObject((IUnknown*)&Test_ClassFactory, 0); + + ok_no_locks(); + + IStream_Release(pStream); } /* tests disconnecting stubs */