Rob Shearman : ole32: Add tests for the standard marshaler' s implementation of IClientSecurity.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Mar 28 06:41:51 CDT 2007


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Tue Mar 27 18:18:05 2007 +0100

ole32: Add tests for the standard marshaler's implementation of IClientSecurity.

---

 dlls/ole32/tests/marshal.c |  106 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 105 insertions(+), 1 deletions(-)

diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c
index c174429..41a2aec 100644
--- a/dlls/ole32/tests/marshal.c
+++ b/dlls/ole32/tests/marshal.c
@@ -48,6 +48,14 @@ static const IID IID_IWineTest =
     {0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd}
 }; /* 5201163f-8164-4fd0-a1a2-5d5a3654d3bd */
 
+static const IID IID_IRemUnknown =
+{
+    0x00000131,
+    0x0000,
+    0x0000,
+    {0xc0,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}
+};
+
 #define EXTENTID_WineTest IID_IWineTest
 #define CLSID_WineTest IID_IWineTest
 
@@ -141,7 +149,9 @@ static HRESULT WINAPI Test_IClassFactory_QueryInterface(
     if (ppvObj == NULL) return E_POINTER;
 
     if (IsEqualGUID(riid, &IID_IUnknown) ||
-        IsEqualGUID(riid, &IID_IClassFactory))
+        IsEqualGUID(riid, &IID_IClassFactory) ||
+        /* the only other interface Wine is currently able to marshal (for testing two proxies) */
+        IsEqualGUID(riid, &IID_IRemUnknown))
     {
         *ppvObj = (LPVOID)iface;
         IClassFactory_AddRef(iface);
@@ -2110,6 +2120,99 @@ static void test_handler_marshaling(void)
 }
 
 
+static void test_client_security(void)
+{
+    HRESULT hr;
+    IStream *pStream = NULL;
+    IClassFactory *pProxy = NULL;
+    IUnknown *pProxy2 = NULL;
+    IUnknown *pUnknown1 = NULL;
+    IUnknown *pUnknown2 = NULL;
+    IClientSecurity *pCliSec = NULL;
+    IMarshal *pMarshal;
+    DWORD tid;
+    HANDLE thread;
+    static const LARGE_INTEGER ullZero;
+    DWORD dwAuthnSvc;
+    DWORD dwAuthzSvc;
+    OLECHAR *pServerPrincName;
+    DWORD dwAuthnLevel;
+    DWORD dwImpLevel;
+    void *pAuthInfo;
+    DWORD dwCapabilities;
+    void *pv;
+
+    cLocks = 0;
+
+    hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
+    ok_ole_success(hr, "CreateStreamOnHGlobal");
+    tid = start_host_object(pStream, &IID_IClassFactory, (IUnknown*)&Test_ClassFactory, MSHLFLAGS_NORMAL, &thread);
+
+    IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL);
+    hr = CoUnmarshalInterface(pStream, &IID_IClassFactory, (void **)&pProxy);
+    ok_ole_success(hr, "CoUnmarshalInterface");
+    IStream_Release(pStream);
+
+    hr = IUnknown_QueryInterface(pProxy, &IID_IUnknown, (LPVOID*)&pUnknown1);
+    ok_ole_success(hr, "IUnknown_QueryInterface IID_IUnknown");
+
+    hr = IUnknown_QueryInterface(pProxy, &IID_IRemUnknown, (LPVOID*)&pProxy2);
+    ok_ole_success(hr, "IUnknown_QueryInterface IID_IStream");
+
+    hr = IUnknown_QueryInterface(pProxy2, &IID_IUnknown, (LPVOID*)&pUnknown2);
+    ok_ole_success(hr, "IUnknown_QueryInterface IID_IUnknown");
+
+    ok(pUnknown1 == pUnknown2, "both proxy's IUnknowns should be the same - %p, %p\n", pUnknown1, pUnknown2);
+
+    hr = IUnknown_QueryInterface(pProxy, &IID_IMarshal, (LPVOID*)&pMarshal);
+    ok_ole_success(hr, "IUnknown_QueryInterface IID_IMarshal");
+
+    hr = IUnknown_QueryInterface(pProxy, &IID_IClientSecurity, (LPVOID*)&pCliSec);
+    ok_ole_success(hr, "IUnknown_QueryInterface IID_IClientSecurity");
+
+    hr = IClientSecurity_QueryBlanket(pCliSec, (IUnknown *)pProxy, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+    todo_wine ok_ole_success(hr, "IClientSecurity_QueryBlanket (all NULLs)");
+
+    hr = IClientSecurity_QueryBlanket(pCliSec, (IUnknown *)pMarshal, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+    todo_wine ok(hr == E_NOINTERFACE, "IClientSecurity_QueryBlanket with local interface should have returned E_NOINTERFACE instead of 0x%08x\n", hr);
+
+    hr = IClientSecurity_QueryBlanket(pCliSec, (IUnknown *)pProxy, &dwAuthnSvc, &dwAuthzSvc, &pServerPrincName, &dwAuthnLevel, &dwImpLevel, &pAuthInfo, &dwCapabilities);
+    todo_wine ok_ole_success(hr, "IClientSecurity_QueryBlanket");
+
+    hr = IClientSecurity_SetBlanket(pCliSec, (IUnknown *)pProxy, dwAuthnSvc, dwAuthzSvc, pServerPrincName, dwAuthnLevel, RPC_C_IMP_LEVEL_IMPERSONATE, pAuthInfo, dwCapabilities);
+    todo_wine ok_ole_success(hr, "IClientSecurity_SetBlanket");
+
+    hr = IClassFactory_CreateInstance(pProxy, NULL, &IID_IWineTest, &pv);
+    ok(hr == E_NOINTERFACE, "COM call should have succeeded instead of returning 0x%08x\n", hr);
+
+    hr = IClientSecurity_SetBlanket(pCliSec, (IUnknown *)pMarshal, dwAuthnSvc, dwAuthzSvc, pServerPrincName, dwAuthnLevel, dwImpLevel, pAuthInfo, dwCapabilities);
+    todo_wine ok(hr == E_NOINTERFACE, "IClientSecurity_SetBlanket with local interface should have returned E_NOINTERFACE instead of 0x%08x\n", hr);
+
+    hr = IClientSecurity_SetBlanket(pCliSec, (IUnknown *)pProxy, 0xdeadbeef, dwAuthzSvc, pServerPrincName, dwAuthnLevel, dwImpLevel, pAuthInfo, dwCapabilities);
+    todo_wine ok(hr == E_INVALIDARG, "IClientSecurity_SetBlanke with invalid dwAuthnSvc should have returned E_INVALIDARG instead of 0x%08x\n", hr);
+
+    CoTaskMemFree(pServerPrincName);
+
+    hr = IClientSecurity_QueryBlanket(pCliSec, (IUnknown *)pUnknown1, &dwAuthnSvc, &dwAuthzSvc, &pServerPrincName, &dwAuthnLevel, &dwImpLevel, &pAuthInfo, &dwCapabilities);
+    todo_wine ok_ole_success(hr, "IClientSecurity_QueryBlanket(IUnknown)");
+
+    CoTaskMemFree(pServerPrincName);
+
+    IClassFactory_Release(pProxy);
+#if 0
+    /* FIXME: fix stub manager to not depend on the IID of the interface to
+     * determine whether it is really the rem unknown for the object before
+     * re-enabling this line */
+    IUnknown_Release(pProxy2);
+#endif
+    IUnknown_Release(pUnknown1);
+    IUnknown_Release(pUnknown2);
+    IMarshal_Release(pMarshal);
+    IClientSecurity_Release(pCliSec);
+
+    end_host_object(tid, thread);
+}
+
 static HANDLE heventShutdown;
 
 static void LockModuleOOP(void)
@@ -2678,6 +2781,7 @@ START_TEST(marshal)
     test_freethreadedmarshaler();
     test_inproc_handler();
     test_handler_marshaling();
+    test_client_security();
 
     test_local_server();
 




More information about the wine-cvs mailing list