Huw Davies : rpcrt4:
Tests for CStdStubBuffer_Connect and fixes to make them pass.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Aug 23 16:36:26 CDT 2006
Module: wine
Branch: master
Commit: f42f727f7cf9472237a82ba259bd638563f105af
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=f42f727f7cf9472237a82ba259bd638563f105af
Author: Huw Davies <huw at codeweavers.com>
Date: Wed Aug 23 16:37:48 2006 +0100
rpcrt4: Tests for CStdStubBuffer_Connect and fixes to make them pass.
---
dlls/rpcrt4/cstub.c | 15 ++++++---
dlls/rpcrt4/tests/cstub.c | 77 ++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 87 insertions(+), 5 deletions(-)
diff --git a/dlls/rpcrt4/cstub.c b/dlls/rpcrt4/cstub.c
index d5dc0af..17890e3 100644
--- a/dlls/rpcrt4/cstub.c
+++ b/dlls/rpcrt4/cstub.c
@@ -134,10 +134,17 @@ ULONG WINAPI NdrCStdStubBuffer2_Release(
HRESULT WINAPI CStdStubBuffer_Connect(LPRPCSTUBBUFFER iface,
LPUNKNOWN lpUnkServer)
{
- CStdStubBuffer *This = (CStdStubBuffer *)iface;
- TRACE("(%p)->Connect(%p)\n",This,lpUnkServer);
- This->pvServerObject = lpUnkServer;
- return S_OK;
+ CStdStubBuffer *This = (CStdStubBuffer *)iface;
+ HRESULT r;
+ IUnknown *new = NULL;
+
+ TRACE("(%p)->Connect(%p)\n",This,lpUnkServer);
+
+ r = IUnknown_QueryInterface(lpUnkServer, STUB_HEADER(This).piid, (void**)&new);
+ new = InterlockedExchangePointer((void**)&This->pvServerObject, new);
+ if(new)
+ IUnknown_Release(new);
+ return r;
}
void WINAPI CStdStubBuffer_Disconnect(LPRPCSTUBBUFFER iface)
diff --git a/dlls/rpcrt4/tests/cstub.c b/dlls/rpcrt4/tests/cstub.c
index 1bd52a6..8df8365 100644
--- a/dlls/rpcrt4/tests/cstub.c
+++ b/dlls/rpcrt4/tests/cstub.c
@@ -628,7 +628,81 @@ static void test_CreateStub(IPSFactoryBu
pstub = create_stub(ppsf, &IID_if1, obj, E_NOINTERFACE);
}
-
+
+static HRESULT WINAPI connect_test_orig_QI(IUnknown *This, REFIID iid, void **ppv)
+{
+ ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
+ *ppv = (void*)This;
+ return S_OK;
+}
+
+static int connect_test_orig_release_called;
+static ULONG WINAPI connect_test_orig_release(IUnknown *This)
+{
+ connect_test_orig_release_called++;
+ return 0;
+}
+
+static IUnknownVtbl connect_test_orig_vtbl =
+{
+ connect_test_orig_QI,
+ NULL,
+ connect_test_orig_release
+};
+
+static HRESULT WINAPI connect_test_new_QI(IUnknown *This, REFIID iid, void **ppv)
+{
+ ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
+ *ppv = (void*)0xcafebabe;
+ return S_OK;
+}
+
+static IUnknownVtbl connect_test_new_vtbl =
+{
+ connect_test_new_QI,
+ NULL,
+ NULL
+};
+
+static HRESULT WINAPI connect_test_new_fail_QI(IUnknown *This, REFIID iid, void **ppv)
+{
+ ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
+ *ppv = (void*)0xdeadbeef;
+ return E_NOINTERFACE;
+}
+
+static IUnknownVtbl connect_test_new_fail_vtbl =
+{
+ connect_test_new_fail_QI,
+ NULL,
+ NULL
+};
+
+
+static void test_Connect(IPSFactoryBuffer *ppsf)
+{
+ IUnknownVtbl *orig_vtbl = &connect_test_orig_vtbl;
+ IUnknownVtbl *new_vtbl = &connect_test_new_vtbl;
+ IUnknownVtbl *new_fail_vtbl = &connect_test_new_fail_vtbl;
+ IUnknown *obj = (IUnknown*)&orig_vtbl;
+ IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
+ CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
+ HRESULT r;
+
+ obj = (IUnknown*)&new_vtbl;
+ r = IRpcStubBuffer_Connect(pstub, obj);
+ ok(r == S_OK, "r %08lx\n", r);
+ ok(connect_test_orig_release_called == 1, "release called %d\n", connect_test_orig_release_called);
+ ok(cstd_stub->pvServerObject == (void*)0xcafebabe, "pvServerObject %p\n", cstd_stub->pvServerObject);
+
+ cstd_stub->pvServerObject = (IUnknown*)&orig_vtbl;
+ obj = (IUnknown*)&new_fail_vtbl;
+ r = IRpcStubBuffer_Connect(pstub, obj);
+ ok(r == E_NOINTERFACE, "r %08lx\n", r);
+ ok(cstd_stub->pvServerObject == (void*)0xdeadbeef, "pvServerObject %p\n", cstd_stub->pvServerObject);
+ ok(connect_test_orig_release_called == 2, "release called %d\n", connect_test_orig_release_called);
+}
+
START_TEST( cstub )
{
IPSFactoryBuffer *ppsf;
@@ -638,6 +712,7 @@ START_TEST( cstub )
ppsf = test_NdrDllGetClassObject();
test_NdrStubForwardingFunction();
test_CreateStub(ppsf);
+ test_Connect(ppsf);
OleUninitialize();
}
More information about the wine-cvs
mailing list