Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

529 lines
22 KiB

  1. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // BVTESS.CPP
  4. //
  5. //
  6. // Copyright (c)2000 Microsoft Corporation, All Rights Reserved
  7. //
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. #include <bvt.h>
  10. #include "bvtess.h"
  11. #include <initguid.h>
  12. #include <stdio.h>
  13. CCriticalSection g_EventCritSec;
  14. int g_fPermConsumerStarted = TRUE;
  15. #define NO_ERRORS_EXPECTED FALSE,__FILE__,__LINE__
  16. #define ERRORS_CAN_BE_EXPECTED TRUE,__FILE__,__LINE__
  17. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  18. int FireEvent(WCHAR * wcsEventInfo, int & nTotalExpected)
  19. {
  20. EventInfo Event;
  21. int nRc = CrackEvent(wcsEventInfo, Event, NO_ERRORS_EXPECTED);
  22. if( SUCCESS == nRc )
  23. {
  24. //=====================================================
  25. // Open up the requested namespace
  26. //=====================================================
  27. IWbemServices * pNamespace = NULL;
  28. nRc = OpenNamespaceAndKeepOpen( &pNamespace, Event.Namespace, FALSE, FALSE);
  29. if( nRc == SUCCESS )
  30. {
  31. //=====================================================
  32. // Run the requested tests
  33. //=====================================================
  34. nRc = RunTests(Event.Section,FALSE,TRUE);
  35. if( SUCCESS != nRc )
  36. {
  37. gp_LogFile->LogError(__FILE__,__LINE__,FATAL_ERROR, L"Firing Events for Permanent consumers in Namespace %s, not as expected.", Event.Namespace);
  38. }
  39. else
  40. {
  41. nTotalExpected += Event.Results;
  42. }
  43. }
  44. SAFE_RELEASE_PTR(pNamespace);
  45. }
  46. return nRc;
  47. }
  48. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. int TestSemiSyncEvent(WCHAR * wcsEventInfo, BOOL fCompareResults)
  50. {
  51. EventInfo Event;
  52. int nRc = CrackEvent(wcsEventInfo, Event, NO_ERRORS_EXPECTED);
  53. if( SUCCESS == nRc )
  54. {
  55. //=====================================================
  56. // Open up the requested namespace
  57. //=====================================================
  58. IWbemServices * pNamespace = NULL;
  59. nRc = OpenNamespaceAndKeepOpen( &pNamespace, Event.Namespace, FALSE,fCompareResults);
  60. if( nRc == SUCCESS )
  61. {
  62. //=====================================================
  63. // Set up the query first
  64. //=====================================================
  65. IEnumWbemClassObject * pEnum = NULL;
  66. IWbemContext * pCtx = NULL;
  67. nRc = ExecNotificationQueryAndLogErrors(pNamespace, &pEnum, Event.Query,
  68. Event.Language, WPTR Event.Namespace, pCtx, NO_ERRORS_EXPECTED);
  69. //=====================================================
  70. // Run the requested tests
  71. //=====================================================
  72. if( SUCCESS == nRc )
  73. {
  74. nRc = RunTests(Event.Section,fCompareResults,TRUE);
  75. if( SUCCESS == nRc )
  76. {
  77. nRc = CompareResultsFromEnumeration(pEnum, Event.Results, WPTR Event.Query, WPTR Event.Namespace);
  78. if( SUCCESS != nRc )
  79. {
  80. gp_LogFile->LogError(__FILE__,__LINE__,FATAL_ERROR, L"Semi-sync Events for query: %s, in Namespace %s, not as expected.", Event.Query, Event.Namespace);
  81. }
  82. }
  83. }
  84. SAFE_RELEASE_PTR(pEnum);
  85. }
  86. SAFE_RELEASE_PTR(pNamespace);
  87. }
  88. return nRc;
  89. }
  90. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  91. int TestAsyncEvent(WCHAR * wcsEventInfo, BOOL fCompareResults)
  92. {
  93. EventInfo Event;
  94. int nRc = CrackEvent(wcsEventInfo, Event, NO_ERRORS_EXPECTED);
  95. if( SUCCESS == nRc )
  96. {
  97. //=====================================================
  98. // Open up the requested namespace
  99. //=====================================================
  100. IWbemServices * pNamespace = NULL;
  101. nRc = OpenNamespaceAndKeepOpen( &pNamespace, Event.Namespace, FALSE,fCompareResults);
  102. if( nRc == SUCCESS )
  103. {
  104. //=====================================================
  105. // Set up the query first
  106. //=====================================================
  107. IWbemContext * pCtx = NULL;
  108. CSinkEx * pHandler = NULL;
  109. pHandler = new CSinkEx;
  110. if( pHandler )
  111. {
  112. nRc = ExecNotificationQueryAsyncAndLogErrors(pNamespace, pHandler, Event.Query,
  113. Event.Language, (WCHAR*)((const WCHAR*) Event.Namespace), pCtx, NO_ERRORS_EXPECTED);
  114. //=====================================================
  115. // Run the requested tests
  116. //=====================================================
  117. if( SUCCESS == nRc )
  118. {
  119. //=================================================
  120. // Wait for the signal, then run the tests, then
  121. // try 3 times to see if we got the event.
  122. //=================================================
  123. nRc = RunTests(Event.Section,fCompareResults,TRUE);
  124. if( SUCCESS == nRc )
  125. {
  126. HRESULT hr = WBEM_E_FAILED;
  127. for( int i=0; i < 3; i++ )
  128. {
  129. pHandler->WaitForSignal(1000);
  130. hr = pHandler->GetStatusCode();
  131. if(SUCCEEDED(hr))
  132. {
  133. break;
  134. }
  135. }
  136. //=============================================
  137. // We got the event
  138. //=============================================
  139. if( S_OK == hr )
  140. {
  141. if( pHandler->GetNumberOfObjectsReceived() != Event.Results )
  142. {
  143. gp_LogFile->LogError(__FILE__,__LINE__,FATAL_ERROR, L"Async Events for query: %s, in Namespace %s, not as expected.", Event.Query, Event.Namespace);
  144. }
  145. }
  146. //=============================================
  147. // We never received the event
  148. //=============================================
  149. else
  150. {
  151. 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 );
  152. }
  153. }
  154. }
  155. }
  156. //=====================================================
  157. // Cancel the async call, then if the return codes are
  158. // ok so far, and this one isn't replace it.
  159. //=====================================================
  160. int nTmp = CancelAsyncCallAndLogErrors(pNamespace, pHandler, Event.Query,
  161. Event.Language, (WCHAR*)((const WCHAR*)Event.Namespace), NO_ERRORS_EXPECTED );
  162. if( nRc == S_OK && nTmp != S_OK )
  163. {
  164. nRc = nTmp;
  165. }
  166. SAFE_RELEASE_PTR(pHandler);
  167. }
  168. SAFE_RELEASE_PTR(pNamespace);
  169. }
  170. return nRc;
  171. }
  172. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  173. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  174. //*****************************************************************************************************************
  175. // Test 300 : Temporary Semi Sync Events
  176. //*****************************************************************************************************************
  177. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  178. int TempSemiSyncEvents(BOOL fCompareResults, BOOL fSuppress)
  179. {
  180. int nRc = FATAL_ERROR;
  181. CHString sNamespace;
  182. IWbemServices * pNamespace = NULL;
  183. LogTestBeginning(300, fSuppress);
  184. // =====================================================================
  185. // Run the requested tests and get the namespace open
  186. // =====================================================================
  187. nRc = RunRequestedTestsAndOpenNamespace(300, sNamespace, &pNamespace, fCompareResults);
  188. if( SUCCESS == nRc )
  189. {
  190. //=========================================================
  191. // Get the types of tests to run
  192. //=========================================================
  193. CHString sEventList;
  194. if( g_Options.GetSpecificOptionForAPITest(L"EVENT_LIST",sEventList, 300))
  195. {
  196. ItemList MasterList;
  197. //=======================================================
  198. // Get the list of the events to test
  199. //=======================================================
  200. if( InitMasterList(sEventList,MasterList))
  201. {
  202. if( SUCCESS == nRc )
  203. {
  204. for( int i = 0; i < MasterList.Size(); i++ )
  205. {
  206. ItemInfo * p = MasterList.GetAt(i);
  207. CHString sEventInfo;
  208. //===========================================
  209. // Get the query information
  210. //===========================================
  211. if( g_Options.GetSpecificOptionForAPITest(WPTR p->Item,sEventInfo,300))
  212. {
  213. nRc = TestSemiSyncEvent(WPTR sEventInfo, fCompareResults);
  214. }
  215. }
  216. }
  217. }
  218. }
  219. }
  220. SAFE_RELEASE_PTR(pNamespace);
  221. LogTestEnding(300,nRc, fSuppress);
  222. return nRc;
  223. }
  224. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  225. //*****************************************************************************************************************
  226. // Test 301 : Temporary Async Events
  227. //*****************************************************************************************************************
  228. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  229. int TempAsyncEvents(BOOL fCompareResults,BOOL fSuppress)
  230. {
  231. int nRc = FATAL_ERROR;
  232. CHString sNamespace;
  233. IWbemServices * pNamespace = NULL;
  234. LogTestBeginning(301, fSuppress);
  235. // =====================================================================
  236. // Run the requested tests and get the namespace open
  237. // =====================================================================
  238. nRc = RunRequestedTestsAndOpenNamespace(301, sNamespace, &pNamespace, fCompareResults);
  239. if( SUCCESS == nRc )
  240. {
  241. //=========================================================
  242. // Get the types of tests to run
  243. //=========================================================
  244. CHString sEventList;
  245. if( g_Options.GetSpecificOptionForAPITest(L"EVENT_LIST",sEventList, 301))
  246. {
  247. ItemList MasterList;
  248. //=======================================================
  249. // Get the list of the events to test
  250. //=======================================================
  251. if( InitMasterList(sEventList,MasterList))
  252. {
  253. if( SUCCESS == nRc )
  254. {
  255. for( int i = 0; i < MasterList.Size(); i++ )
  256. {
  257. ItemInfo * p = MasterList.GetAt(i);
  258. CHString sEventInfo;
  259. //===========================================
  260. // Get the query information
  261. //===========================================
  262. if( g_Options.GetSpecificOptionForAPITest( (WCHAR*)((const WCHAR*)p->Item),sEventInfo,300))
  263. {
  264. nRc = TestAsyncEvent( (WCHAR*)((const WCHAR*)sEventInfo), fCompareResults);
  265. }
  266. }
  267. }
  268. }
  269. }
  270. }
  271. SAFE_RELEASE_PTR(pNamespace);
  272. LogTestEnding(301,nRc, fSuppress);
  273. return nRc;
  274. }
  275. //************************************************************************************
  276. //
  277. // Test302:
  278. //
  279. //************************************************************************************
  280. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  281. int CompareExpectedResultsForPermanentEvents(DWORD dwTotalEventsExpected, WCHAR * sOutputLocation, int nRetry, int nSleep )
  282. {
  283. int nRc = FATAL_ERROR;
  284. DWORD dwNumber = 0;
  285. for( int i=0; i < nRetry; i++ )
  286. {
  287. Sleep(nSleep);
  288. //==========================
  289. // Get it from the registry
  290. //==========================
  291. HKEY hKey;
  292. if( ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE,L"SOFTWARE\\BVT", &hKey))
  293. {
  294. DWORD dwType = 0;
  295. DWORD dwSize = sizeof(DWORD);
  296. RegQueryValueEx( hKey, L"PermEvents", 0, &dwType,(LPBYTE) &dwNumber, &dwSize);
  297. DWORD dwNum = 0;
  298. RegSetValueEx( hKey, L"PermEvents", 0, REG_DWORD,(LPBYTE) &dwNum, sizeof(REG_DWORD));
  299. RegCloseKey(hKey);
  300. break;
  301. }
  302. }
  303. if( nRc == FATAL_ERROR )
  304. {
  305. if( dwNumber != dwTotalEventsExpected )
  306. {
  307. gp_LogFile->LogError(__FILE__,__LINE__,FATAL_ERROR, L"Results for Permanent Event Consumer not as expected. Expected %ld, received %ld", dwTotalEventsExpected, dwNumber );
  308. }
  309. else
  310. {
  311. nRc = SUCCESS;
  312. }
  313. }
  314. return nRc;
  315. }
  316. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  317. int SpawnOffPermEventConsumer( )
  318. {
  319. int nRc = FATAL_ERROR;
  320. STARTUPINFO si;
  321. PROCESS_INFORMATION pi;
  322. ZeroMemory(&si,sizeof(si));
  323. si.cb=sizeof(si);
  324. CHString sReg;
  325. if( g_Options.GetSpecificOptionForAPITest(L"REGISTER_PERM_EVENT_CONSUMER",sReg, 302))
  326. {
  327. WCHAR wcsDir[MAX_PATH*2];
  328. DWORD dw = GetCurrentDirectory(MAX_PATH,wcsDir);
  329. wcscat( wcsDir, L"\\");
  330. wcscat( wcsDir, WPTR sReg );
  331. if( CreateProcess(wcsDir,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&si,&pi))
  332. {
  333. g_fPermConsumerStarted = TRUE;
  334. nRc = SUCCESS;
  335. }
  336. }
  337. return nRc;
  338. }
  339. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  340. int PermanentEvents(BOOL fCompareResults, BOOL fSuppress)
  341. {
  342. int nRc = FATAL_ERROR;
  343. CHString sNamespace;
  344. IWbemServices * pNamespace = NULL;
  345. LogTestBeginning(302,fSuppress);
  346. CAutoBlock Block(&g_EventCritSec);
  347. // =====================================================================
  348. // Run the requested tests and get the namespace open
  349. // =====================================================================
  350. nRc = RunRequestedTestsAndOpenNamespace(302, sNamespace, &pNamespace, fCompareResults);
  351. if( SUCCESS == nRc )
  352. {
  353. //=========================================================
  354. // Get the mofs to run
  355. //=========================================================
  356. CHString sMOF;
  357. if( g_Options.GetSpecificOptionForAPITest(L"MOF_COMMAND",sMOF, 302))
  358. {
  359. HRESULT hr = _wsystem(WPTR sMOF);
  360. if( !g_fPermConsumerStarted )
  361. {
  362. nRc = SpawnOffPermEventConsumer();
  363. }
  364. if( SUCCESS == nRc )
  365. {
  366. //=========================================================
  367. // Now, fire the events
  368. //=========================================================
  369. CHString sEventList;
  370. if( g_Options.GetSpecificOptionForAPITest(L"FIRE_EVENTS",sEventList, 302))
  371. {
  372. ItemList MasterList;
  373. int nTotalEventsExpected = 0;
  374. //=======================================================
  375. // Get the list of the events to test
  376. //=======================================================
  377. if( InitMasterList(sEventList,MasterList))
  378. {
  379. if( SUCCESS == nRc )
  380. {
  381. for( int i = 0; i < MasterList.Size(); i++ )
  382. {
  383. ItemInfo * p = MasterList.GetAt(i);
  384. CHString sEventInfo;
  385. //===========================================
  386. // Get the query information
  387. //===========================================
  388. if( g_Options.GetSpecificOptionForAPITest(p->Item,sEventInfo,302))
  389. {
  390. nRc = FireEvent(WPTR sEventInfo, nTotalEventsExpected );
  391. }
  392. }
  393. }
  394. }
  395. //=======================================================
  396. // See if we got what we expected
  397. //=======================================================
  398. if( fCompareResults )
  399. {
  400. CHString sFileLocation;
  401. if(g_Options.GetSpecificOptionForAPITest(L"PERM_EVENT_OUTPUT_FILE",sFileLocation, 302))
  402. {
  403. CHString sRetry;
  404. if(g_Options.GetSpecificOptionForAPITest(L"RETRY",sRetry, 302))
  405. {
  406. CHString sSleep;
  407. if(g_Options.GetSpecificOptionForAPITest(L"SLEEP_IN_MILLISECONDS",sSleep, 302))
  408. {
  409. nRc = CompareExpectedResultsForPermanentEvents(nTotalEventsExpected, WPTR sFileLocation, _wtoi(WPTR sRetry), _wtoi(WPTR sSleep));
  410. }
  411. }
  412. }
  413. }
  414. }
  415. }
  416. }
  417. }
  418. SAFE_RELEASE_PTR(pNamespace);
  419. LogTestEnding(302,nRc, fSuppress);
  420. return nRc;
  421. }
  422. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  423. //*****************************************************************************************************************
  424. // Test 303
  425. //*****************************************************************************************************************
  426. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  427. int PermanentInstances(BOOL fCompareResults, BOOL fSuppressHeader )
  428. {
  429. int nRc = FATAL_ERROR;
  430. CHString sNamespace;
  431. IWbemServices * pNamespace = NULL;
  432. LogTestBeginning(303,fSuppressHeader);
  433. // =====================================================================
  434. // Run the requested tests and get then namespace open
  435. // =====================================================================
  436. nRc = RunRequestedTestsAndOpenNamespace(303, sNamespace, &pNamespace, fCompareResults);
  437. if( SUCCESS == nRc )
  438. {
  439. nRc = CreateInstancesForSpecificTest(pNamespace, WPTR sNamespace,L"INSTANCE_LIST",303,TRUE);
  440. }
  441. // =====================================================================
  442. // Release the pointers
  443. // =====================================================================
  444. SAFE_RELEASE_PTR(pNamespace);
  445. LogTestEnding(303,nRc,fSuppressHeader);
  446. return nRc;
  447. }
  448. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  449. //*****************************************************************************************************************
  450. // Test 304
  451. //*****************************************************************************************************************
  452. int PermanentClasses(BOOL fCompareResults, BOOL fSuppressHeader )
  453. {
  454. int nRc = FATAL_ERROR;
  455. CHString sNamespace;
  456. IWbemServices * pNamespace = NULL;
  457. LogTestBeginning(304,fSuppressHeader);
  458. // =====================================================================
  459. // Run the requested tests and get then namespace open
  460. // =====================================================================
  461. nRc = RunRequestedTestsAndOpenNamespace(304, sNamespace, &pNamespace, fCompareResults);
  462. if( SUCCESS == nRc )
  463. {
  464. //=========================================================
  465. // Create classes with different properties. Some of
  466. // these should be in the following inheritance chain and
  467. // some should not inherit from the others at all:
  468. // classes = {A, B, C, D:A, E:A, F:E, G:F, H:G, I:F}.
  469. // A mix of simple string & sint32 keys are fine.
  470. //=========================================================
  471. nRc = CreateClassesForSpecificTest(pNamespace, WPTR sNamespace,L"CLASSES",304);
  472. }
  473. // =====================================================================
  474. // Release the pointers
  475. // =====================================================================
  476. SAFE_RELEASE_PTR(pNamespace);
  477. LogTestEnding(304,nRc,fSuppressHeader);
  478. return nRc;
  479. }