Module: wine Branch: master Commit: de527d5ec0f63f7d4a3cf6eeea854b9efa276ee0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=de527d5ec0f63f7d4a3cf6eeea...
Author: Rob Shearman rob@codeweavers.com Date: Tue Jan 9 17:17:15 2007 +0000
ole32: Add tests for invalid arguments of CoMarshalInterface and CoMarshalInterThreadInterfaceInStream.
---
dlls/ole32/tests/compobj.c | 149 +++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 146 insertions(+), 3 deletions(-)
diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c index d68d54a..cc83f83 100644 --- a/dlls/ole32/tests/compobj.c +++ b/dlls/ole32/tests/compobj.c @@ -34,6 +34,8 @@ HRESULT (WINAPI * pCoInitializeEx)(LPVOID lpReserved, DWORD dwCoInit);
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr) +#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)
static const CLSID CLSID_non_existent = { 0x12345678, 0x1234, 0x1234, { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 } }; static const CLSID CLSID_CDeviceMoniker = { 0x4315d437, 0x5b8c, 0x11d0, { 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86 } }; @@ -58,6 +60,77 @@ static const IID IID_IWineTest = {0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd} }; /* 5201163f-8164-4fd0-a1a2-5d5a3654d3bd */
+static LONG cLocks; + +static void LockModule(void) +{ + InterlockedIncrement(&cLocks); +} + +static void UnlockModule(void) +{ + InterlockedDecrement(&cLocks); +} + +static HRESULT WINAPI Test_IClassFactory_QueryInterface( + LPCLASSFACTORY iface, + REFIID riid, + LPVOID *ppvObj) +{ + if (ppvObj == NULL) return E_POINTER; + + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IClassFactory)) + { + *ppvObj = (LPVOID)iface; + IClassFactory_AddRef(iface); + return S_OK; + } + + *ppvObj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI Test_IClassFactory_AddRef(LPCLASSFACTORY iface) +{ + LockModule(); + return 2; /* non-heap-based object */ +} + +static ULONG WINAPI Test_IClassFactory_Release(LPCLASSFACTORY iface) +{ + UnlockModule(); + return 1; /* non-heap-based object */ +} + +static HRESULT WINAPI Test_IClassFactory_CreateInstance( + LPCLASSFACTORY iface, + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID *ppvObj) +{ + *ppvObj = NULL; + if (pUnkOuter) return CLASS_E_NOAGGREGATION; + return E_NOINTERFACE; +} + +static HRESULT WINAPI Test_IClassFactory_LockServer( + LPCLASSFACTORY iface, + BOOL fLock) +{ + return S_OK; +} + +static const IClassFactoryVtbl TestClassFactory_Vtbl = +{ + Test_IClassFactory_QueryInterface, + Test_IClassFactory_AddRef, + Test_IClassFactory_Release, + Test_IClassFactory_CreateInstance, + Test_IClassFactory_LockServer +}; + +static IClassFactory Test_ClassFactory = { &TestClassFactory_Vtbl };
static void test_ProgIDFromCLSID(void) { @@ -160,7 +233,7 @@ static ATOM register_dummy_class(void) NULL, TEXT("WineOleTestClass"), }; - + return RegisterClass(&wc); }
@@ -337,7 +410,7 @@ static HRESULT WINAPI PSFactoryBuffer_Qu } return E_NOINTERFACE; } - + static ULONG WINAPI PSFactoryBuffer_AddRef( IPSFactoryBuffer * This) { @@ -359,7 +432,7 @@ static HRESULT WINAPI PSFactoryBuffer_Cr { return E_NOTIMPL; } - + static HRESULT WINAPI PSFactoryBuffer_CreateStub( IPSFactoryBuffer * This, /* [in] */ REFIID riid, @@ -468,6 +541,74 @@ static void test_CoGetInterfaceAndReleas CoUninitialize(); }
+static void test_CoMarshalInterface(void) +{ + IStream *pStream; + HRESULT hr; + static const LARGE_INTEGER llZero; + + pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + + hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream); + ok_ole_success(hr, "CreateStreamOnHGlobal"); + + hr = CoMarshalInterface(pStream, &IID_IUnknown, NULL, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + ok(hr == E_INVALIDARG, "CoMarshalInterface should have returned E_INVALIDARG instead of 0x%08x\n", hr); + + hr = CoMarshalInterface(NULL, &IID_IUnknown, (IUnknown *)&Test_ClassFactory, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + ok(hr == E_INVALIDARG, "CoMarshalInterface should have returned E_INVALIDARG instead of 0x%08x\n", hr); + + hr = CoMarshalInterface(pStream, &IID_IUnknown, (IUnknown *)&Test_ClassFactory, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + ok_ole_success(hr, "CoMarshalInterface"); + + /* stream not rewound */ + hr = CoReleaseMarshalData(pStream); + ok(hr == STG_E_READFAULT, "CoReleaseMarshalData should have returned STG_E_READFAULT instead of 0x%08x\n", hr); + + hr = IStream_Seek(pStream, llZero, STREAM_SEEK_SET, NULL); + ok_ole_success(hr, "IStream_Seek"); + + hr = CoReleaseMarshalData(pStream); + ok_ole_success(hr, "CoReleaseMarshalData"); + + IStream_Release(pStream); + + CoUninitialize(); +} + +static void test_CoMarshalInterThreadInterfaceInStream(void) +{ + IStream *pStream; + HRESULT hr; + IClassFactory *pProxy; + + pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + + cLocks = 0; + + hr = CoMarshalInterThreadInterfaceInStream(&IID_IUnknown, (IUnknown *)&Test_ClassFactory, NULL); + ok(hr == E_INVALIDARG, "CoMarshalInterThreadInterfaceInStream should have returned E_INVALIDARG instead of 0x%08x\n", hr); + + hr = CoMarshalInterThreadInterfaceInStream(&IID_IUnknown, NULL, &pStream); + ok(hr == E_INVALIDARG, "CoMarshalInterThreadInterfaceInStream should have returned E_INVALIDARG instead of 0x%08x\n", hr); + + ok_no_locks(); + + hr = CoMarshalInterThreadInterfaceInStream(&IID_IUnknown, (IUnknown *)&Test_ClassFactory, &pStream); + ok_ole_success(hr, "CoMarshalInterThreadInterfaceInStream"); + + ok_more_than_one_lock(); + + hr = CoUnmarshalInterface(pStream, &IID_IClassFactory, (void **)&pProxy); + ok_ole_success(hr, "CoUnmarshalInterface"); + + IClassFactory_Release(pProxy); + + ok_no_locks(); + + CoUninitialize(); +} + START_TEST(compobj) { HMODULE hOle32 = GetModuleHandle("ole32"); @@ -487,4 +628,6 @@ START_TEST(compobj) test_CoRegisterPSClsid(); test_CoGetPSClsid(); test_CoGetInterfaceAndReleaseStream(); + test_CoMarshalInterface(); + test_CoMarshalInterThreadInterfaceInStream(); }