Rob Shearman : ole32: Add tests for channel hooks.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Dec 29 14:35:33 CST 2006
Module: wine
Branch: master
Commit: 638182bbbaf90cbe91596689aa435e860e639080
URL: http://source.winehq.org/git/wine.git/?a=commit;h=638182bbbaf90cbe91596689aa435e860e639080
Author: Rob Shearman <rob at codeweavers.com>
Date: Fri Dec 29 14:44:14 2006 +0000
ole32: Add tests for channel hooks.
---
dlls/ole32/tests/Makefile.in | 2 +-
dlls/ole32/tests/marshal.c | 220 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 221 insertions(+), 1 deletions(-)
diff --git a/dlls/ole32/tests/Makefile.in b/dlls/ole32/tests/Makefile.in
index 1be0be0..f34aef3 100644
--- a/dlls/ole32/tests/Makefile.in
+++ b/dlls/ole32/tests/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = ole32.dll
-IMPORTS = oleaut32 ole32 user32 gdi32 kernel32
+IMPORTS = oleaut32 ole32 user32 gdi32 advapi32 kernel32
EXTRALIBS = -luuid
CTESTS = \
diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c
index e8e3530..3c8281a 100644
--- a/dlls/ole32/tests/marshal.c
+++ b/dlls/ole32/tests/marshal.c
@@ -47,6 +47,8 @@ static const IID IID_IWineTest =
{0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd}
}; /* 5201163f-8164-4fd0-a1a2-5d5a3654d3bd */
+#define EXTENTID_WineTest IID_IWineTest
+
static void test_cocreateinstance_proxy(void)
{
IUnknown *pProxy;
@@ -2182,6 +2184,221 @@ static void test_CoGetInterfaceAndReleas
ok(hr == E_INVALIDARG, "hr %08x\n", hr);
}
+static const char *debugstr_iid(REFIID riid)
+{
+ static char name[256];
+ HKEY hkeyInterface;
+ WCHAR bufferW[39];
+ char buffer[39];
+ LONG name_size = sizeof(name);
+ StringFromGUID2(riid, bufferW, sizeof(bufferW)/sizeof(bufferW[0]));
+ WideCharToMultiByte(CP_ACP, 0, bufferW, sizeof(bufferW)/sizeof(bufferW[0]), buffer, sizeof(buffer), NULL, NULL);
+ if (RegOpenKeyEx(HKEY_CLASSES_ROOT, "Interface", 0, KEY_QUERY_VALUE, &hkeyInterface) != ERROR_SUCCESS)
+ {
+ memcpy(name, buffer, sizeof(buffer));
+ goto done;
+ }
+ if (RegQueryValue(hkeyInterface, buffer, name, &name_size) != ERROR_SUCCESS)
+ {
+ memcpy(name, buffer, sizeof(buffer));
+ goto done;
+ }
+ RegCloseKey(hkeyInterface);
+done:
+ return name;
+}
+
+static HRESULT WINAPI TestChannelHook_QueryInterface(IChannelHook *iface, REFIID riid, void **ppv)
+{
+ if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IChannelHook))
+ {
+ *ppv = iface;
+ IUnknown_AddRef(iface);
+ return S_OK;
+ }
+
+ *ppv = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI TestChannelHook_AddRef(IChannelHook *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI TestChannelHook_Release(IChannelHook *iface)
+{
+ return 1;
+}
+
+static void WINAPI TestChannelHook_ClientGetSize(
+ IChannelHook *iface,
+ REFGUID uExtent,
+ REFIID riid,
+ ULONG *pDataSize )
+{
+ SChannelHookCallInfo *info = (SChannelHookCallInfo *)riid;
+ trace("TestChannelHook_ClientGetBuffer\n");
+ trace("\t%s method %d\n", debugstr_iid(riid), info->iMethod);
+ trace("\tcid: %s\n", debugstr_iid(&info->uCausality));
+ ok(info->cbSize == sizeof(*info), "info->cbSize was %d instead of %d\n", info->cbSize, (int)sizeof(*info));
+ todo_wine {
+ ok(info->dwServerPid == GetCurrentProcessId(), "info->dwServerPid was 0x%x instead of 0x%x\n", info->dwServerPid, GetCurrentProcessId());
+ }
+ ok(!info->pObject, "info->pObject should be NULL\n");
+ ok(IsEqualGUID(uExtent, &EXTENTID_WineTest), "uExtent wasn't correct\n");
+
+ *pDataSize = 1;
+}
+
+static void WINAPI TestChannelHook_ClientFillBuffer(
+ IChannelHook *iface,
+ REFGUID uExtent,
+ REFIID riid,
+ ULONG *pDataSize,
+ void *pDataBuffer )
+{
+ SChannelHookCallInfo *info = (SChannelHookCallInfo *)riid;
+ trace("TestChannelHook_ClientFillBuffer\n");
+ ok(info->cbSize == sizeof(*info), "info->cbSize was %d instead of %d\n", info->cbSize, (int)sizeof(*info));
+ todo_wine {
+ ok(info->dwServerPid == GetCurrentProcessId(), "info->dwServerPid was 0x%x instead of 0x%x\n", info->dwServerPid, GetCurrentProcessId());
+ }
+ ok(!info->pObject, "info->pObject should be NULL\n");
+ ok(IsEqualGUID(uExtent, &EXTENTID_WineTest), "uExtent wasn't correct\n");
+
+ *(unsigned char *)pDataBuffer = 0xcc;
+ *pDataSize = 1;
+}
+
+static void WINAPI TestChannelHook_ClientNotify(
+ IChannelHook *iface,
+ REFGUID uExtent,
+ REFIID riid,
+ ULONG cbDataSize,
+ void *pDataBuffer,
+ DWORD lDataRep,
+ HRESULT hrFault )
+{
+ SChannelHookCallInfo *info = (SChannelHookCallInfo *)riid;
+ trace("TestChannelHook_ClientNotify hrFault = 0x%08x\n", hrFault);
+ ok(info->cbSize == sizeof(*info), "info->cbSize was %d instead of %d\n", info->cbSize, (int)sizeof(*info));
+ todo_wine {
+ ok(info->dwServerPid == GetCurrentProcessId(), "info->dwServerPid was 0x%x instead of 0x%x\n", info->dwServerPid, GetCurrentProcessId());
+ ok(info->pObject != NULL, "info->pObject shouldn't be NULL\n");
+ }
+ ok(IsEqualGUID(uExtent, &EXTENTID_WineTest), "uExtent wasn't correct\n");
+}
+
+static void WINAPI TestChannelHook_ServerNotify(
+ IChannelHook *iface,
+ REFGUID uExtent,
+ REFIID riid,
+ ULONG cbDataSize,
+ void *pDataBuffer,
+ DWORD lDataRep )
+{
+ SChannelHookCallInfo *info = (SChannelHookCallInfo *)riid;
+ trace("TestChannelHook_ServerNotify\n");
+ ok(info->cbSize == sizeof(*info), "info->cbSize was %d instead of %d\n", info->cbSize, (int)sizeof(*info));
+ ok(info->dwServerPid == GetCurrentProcessId(), "info->dwServerPid was 0x%x instead of 0x%x\n", info->dwServerPid, GetCurrentProcessId());
+ ok(info->pObject != NULL, "info->pObject shouldn't be NULL\n");
+ ok(cbDataSize == 1, "cbDataSize should have been 1 instead of %d\n", cbDataSize);
+ ok(*(unsigned char *)pDataBuffer == 0xcc, "pDataBuffer should have contained 0xcc instead of 0x%x\n", *(unsigned char *)pDataBuffer);
+ ok(IsEqualGUID(uExtent, &EXTENTID_WineTest), "uExtent wasn't correct\n");
+}
+
+static void WINAPI TestChannelHook_ServerGetSize(
+ IChannelHook *iface,
+ REFGUID uExtent,
+ REFIID riid,
+ HRESULT hrFault,
+ ULONG *pDataSize )
+{
+ SChannelHookCallInfo *info = (SChannelHookCallInfo *)riid;
+ trace("TestChannelHook_ServerGetSize\n");
+ trace("\t%s method %d\n", debugstr_iid(riid), info->iMethod);
+ ok(info->cbSize == sizeof(*info), "info->cbSize was %d instead of %d\n", info->cbSize, (int)sizeof(*info));
+ ok(info->dwServerPid == GetCurrentProcessId(), "info->dwServerPid was 0x%x instead of 0x%x\n", info->dwServerPid, GetCurrentProcessId());
+ ok(info->pObject != NULL, "info->pObject shouldn't be NULL\n");
+ ok(IsEqualGUID(uExtent, &EXTENTID_WineTest), "uExtent wasn't correct\n");
+ if (hrFault != S_OK)
+ trace("\thrFault = 0x%08x\n", hrFault);
+
+ *pDataSize = 0;
+}
+
+static void WINAPI TestChannelHook_ServerFillBuffer(
+ IChannelHook *iface,
+ REFGUID uExtent,
+ REFIID riid,
+ ULONG *pDataSize,
+ void *pDataBuffer,
+ HRESULT hrFault )
+{
+ trace("TestChannelHook_ServerFillBuffer\n");
+ ok(0, "TestChannelHook_ServerFillBuffer shouldn't be called\n");
+}
+
+static const IChannelHookVtbl TestChannelHookVtbl =
+{
+ TestChannelHook_QueryInterface,
+ TestChannelHook_AddRef,
+ TestChannelHook_Release,
+ TestChannelHook_ClientGetSize,
+ TestChannelHook_ClientFillBuffer,
+ TestChannelHook_ClientNotify,
+ TestChannelHook_ServerNotify,
+ TestChannelHook_ServerGetSize,
+ TestChannelHook_ServerFillBuffer,
+};
+
+static IChannelHook TestChannelHook = { &TestChannelHookVtbl };
+
+static void test_channel_hook(void)
+{
+ IStream *pStream = NULL;
+ IClassFactory *cf = NULL;
+ DWORD tid;
+ IUnknown *proxy = NULL;
+ HANDLE thread;
+ HRESULT hr;
+
+ hr = CoRegisterChannelHook(&EXTENTID_WineTest, &TestChannelHook);
+ ok_ole_success(hr, CoRegisterChannelHook);
+
+ hr = CoRegisterMessageFilter(&MessageFilter, NULL);
+ ok_ole_success(hr, CoRegisterMessageFilter);
+
+ cLocks = 0;
+
+ hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
+ ok_ole_success(hr, CreateStreamOnHGlobal);
+ tid = start_host_object2(pStream, &IID_IClassFactory, (IUnknown*)&Test_ClassFactory, MSHLFLAGS_NORMAL, &MessageFilter, &thread);
+
+ ok_more_than_one_lock();
+
+ IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL);
+ hr = CoUnmarshalInterface(pStream, &IID_IClassFactory, (void **)&cf);
+ ok_ole_success(hr, CoUnmarshalInterface);
+ IStream_Release(pStream);
+
+ ok_more_than_one_lock();
+
+ hr = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (LPVOID*)&proxy);
+ ok_ole_success(hr, IClassFactory_CreateInstance);
+ IUnknown_Release(proxy);
+
+ IClassFactory_Release(cf);
+
+ ok_no_locks();
+
+ end_host_object(tid, thread);
+
+ hr = CoRegisterMessageFilter(NULL, NULL);
+ ok_ole_success(hr, CoRegisterMessageFilter);
+}
+
START_TEST(marshal)
{
WNDCLASS wndclass;
@@ -2240,6 +2457,9 @@ START_TEST(marshal)
test_CoGetInterfaceAndReleaseStream();
+ /* must be last test as channel hooks can't be unregistered */
+ test_channel_hook();
+
CoUninitialize();
return;
More information about the wine-cvs
mailing list