Leaked source code of windows server 2003
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.

387 lines
9.5 KiB

  1. //+-------------------------------------------------------------------
  2. // Microsoft OLE
  3. // Copyright (C) Microsoft Corporation, 1994-1995.
  4. //
  5. // File: cmdutest.cxx
  6. //
  7. // Contents: Unit test for the CDebugHelp class implementation.
  8. // Utilizes functions in arghelp.cxx and the CRegistryHelp
  9. // class.
  10. //
  11. // Classes: None
  12. //
  13. // History: 28-Nov-94 DeanE Created
  14. //---------------------------------------------------------------------
  15. #include <oleworld.hxx>
  16. // Declare the CDebugHelp object
  17. DH_DECLARE;
  18. // Local Functions
  19. HRESULT SettingsTest(VOID);
  20. HRESULT TraceTest(VOID);
  21. HRESULT LogTest(VOID);
  22. HRESULT AssertTest(VOID);
  23. // Test TRACE level flags
  24. #define DH_UTEST_LVL1 0x00001000
  25. #define DH_UTEST_LVL2 0x08000000
  26. // Results macros
  27. #define TESTFAIL(msg) \
  28. printf("FAIL: %s, %ul - %s\n", __FILE__, __LINE__, msg)
  29. #define TESTPASS(msg) \
  30. printf("PASS: %s\n", msg)
  31. // Define the CDebugHelp object
  32. DH_DEFINE;
  33. //+---------------------------------------------------------------------
  34. // Function: main
  35. //
  36. // Synopsis: Command line test utilizing a CDebugHelp object.
  37. // Excercises Trace Location, Log Location, Trace Level,
  38. // Trace and Log output, and Assert functionality. Uses
  39. // a log created via DH_CREATELOGARGS.
  40. //
  41. // Arguments: [argc] - Number of command line arguments.
  42. // [argv] - Command line arguments.
  43. //
  44. // Returns: Zero if no errors, otherwise non-zero
  45. //
  46. // History: 28-Nov-94 DeanE Created
  47. //----------------------------------------------------------------------
  48. int _cdecl main(int argc, char *argv[])
  49. {
  50. HRESULT hr;
  51. // First, create a log
  52. hr = DH_CREATELOGARGS(argc, argv);
  53. if (FAILED(hr))
  54. {
  55. printf("Log creation failed - %lx\n", hr);
  56. return(1);
  57. }
  58. // Set & retrieve settings
  59. hr = SettingsTest();
  60. if (SUCCEEDED(hr))
  61. {
  62. TESTPASS("Debug settings");
  63. }
  64. else
  65. {
  66. TESTFAIL("Debug settings");
  67. return(1);
  68. }
  69. // Trace output macro tests
  70. hr = TraceTest();
  71. if (SUCCEEDED(hr))
  72. {
  73. TESTPASS("Trace Output");
  74. }
  75. else
  76. {
  77. TESTFAIL("Trace Output");
  78. return(1);
  79. }
  80. // Logging output macro tests
  81. hr = LogTest();
  82. if (SUCCEEDED(hr))
  83. {
  84. TESTPASS("Log Output");
  85. }
  86. else
  87. {
  88. TESTFAIL("Log Output");
  89. return(1);
  90. }
  91. // Assert tests
  92. hr = AssertTest();
  93. if (SUCCEEDED(hr))
  94. {
  95. TESTPASS("Assert Test");
  96. }
  97. else
  98. {
  99. TESTFAIL("Assert Test");
  100. return(1);
  101. }
  102. return(0);
  103. }
  104. //+---------------------------------------------------------------------
  105. // Function: SettingsTest
  106. //
  107. // Synopsis: Sets and checks (by retrieving) values in the
  108. // global CDebugHelp object. Assumes a log has been
  109. // created.
  110. //
  111. // Arguments: None.
  112. //
  113. // Returns: S_OK if test passes, error code if not.
  114. //
  115. // History: 28-Nov-94 DeanE Created
  116. //----------------------------------------------------------------------
  117. HRESULT SettingsTest()
  118. {
  119. HRESULT hr;
  120. DWORD fValues;
  121. // Set and check Trace Location
  122. // Set a valid setting - should succeed
  123. //
  124. hr = DH_SETTRACELOC(DH_LOC_STDOUT);
  125. if (SUCCEEDED(hr))
  126. {
  127. fValues = DH_GETTRACELOC;
  128. hr = (fValues & DH_LOC_STDOUT) ? S_OK : E_FAIL;
  129. }
  130. if (FAILED(hr))
  131. {
  132. TESTFAIL("DH_SETTRACELOC test - valid setting");
  133. }
  134. // Set an invalid setting - should fail
  135. if (SUCCEEDED(hr))
  136. {
  137. hr = DH_SETTRACELOC(DH_LOC_NONE);
  138. if (FAILED(hr))
  139. {
  140. hr = S_OK;
  141. }
  142. }
  143. if (FAILED(hr))
  144. {
  145. TESTFAIL("DH_SETTRACELOC test - invalid setting");
  146. return(hr);
  147. }
  148. // Set and check Log Location
  149. // Set a valid setting - should succeed
  150. //
  151. hr = DH_SETLOGLOC(DH_LOC_STDOUT|DH_LOC_LOG);
  152. if (SUCCEEDED(hr))
  153. {
  154. fValues = DH_GETLOGLOC;
  155. hr = (fValues & DH_LOC_STDOUT) &&
  156. (fValues & DH_LOC_LOG) ? S_OK : E_FAIL;
  157. }
  158. if (FAILED(hr))
  159. {
  160. TESTFAIL("DH_SETLOGLOC test - valid setting");
  161. }
  162. // Set an invalid setting - should fail
  163. if (SUCCEEDED(hr))
  164. {
  165. hr = DH_SETLOGLOC(DH_LOC_NONE);
  166. if (FAILED(hr))
  167. {
  168. hr = S_OK;
  169. }
  170. }
  171. if (FAILED(hr))
  172. {
  173. TESTFAIL("DH_SETLOGLOC test - invalid setting");
  174. return(hr);
  175. }
  176. // Set and check Trace Level
  177. // Set a valid level - should succeed
  178. //
  179. hr = DH_SETLVL(DH_UTEST_LVL1|DH_LVL_TRACE1);
  180. if (SUCCEEDED(hr))
  181. {
  182. fValues = DH_GETTRACELVL;
  183. hr = (fValues & DH_UTEST_LVL1) &&
  184. (fValues & DH_LVL_TRACE1) ? S_OK : E_FAIL;
  185. }
  186. if (FAILED(hr))
  187. {
  188. TESTFAIL("DH_SETLVL test - valid setting");
  189. }
  190. // Try to turn one of the reserved settings off - should fail
  191. if (SUCCEEDED(hr))
  192. {
  193. hr = DH_SETLVL(DH_GETTRACELVL&~DH_LVL_ERROR);
  194. if (SUCCEEDED(hr))
  195. {
  196. fValues = DH_GETTRACELVL;
  197. hr = (fValues & DH_LVL_ERROR) ? S_OK : E_FAIL;
  198. }
  199. }
  200. if (FAILED(hr))
  201. {
  202. TESTFAIL("DH_SETLVL - turn reserved off");
  203. }
  204. return(hr);
  205. }
  206. //+---------------------------------------------------------------------
  207. // Function: TraceTest
  208. //
  209. // Synopsis: Tests TRACE macro outputs of the global CDebugHelp object.
  210. //
  211. // Arguments: None.
  212. //
  213. // Returns: S_OK if test passes, error code if not.
  214. //
  215. // History: 28-Nov-94 DeanE Created
  216. //----------------------------------------------------------------------
  217. HRESULT TraceTest()
  218. {
  219. HRESULT hr;
  220. // Set the Trace Location to STDOUT and the debug terminal so we
  221. // can see messages
  222. //
  223. hr = DH_SETTRACELOC(DH_LOC_STDOUT|DH_LOC_TERM);
  224. if (FAILED(hr))
  225. {
  226. TESTFAIL("Cannot set test trace location");
  227. return(hr);
  228. }
  229. printf("Six messages should appear\n");
  230. // Set a level that should NOT produce a message...
  231. hr = DH_SETLVL(DH_UTEST_LVL2);
  232. if (FAILED(hr))
  233. {
  234. TESTFAIL("Failure setting test trace level");
  235. return(hr);
  236. }
  237. // Output a message at a level NOT set
  238. DH_TRACE((DH_UTEST_LVL1, TEXT("ERROR! Message should not appear!")));
  239. // Output simple messages that should appear
  240. DH_TRACE((DH_LVL_ALWAYS, TEXT("Sample ALWAYS message")));
  241. DH_TRACE((DH_LVL_ERROR, TEXT("Sample ERROR message")));
  242. DH_TRACE((DH_UTEST_LVL2, TEXT("Sample USER-DEFINED message")));
  243. // Output complex messages
  244. DH_TRACE((DH_LVL_ALWAYS,
  245. TEXT("ALWAYS - Expansion File: %s, Line: %lu"),
  246. TEXT(__FILE__),
  247. __LINE__));
  248. // Output messages with multiple levels set
  249. hr = DH_SETLVL(DH_UTEST_LVL2 | DH_UTEST_LVL1);
  250. if (FAILED(hr))
  251. {
  252. TESTFAIL("Failure setting multiple trace levels");
  253. return(hr);
  254. }
  255. DH_TRACE((DH_UTEST_LVL1,
  256. TEXT("Sample MULTI-USER-DEFINED message value: %lx"),
  257. DH_UTEST_LVL1));
  258. DH_TRACE((DH_UTEST_LVL2,
  259. TEXT("Sample MULTI-USER-DEFINED message value: %lx"),
  260. DH_UTEST_LVL2));
  261. DH_TRACE((DH_LVL_TRACE4,
  262. TEXT("ERROR! Message TRACE4 should not appear!")));
  263. return(hr);
  264. }
  265. //+---------------------------------------------------------------------
  266. // Function: LogTest
  267. //
  268. // Synopsis: Tests LOG macro outputs of the global CDebugHelp object.
  269. //
  270. // Arguments: None.
  271. //
  272. // Returns: S_OK if test passes, error code if not.
  273. //
  274. // History: 28-Nov-94 DeanE Created
  275. //----------------------------------------------------------------------
  276. HRESULT LogTest()
  277. {
  278. HRESULT hr;
  279. // Set the Log Location to STDOUT, the log, and the debug
  280. // terminal so we can see messages
  281. //
  282. hr = DH_SETLOGLOC(DH_LOC_STDOUT|DH_LOC_TERM|DH_LOC_LOG);
  283. if (FAILED(hr))
  284. {
  285. TESTFAIL("Cannot set test log location");
  286. return(hr);
  287. }
  288. // Report a simple PASS, complex FAIL, and statistics
  289. DH_LOG((LOG_PASS, TEXT("Simple sample PASS")));
  290. DH_LOG((LOG_FAIL,
  291. TEXT("Complex sample FAIL %s, %lu"),
  292. TEXT(__FILE__),
  293. __LINE__));
  294. printf("Correct totals: 1 PASS, 1 FAIL, 0 ABORT\n");
  295. DH_LOGSTATS;
  296. return(hr);
  297. }
  298. //+---------------------------------------------------------------------
  299. // Function: AssertTest
  300. //
  301. // Synopsis: Tests ASSERT macro outputs of the global CDebugHelp object.
  302. //
  303. // Arguments: None.
  304. //
  305. // Returns: S_OK if test passes, error code if not.
  306. //
  307. // History: 28-Nov-94 DeanE Created
  308. //----------------------------------------------------------------------
  309. HRESULT AssertTest()
  310. {
  311. #pragma warning(disable: 4127) // Examined and ignored
  312. // Set Lab Mode to ON - we should NOT get any popups
  313. DH_SETMODE(DH_LABMODE_ON);
  314. // Trigger an assert
  315. DH_ASSERT(!"LABMODE ON - NO POPUP SHOULD APPEAR");
  316. // Set Lab Mode to ON - we should get popups
  317. DH_SETMODE(DH_LABMODE_OFF);
  318. // This assert should NOT trigger
  319. DH_ASSERT(5 < 6);
  320. // Set Lab Mode to OFF - we should get a popup
  321. DH_ASSERT(!"LABMODE OFF - POPUP SHOULD APPEAR");
  322. #pragma warning(default: 4127) // Examined and ignored
  323. return(S_OK);
  324. }
  325.