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