//+------------------------------------------------------------------------ // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1993. // // File: bmdriver.cxx // // Contents: Main module of the benchmark test // // Classes: CBenchMarkDriver // // Functions: WinMain // // History: 30-June-93 t-martig Created // 07-June-94 t-vadims Added Storage tests // //-------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "..\cairole\ui\hlp_iocs.hxx" #include "..\cairole\ui\hlp_ias.hxx" #include "..\cairole\ui\hlp_site.hxx" #include "..\cairole\ui\hlp_doc.hxx" #include "..\cairole\ui\bm_crt.hxx" #include "..\cairole\ui\bm_crtl.hxx" //#include "..\cairole\ui\bm_clip.hxx" #include "..\cairole\ui\bm_load.hxx" #include "..\cairole\ui\bm_link.hxx" #include "..\cairole\ui\bm_cache.hxx" #define REGISTRY_ENTRY_LEN 256 typedef struct { const char *key; const char *value; } RegistryKeyValue; const RegistryKeyValue REG_CONST_KEY[] = { ".bm1", "CLSID\\{99999999-0000-0008-C000-000000000052}", ".bm2", "CLSID\\{99999999-0000-0008-C000-000000000051}", "CLSID\\{20730701-0001-0008-C000-000000000046}", "OleTestClass", "CLSID\\{20730711-0001-0008-C000-000000000046}", "OleTestClass1", "CLSID\\{20730712-0001-0008-C000-000000000046}", "OleTestClass2", "CLSID\\{20730713-0001-0008-C000-000000000046}", "OleTestClass3", "CLSID\\{20730714-0001-0008-C000-000000000046}", "OleTestClass4", "CLSID\\{20730715-0001-0008-C000-000000000046}", "OleTestClass5", "CLSID\\{20730716-0001-0008-C000-000000000046}", "OleTestClass6", "CLSID\\{20730717-0001-0008-C000-000000000046}", "OleTestClass7", "CLSID\\{20730718-0001-0008-C000-000000000046}", "OleTestClass8", "CLSID\\{00000138-0001-0008-C000-000000000046}", "CPrxyBalls", "Interface\\{00000138-0001-0008-C000-000000000046}", "IBalls", "Interface\\{00000139-0001-0008-C000-000000000046}", "ICube", "Interface\\{00000136-0001-0008-C000-000000000046}", "ILoops", "Interface\\{00000137-0001-0008-C000-000000000046}", "IRpcTest", "Interface\\{00000138-0001-0008-C000-000000000046}\\ProxyStubClsid32", "{00000138-0001-0008-C000-000000000046}", "Interface\\{00000139-0001-0008-C000-000000000046}\\ProxyStubClsid32", "{00000138-0001-0008-C000-000000000046}", "Interface\\{00000136-0001-0008-C000-000000000046}\\ProxyStubClsid32", "{00000138-0001-0008-C000-000000000046}", "Interface\\{00000137-0001-0008-C000-000000000046}\\ProxyStubClsid32", "{00000138-0001-0008-C000-000000000046}", "CLSID\\{0000013a-0001-0008-C000-000000000046}\\ProgID", "ProgID60", "CLSID\\{0000013a-0001-0008-C000-000000000046}", "CBallsClassFactory", "CLSID\\{0000013b-0001-0008-C000-000000000046}", "CCubesClassFactory", "CLSID\\{0000013c-0001-0008-C000-000000000046}", "CLoopClassFactory", "CLSID\\{0000013d-0001-0008-C000-000000000046}", "CRpcTestClassFactory", "CLSID\\{00000140-0000-0008-C000-000000000046}", "CQueryInterface", "CLSID\\{00000142-0000-0008-C000-000000000046}", "Dummy", ".ut4", "ProgID50", ".ut5", "ProgID51", ".ut6", "ProgID52", ".ut7", "ProgID53", ".ut8", "ProgID54", ".ut9", "ProgID55", ".bls", "ProgID60", "CLSID\\{99999999-0000-0008-C000-000000000050}", "SDI", "CLSID\\{99999999-0000-0008-C000-000000000051}", "MDI", "CLSID\\{99999999-0000-0008-C000-000000000052}", "InprocNoRegister", "CLSID\\{99999999-0000-0008-C000-000000000053}", "InprocRegister", "CLSID\\{99999999-0000-0008-C000-000000000054}", "InprocRegister", "CLSID\\{99999999-0000-0008-C000-000000000054}\\TreatAs", "{99999999-0000-0008-C000-000000000050}", "CLSID\\{99999999-0000-0008-C000-000000000055}", "MDI", "CLSID\\{99999999-0000-0008-C000-000000000055}\\ActivateAtBits", "Y", "ProgID50", "objact sdi", "ProgID50\\CLSID", "{99999999-0000-0008-C000-000000000050}", "ProgID51", "objact mdi", "ProgID51\\CLSID", "{99999999-0000-0008-C000-000000000051}", "ProgID52", "objact dll", "ProgID52\\CLSID", "{99999999-0000-0008-C000-000000000052}", "ProgID53", "objact dll reg", "ProgID53\\CLSID", "{99999999-0000-0008-C000-000000000053}", "ProgID54", "objact dll reg", "ProgID54\\CLSID", "{99999999-0000-0008-C000-000000000054}", "ProgID55", "remote activation", "ProgID55\\CLSID", "{99999999-0000-0008-C000-000000000055}", "ProgID60", "CLSIDFromProgID test", "ProgID60\\CLSID", "{0000013a-0001-0008-C000-000000000046}", // Indicates end of list. "", "" }; const RegistryKeyValue REG_EXE_KEY[] = { "CLSID\\{20730701-0001-0008-C000-000000000046}\\InprocServer32", "oletest.dll", "CLSID\\{20730711-0001-0008-C000-000000000046}\\InprocServer32", "oletest.dll", "CLSID\\{20730712-0001-0008-C000-000000000046}\\InprocServer32", "oletest.dll", "CLSID\\{20730713-0001-0008-C000-000000000046}\\InprocServer32", "oletest.dll", "CLSID\\{20730714-0001-0008-C000-000000000046}\\InprocServer32", "oletest.dll", "CLSID\\{20730715-0001-0008-C000-000000000046}\\InprocServer32", "oletest.dll", "CLSID\\{20730716-0001-0008-C000-000000000046}\\InprocServer32", "oletest.dll", "CLSID\\{20730717-0001-0008-C000-000000000046}\\InprocServer32", "oletest.dll", "CLSID\\{20730718-0001-0008-C000-000000000046}\\InprocServer32", "oletest.dll", "CLSID\\{20730712-0001-0008-C000-000000000046}\\LocalServer32", "bmtstsvr.exe", "CLSID\\{20730701-0001-0008-C000-000000000046}\\LocalServer32", "bmtstsvr.exe", "CLSID\\{0000013a-0001-0008-C000-000000000046}\\LocalServer32", "ballsrv.exe", "CLSID\\{00000138-0001-0008-C000-000000000046}\\InprocServer32", "iballs.dll", "CLSID\\{0000013b-0001-0008-C000-000000000046}\\LocalServer32", "cubesrv.exe", "CLSID\\{0000013c-0001-0008-C000-000000000046}\\LocalServer32", "loopsrv.exe", "CLSID\\{0000013d-0001-0008-C000-000000000046}\\LocalServer32", "rpctst.exe", "CLSID\\{00000140-0000-0008-C000-000000000046}\\LocalServer32", "qisrv.exe", "CLSID\\{00000140-0000-0008-C000-000000000046}\\InprocServer32", "qisrv.dll", "CLSID\\{00000142-0000-0008-C000-000000000046}\\InprocServer32", "ballsrv.dll", "CLSID\\{99999999-0000-0008-C000-000000000050}\\LocalServer32", "sdi.exe", "CLSID\\{99999999-0000-0008-C000-000000000051}\\LocalServer32", "mdi.exe", "CLSID\\{99999999-0000-0008-C000-000000000052}\\InprocServer32", "dlltest.dll", "CLSID\\{99999999-0000-0008-C000-000000000053}\\InprocServer32", "dlltest.dll", "CLSID\\{99999999-0000-0008-C000-000000000055}\\LocalServer32", "db.exe", // Indicates end of list. "", "" }; DWORD g_fFullInfo = 0; // write full info or not DWORD g_dwPauseBetweenTests = 0; // time delay between running tests //+------------------------------------------------------------------- // // Member: CBenchMarkDriver::RunTest, public // // Synopsis: Sets up, runs, reports and cleans up test procedure // of specified class // // Parameters: [output] Output class for results // [pTest] Test object // // History: 30-June-93 t-martig Created // //-------------------------------------------------------------------- SCODE CBenchMarkDriver::RunTest (CTestInput &input, CTestOutput &output, CTestBase *pTest) { TCHAR szConfigString[80]; SCODE sc; input.GetConfigString (TEXT("Tests"), pTest->Name(), TEXT("OFF"), szConfigString, 80); if (lstrcmpi (szConfigString, TEXT("OFF")) != 0 && lstrcmpi (szConfigString, TEXT("FALSE")) != 0) { LogSection (pTest->Name()); sc=pTest->Setup(&input); if (FAILED(sc)) return sc; // pause between test invocations Sleep(g_dwPauseBetweenTests); sc = pTest->Run(); pTest->Report(output); pTest->Cleanup(); if (FAILED(sc)) { output.WriteString (TEXT("\nStatus:\tERROR, see log file\n")); } // pause between test invocations Sleep(g_dwPauseBetweenTests); } return sc; } //+------------------------------------------------------------------- // // Member: CBenchMarkDriver::WriteHeader, public // // Synopsis: Prints test form header into output file // // History: 5-August-93 t-martig Created // //-------------------------------------------------------------------- void CBenchMarkDriver::WriteHeader (CTestInput &input, CTestOutput &output) { _SYSTEMTIME stTimeDate; output.WriteString (TEXT("CairOLE Benchmarks\n")); output.WriteConfigEntry (input, TEXT("Driver"), TEXT("Tester"), TEXT("")); GetLocalTime (&stTimeDate); output.WriteDate (&stTimeDate); output.WriteString (TEXT("\t")); output.WriteTime (&stTimeDate); output.WriteString (TEXT("\n\n")); } //+------------------------------------------------------------------- // // Member: CBenchMarkDriver::Run, public // // Synopsis: Runs all tests specified in .ini file // // History: 30-June-93 t-martig Created // //-------------------------------------------------------------------- #define RUN_TEST(CMyTestClass) \ { \ CTestBase *pTest; \ pTest = new CMyTestClass; \ RunTest (input, output, pTest); \ delete pTest; \ output.Flush(); \ } SCODE CBenchMarkDriver::Run (LPSTR lpCmdLine) { TCHAR szBenchMarkIniFile[MAX_PATH]; TCHAR szOutputFileName[MAX_PATH]; TCHAR szLogFileName[MAX_PATH]; TCHAR szTemp[MAX_PATH]; // Get file name of .ini file. if not specified in the command // line, use the default BM.INI in the local directory GetCurrentDirectory (MAX_PATH, szTemp); lstrcpy(szBenchMarkIniFile, szTemp); lstrcat (szBenchMarkIniFile, TEXT("\\BM.INI")); // create the names for the temporary files. uses pid.xxx. Its the // current directory appended with the pid and a file extension. OLECHAR szPid[9]; DWORD pid = GetCurrentProcessId(); CHAR aszPid[9]; _itoa(pid, aszPid, 16); mbstowcs(szPid, aszPid, strlen(aszPid)+1); #ifdef UNICODE wcscpy(aszPerstName[0], szTemp); #else mbstowcs(aszPerstName[0], szTemp, strlen(szTemp)+1); #endif wcscat(aszPerstName[0], L"\\"); wcscat(aszPerstName[0], szPid); wcscpy(aszPerstName[1], aszPerstName[0]); wcscpy(aszPerstNameNew[0], aszPerstName[0]); wcscpy(aszPerstNameNew[1], aszPerstName[0]); wcscat(aszPerstName[0], L".BM1"); wcscat(aszPerstNameNew[0], L"NEW.BM1"); wcscat(aszPerstName[1], L".BM2"); wcscat(aszPerstNameNew[1], L"NEW.BM2"); // Define input, output and log file CTestInput input (szBenchMarkIniFile); CTestOutput output (input.GetConfigString (TEXT("Driver"), TEXT("Report"), TEXT("BM.RES"), szOutputFileName, MAX_PATH)); CTestOutput log (input.GetConfigString (TEXT("Driver"), TEXT("Log"), TEXT("BM.LOG"), szLogFileName, MAX_PATH)); LogTo (&log); // Get the pause time between test invocations g_dwPauseBetweenTests = input.GetConfigInt (TEXT("Driver"), TEXT("PauseBetweenTests"), 2000); // Get global info level flag g_fFullInfo = input.GetInfoLevelFlag(); // Write the correct OleInitialize flag to win.ini for the various // OLE servers to use, based on the init flag in bm.ini. LPTSTR pszOleInit; #ifdef THREADING_SUPPORT if (input.GetOleInitFlag() == COINIT_MULTITHREADED) { // pszOleInit = TEXT("MultiThreaded"); } else #endif { // pszOleInit = TEXT("ApartmentThreaded"); } // WriteProfileString(TEXT("TestSrv"), TEXT("ThreadMode"), pszOleInit); // WriteProfileString(TEXT("OleSrv"), TEXT("ThreadMode"), pszOleInit); // Write header and configuration info WriteHeader (input, output); ReportBMConfig (input, output); // Run all the tests // To add tests, use macro RUN_TEST, the parameter is the name of // the test class. Be sure to include a sction called [] in // the BM.INI file, as well as a switch under the [Tests] section // ( = ON, e.g.) Sleep(1000); RUN_TEST (COleMarshalTest2); RUN_TEST (CNoiseTest); RUN_TEST (CRawRpc); // NOTE: must come before any OLE tests RUN_TEST (COleInitializeTest); RUN_TEST (COleRegistrationTest); RUN_TEST (COleActivationTest); RUN_TEST (CFileMonikerStorageBindTest); RUN_TEST (CFileMonikerObjBindTest); RUN_TEST (CROTTest); RUN_TEST (COlePropertyTest); RUN_TEST (COleMarshalTest); RUN_TEST (CRpcTest); RUN_TEST (CRpcTest2); RUN_TEST (CNestTest); RUN_TEST (CQueryInterfaceTest); RUN_TEST (CApiTest); RUN_TEST (CCGPSTest); RUN_TEST (COleAllocTest); RUN_TEST (CGuidCompareTest); RUN_TEST (CFileIOTest); RUN_TEST (CStorageTest); RUN_TEST (CNestedStorageTest); RUN_TEST (CStorageParserTest); //Upper layer tests RUN_TEST (CCreateTest); RUN_TEST (CCreateLinkTest); // RUN_TEST (CClipbrdTest); RUN_TEST (COleLoadTest); RUN_TEST (CIOLTest); RUN_TEST (COleCacheTest); return S_OK; } //+------------------------------------------------------------------- // // Function: RegistrySetup // // Synopsis: If the registry entries for this program are not set, // write them // // Note: This function uses all Ascii characters and character // arithmatic because it has to run on NT and Chicago. // // History: 16 Dec 94 AlexMit Created // //-------------------------------------------------------------------- BOOL RegistrySetup() { char value[REGISTRY_ENTRY_LEN]; LONG value_size; LONG result; char directory[MAX_PATH]; char *appname; BOOL success = FALSE; // Write constant entries. for (int i = 0; REG_CONST_KEY[i].key[0] != '\0'; i++) { result = RegSetValueA( HKEY_CLASSES_ROOT, REG_CONST_KEY[i].key, REG_SZ, REG_CONST_KEY[i].value, strlen(REG_CONST_KEY[i].value) ); if (result != ERROR_SUCCESS) goto cleanup; } // Compute the path to the application. result = GetFullPathNameA("benchmrk", sizeof(directory), directory, &appname); if (result == 0) goto cleanup; // Add the path to all the dll and exe entries. for (i = 0; REG_EXE_KEY[i].key[0] != '\0'; i++) { // Verify that the path will fit in the buffer and compute the path // to the next executable. if (strlen(REG_EXE_KEY[i].value) >= (ULONG)(MAX_PATH - (appname - directory))) goto cleanup; strcpy(appname, REG_EXE_KEY[i].value); // Write the next entry. result = RegSetValueA( HKEY_CLASSES_ROOT, REG_EXE_KEY[i].key, REG_SZ, directory, strlen(directory)); if (result != ERROR_SUCCESS) goto cleanup; } success = TRUE; cleanup: return success; } //+------------------------------------------------------------------- // // Function: WinMain // // Synopsis: Program entry point, starts benchmark driver // // History: 30-June-93 t-martig Created // //-------------------------------------------------------------------- int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { CBenchMarkDriver driver; if (!_stricmp(lpCmdLine, "/r") || !_stricmp(lpCmdLine, "-r")) { if (!RegistrySetup()) { printf("Registry Updated\n"); return 0; } else { printf("Registry Update Failed\n"); return 1; } } driver.Run (lpCmdLine); return 0; }