Huw Davies : rpcrt4: Add tests for CreateStub and fix up CStdStubBuffer_Construct to match.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Aug 23 16:36:26 CDT 2006


Module: wine
Branch: master
Commit: cadc39842bbc93dc1d1552e070efcbc2d46c6c92
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=cadc39842bbc93dc1d1552e070efcbc2d46c6c92

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Aug 23 14:53:24 2006 +0100

rpcrt4: Add tests for CreateStub and fix up CStdStubBuffer_Construct to match.

---

 dlls/rpcrt4/cstub.c       |   15 ++++++++--
 dlls/rpcrt4/tests/cstub.c |   66 ++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 75 insertions(+), 6 deletions(-)

diff --git a/dlls/rpcrt4/cstub.c b/dlls/rpcrt4/cstub.c
index ddc0dca..d5dc0af 100644
--- a/dlls/rpcrt4/cstub.c
+++ b/dlls/rpcrt4/cstub.c
@@ -54,7 +54,8 @@ HRESULT WINAPI CStdStubBuffer_Construct(
                                        LPRPCSTUBBUFFER *ppStub)
 {
   CStdStubBuffer *This;
-
+  IUnknown *pvServer;
+  HRESULT r;
   TRACE("(%p,%p,%p,%p) %s\n", pUnkServer, vtbl, pPSFactory, ppStub, name);
   TRACE("iid=%s\n", debugstr_guid(vtbl->header.piid));
   TRACE("vtbl=%p\n", &vtbl->Vtbl);
@@ -64,16 +65,22 @@ HRESULT WINAPI CStdStubBuffer_Construct(
     return RPC_E_UNEXPECTED;
   }
 
+  r = IUnknown_QueryInterface(pUnkServer, riid, (void**)&pvServer);
+  if(FAILED(r))
+    return r;
+
   This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CStdStubBuffer));
-  if (!This) return E_OUTOFMEMORY;
+  if (!This) {
+    IUnknown_Release(pvServer);
+    return E_OUTOFMEMORY;
+  }
 
   This->lpVtbl = &vtbl->Vtbl;
   This->RefCount = 1;
-  This->pvServerObject = pUnkServer;
+  This->pvServerObject = pvServer;
   This->pPSFactory = pPSFactory;
   *ppStub = (LPRPCSTUBBUFFER)This;
 
-  IUnknown_AddRef(This->pvServerObject);
   IPSFactoryBuffer_AddRef(pPSFactory);
   return S_OK;
 }
diff --git a/dlls/rpcrt4/tests/cstub.c b/dlls/rpcrt4/tests/cstub.c
index 54aa180..1bd52a6 100644
--- a/dlls/rpcrt4/tests/cstub.c
+++ b/dlls/rpcrt4/tests/cstub.c
@@ -21,6 +21,7 @@
 #include <stdarg.h>
 
 #define PROXY_DELEGATION
+#define COBJMACROS
 
 #include "wine/test.h"
 #include <windef.h>
@@ -426,7 +427,7 @@ const ProxyFileInfo *proxy_file_list[] =
 };
 
 
-static void test_NdrDllGetClassObject(void)
+static IPSFactoryBuffer *test_NdrDllGetClassObject(void)
 {
     IPSFactoryBuffer *ppsf = NULL;
     const CLSID PSDispatch = {0x20420, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
@@ -524,6 +525,7 @@ #undef VTBL_TEST_CHANGE_TO
 #undef VTBL_TEST_ZERO
 
     ok(PSFactoryBuffer.RefCount == 1, "ref count %ld\n", PSFactoryBuffer.RefCount);
+    return ppsf;
 }
 
 static int base_buffer_invoke_called;
@@ -570,12 +572,72 @@ todo_wine {
 
 }
 
+static IRpcStubBuffer *create_stub(IPSFactoryBuffer *ppsf, REFIID iid, IUnknown *obj, HRESULT expected_result)
+{
+    IRpcStubBuffer *pstub = NULL;
+    HRESULT r;
+
+    r = IPSFactoryBuffer_CreateStub(ppsf, iid, obj, &pstub);
+    ok(r == expected_result, "CreateStub returned %08lx expected %08lx\n", r, expected_result);
+    return pstub;
+}
+
+static HRESULT WINAPI create_stub_test_QI(IUnknown *This, REFIID iid, void **ppv)
+{
+    ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
+    *ppv = (void*)0xdeadbeef;
+    return S_OK;
+}
+
+static IUnknownVtbl create_stub_test_vtbl =
+{
+    create_stub_test_QI,
+    NULL,
+    NULL
+};
+
+static HRESULT WINAPI create_stub_test_fail_QI(IUnknown *This, REFIID iid, void **ppv)
+{
+    ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
+    *ppv = NULL;
+    return E_NOINTERFACE;
+}
+
+static IUnknownVtbl create_stub_test_fail_vtbl =
+{
+    create_stub_test_fail_QI,
+    NULL,
+    NULL
+};
+
+static void test_CreateStub(IPSFactoryBuffer *ppsf)
+{
+    IUnknownVtbl *vtbl = &create_stub_test_vtbl;
+    IUnknown *obj = (IUnknown*)&vtbl;
+    IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
+    CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
+    CInterfaceStubHeader *header = ((CInterfaceStubHeader *)cstd_stub->lpVtbl) - 1;
+
+    ok(IsEqualIID(header->piid, &IID_if1), "header iid differs\n");
+    ok(cstd_stub->RefCount == 1, "ref count %ld\n", cstd_stub->RefCount);
+    /* 0xdeadbeef returned from create_stub_test_QI */
+    ok(cstd_stub->pvServerObject == (void*)0xdeadbeef, "pvServerObject %p", cstd_stub->pvServerObject);
+    ok(cstd_stub->pPSFactory == ppsf, "pPSFactory %p\n", cstd_stub->pPSFactory);
+
+    vtbl = &create_stub_test_fail_vtbl;
+    pstub = create_stub(ppsf, &IID_if1, obj, E_NOINTERFACE);
+
+}
+    
 START_TEST( cstub )
 {
+    IPSFactoryBuffer *ppsf;
+
     OleInitialize(NULL);
 
-    test_NdrDllGetClassObject();
+    ppsf = test_NdrDllGetClassObject();
     test_NdrStubForwardingFunction();
+    test_CreateStub(ppsf);
 
     OleUninitialize();
 }




More information about the wine-cvs mailing list