530 lines
22 KiB
C++
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;
|
||
|
}
|