//+------------------------------------------------------------------------ // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1993. // // File: bm_rpc.cxx // // Contents: Rpc Method Invocation tests // // Classes: CRpcTest // // History: 1-July-93 t-martig Created // //-------------------------------------------------------------------------- #include #pragma hdrstop #include #include #include TCHAR *CRpcTest::Name () { return TEXT("RpcTest"); } SCODE CRpcTest::Setup (CTestInput *pInput) { CTestBase::Setup(pInput); SCODE sc = pInput->GetGUID(&m_ClsID, Name(), TEXT("Clsid_Local")); if (FAILED(sc)) { Log (TEXT("Setup - GetClassID failed."), sc); return sc; } // get flag indicating whether to keep all values or // only average values. TCHAR szAverage[5]; pInput->GetConfigString(Name(), TEXT("Average"), TEXT("Y"), szAverage, sizeof(szAverage)/sizeof(TCHAR)); if (szAverage[0] == 'n' || szAverage[0] == 'N') m_fAverage = FALSE; else m_fAverage = TRUE; // get iteration count if (m_fAverage) m_ulIterations = pInput->GetRealIterations(Name()); else m_ulIterations = pInput->GetIterations(Name()); // initialize timing arrays INIT_RESULTS(m_ulVoidTime); INIT_RESULTS(m_ulVoidRCTime); INIT_RESULTS(m_ulDwordInTime); INIT_RESULTS(m_ulDwordOutTime); INIT_RESULTS(m_ulDwordInOutTime); INIT_RESULTS(m_ulStringInTime); INIT_RESULTS(m_ulStringOutTime); INIT_RESULTS(m_ulStringInOutTime); INIT_RESULTS(m_ulGuidInTime); INIT_RESULTS(m_ulGuidOutTime); INIT_RESULTS(m_ulIUnknownInprocInTime); INIT_RESULTS(m_ulIUnknownInprocOutTime); INIT_RESULTS(m_ulIUnknownLocalInTime); INIT_RESULTS(m_ulIUnknownLocalOutTime); INIT_RESULTS(m_ulIUnknownKeepInTime); INIT_RESULTS(m_ulIUnknownKeepOutTime); INIT_RESULTS(m_ulInterfaceInprocInTime); INIT_RESULTS(m_ulInterfaceLocalInTime); sc = InitCOM(); if (FAILED(sc)) { Log (TEXT("Setup - CoInitialize failed."), sc); return sc; } m_pRPC=NULL; sc = CoCreateInstance(m_ClsID, NULL, CLSCTX_LOCAL_SERVER, IID_IRpcTest, (void **)&m_pRPC); if (FAILED(sc)) { Log (TEXT("Setup - CoCreateInstance IRpcTest failed."), sc); return sc; } // get the inprocess object for the IUnknown marshalling test sc = pInput->GetGUID(&m_ClsID, Name(), TEXT("Clsid_Inproc")); if (FAILED(sc)) { Log (TEXT("Setup - GetClassID Inproc failed."), sc); return sc; } m_punkInproc = NULL; sc = CoCreateInstance(m_ClsID, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&m_punkInproc); if (FAILED(sc)) { Log (TEXT("Setup - CoCreateInstance IUnknown Inproc failed."), sc); return sc; } // get the out of process object for the IUnknown marshalling test m_punkLocal = NULL; sc = CoCreateInstance(m_ClsID, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)&m_punkLocal); if (FAILED(sc)) { Log (TEXT("Setup - CoCreateInstance IUnknown LocalSrv failed."), sc); return sc; } return S_OK; } SCODE CRpcTest::Cleanup () { if (m_pRPC) m_pRPC->Release(); if (m_punkInproc) m_punkInproc->Release(); if (m_punkLocal) m_punkLocal->Release(); UninitCOM(); return S_OK; } SCODE CRpcTest::Run () { CStopWatch sw; SCODE sc; ULONG iIter; // // void passing tests // // STARTTRACE("CRpcTest"); ResetAverage( m_fAverage, sw ); for (iIter=0; iIterVoid()"); ResetNotAverage( m_fAverage, sw ); m_pRPC->Void(); ReadNotAverage( m_fAverage, sw, m_ulVoidTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulVoidTime[0], m_ulIterations ); // STOPTRACE("CRpcTest"); ResetAverage( m_fAverage, sw ); for (iIter=0; iIterVoidRC()"); ResetNotAverage( m_fAverage, sw ); sc = m_pRPC->VoidRC(); ReadNotAverage( m_fAverage, sw, m_ulVoidRCTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulVoidRCTime[0], m_ulIterations ); // // dword passing tests // DWORD dwTmp = 1; ResetAverage( m_fAverage, sw ); for (iIter=0; iIterDwordIn(dwTmp); ReadNotAverage( m_fAverage, sw, m_ulDwordInTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulDwordInTime[0], m_ulIterations ); ResetAverage( m_fAverage, sw ); for (iIter=0; iIterDwordOut(&dwTmp); ReadNotAverage( m_fAverage, sw, m_ulDwordOutTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulDwordOutTime[0], m_ulIterations ); ResetAverage( m_fAverage, sw ); for (iIter=0; iIterDwordInOut(&dwTmp); ReadNotAverage( m_fAverage, sw, m_ulDwordInOutTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulDwordInOutTime[0], m_ulIterations ); // // string passing tests // OLECHAR wszHello[] = L"C:\\FOOFOO\\FOOBAR\\FOOBAK\\FOOBAZ\\FOOTYPICAL\\PATH\\HELLO"; ResetAverage( m_fAverage, sw ); for (iIter=0; iIterStringIn(wszHello); ReadNotAverage( m_fAverage, sw, m_ulStringInTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulStringInTime[0], m_ulIterations ); LPOLESTR pwszOut = NULL; #ifdef STRINGOUT ResetAverage( m_fAverage, sw ); for (iIter=0; iIterStringOut(&pwszOut); ReadNotAverage( m_fAverage, sw, m_ulStringOutTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulStringOutTime[0], m_ulIterations ); #endif pwszOut = wszHello; ResetAverage( m_fAverage, sw ); for (iIter=0; iIterStringInOut(pwszOut); ReadNotAverage( m_fAverage, sw, m_ulStringInOutTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulStringInOutTime[0], m_ulIterations ); // // guid passing tests // ResetAverage( m_fAverage, sw ); for (iIter=0; iIterGuidIn(IID_IRpcTest); ReadNotAverage( m_fAverage, sw, m_ulGuidInTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulGuidInTime[0], m_ulIterations ); GUID guid; ResetAverage( m_fAverage, sw ); for (iIter=0; iIterGuidOut(&guid); ReadNotAverage( m_fAverage, sw, m_ulGuidOutTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulGuidOutTime[0], m_ulIterations ); // // IUnknown passing tests // ResetAverage( m_fAverage, sw ); for (iIter=0; iIterIUnknownIn(m_punkInproc); ReadNotAverage( m_fAverage, sw, m_ulIUnknownInprocInTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulIUnknownInprocInTime[0], m_ulIterations ); ResetAverage( m_fAverage, sw ); for (iIter=0; iIterIUnknownIn(m_punkLocal); ReadNotAverage( m_fAverage, sw, m_ulIUnknownLocalInTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulIUnknownLocalInTime[0], m_ulIterations ); IUnknown *punk = NULL; ResetAverage( m_fAverage, sw ); for (iIter=0; iIterIUnknownOut(&punk); punk->Release(); punk = NULL; ReadNotAverage( m_fAverage, sw, m_ulIUnknownInprocOutTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulIUnknownInprocOutTime[0], m_ulIterations ); // // interface passing tests // #ifdef NOTYET IStream *pIStm = NULL; sc = m_punkInproc->QueryInterface(IID_IStream, (void **)&pIStm); if (SUCCEEDED(sc) && pIStm) { ResetAverage( m_fAverage, sw ); for (iIter=0; iIterInterfaceIn(IID_IStream, pIStm); ReadNotAverage( m_fAverage, sw, m_ulInterfaceInprocInTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulInterfaceInprocInTime[0], m_ulIterations ); pIStm->Release(); } pIStm = NULL; sc = m_punkLocal->QueryInterface(IID_IStream, (void **)&pIStm); if (SUCCEEDED(sc) && pIStm) { ResetAverage( m_fAverage, sw ); for (iIter=0; iIterInterfaceIn(IID_IStream, pIStm); ReadNotAverage( m_fAverage, sw, m_ulInterfaceLocalInTime[iIter] ); } ReadAverage( m_fAverage, sw, m_ulInterfaceLocalInTime[0], m_ulIterations ); pIStm->Release(); } #endif return S_OK; } SCODE CRpcTest::Report (CTestOutput &output) { if (m_fAverage) { output.WriteSectionHeader (Name(), TEXT("Object Rpc"), *m_pInput); output.WriteString (TEXT("\n")); output.WriteString (TEXT("Average times\n")); output.WriteString (TEXT("\n")); output.WriteResult (TEXT("Void "), m_ulVoidTime[0]); output.WriteResult (TEXT("VoidRC "), m_ulVoidRCTime[0]); output.WriteResult (TEXT("DwordIn "), m_ulDwordInTime[0]); output.WriteResult (TEXT("DwordOut "), m_ulDwordOutTime[0]); output.WriteResult (TEXT("DwordInOut "), m_ulDwordInOutTime[0]); output.WriteResult (TEXT("StringIn "), m_ulStringInTime[0]); #ifdef STRINGOUT output.WriteResult (TEXT("StringOut "), m_ulStringOutTime[0]); #endif output.WriteResult (TEXT("StringInOut "), m_ulStringInOutTime[0]); output.WriteResult (TEXT("GuidIn "), m_ulGuidInTime[0]); output.WriteResult (TEXT("GuidOut "), m_ulGuidOutTime[0]); output.WriteResult (TEXT("IUnknownIp "), m_ulIUnknownInprocInTime[0]); output.WriteResult (TEXT("IUnknownLcl "), m_ulIUnknownLocalInTime[0]); output.WriteResult (TEXT("IUnknownOut "), m_ulIUnknownInprocOutTime[0]); // output.WriteResult (TEXT("IUnknownKpIn "), m_ulIUnknownKeepInTime[0]); // output.WriteResult (TEXT("IUnknownKpOut"), m_ulIUnknownKeepOutTime[0]); #ifdef NOTYET output.WriteResult (TEXT("InterfaceIn "), m_ulInterfaceInprocInTime[0]); output.WriteResult (TEXT("InterfaceLcl"), m_ulInterfaceLocalInTime[0]); #endif } else { output.WriteSectionHeader (Name(), TEXT("Object Rpc"), *m_pInput); output.WriteString (TEXT("\n")); output.WriteResults (TEXT("Void "), m_ulIterations, m_ulVoidTime); output.WriteResults (TEXT("VoidRC "), m_ulIterations, m_ulVoidRCTime); output.WriteResults (TEXT("DwordIn "), m_ulIterations, m_ulDwordInTime); output.WriteResults (TEXT("DwordOut "), m_ulIterations, m_ulDwordOutTime); output.WriteResults (TEXT("DwordInOut "), m_ulIterations, m_ulDwordInOutTime); output.WriteResults (TEXT("StringIn "), m_ulIterations, m_ulStringInTime); #ifdef STRINGOUT output.WriteResults (TEXT("StringOut "), m_ulIterations, m_ulStringOutTime); #endif output.WriteResults (TEXT("StringInOut "), m_ulIterations, m_ulStringInOutTime); output.WriteResults (TEXT("GuidIn "), m_ulIterations, m_ulGuidInTime); output.WriteResults (TEXT("GuidOut "), m_ulIterations, m_ulGuidOutTime); output.WriteResults (TEXT("IUnknownIp "), m_ulIterations, m_ulIUnknownInprocInTime); output.WriteResults (TEXT("IUnknownLcl "), m_ulIterations, m_ulIUnknownLocalInTime); output.WriteResults (TEXT("IUnknownOut "), m_ulIterations, m_ulIUnknownInprocOutTime); // output.WriteResults (TEXT("IUnknownKpIn "), m_ulIterations, m_ulIUnknownKeepInTime); // output.WriteResults (TEXT("IUnknownKpOut"), m_ulIterations, m_ulIUnknownKeepOutTime); #ifdef NOTYET output.WriteResults (TEXT("InterfaceIn "), m_ulIterations, m_ulInterfaceInprocInTime); output.WriteResults (TEXT("InterfaceLcl"), m_ulIterations, m_ulInterfaceLocalInTime); #endif } return S_OK; }