CUSTOM.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:15k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //*---------------------------------------------------------------------------------
  2. //| Custom Auto Test DLL
  3. //|
  4. //| Title: CUSTOM.C
  5. //|
  6. //| Purpose:
  7. //| This sample Auto Test DLL shows how an ODBC auto test may be written and
  8. //| subsequently run via the ODBC Test application.  To use this DLL:
  9. //| 1) Compile the source code via the BUILD.EXE program
  10. //| CUSTOM.C This shource file with test code
  11. //| CUSTOM.H Include files with defines, macros, and prototypes
  12. //| CUSTOM.RC Resource file for string tables
  13. //| (Note that .H and .RC files are optional in for an Auto Test)
  14. //| 2) Start the ODBC Test application
  15. //| 3) If you have not done so, choose Tools, Manage Test Sources and define
  16. //| a test source to run against
  17. //| 4) Choose Tools, Manage Tests and add the CUSTOM.DLL created in step 1
  18. //| to the list of installed test DLLs
  19. //| 5) Choose Tools, Run Tests and select "Custom Auto Test" and your Test Source
  20. //| from step #3
  21. //| For more details, please see the SDK documentation.
  22. //*---------------------------------------------------------------------------------
  23. #include "autotest.h"
  24. #include "custom.h"
  25. //----------------------------------------------------------------------------------
  26. // Defines and macros
  27. //----------------------------------------------------------------------------------
  28. typedef SWORD (FAR PASCAL *TESTCASEFUNC)(HENV FAR *, HDBC FAR *, HSTMT FAR *, lpSERVERINFO);
  29. #define CHECKTEST(lps, exprc, actrc, func) 
  30. {                                                  
  31. if(!CheckTest(lps, exprc, actrc, (LPSTR)func))  
  32. return TEST_ABORTED;                         
  33. }
  34. #define CHECKERRS(sErr)
  35. if(!sErr) szLogPrintf(lpSrvr, FALSE, "ttPassedrnrn"); 
  36. else szLogPrintf(lpSrvr, FALSE, "tt%d errorsrnrn", sErr);
  37. //----------------------------------------------------------------------------------
  38. // Local function prototypes
  39. //----------------------------------------------------------------------------------
  40. SWORD FAR PASCAL DoHelloWorld(HENV FAR * phenv, HDBC FAR * phdbc,
  41. HSTMT FAR * phstmt, lpSERVERINFO lpSrvr);
  42. SWORD FAR PASCAL DoDisplayInfoDesc(HENV FAR * phenv, HDBC FAR * phdbc,
  43. HSTMT FAR * phstmt, lpSERVERINFO lpSrvr);
  44. SWORD FAR PASCAL DoSimpleConnect(HENV FAR * phenv, HDBC FAR * phdbc,
  45. HSTMT FAR * phstmt, lpSERVERINFO lpSrvr);
  46. BOOL FAR PASCAL CheckTest(lpSERVERINFO lps, RETCODE exprc, RETCODE actrc,
  47. LPSTR szFuncName);
  48. //
  49. // This structure is declared to describe the test cases and descriptions
  50. // that this auto test supports.  Note that the strings are stored in
  51. // the resource fork, but could have been hard coded.
  52. //
  53. struct {
  54. UINT uiName; // Test case name
  55. UINT uiDesc; // Test case description
  56. TESTCASEFUNC lpTestFunc; // Pointer to function to implement test
  57. } TestCases[] = {
  58. // szName szDesc lpTestFunc
  59. // -------------------- ----------------------- ------------------------
  60. idsHelloWorld, idsHelloWorldDesc, DoHelloWorld,
  61. idsDisplayInfo, idsDisplayInfoDesc, DoDisplayInfoDesc,
  62. idsSimpleConnect, idsSimpleConnectDesc, DoSimpleConnect,
  63. };
  64. //**************************************************************************
  65. //***************************  External Interfaces  ************************
  66. //*  These functions are called by ODBC Test to gather run-time information
  67. //**************************************************************************
  68. //*---------------------------------------------------------------------------------
  69. //| AutoTestName:
  70. //| This function is called to give the name of the auto test (which cannot
  71. //| exceed AUTO_MAX_TEST_NAME) as well as the number of test cases which
  72. //| are implemented in this test DLL.
  73. //| Parms:
  74. //| szName The name to be displayed
  75. //| pcbTestCases Pointer to count of test cases
  76. //| Returns:
  77. //| TRUE if successful (pcbTestCases set), FALSE for error
  78. //*---------------------------------------------------------------------------------
  79. BOOL EXTFUN AutoTestName(LPSTR szName, UINT FAR * pcbTestCases)
  80. {
  81. GetRCString(hLoadedInst, szName, AUTO_MAX_TEST_NAME, idsTestName);
  82. *pcbTestCases = NumItems(TestCases);
  83.    return TRUE;
  84. }
  85. //*---------------------------------------------------------------------------------
  86. //| AutoTestDesc:
  87. //| This function is called by ODBC Test when a description of a specific
  88. //| test case is required.  The returned name must be no larger than
  89. //| AUTO_MAX_TESTCASE_NAME including the NULL terminator.  The returned
  90. //| description must be no larger than AUTO_MAX_TESTDESC_NAME including the
  91. //| NULL.  iTest will be 1-based index of the test required.
  92. //|
  93. //| Note that iTest will start at 1 and will go to the number of
  94. //| test cases as specified by the AutoTestName function.
  95. //|
  96. //| Parms:
  97. //| iTest 1-based index of test case required
  98. //| szName The name of the test case
  99. //| szDesc A description of the test case
  100. //| Returns:
  101. //| TRUE if successful, FALSE for error
  102. //*---------------------------------------------------------------------------------
  103. BOOL EXTFUN AutoTestDesc(UWORD iTest, LPSTR szName, LPSTR szDesc)
  104. {
  105. // Extra protection should AutoTestName return invalid pcbTestCases
  106. if(iTest > NumItems(TestCases))
  107. return FALSE;
  108. // Use GetRCString to retrieve resource string directly into return
  109. // values
  110. GetRCString(hLoadedInst, szName, 
  111. AUTO_MAX_TESTCASE_NAME, TestCases[(iTest-1)].uiName);
  112. GetRCString(hLoadedInst, szDesc, 
  113. AUTO_MAX_TESTDESC_NAME, TestCases[(iTest-1)].uiDesc);
  114.    return TRUE;
  115. }
  116.  
  117.  
  118. //*---------------------------------------------------------------------------------
  119. //| AutoTestFunc:
  120. //| This function is called to execute a test case selected by the user for
  121. //| execution.  The lpSrvr structure contains the information required for
  122. //| connected (as defined in the chosen Test Source), as well as other
  123. //| usefull information.  See the AUTOTEST.H file for the structure
  124. //| declaration.
  125. //|
  126. //| Use the GETBIT macro to determine which test should be executed.
  127. //|
  128. //| Parms:
  129. //| lpSrvr Information required for running the test
  130. //| Returns:
  131. //| Nothing
  132. //*---------------------------------------------------------------------------------
  133. void EXTFUN AutoTestFunc(lpSERVERINFO lpSrvr)
  134. {
  135. HENV  henv=NULL;
  136. HDBC  hdbc=NULL;
  137. HSTMT  hstmt0=NULL;
  138. int iDex;
  139. SWORD cErrCnt; // Count errors
  140. char szName[AUTO_MAX_TESTCASE_NAME+6]; // Room for NULL and rn
  141. // Sets the error count to 0
  142. InitTest(lpSrvr);
  143. // Loop through the count of test cases looking for set bits via GETBIT.
  144. // When a bit is set, that test is to be run.  We've stored the
  145. // function address which will implement the test, so simply call it.
  146. for(iDex=1;  iDex<=NumItems(TestCases);  iDex++)
  147. if(GETBIT(lpSrvr->rglMask, iDex)) {
  148. // Print out title of test
  149. GetRCString(hLoadedInst, szName, 
  150. AUTO_MAX_TESTCASE_NAME, TestCases[(iDex-1)].uiName);
  151. szLogPrintf(lpSrvr, FALSE, "%s:rn", (LPSTR)szName);
  152. // Call the test case and add errors
  153. cErrCnt = 
  154. (*TestCases[(iDex-1)].lpTestFunc)(&henv, &hdbc, &hstmt0, lpSrvr);
  155. if(cErrCnt != TEST_ABORTED)
  156. lpSrvr->cErrors += cErrCnt;
  157. else
  158. goto abort;
  159. }
  160. return;
  161. // When a test must abort, the test case should call the AbortTest
  162. // macro which sets lpSrvr->cErrors to TEST_ABORTED.
  163. abort:
  164. return;
  165. }
  166.  
  167. //**************************************************************************
  168. //*****************************  Test Cases  *******************************
  169. //*  The following functions implement the tests
  170. //**************************************************************************
  171. //*---------------------------------------------------------------------------------
  172. //| DoHelloWord:
  173. //| This is a simple test which uses the szLogPrintf and szMessageBox
  174. //| functions defined in GATORTST.DLL.
  175. //|
  176. //| Note that this test also simulates an error by returning a count
  177. //| of 1.  This value is then totaled by ODBC Test and displayed as
  178. //| part of the grand total.
  179. //|
  180. //| Returns:
  181. //| Number of Errors or TEST_ABORTED
  182. //*---------------------------------------------------------------------------------
  183. SWORD FAR PASCAL DoHelloWorld(HENV FAR * phenv, HDBC FAR * phdbc,
  184. HSTMT FAR * phstmt, lpSERVERINFO lpSrvr)
  185. {
  186. SWORD sErr=1; // Pretend there was 1 error
  187. // The szMessageBox function will display a formatted message via the
  188. // Windows MessageBox function.  This function should not be used
  189. // for standard testing since a good test will run unattended.
  190. szMessageBox(lpSrvr->hwnd, 
  191. MB_ICONINFORMATION | MB_OK,
  192. "Hello World",
  193. "This is a sample message.");
  194. // The szLogPrintf function is preferred for output operations.  It will
  195. // format your string using wvsprintf (which has a limit of 2000 characters)
  196. // and log the result both to the output window and to a file per
  197. // user instructions.
  198. szLogPrintf(lpSrvr, FALSE, "tHello World!!rn");
  199. // check for errors
  200. CHECKERRS(sErr);
  201. return sErr;
  202. }
  203. //*---------------------------------------------------------------------------------
  204. //| DoDisplayInfoDesc:
  205. //| This test case will use the szLogPrintf function to dump the contents
  206. //| of the lpSrvr structure.
  207. //|
  208. //| Returns:
  209. //| Number of Errors or TEST_ABORTED
  210. //*---------------------------------------------------------------------------------
  211. SWORD FAR PASCAL DoDisplayInfoDesc(HENV FAR * phenv, HDBC FAR * phdbc,
  212. HSTMT FAR * phstmt, lpSERVERINFO lpSrvr)
  213. {
  214. SWORD sErr=0;
  215. #ifndef WIN32
  216. #define szAddress "%04X:%04Xrn"
  217. #else
  218. #define szAddress "%08Xrn"
  219. #endif
  220. // The hwnd parameter is the window of style "edit" which is used for output.
  221. // The szLogFile parameter is used for file logging of output.
  222. szLogPrintf(lpSrvr, FALSE,
  223. "thwnd:ttttttt%04Xrn", lpSrvr->hwnd);
  224. szLogPrintf(lpSrvr, FALSE,
  225. "tszLogFile:tttt%srn", (LPSTR)lpSrvr->szLogFile);
  226. // Print out address information.  Note that szAddress is conditionaly compiled
  227. // to handle 16 and 32-bit.  It will be concatenated to the format string
  228. // by the compiler to create a file platform correct string.
  229. szLogPrintf(lpSrvr, FALSE,
  230. "thenv:ttttttt" szAddress, 
  231. #ifndef WIN32
  232. HIWORD(lpSrvr->henv), LOWORD(lpSrvr->henv));
  233. #else
  234. lpSrvr->henv);
  235. #endif
  236. szLogPrintf(lpSrvr, FALSE,
  237. "thdbc:ttttttt" szAddress, 
  238. #ifndef WIN32
  239. HIWORD(lpSrvr->hdbc), LOWORD(lpSrvr->hdbc));
  240. #else
  241. lpSrvr->hdbc);
  242. #endif
  243. szLogPrintf(lpSrvr, FALSE,
  244. "thstmt:ttttttt" szAddress, 
  245. #ifndef WIN32
  246. HIWORD(lpSrvr->hstmt), LOWORD(lpSrvr->hstmt));
  247. #else
  248. lpSrvr->hstmt);
  249. #endif
  250. // The following are defined via the Tools, Manage Test Sources dialog in
  251. // the ODBC Test application.
  252. szLogPrintf(lpSrvr, FALSE,
  253. "tszSource:ttttt%srn", (LPSTR)lpSrvr->szSource);
  254. szLogPrintf(lpSrvr, FALSE,
  255. "tszValidServer0:tttttt%srn", (LPSTR)lpSrvr->szValidServer0);
  256. szLogPrintf(lpSrvr, FALSE,
  257. "tszValidLogin0:tttttt%srn", (LPSTR)lpSrvr->szValidLogin0);
  258. szLogPrintf(lpSrvr, FALSE,
  259. "tszValidPassword0:ttt%srn", (LPSTR)lpSrvr->szValidPassword0);
  260. szLogPrintf(lpSrvr, FALSE,
  261. "tszKeywords:ttt%srn", (LPSTR)lpSrvr->szKeywords);
  262. // The following elements describe the run-time environment
  263. szLogPrintf(lpSrvr, FALSE,
  264. "tcErrors:tttttt%drn", (LPSTR)lpSrvr->cErrors);
  265. szLogPrintf(lpSrvr, FALSE,
  266. "tfDebug:tttttt%drn", (LPSTR)lpSrvr->fDebug);
  267. szLogPrintf(lpSrvr, FALSE,
  268. "tfScreen:tttttt%drn", (LPSTR)lpSrvr->fScreen);
  269. szLogPrintf(lpSrvr, FALSE,
  270. "tfLog:tttttttt%drn", (LPSTR)lpSrvr->fLog);
  271. szLogPrintf(lpSrvr, FALSE,
  272. "tfIsolate:tttttt%drn", (LPSTR)lpSrvr->fIsolate);
  273. szLogPrintf(lpSrvr, FALSE,
  274. "tvCursorLib:tttt%lurn", (LPSTR)lpSrvr->vCursorLib);
  275. szLogPrintf(lpSrvr, FALSE,
  276. "thLoadedInst:ttt%04Xrn", (LPSTR)lpSrvr->hLoadedInst);
  277. // check for errors
  278. CHECKERRS(sErr);
  279. return sErr;
  280. }
  281. //*---------------------------------------------------------------------------------
  282. //| DoSimpleConnect:
  283. //| This test case will use the information in SERVERINFO to make a connection
  284. //| to the chosen test source.
  285. //|
  286. //| Returns:
  287. //| Number of Errors or TEST_ABORTED
  288. //*---------------------------------------------------------------------------------
  289. SWORD FAR PASCAL DoSimpleConnect(HENV FAR * phenv, HDBC FAR * phdbc,
  290. HSTMT FAR * phstmt, lpSERVERINFO lpSrvr)
  291. {
  292. RETCODE rc;
  293. SWORD sErr=0;
  294. // This test will assume that the ODBC handles passed in
  295. // are NULL.  One could have this function do a connection
  296. // and pass the handles to other test functions.
  297. rc = SQLAllocEnv(phenv);
  298. CHECKTEST(lpSrvr, SQL_SUCCESS, rc, "SQLAllocEnv");
  299. rc = SQLAllocConnect(*phenv, phdbc);
  300. CHECKTEST(lpSrvr, SQL_SUCCESS, rc, "SQLAllocConnect");
  301. rc = SQLConnect(*phdbc, lpSrvr->szValidServer0, SQL_NTS,
  302. lpSrvr->szValidLogin0, SQL_NTS,
  303. lpSrvr->szValidPassword0, SQL_NTS);
  304. CHECKTEST(lpSrvr,
  305. (RETCODE)((rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
  306. ? rc : SQL_SUCCESS),
  307. rc, "SQLConnect");
  308. rc = SQLAllocStmt(*phdbc, phstmt);
  309. CHECKTEST(lpSrvr, SQL_SUCCESS, rc, "SQLAllocStmt");
  310. rc = SQLFreeStmt(*phstmt, SQL_DROP);
  311. CHECKTEST(lpSrvr, SQL_SUCCESS, rc, "SQLFreeStmt");
  312. rc = SQLDisconnect(*phdbc);
  313. CHECKTEST(lpSrvr, SQL_SUCCESS, rc, "SQLDisconnect");
  314. rc = SQLFreeConnect(*phdbc);
  315. CHECKTEST(lpSrvr, SQL_SUCCESS, rc, "SQLFreeConnect");
  316. rc = SQLFreeEnv(*phenv);
  317. CHECKTEST(lpSrvr, SQL_SUCCESS, rc, "SQLFreeEnv");
  318. // check for errors
  319. CHECKERRS(sErr);
  320. return sErr;
  321. }
  322.  
  323.  
  324.  
  325. //**************************************************************************
  326. //*************************  Utility Functions  ****************************
  327. //*  This section contains internal utility functions
  328. //**************************************************************************
  329. //*---------------------------------------------------------------------------------
  330. //| CheckTest:
  331. //| This function will do a simple comparison of return codes and issue
  332. //| erros on failure.  Use the CHECKTEST macro to invoke.
  333. //|
  334. //| Returns:
  335. //| TRUE if the codes match, FALSE on error
  336. //*---------------------------------------------------------------------------------
  337. BOOL FAR PASCAL CheckTest(lpSERVERINFO lps, RETCODE exprc, RETCODE actrc,
  338. LPSTR szFuncName)
  339. {
  340. if(exprc != actrc) {
  341. szLogPrintf(lps, FALSE, "t%s failed:rn", (LPSTR)szFuncName);
  342. szLogPrintf(lps, FALSE, "ttExpected: %drn", exprc);
  343. szLogPrintf(lps, FALSE, "ttActual:   %drn", actrc);
  344. return FALSE;
  345. }
  346. else
  347. return TRUE;
  348. }