464 lines
17 KiB
C++
464 lines
17 KiB
C++
/*++
|
|
|
|
Copyright (C) 1999-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Abstract:
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
|
|
|
|
// *****************************************************
|
|
//
|
|
// autotest.cpp
|
|
//
|
|
// Automated test suite for Quasar
|
|
//
|
|
// This should exercise all the major functionality
|
|
// of any implementation of the repository driver,
|
|
// and report the successes/failures/perf figures.
|
|
//
|
|
// *****************************************************
|
|
|
|
#include "precomp.h"
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <comutil.h>
|
|
#include <time.h>
|
|
#include <reposit.h>
|
|
#include <wbemcli.h>
|
|
#include <testmods.h>
|
|
|
|
#include <oledb.h>
|
|
#include <msjetoledb.h>
|
|
|
|
HRESULT RunSuite(int iSuiteNum, IWmiDbSession *pSession, IWmiDbController *pController, IWmiDbHandle *pScope);
|
|
BOOL SetParam(const wchar_t *pszParam);
|
|
void SetObjProp(IWbemClassObject *pObj, const wchar_t *pszPropName, wchar_t *pszValue, CIMTYPE ct = CIM_STRING);
|
|
void ShowHelp();
|
|
|
|
CLSID ridDriver = CLSID_WmiRepository_SQL;
|
|
|
|
struct LocalParams
|
|
{
|
|
wchar_t szServerName[250]; // SQL Server name
|
|
wchar_t szDatabase[100]; // SQL database
|
|
wchar_t szUser[100]; // SQL User name
|
|
wchar_t szPassword[100]; // SQL Password
|
|
wchar_t szLogonUser[200]; // Logon user account (for security testing)
|
|
DWORD dwTestSuite; // Test suite # to run (0 if all)
|
|
wchar_t szFileName[250]; // File name for results
|
|
wchar_t szNamespace[100]; // Namespace to create
|
|
BOOL bDropNamespace; // TRUE to drop namespace afterwards
|
|
DWORD dwMaxNumThreads; // Maximum number of threads
|
|
DWORD dwMaxHierarchyDepth; // Maximum hierarchy depth
|
|
DWORD dwMaxNumObjects; // Maximum number of any object type
|
|
BOOL bGatherStats; // TRUE to print statistics
|
|
DWORD dwCacheSize; // Maximum cache size
|
|
};
|
|
|
|
LocalParams config = {L".",L"WMI1",L"sa",L"",L"AKIAPOLAAU\\Guest", 0, L"", L"test", FALSE, 2, 5, 1000, TRUE, 65535};
|
|
|
|
|
|
|
|
// *****************************************************
|
|
//
|
|
// wmain
|
|
//
|
|
// *****************************************************
|
|
|
|
int __cdecl main (int argc, char ** argv)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
IWmiDbController *pController = NULL;
|
|
WMIDB_LOGON_TEMPLATE *pTemplate = NULL;
|
|
IWmiDbSession *pSession= NULL;
|
|
|
|
ridDriver = CLSID_WmiRepository_SQL;
|
|
|
|
printf (" *** WMI QUASAR REPOSITORY DRIVER COMPLIANCE TEST ***\n\n");
|
|
|
|
for (int i = 1; i < argc; i++)
|
|
{
|
|
// Set the value in the appropriate
|
|
// slot...
|
|
|
|
wchar_t wTemp[50];
|
|
swprintf(wTemp, L"%S", argv[i]);
|
|
if (!SetParam((const wchar_t *)wTemp))
|
|
{
|
|
wchar_t szTmp[100];
|
|
ShowHelp();
|
|
wprintf(L"Press <Enter> to continue.\n");
|
|
_getws(szTmp);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
hr = CoInitialize(NULL);
|
|
|
|
// Connect to driver. Set login information
|
|
// and attempt to get a connection.
|
|
|
|
hr = CoCreateInstance(ridDriver, NULL, CLSCTX_INPROC_SERVER, IID_IWmiDbController, (void **)&pController);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
wchar_t szPath[500];
|
|
IWbemPath *pNamespacePath = NULL;
|
|
IWbemClassObject *pNewNamespace = NULL;
|
|
IWmiDbHandle *pRoot = NULL;
|
|
IWmiDbHandle *pScopePath = NULL;
|
|
wchar_t szTmp[250];
|
|
hr = pController->GetLogonTemplate(0x409, 0, &pTemplate);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// Print out the current configuration, for the record.
|
|
// ====================================================
|
|
|
|
wprintf(L"\n*** Configuration ***\n"
|
|
L"=======================\n"
|
|
L"SQL Server Name.... %s\n", (const wchar_t *)config.szServerName);
|
|
wprintf(L"Database Name.. %s\n", (const wchar_t *)config.szDatabase);
|
|
wprintf(L"User ID........ %s\n", (const wchar_t *)config.szUser);
|
|
if (wcslen(config.szLogonUser))
|
|
wprintf(L"NT User............ %s\n", (const wchar_t *)config.szLogonUser);
|
|
else
|
|
wprintf(L"(No NT User)\n");
|
|
if (wcslen(config.szFileName))
|
|
wprintf(L"Output File ............ %s\n", (const wchar_t *)config.szFileName);
|
|
else
|
|
wprintf(L"(No Database Script)\n");
|
|
wprintf(L"Namespace Name..... %s\n", (const wchar_t *)config.szNamespace);
|
|
if (config.dwTestSuite)
|
|
wprintf(L"Test Suite #....... %ld\n", config.dwTestSuite);
|
|
else
|
|
wprintf(L"(Running all test suites...)\n");
|
|
wprintf(L"Max Num Threads.... %ld\n", config.dwMaxNumThreads);
|
|
wprintf(L"Max Hierarchy Depth %ld\n", config.dwMaxHierarchyDepth);
|
|
wprintf(L"Max Num Objects.... %ld\n", config.dwMaxNumObjects);
|
|
wprintf(L"Max Cache Size..... %ld\n", config.dwCacheSize);
|
|
wprintf(L"Drop Namespace?.... %s\n", (config.bDropNamespace ) ? L"TRUE" : L"FALSE");
|
|
wprintf(L"Gather statistics?. %s\n", (config.bGatherStats) ? L"TRUE" : L"FALSE");
|
|
if (ridDriver == CLSID_WmiRepository_SQL)
|
|
wprintf(L"Using SQL driver\n");
|
|
else
|
|
wprintf(L"Using JET driver\n");
|
|
wprintf(L"=======================\n\n");
|
|
|
|
// Fill in the parameters:
|
|
|
|
for (i = 0; i < (int)pTemplate->dwArraySize - 1; i++)
|
|
{
|
|
if (!_wcsicmp(pTemplate->pParm[i].strParmDisplayName, L"Server"))
|
|
{
|
|
pTemplate->pParm[i].Value.bstrVal = SysAllocString(config.szServerName);
|
|
pTemplate->pParm[i].Value.vt = VT_BSTR;
|
|
}
|
|
else if (!_wcsicmp(pTemplate->pParm[i].strParmDisplayName, L"Database"))
|
|
{
|
|
pTemplate->pParm[i].Value.bstrVal = SysAllocString(config.szDatabase);
|
|
pTemplate->pParm[i].Value.vt = VT_BSTR;
|
|
}
|
|
else if (!_wcsicmp(pTemplate->pParm[i].strParmDisplayName, L"UserID"))
|
|
{
|
|
pTemplate->pParm[i].Value.bstrVal = SysAllocString(config.szUser);
|
|
pTemplate->pParm[i].Value.vt = VT_BSTR;
|
|
}
|
|
else if (!_wcsicmp(pTemplate->pParm[i].strParmDisplayName, L"Password"))
|
|
{
|
|
pTemplate->pParm[i].Value.bstrVal = SysAllocString(config.szPassword);
|
|
pTemplate->pParm[i].Value.vt = VT_BSTR;
|
|
}
|
|
|
|
}
|
|
|
|
hr = pController->SetCacheValue(config.dwCacheSize);
|
|
if (FAILED(hr))
|
|
printf("IWmiDbController::SetCacheValue failed (%X)\n", hr);
|
|
|
|
hr = pController->Logon(pTemplate, 0, WMIDB_HANDLE_TYPE_VERSIONED, &pSession, &pRoot);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
wcscpy(szPath, L"__Namespace");
|
|
|
|
pController->FreeLogonTemplate(&pTemplate);
|
|
printf("Successfully obtained connection to repository...\n");
|
|
|
|
// Create a namespace (config.szNamespace)
|
|
|
|
IWbemClassObject *pNamespace = NULL;
|
|
IWmiDbHandle *pNSHandle = NULL;
|
|
|
|
hr = CoCreateInstance(CLSID_WbemDefPath, 0, CLSCTX_INPROC_SERVER,
|
|
IID_IWbemPath, (LPVOID *) &pNamespacePath);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
ULONG uLen = 500;
|
|
pNamespacePath->SetText(WBEMPATH_CREATE_ACCEPT_ALL, szPath);
|
|
|
|
hr = pSession->GetObject(pRoot, pNamespacePath, 0, WMIDB_HANDLE_TYPE_COOKIE, &pNSHandle);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pNSHandle->QueryInterface(IID_IWbemClassObject, (void **)&pNamespace);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
pNamespace->SpawnInstance(0, &pNewNamespace);
|
|
|
|
SetObjProp(pNewNamespace, L"Name", config.szNamespace);
|
|
hr = pSession->PutObject(pRoot, IID_IWbemClassObject, pNewNamespace, WBEM_FLAG_CREATE_ONLY, WMIDB_HANDLE_TYPE_VERSIONED, &pScopePath);
|
|
if (FAILED(hr))
|
|
{
|
|
pNamespacePath->SetText(WBEMPATH_CREATE_ACCEPT_ALL, config.szNamespace);
|
|
hr = pSession->DeleteObject(pRoot, 0, IID_IWbemPath, pNamespacePath);
|
|
if (SUCCEEDED(hr))
|
|
hr = pSession->PutObject(pRoot, IID_IWbemClassObject, pNewNamespace, WBEM_FLAG_CREATE_ONLY,
|
|
WMIDB_HANDLE_TYPE_VERSIONED, &pScopePath);
|
|
}
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = RunSuite(config.dwTestSuite, pSession, pController, pScopePath);
|
|
if (FAILED(hr))
|
|
printf("RunSuite failed with %X\n", hr);
|
|
}
|
|
else
|
|
wprintf(L"IWmiDbSession::PutObject failed to put %s (%X)\n", (const wchar_t *)config.szNamespace, hr);
|
|
pNSHandle->Release();
|
|
pNamespace->Release();
|
|
pNewNamespace->Release();
|
|
}
|
|
else
|
|
printf("IWmiDbHandle::QueryInterface failed (IID_IWbemClassObject) (%X)\n", hr);
|
|
}
|
|
else
|
|
wprintf(L"IWmiDbSession::GetObject failed to get %s (%X) \n", (const wchar_t *)szPath, hr);
|
|
}
|
|
else
|
|
printf("CoCreateInstance failed to create a IWbemPath (%X)\n", hr);
|
|
|
|
}
|
|
else
|
|
printf("IWmiDbController::Logon failed (%X)\n", hr);
|
|
}
|
|
else
|
|
printf("IWmiDbController::GetLogonTemplate failed. (%X)\n", hr);
|
|
|
|
// Drop the namespace, if requested
|
|
// ================================
|
|
|
|
if (SUCCEEDED(hr) && config.bDropNamespace)
|
|
{
|
|
hr = pSession->DeleteObject(pRoot, 0, IID_IWmiDbHandle, pScopePath);
|
|
if (FAILED(hr))
|
|
printf("IWmiDbSession::DeleteObject failed (%X)\n", hr);
|
|
else
|
|
printf("IWmiDbSession::DeleteObject succeeded. PLEASE VERIFY REMOVAL OF NAMESPACE IN UNDERLYING REPOSITORY!!\n\n");
|
|
}
|
|
|
|
hr = pController->FlushCache(0);
|
|
|
|
hr = pController->Shutdown(0);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
try {
|
|
|
|
DWORD dwType = 0;
|
|
if (pSession)
|
|
{
|
|
hr = pSession->PutObject(pRoot, IID_IWbemClassObject, pScopePath, 0, 0, NULL);
|
|
if (SUCCEEDED(hr))
|
|
wprintf(L"WARNING: IWmiDbSession::PutObject succeeded after shutdown!!\n");
|
|
hr = pSession->SetDecoration(L".", L"root");
|
|
if (SUCCEEDED(hr))
|
|
wprintf(L"WARNING: IWmiDbSession::SetDecoration succeeded after shutdown!!\n");
|
|
}
|
|
if (SUCCEEDED(pController->SetCacheValue(0)))
|
|
wprintf(L"WARNING: IWmiDbController::SetCacheValue succeeded after shutdown!!\n\n");
|
|
}
|
|
catch (...)
|
|
{
|
|
wprintf(L"ERROR: An exception occurred while testing post-shutdown calls.\n");
|
|
}
|
|
}
|
|
else
|
|
wprintf(L"IWmiDbController::Shutdown failed (%X)\n", hr);
|
|
|
|
if (pRoot)
|
|
pRoot->Release();
|
|
if (pNamespacePath)
|
|
pNamespacePath->Release();
|
|
if (pScopePath)
|
|
pScopePath->Release();
|
|
if (pSession)
|
|
pSession->Release();
|
|
if (pController)
|
|
pController->Release();
|
|
|
|
if (SUCCEEDED(hr))
|
|
printf("Shutdown successful.\n");
|
|
|
|
printf("Press <Enter> to end.\n");
|
|
_getws(szTmp);
|
|
|
|
CoUninitialize();
|
|
}
|
|
else
|
|
printf("CoCreateInstance failed to create an IWmiDbController (%X).\n", hr);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
// *****************************************************
|
|
//
|
|
// RunSuite
|
|
//
|
|
// *****************************************************
|
|
|
|
HRESULT RunSuite(int iSuiteNum, IWmiDbSession *pSession, IWmiDbController *pController, IWmiDbHandle *pScope)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
if (iSuiteNum)
|
|
printf("*** Running Test Suite %ld...\n", iSuiteNum);
|
|
else
|
|
printf("*** Running ALL Test Suites. Beginning...\n");
|
|
|
|
// Run the suite(s)...
|
|
|
|
SuiteManager mgr (config.szFileName, config.szLogonUser, config.dwMaxNumThreads, config.dwMaxHierarchyDepth, config.dwMaxNumObjects);
|
|
hr = mgr.RunSuite(iSuiteNum, pSession, pController, pScope);
|
|
|
|
// Report the statistics!!
|
|
|
|
mgr.DumpResults(config.bGatherStats);
|
|
|
|
printf("*** Done\n");
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
// *****************************************************
|
|
//
|
|
// SetObjProp
|
|
//
|
|
// *****************************************************
|
|
|
|
void SetObjProp(IWbemClassObject *pObj, const wchar_t *pszPropName, wchar_t *pszValue, CIMTYPE ct)
|
|
{
|
|
VARIANT vTemp;
|
|
VariantInit(&vTemp);
|
|
|
|
vTemp.vt = VT_BSTR;
|
|
vTemp.bstrVal = SysAllocString(pszValue);
|
|
|
|
HRESULT hr = pObj->Put(pszPropName, 0, &vTemp, ct);
|
|
VariantClear(&vTemp);
|
|
}
|
|
|
|
// *****************************************************
|
|
//
|
|
// ShowHelp
|
|
//
|
|
// *****************************************************
|
|
|
|
void ShowHelp()
|
|
{
|
|
wprintf(L" Parameters:\n");
|
|
wprintf(L" ==========\n");
|
|
wprintf(L" S=Server name \n");
|
|
wprintf(L" D=Database\n");
|
|
wprintf(L" U=User\n");
|
|
wprintf(L" P=Password\n");
|
|
wprintf(L" UA=Logon user account\n");
|
|
wprintf(L" TS=Test Suite # (1=Functionality, 2=Error Verification, 3=Stress)\n");
|
|
wprintf(L" FN=File name\n");
|
|
wprintf(L" NS=Name of the test namespace.\n");
|
|
wprintf(L" MT=Max number of threads to run concurrently\n");
|
|
wprintf(L" MH=Maximum hierarchy depth\n");
|
|
wprintf(L" NO=Maximum number of any one object to create\n");
|
|
wprintf(L" CS=Cache size in bytes\n");
|
|
wprintf(L" ST=Gather speed/space statistics (Y/N)\n");
|
|
wprintf(L" DN=Drop namespace when done (Y/N)\n");
|
|
wprintf(L" SQL=Use SQL driver (Y/N)\n");
|
|
wprintf(L" /? Display help\n");
|
|
wprintf(L"\n");
|
|
wprintf(L" Example: autotest S=. D=WMI1 U=sa CS=65535\n\n");
|
|
}
|
|
|
|
// *****************************************************
|
|
//
|
|
// SetParam
|
|
//
|
|
// *****************************************************
|
|
|
|
BOOL SetParam(const wchar_t *pszParam)
|
|
{
|
|
BOOL bRet = 0;
|
|
wchar_t szTmp[5];
|
|
|
|
wchar_t *pTmp = wcsstr(pszParam, L"=");
|
|
if (pTmp)
|
|
{
|
|
bRet = TRUE;
|
|
wcsncpy(szTmp, pszParam, pTmp-pszParam);
|
|
szTmp[pTmp-pszParam] = '\0';
|
|
pTmp++;
|
|
|
|
if (!_wcsicmp(szTmp, L"S"))
|
|
wcscpy(config.szServerName, pTmp);
|
|
else if (!_wcsicmp(szTmp, L"D"))
|
|
wcscpy(config.szDatabase, pTmp);
|
|
else if (!_wcsicmp(szTmp, L"U"))
|
|
wcscpy(config.szUser, pTmp);
|
|
else if (!_wcsicmp(szTmp, L"P"))
|
|
wcscpy(config.szPassword, pTmp);
|
|
else if (!_wcsicmp(szTmp, L"UA"))
|
|
wcscpy(config.szLogonUser, pTmp);
|
|
else if (!_wcsicmp(szTmp, L"TS"))
|
|
config.dwTestSuite = _wtoi(pTmp);
|
|
else if (!_wcsicmp(szTmp, L"FN"))
|
|
wcscpy(config.szFileName, pTmp);
|
|
else if (!_wcsicmp(szTmp, L"NS"))
|
|
wcscpy(config.szNamespace, pTmp);
|
|
else if (!_wcsicmp(szTmp, L"DN"))
|
|
{
|
|
if (!_wcsicmp(pTmp, L"Y"))
|
|
config.bDropNamespace = TRUE;
|
|
else
|
|
config.bDropNamespace = false;
|
|
}
|
|
else if (!_wcsicmp(szTmp, L"MT"))
|
|
config.dwMaxNumThreads = _wtoi(pTmp);
|
|
else if (!_wcsicmp(szTmp, L"MH"))
|
|
config.dwMaxHierarchyDepth = _wtoi(pTmp);
|
|
else if (!_wcsicmp(szTmp, L"NO"))
|
|
config.dwMaxNumObjects = _wtoi(pTmp);
|
|
else if (!_wcsicmp(szTmp, L"ST"))
|
|
{
|
|
if (!_wcsicmp(pTmp, L"Y"))
|
|
config.bGatherStats = TRUE;
|
|
else
|
|
config.bGatherStats = false;
|
|
}
|
|
else if (!_wcsicmp(szTmp, L"SQL"))
|
|
{
|
|
if (!_wcsicmp(pTmp, L"Y"))
|
|
ridDriver = CLSID_WmiRepository_SQL;
|
|
else
|
|
ridDriver = CLSID_WmiRepository_Jet;
|
|
}
|
|
else if (!_wcsicmp(szTmp, L"CS"))
|
|
config.dwCacheSize = _wtoi(pTmp);
|
|
else
|
|
bRet = FALSE;
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|