|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// BVTCOM.CPP
//
//
// Copyright (c)2000 Microsoft Corporation, All Rights Reserved
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "bvt.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Common functional units used among tests
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int OpenNamespaceAndKeepOpen( IWbemServices ** ppNamespace, WCHAR * wcsNamespace, BOOL fCreateIfDoesntExist) { //==========================================================================
// Open CIMV2 namespace
//==========================================================================
int nRc = FATAL_ERROR; IWbemLocator * pLocator = NULL;
// =====================================================================
// Get the locator
// =====================================================================
nRc = CoCreateInstanceAndLogErrors(CLSID_WbemLocator,IID_IWbemLocator,(void**)&pLocator,NO_ERRORS_EXPECTED); if( SUCCESS == nRc ) { // =================================================================
// Connect to the desired namespace
// =================================================================
nRc = ConnectServerAndLogErrors(pLocator,ppNamespace,wcsNamespace,NO_ERRORS_EXPECTED); if( (SUCCESS != nRc ) && ( fCreateIfDoesntExist )) { nRc = CreateNewTestNamespace(); if( nRc == S_OK ) { nRc = ConnectServerAndLogErrors(pLocator,ppNamespace,wcsNamespace,NO_ERRORS_EXPECTED); } } } // =====================================================================
// Release the pointers
// =====================================================================
SAFE_RELEASE_PTR(pLocator);
return nRc; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int WritePropertiesAndQualifiers( IWbemServices * pNamespace, IWbemClassObject * pClass, CPropertyList & Props, const WCHAR * wcsClass, DWORD dwFlags, WCHAR * wcsNamespace, BOOL fExpectedFailure, const char * csFile , const ULONG Line ) { int nRc = FATAL_ERROR;
if( Props.Size() == 0 ) { nRc = SUCCESS; }
for( int i = 0; i < Props.Size(); i++ ) { //======================================================
// Get the property info
//======================================================
PropertyInfo *p = Props.GetAt(i); if( !p ) { break; }
if( !p->QualifierName ) { //======================================================
// Write out the property
//======================================================
nRc = PutPropertyAndLogErrors( pClass, p->Property, p->Type, p->Var, wcsClass, 0,wcsNamespace, fExpectedFailure, csFile , Line ); } else { //======================================================
// If it is a qualifier, write the qualifier
//======================================================
nRc = PutQualifierOnPropertyAndLogErrors( pClass, p->Property, p->QualifierName ,p->Var, wcsClass, dwFlags, wcsNamespace, fExpectedFailure, csFile , Line ); } if( nRc != SUCCESS ) { break; } } return nRc; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int CreateClassAndLogErrors( IWbemServices * pNamespace, const WCHAR * wcsClass, WCHAR * wcsClassDefinition, WCHAR * wcsNamespace, BOOL fExpectedFailure, const char * csFile , const ULONG Line ) { int nRc = FATAL_ERROR; IWbemClassObject *pClass = NULL;
const WCHAR * wcsParentClass = NULL; // nothing is allocated, so don't release
CPropertyList Properties; // destructor will release
//===========================================================
// Get the class definition
//===========================================================
nRc = CrackClass(wcsClassDefinition,wcsParentClass, Properties, fExpectedFailure, csFile, Line ); if( nRc == SUCCESS ) {
if( wcsParentClass ) { // =================================================================
// Spawn a class from the parent
// =================================================================
IWbemClassObject * pParentClass = NULL; nRc = GetClassObjectAndLogErrors(pNamespace, wcsParentClass, &pParentClass, wcsNamespace, fExpectedFailure, csFile , Line ); if( nRc == SUCCESS ) { nRc = SpawnDerivedClassAndLogErrors(pParentClass, wcsParentClass, &pClass,wcsNamespace, fExpectedFailure, csFile , Line ); } } else { // =================================================================
// Get an empty class object to work with
// =================================================================
nRc = GetClassObjectAndLogErrors(pNamespace, NULL, &pClass, wcsNamespace, fExpectedFailure, csFile , Line ); } if( nRc == SUCCESS ) { //==============================================================
// Now, set the properties of the class
// start with the name of the class
//==============================================================
CVARIANT var; var.SetStr((WCHAR*)wcsClass);
nRc = PutPropertyAndLogErrors( pClass, L"__CLASS", CIM_STRING, var, wcsClass, 0,wcsNamespace, fExpectedFailure, csFile , Line ); if( SUCCESS == nRc ) { //==========================================================
// Set the rest of the properties
//==========================================================
DWORD dwFlags = 0; nRc = WritePropertiesAndQualifiers(pNamespace, pClass, Properties,wcsClass,dwFlags,wcsNamespace,NO_ERRORS_EXPECTED); //==============================================================
// Now, create the class
//==============================================================
if( SUCCESS == nRc ) { nRc = PutClassAndLogErrors(pNamespace, pClass,wcsClass,wcsNamespace, TRUE, csFile , Line ); } } } }
SAFE_RELEASE_PTR(pClass); return nRc; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int DeleteClasses(CAutoDeleteString & sDeleteClasses,IWbemServices * pNamespace, WCHAR * wcsNamespace) { int nRc = FATAL_ERROR;
ClassList MasterList;
//=======================================================
// Get the list of the classes to be deleted
//=======================================================
if( InitMasterListOfClasses(sDeleteClasses.GetPtr(),MasterList)) {
for( int i = 0; i < MasterList.Size(); i++ ) { ClassInfo * pClass = MasterList.GetAt(i);
nRc = DeleteClassAndLogErrors(pNamespace, pClass->Class, wcsNamespace,NO_ERRORS_EXPECTED); if( nRc != SUCCESS ) { break; } } } return nRc; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int EnumerateInstancesAndCompare( IWbemServices * pNamespace, CAutoDeleteString & sInstanceList, CAutoDeleteString & sInstanceCompareList, WCHAR * wcsNamespace ) { int nRc = FATAL_ERROR;
//=======================================================
// Get the list of the classes to get instances for
//=======================================================
ClassList InstanceList;
if( InitMasterListOfClasses(sInstanceList.GetPtr(),InstanceList)) { for( int i=0; i < InstanceList.Size(); i++ ) { ClassInfo * p = InstanceList.GetAt(i); IEnumWbemClassObject * pEnum = NULL; //===========================================================
// Begin enumerating all of the requested instances
//===========================================================
nRc = EnumerateInstancesAndLogErrors(pNamespace,&pEnum,p->Class,wcsNamespace,NO_ERRORS_EXPECTED); if( nRc == S_OK ) { //=======================================================
// Compare instances, if we were asked to do so
//=======================================================
if( sInstanceCompareList.GetPtr() ) { ClassList MasterList; //===================================================
// Get the list of the classes to compare with what
// is in the namespace
//===================================================
if( InitMasterListOfClasses(sInstanceCompareList.GetPtr(),MasterList)) { //===================================================
// while we get the instances
//===================================================
while( TRUE ) { IWbemClassObject * pClass = NULL; nRc = NextClassAndLogErrors(pEnum, &pClass,wcsNamespace,NO_ERRORS_EXPECTED); if( nRc == NO_MORE_DATA ) { nRc = SUCCESS; break; } if( nRc != SUCCESS ) { break; } CVARIANT vProperty; CIMTYPE pType = 0; LONG lFlavor = 0; //===================================================
// Get the name of the class
//===================================================
nRc = GetPropertyAndLogErrors( pClass, L"__CLASS", &vProperty, &pType, &lFlavor, NULL,wcsNamespace, NO_ERRORS_EXPECTED); if( nRc == S_OK ) { //===============================================
// Compare the class name with what we expect
// and make sure we haven't already compared it
// before, if it isn't in the list, then error
// out, we have a big problem
//===============================================
if( !MasterList.ClassInListAndLogErrors(vProperty.GetStr(),wcsNamespace,NO_ERRORS_EXPECTED)) { break; } } } if( nRc == SUCCESS ) { //====================================================
// Go through the master list and see if there are
// any classes we expect to be there but we didn't
// get during the enumeration
//====================================================
nRc = MasterList.ClassesCompareAsExpectedAndLogErrors(wcsNamespace,NO_ERRORS_EXPECTED); } } } } SAFE_RELEASE_PTR(pEnum); } } return nRc; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int EnumerateClassesAndCompare(CAutoDeleteString & sClassesAfterDelete, IWbemServices * pNamespace, WCHAR * wcsNamespace) { IEnumWbemClassObject * pEnum = NULL; int nRc = FATAL_ERROR;
//===========================================================
// Begin enumerating all of the classes in the namespace
//===========================================================
nRc = EnumerateClassesAndLogErrors(pNamespace,&pEnum, wcsNamespace,NO_ERRORS_EXPECTED); if( nRc == S_OK ) { ClassList MasterList;
//=======================================================
// Get the list of the classes to compare with what is
// in the namespace
//=======================================================
if( InitMasterListOfClasses(sClassesAfterDelete.GetPtr(),MasterList)) { //===================================================
// while we get the classes in the namespace
//===================================================
while( TRUE ) { IWbemClassObject * pClass = NULL; nRc = NextClassAndLogErrors(pEnum, &pClass,wcsNamespace,NO_ERRORS_EXPECTED); if( nRc == NO_MORE_DATA ) { nRc = SUCCESS; break; } if( nRc != SUCCESS ) { break; } CVARIANT vProperty; CIMTYPE pType = 0; LONG lFlavor = 0; //===================================================
// Get the name of the class
//===================================================
nRc = GetPropertyAndLogErrors( pClass, L"__CLASS", &vProperty, &pType, &lFlavor, NULL,wcsNamespace, NO_ERRORS_EXPECTED); if( nRc == S_OK ) { //===============================================
// filter out system classes
//===============================================
if( wcsncmp( vProperty.GetStr(), L"__", 2 ) != 0 ) { //===============================================
// Compare the class name with what we expect
// and make sure we haven't already compared it
// before, if it isn't in the list, then error
// out, we have a big problem
//===============================================
nRc = MasterList.ClassInListAndLogErrors(vProperty.GetStr(),wcsNamespace,NO_ERRORS_EXPECTED); if( nRc != SUCCESS ) { break; } } } } } if( nRc == SUCCESS ) { //====================================================
// Go through the master list and see if there are
// any classes we expect to be there but we didn't
// get during the enumeration
//====================================================
nRc = MasterList.ClassesCompareAsExpectedAndLogErrors(wcsNamespace,NO_ERRORS_EXPECTED); } } return nRc; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int AddClasses(CAutoDeleteString & sAddClasses, IWbemServices * pNamespace, WCHAR * wcsNamespace) { int nRc = FATAL_ERROR;
ClassList MasterList;
//=======================================================
// Get the list of the classes to be deleted
//=======================================================
if( InitMasterListOfClasses(sAddClasses.GetPtr(),MasterList)) { for( int i = 0; i < MasterList.Size(); i++ ) { ClassInfo * pClass = MasterList.GetAt(i); CAutoDeleteString sClassDefinition;
if( g_Options.GetSpecificOptionForAPITest( pClass->Class, sClassDefinition,APITEST5)) { nRc = CreateClassAndLogErrors(pNamespace, pClass->Class, sClassDefinition.GetPtr(), wcsNamespace,NO_ERRORS_EXPECTED); if( nRc != SUCCESS ) { break; } } } } return nRc;
} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int DeleteAndAddClasses(CAutoDeleteString & sDeleteAddClasses, IWbemServices * pNamespace, WCHAR * wcsNamespace) { int nRc = FATAL_ERROR;
ClassList MasterList;
//=======================================================
// Get the list of the classes to be added & deleted
//=======================================================
if( InitMasterListOfAddDeleteClasses(sDeleteAddClasses.GetPtr(),MasterList)) {
for( int i = 0; i < MasterList.Size(); i++ ) { ClassInfo * pClass = MasterList.GetAt(i); if( pClass->fAction == DELETE_CLASS ) { nRc = DeleteClassAndLogErrors(pNamespace, pClass->Class, wcsNamespace,NO_ERRORS_EXPECTED); if( nRc != SUCCESS ) { break; } } else { ClassInfo * pClass = MasterList.GetAt(i); CAutoDeleteString sClassDefinition;
if( g_Options.GetSpecificOptionForAPITest( pClass->Class, sClassDefinition, APITEST5)) { nRc = CreateClassAndLogErrors(pNamespace, pClass->Class, sClassDefinition.GetPtr(), wcsNamespace,NO_ERRORS_EXPECTED); if( nRc != SUCCESS ) { break; } } } } } return nRc; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int GetSpecificObjects(CAutoDeleteString & sObjects, IWbemServices * pNamespace, WCHAR * wcsNamespace) { int nRc = FATAL_ERROR;
ClassList MasterList;
//=======================================================
// Get the list of the classes to be deleted
//=======================================================
if( InitMasterListOfClasses(sObjects.GetPtr(),MasterList)) { for( int i = 0; i < MasterList.Size(); i++ ) { ClassInfo * pClassInfo = MasterList.GetAt(i); IWbemClassObject * pClass = NULL;
nRc = GetClassObjectAndLogErrors(pNamespace, pClassInfo->Class, &pClass, wcsNamespace,NO_ERRORS_EXPECTED); if( nRc != SUCCESS ) { break; } SAFE_RELEASE_PTR(pClass); } } return nRc; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int CreateInstances(IWbemServices * pNamespace, CAutoDeleteString & sInstances, WCHAR * wcsNamespace, int nClassDefinitionSection ) {
int nRc = FATAL_ERROR;
ClassList MasterList;
//=======================================================
// Get the list of the instances to be created
//=======================================================
if( InitMasterListOfClasses(sInstances.GetPtr(),MasterList)) { IWbemClassObject * pClass = NULL; IWbemClassObject *pInst = NULL;
for( int i = 0; i < MasterList.Size(); i++ ) { CAutoDeleteString sClassInformation;
ClassInfo * pClassInfo = MasterList.GetAt(i);
if( g_Options.GetSpecificOptionForAPITest(pClassInfo->Class,sClassInformation,nClassDefinitionSection) ) { const WCHAR * wcsTmpParentClass = NULL; // nothing is allocated, so don't release
CPropertyList Properties; // destructor will release
//===========================================================
// Get the class definition
//===========================================================
nRc = CrackClass(sClassInformation.GetPtr(),wcsTmpParentClass, Properties, NO_ERRORS_EXPECTED); if( SUCCESS == nRc ) { //==============================================================
// Get the class definition
//==============================================================
nRc = GetClassObjectAndLogErrors(pNamespace,pClassInfo->Class,&pClass,wcsNamespace, NO_ERRORS_EXPECTED); if( SUCCESS != nRc ) { break; }
//==============================================================
// Spawn a new instance of this class.
//==============================================================
nRc = SpawnInstanceAndLogErrors(pClass,pClassInfo->Class,&pInst,wcsNamespace,NO_ERRORS_EXPECTED); if( SUCCESS != nRc ) { break; } //==========================================================
// Set the Properties
//==========================================================
DWORD dwFlags = 0; nRc = WritePropertiesAndQualifiers(pNamespace, pClass, Properties,pClassInfo->Class,dwFlags,wcsNamespace,NO_ERRORS_EXPECTED); if( SUCCESS != nRc ) { break; }
//==========================================================
// Create the new instance
//==========================================================
nRc = PutInstanceAndLogErrors(pNamespace, pInst,pClassInfo->Class,wcsNamespace,NO_ERRORS_EXPECTED); if( SUCCESS != nRc ) { break; } SAFE_RELEASE_PTR(pInst); SAFE_RELEASE_PTR(pClass); } } } SAFE_RELEASE_PTR(pInst); SAFE_RELEASE_PTR(pClass);
} return nRc; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int DeleteInstances(CAutoDeleteString & sDeleteInstances,IWbemServices * pNamespace, WCHAR * wcsNamespace) { int nRc = FATAL_ERROR;
ClassList MasterList;
//=======================================================
// Get the list of the instances to be deleted
//=======================================================
if( InitMasterListOfClasses(sDeleteInstances.GetPtr(),MasterList)) { for( int i = 0; i < MasterList.Size(); i++ ) { ClassInfo * pClass = MasterList.GetAt(i);
nRc = DeleteInstanceAndLogErrors(pNamespace, pClass->Class, wcsNamespace,NO_ERRORS_EXPECTED); if( nRc != SUCCESS ) { break; } } } return nRc; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int CreateAssociationAndLogErrors( IWbemServices * pNamespace, const WCHAR * wcsClass, WCHAR * wcsClassDefinition, WCHAR * wcsNamespace ) { IWbemClassObject *pClass = NULL; const WCHAR * wcsClass1 = NULL; // nothing is allocated, so don't release
const WCHAR * wcsClass2 = NULL; // nothing is allocated, so don't release
//===========================================================
// Get the association definition
//===========================================================
CPropertyList Props;
int nRc = CrackAssociation( wcsClassDefinition, Props, NO_ERRORS_EXPECTED); if( nRc == SUCCESS ) { // =================================================================
// Get an empty class object to work with
// =================================================================
nRc = GetClassObjectAndLogErrors(pNamespace, NULL, &pClass, wcsNamespace, NO_ERRORS_EXPECTED); if( nRc == SUCCESS ) { //==============================================================
// Write out the name of the association
//==============================================================
DWORD dwFlags = WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE | WBEM_FLAVOR_FLAG_PROPAGATE_TO_DERIVED_CLASS; CVARIANT v; v.SetStr((WCHAR*)wcsClass);
nRc = PutPropertyAndLogErrors( pClass, L"__CLASS",CIM_STRING, v, wcsClass, dwFlags, wcsNamespace, NO_ERRORS_EXPECTED); if( nRc == SUCCESS ) { //==========================================================
// Make the class an association
//==========================================================
CVARIANT Var; Var.SetBool(TRUE); nRc = PutQualifierOnClassAndLogErrors( pClass, L"Association",&Var, wcsClass,dwFlags, wcsNamespace, NO_ERRORS_EXPECTED); if( nRc == SUCCESS ) { //======================================================
// Now, create the association endpoints
//======================================================
nRc = WritePropertiesAndQualifiers(pNamespace, pClass, Props,wcsClass,dwFlags,wcsNamespace,NO_ERRORS_EXPECTED); if( SUCCESS == nRc ) { //==============================================================
// Now, create the association class
//==============================================================
nRc = PutClassAndLogErrors(pNamespace, pClass,wcsClass,wcsNamespace, NO_ERRORS_EXPECTED);
} } } } } SAFE_RELEASE_PTR(pClass); return nRc; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int QueryAndCompareResults( IWbemServices * pNamespace, WCHAR * wcsQuery, WCHAR * wcsNamespace ) { IEnumWbemClassObject * pEnum = NULL;
DWORD dwFlags = WBEM_FLAG_FORWARD_ONLY; int nRc = ExecQueryAndLogErrors( pNamespace,&pEnum, wcsQuery, dwFlags, wcsNamespace,NO_ERRORS_EXPECTED);
SAFE_RELEASE_PTR(pEnum); return nRc; }
|