windows-nt/Source/XPSP1/NT/admin/wmi/wbem/bvt/whistler/bvtess.cpp
2020-09-26 16:20:57 +08:00

530 lines
22 KiB
C++

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// BVTESS.CPP
//
//
// Copyright (c)2000 Microsoft Corporation, All Rights Reserved
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <bvt.h>
#include "bvtess.h"
#include <initguid.h>
#include <stdio.h>
CCriticalSection g_EventCritSec;
int g_fPermConsumerStarted = TRUE;
#define NO_ERRORS_EXPECTED FALSE,__FILE__,__LINE__
#define ERRORS_CAN_BE_EXPECTED TRUE,__FILE__,__LINE__
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int FireEvent(WCHAR * wcsEventInfo, int & nTotalExpected)
{
EventInfo Event;
int nRc = CrackEvent(wcsEventInfo, Event, NO_ERRORS_EXPECTED);
if( SUCCESS == nRc )
{
//=====================================================
// Open up the requested namespace
//=====================================================
IWbemServices * pNamespace = NULL;
nRc = OpenNamespaceAndKeepOpen( &pNamespace, Event.Namespace, FALSE, FALSE);
if( nRc == SUCCESS )
{
//=====================================================
// Run the requested tests
//=====================================================
nRc = RunTests(Event.Section,FALSE,TRUE);
if( SUCCESS != nRc )
{
gp_LogFile->LogError(__FILE__,__LINE__,FATAL_ERROR, L"Firing Events for Permanent consumers in Namespace %s, not as expected.", Event.Namespace);
}
else
{
nTotalExpected += Event.Results;
}
}
SAFE_RELEASE_PTR(pNamespace);
}
return nRc;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int TestSemiSyncEvent(WCHAR * wcsEventInfo, BOOL fCompareResults)
{
EventInfo Event;
int nRc = CrackEvent(wcsEventInfo, Event, NO_ERRORS_EXPECTED);
if( SUCCESS == nRc )
{
//=====================================================
// Open up the requested namespace
//=====================================================
IWbemServices * pNamespace = NULL;
nRc = OpenNamespaceAndKeepOpen( &pNamespace, Event.Namespace, FALSE,fCompareResults);
if( nRc == SUCCESS )
{
//=====================================================
// Set up the query first
//=====================================================
IEnumWbemClassObject * pEnum = NULL;
IWbemContext * pCtx = NULL;
nRc = ExecNotificationQueryAndLogErrors(pNamespace, &pEnum, Event.Query,
Event.Language, WPTR Event.Namespace, pCtx, NO_ERRORS_EXPECTED);
//=====================================================
// Run the requested tests
//=====================================================
if( SUCCESS == nRc )
{
nRc = RunTests(Event.Section,fCompareResults,TRUE);
if( SUCCESS == nRc )
{
nRc = CompareResultsFromEnumeration(pEnum, Event.Results, WPTR Event.Query, WPTR Event.Namespace);
if( SUCCESS != nRc )
{
gp_LogFile->LogError(__FILE__,__LINE__,FATAL_ERROR, L"Semi-sync Events for query: %s, in Namespace %s, not as expected.", Event.Query, Event.Namespace);
}
}
}
SAFE_RELEASE_PTR(pEnum);
}
SAFE_RELEASE_PTR(pNamespace);
}
return nRc;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int TestAsyncEvent(WCHAR * wcsEventInfo, BOOL fCompareResults)
{
EventInfo Event;
int nRc = CrackEvent(wcsEventInfo, Event, NO_ERRORS_EXPECTED);
if( SUCCESS == nRc )
{
//=====================================================
// Open up the requested namespace
//=====================================================
IWbemServices * pNamespace = NULL;
nRc = OpenNamespaceAndKeepOpen( &pNamespace, Event.Namespace, FALSE,fCompareResults);
if( nRc == SUCCESS )
{
//=====================================================
// Set up the query first
//=====================================================
IWbemContext * pCtx = NULL;
CSinkEx * pHandler = NULL;
pHandler = new CSinkEx;
if( pHandler )
{
nRc = ExecNotificationQueryAsyncAndLogErrors(pNamespace, pHandler, Event.Query,
Event.Language, (WCHAR*)((const WCHAR*) Event.Namespace), pCtx, NO_ERRORS_EXPECTED);
//=====================================================
// Run the requested tests
//=====================================================
if( SUCCESS == nRc )
{
//=================================================
// Wait for the signal, then run the tests, then
// try 3 times to see if we got the event.
//=================================================
nRc = RunTests(Event.Section,fCompareResults,TRUE);
if( SUCCESS == nRc )
{
HRESULT hr = WBEM_E_FAILED;
for( int i=0; i < 3; i++ )
{
pHandler->WaitForSignal(1000);
hr = pHandler->GetStatusCode();
if(SUCCEEDED(hr))
{
break;
}
}
//=============================================
// We got the event
//=============================================
if( S_OK == hr )
{
if( pHandler->GetNumberOfObjectsReceived() != Event.Results )
{
gp_LogFile->LogError(__FILE__,__LINE__,FATAL_ERROR, L"Async Events for query: %s, in Namespace %s, not as expected.", Event.Query, Event.Namespace);
}
}
//=============================================
// We never received the event
//=============================================
else
{
gp_LogFile->LogError(__FILE__,__LINE__,FATAL_ERROR, L"Didn't receive expected async event for Query: %s, in Namespace %s. HRESULT from GetStatusCode was: 0x%x", Event.Query, Event.Namespace, hr );
}
}
}
}
//=====================================================
// Cancel the async call, then if the return codes are
// ok so far, and this one isn't replace it.
//=====================================================
int nTmp = CancelAsyncCallAndLogErrors(pNamespace, pHandler, Event.Query,
Event.Language, (WCHAR*)((const WCHAR*)Event.Namespace), NO_ERRORS_EXPECTED );
if( nRc == S_OK && nTmp != S_OK )
{
nRc = nTmp;
}
SAFE_RELEASE_PTR(pHandler);
}
SAFE_RELEASE_PTR(pNamespace);
}
return nRc;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*****************************************************************************************************************
// Test 300 : Temporary Semi Sync Events
//*****************************************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int TempSemiSyncEvents(BOOL fCompareResults, BOOL fSuppress)
{
int nRc = FATAL_ERROR;
CHString sNamespace;
IWbemServices * pNamespace = NULL;
LogTestBeginning(300, fSuppress);
// =====================================================================
// Run the requested tests and get the namespace open
// =====================================================================
nRc = RunRequestedTestsAndOpenNamespace(300, sNamespace, &pNamespace, fCompareResults);
if( SUCCESS == nRc )
{
//=========================================================
// Get the types of tests to run
//=========================================================
CHString sEventList;
if( g_Options.GetSpecificOptionForAPITest(L"EVENT_LIST",sEventList, 300))
{
ItemList MasterList;
//=======================================================
// Get the list of the events to test
//=======================================================
if( InitMasterList(sEventList,MasterList))
{
if( SUCCESS == nRc )
{
for( int i = 0; i < MasterList.Size(); i++ )
{
ItemInfo * p = MasterList.GetAt(i);
CHString sEventInfo;
//===========================================
// Get the query information
//===========================================
if( g_Options.GetSpecificOptionForAPITest(WPTR p->Item,sEventInfo,300))
{
nRc = TestSemiSyncEvent(WPTR sEventInfo, fCompareResults);
}
}
}
}
}
}
SAFE_RELEASE_PTR(pNamespace);
LogTestEnding(300,nRc, fSuppress);
return nRc;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*****************************************************************************************************************
// Test 301 : Temporary Async Events
//*****************************************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int TempAsyncEvents(BOOL fCompareResults,BOOL fSuppress)
{
int nRc = FATAL_ERROR;
CHString sNamespace;
IWbemServices * pNamespace = NULL;
LogTestBeginning(301, fSuppress);
// =====================================================================
// Run the requested tests and get the namespace open
// =====================================================================
nRc = RunRequestedTestsAndOpenNamespace(301, sNamespace, &pNamespace, fCompareResults);
if( SUCCESS == nRc )
{
//=========================================================
// Get the types of tests to run
//=========================================================
CHString sEventList;
if( g_Options.GetSpecificOptionForAPITest(L"EVENT_LIST",sEventList, 301))
{
ItemList MasterList;
//=======================================================
// Get the list of the events to test
//=======================================================
if( InitMasterList(sEventList,MasterList))
{
if( SUCCESS == nRc )
{
for( int i = 0; i < MasterList.Size(); i++ )
{
ItemInfo * p = MasterList.GetAt(i);
CHString sEventInfo;
//===========================================
// Get the query information
//===========================================
if( g_Options.GetSpecificOptionForAPITest( (WCHAR*)((const WCHAR*)p->Item),sEventInfo,300))
{
nRc = TestAsyncEvent( (WCHAR*)((const WCHAR*)sEventInfo), fCompareResults);
}
}
}
}
}
}
SAFE_RELEASE_PTR(pNamespace);
LogTestEnding(301,nRc, fSuppress);
return nRc;
}
//************************************************************************************
//
// Test302:
//
//************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int CompareExpectedResultsForPermanentEvents(DWORD dwTotalEventsExpected, WCHAR * sOutputLocation, int nRetry, int nSleep )
{
int nRc = FATAL_ERROR;
DWORD dwNumber = 0;
for( int i=0; i < nRetry; i++ )
{
Sleep(nSleep);
//==========================
// Get it from the registry
//==========================
HKEY hKey;
if( ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE,L"SOFTWARE\\BVT", &hKey))
{
DWORD dwType = 0;
DWORD dwSize = sizeof(DWORD);
RegQueryValueEx( hKey, L"PermEvents", 0, &dwType,(LPBYTE) &dwNumber, &dwSize);
DWORD dwNum = 0;
RegSetValueEx( hKey, L"PermEvents", 0, REG_DWORD,(LPBYTE) &dwNum, sizeof(REG_DWORD));
RegCloseKey(hKey);
break;
}
}
if( nRc == FATAL_ERROR )
{
if( dwNumber != dwTotalEventsExpected )
{
gp_LogFile->LogError(__FILE__,__LINE__,FATAL_ERROR, L"Results for Permanent Event Consumer not as expected. Expected %ld, received %ld", dwTotalEventsExpected, dwNumber );
}
else
{
nRc = SUCCESS;
}
}
return nRc;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
int SpawnOffPermEventConsumer( )
{
int nRc = FATAL_ERROR;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);
CHString sReg;
if( g_Options.GetSpecificOptionForAPITest(L"REGISTER_PERM_EVENT_CONSUMER",sReg, 302))
{
WCHAR wcsDir[MAX_PATH*2];
DWORD dw = GetCurrentDirectory(MAX_PATH,wcsDir);
wcscat( wcsDir, L"\\");
wcscat( wcsDir, WPTR sReg );
if( CreateProcess(wcsDir,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&si,&pi))
{
g_fPermConsumerStarted = TRUE;
nRc = SUCCESS;
}
}
return nRc;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int PermanentEvents(BOOL fCompareResults, BOOL fSuppress)
{
int nRc = FATAL_ERROR;
CHString sNamespace;
IWbemServices * pNamespace = NULL;
LogTestBeginning(302,fSuppress);
CAutoBlock Block(&g_EventCritSec);
// =====================================================================
// Run the requested tests and get the namespace open
// =====================================================================
nRc = RunRequestedTestsAndOpenNamespace(302, sNamespace, &pNamespace, fCompareResults);
if( SUCCESS == nRc )
{
//=========================================================
// Get the mofs to run
//=========================================================
CHString sMOF;
if( g_Options.GetSpecificOptionForAPITest(L"MOF_COMMAND",sMOF, 302))
{
HRESULT hr = _wsystem(WPTR sMOF);
if( !g_fPermConsumerStarted )
{
nRc = SpawnOffPermEventConsumer();
}
if( SUCCESS == nRc )
{
//=========================================================
// Now, fire the events
//=========================================================
CHString sEventList;
if( g_Options.GetSpecificOptionForAPITest(L"FIRE_EVENTS",sEventList, 302))
{
ItemList MasterList;
int nTotalEventsExpected = 0;
//=======================================================
// Get the list of the events to test
//=======================================================
if( InitMasterList(sEventList,MasterList))
{
if( SUCCESS == nRc )
{
for( int i = 0; i < MasterList.Size(); i++ )
{
ItemInfo * p = MasterList.GetAt(i);
CHString sEventInfo;
//===========================================
// Get the query information
//===========================================
if( g_Options.GetSpecificOptionForAPITest(p->Item,sEventInfo,302))
{
nRc = FireEvent(WPTR sEventInfo, nTotalEventsExpected );
}
}
}
}
//=======================================================
// See if we got what we expected
//=======================================================
if( fCompareResults )
{
CHString sFileLocation;
if(g_Options.GetSpecificOptionForAPITest(L"PERM_EVENT_OUTPUT_FILE",sFileLocation, 302))
{
CHString sRetry;
if(g_Options.GetSpecificOptionForAPITest(L"RETRY",sRetry, 302))
{
CHString sSleep;
if(g_Options.GetSpecificOptionForAPITest(L"SLEEP_IN_MILLISECONDS",sSleep, 302))
{
nRc = CompareExpectedResultsForPermanentEvents(nTotalEventsExpected, WPTR sFileLocation, _wtoi(WPTR sRetry), _wtoi(WPTR sSleep));
}
}
}
}
}
}
}
}
SAFE_RELEASE_PTR(pNamespace);
LogTestEnding(302,nRc, fSuppress);
return nRc;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*****************************************************************************************************************
// Test 303
//*****************************************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int PermanentInstances(BOOL fCompareResults, BOOL fSuppressHeader )
{
int nRc = FATAL_ERROR;
CHString sNamespace;
IWbemServices * pNamespace = NULL;
LogTestBeginning(303,fSuppressHeader);
// =====================================================================
// Run the requested tests and get then namespace open
// =====================================================================
nRc = RunRequestedTestsAndOpenNamespace(303, sNamespace, &pNamespace, fCompareResults);
if( SUCCESS == nRc )
{
nRc = CreateInstancesForSpecificTest(pNamespace, WPTR sNamespace,L"INSTANCE_LIST",303,TRUE);
}
// =====================================================================
// Release the pointers
// =====================================================================
SAFE_RELEASE_PTR(pNamespace);
LogTestEnding(303,nRc,fSuppressHeader);
return nRc;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*****************************************************************************************************************
// Test 304
//*****************************************************************************************************************
int PermanentClasses(BOOL fCompareResults, BOOL fSuppressHeader )
{
int nRc = FATAL_ERROR;
CHString sNamespace;
IWbemServices * pNamespace = NULL;
LogTestBeginning(304,fSuppressHeader);
// =====================================================================
// Run the requested tests and get then namespace open
// =====================================================================
nRc = RunRequestedTestsAndOpenNamespace(304, sNamespace, &pNamespace, fCompareResults);
if( SUCCESS == nRc )
{
//=========================================================
// Create classes with different properties. Some of
// these should be in the following inheritance chain and
// some should not inherit from the others at all:
// classes = {A, B, C, D:A, E:A, F:E, G:F, H:G, I:F}.
// A mix of simple string & sint32 keys are fine.
//=========================================================
nRc = CreateClassesForSpecificTest(pNamespace, WPTR sNamespace,L"CLASSES",304);
}
// =====================================================================
// Release the pointers
// =====================================================================
SAFE_RELEASE_PTR(pNamespace);
LogTestEnding(304,nRc,fSuppressHeader);
return nRc;
}