tctestsql.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. unit tctestsql;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry, testu, dbtests, tresults, sqldb, pqconnection;
  6. const
  7. Bools : Array[Boolean] of string = ('f','t');
  8. type
  9. { TTestSQLCase }
  10. TTestSQLCase= class(TTestCase)
  11. const
  12. SQLTestResultFilter = '(TR_ID=%d) and (TR_TESTRUN_FK=%d) and (TR_TEST_FK=%d) and (TR_OK=''%s'') and (TR_SKIP=''%s'') and (TR_RESULT=%d) and (TR_LOG=''%s'')';
  13. private
  14. procedure AssertTestRunData(aQry: TSQLQuery; aData: TTestRunData);
  15. function CreateResultData(out aData: TTestRunData; out aResult: TTestResultData; DateOffset: Integer = 0): Int64;
  16. procedure DeleteSource(const aFileName: String);
  17. function GetSQL: TTestSQL;
  18. function PreparePlatform(var aData: TTestRunData): Integer;
  19. protected
  20. procedure SetUp; override;
  21. procedure TearDown; override;
  22. procedure CreateSource(const aFileName : String);
  23. property SQL : TTestSQL Read GetSQL;
  24. published
  25. procedure TestHookUp;
  26. procedure TestAddCPU;
  27. procedure TestAddOS;
  28. procedure TestAddVersion;
  29. procedure TestAddCategory;
  30. procedure TestAddTest;
  31. procedure TestAddPlatform;
  32. Procedure TestAddRun;
  33. procedure TestUpdateRun;
  34. Procedure TestAddTestResult;
  35. Procedure TestAddTestResultTwice;
  36. Procedure TestUpdateTestResult;
  37. Procedure TestAddLastResult;
  38. Procedure TestAddLastResultTwice;
  39. Procedure TestGetLastTestResult;
  40. procedure TestGetCPUID;
  41. procedure TestGetOSID;
  42. procedure TestGetCategoryID;
  43. procedure TestGetVersionID;
  44. procedure TestGetTestID;
  45. procedure TestGetRunID;
  46. end;
  47. implementation
  48. uses tcsetup;
  49. procedure TTestSQLCase.TestHookUp;
  50. begin
  51. AssertEquals('Empty testos',0,TDBHelper.CountRecords('TESTOS'));
  52. AssertEquals('Empty TESTCPU',0,TDBHelper.CountRecords('TESTCPU'));
  53. AssertEquals('Empty TESTCATEGORY',0,TDBHelper.CountRecords('TESTCATEGORY'));
  54. AssertEquals('Empty TESTVERSION',0,TDBHelper.CountRecords('TESTVERSION'));
  55. AssertEquals('Empty TESTPLATFORM',0,TDBHelper.CountRecords('TESTPLATFORM'));
  56. AssertEquals('Empty TESTRUN',0,TDBHelper.CountRecords('TESTRUN'));
  57. AssertEquals('Empty TESTS',0,TDBHelper.CountRecords('TESTS'));
  58. AssertEquals('Empty TESTRESULTS',0,TDBHelper.CountRecords('TESTRESULTS'));
  59. AssertEquals('Empty TESTLASTRESULTS',0,TDBHelper.CountRecords('TESTLASTRESULTS'));
  60. AssertEquals('Empty TESTPREVIOUSRESULTS',0,TDBHelper.CountRecords('TESTPREVIOUSRESULTS'));
  61. end;
  62. procedure TTestSQLCase.TestAddCPU;
  63. var
  64. lID : Int64;
  65. begin
  66. lID:=SQL.AddCPU('x');
  67. AssertEquals('exists',1,TDBHelper.CountRecords('TESTCPU',Format('(TC_ID=%d) and (tc_name=''x'')',[lID])));
  68. end;
  69. procedure TTestSQLCase.TestAddOS;
  70. var
  71. lID : Int64;
  72. begin
  73. lID:=SQL.AddOS('x');
  74. AssertEquals('exists',1,TDBHelper.CountRecords('TESTOS',Format('(TO_ID=%d) and (to_name=''x'')',[lID])));
  75. end;
  76. procedure TTestSQLCase.TestAddVersion;
  77. var
  78. lID : Int64;
  79. begin
  80. lID:=SQL.AddVersion('x',date);
  81. AssertEquals('exists',1,TDBHelper.CountRecords('TESTVERSION',Format('(Tv_ID=%d) and (tv_version=''x'')',[lID])));
  82. end;
  83. procedure TTestSQLCase.TestAddCategory;
  84. var
  85. lID : Int64;
  86. begin
  87. lID:=SQL.AddCategory('x');
  88. AssertEquals('exists',1,TDBHelper.CountRecords('TESTCATEGORY',Format('(TA_ID=%d) and (ta_name=''x'')',[lID])));
  89. end;
  90. procedure TTestSQLCase.TestAddTest;
  91. var
  92. lID : Integer;
  93. begin
  94. CreateSource('x');
  95. lID:=SQL.AddTest('x.pp',False);
  96. AssertEquals('exists',1,TDBHelper.CountRecords('TESTS',Format('(T_ID=%d) and (t_name=''x.pp'')',[lID])));
  97. end;
  98. function TTestSQLCase.PreparePlatform(var aData : TTestRunData) : Integer;
  99. begin
  100. aData.CategoryID:=SQL.GetCategoryID('x');
  101. if aData.CategoryID=-1 then
  102. aData.CategoryID:=SQL.AddCategory('x');
  103. aData.OSID:=SQL.GetOSID('y');
  104. if aData.OSID=-1 then
  105. aData.OSID:=SQL.AddOS('y');
  106. aData.CPUID:=SQL.GetCPUID('z');
  107. if aData.CPUID=-1 then
  108. aData.CPUID:=SQL.AddCPU('z');
  109. aData.VersionID:=SQL.GetVersionID('w');
  110. if aData.VersionID=-1 then
  111. aData.VersionID:=SQL.AddVersion('w',Date);
  112. aData.config:='v';
  113. Result:=SQL.GetPlatformID(aData,False);
  114. if Result=-1 then
  115. Result:=SQL.AddPlatform(aData);
  116. end;
  117. procedure TTestSQLCase.TestAddPlatform;
  118. const
  119. SQLFilter = '(TP_ID=%d) and (TP_OS_FK=%d) and (TP_CPU_FK=%d) '+
  120. 'and (TP_VERSION_FK=%d) and (TP_CONFIG=''%s'')';
  121. var
  122. lData : TTestRunData;
  123. lID : integer;
  124. Flt : String;
  125. begin
  126. lData:=Default(TTestRunData);
  127. lID:=PreparePlatform(lData);
  128. With lData do
  129. flt:=Format(SQLFilter,[lID,OSID,CPUID,VersionID,Config]);
  130. AssertEquals('Platform',1,TDBHelper.CountRecords('TESTPLATFORM',Flt));
  131. end;
  132. procedure TTestSQLCase.AssertTestRunData(aQry : TSQLQuery; aData : TTestRunData);
  133. var
  134. St : TTestStatus;
  135. begin
  136. With aQry,aData do
  137. begin
  138. AssertEquals('Date',DATE,FieldByName('TU_DATE').AsDateTime);
  139. AssertEquals('Platform',PlatformID,FieldByName('TU_PLATFORM_FK').AsInteger);
  140. AssertEquals('Machine',Machine,FieldByName('TU_MACHINE').AsString);
  141. AssertEquals('Submitter',Submitter,FieldByName('TU_SUBMITTER').AsString);
  142. For St in TTestStatus do
  143. AssertEquals(StatusText[St],StatusCount[st],FieldByName(SQLField[ST]).AsInteger);
  144. AssertEquals('CompilerDate',CompilerDate,FieldByName('TU_COMPILERDATE').AsString);
  145. AssertEquals('CompilerFullVersion',CompilerFullVersion,FieldByName('TU_COMPILERFULLVERSION').AsString);
  146. AssertEquals('CompilerRevision',CompilerRevision,FieldByName('TU_COMPILERREVISION').AsString);
  147. AssertEquals('TestsRevision',TestsRevision,FieldByName('TU_TESTSREVISION').AsString);
  148. AssertEquals('RTLRevision',RTLRevision,FieldByName('TU_RTLREVISION').AsString);
  149. AssertEquals('PackagesRevision',PackagesRevision,FieldByName('TU_PACKAGESREVISION').AsString);
  150. end;
  151. end;
  152. procedure TTestSQLCase.TestAddRun;
  153. var
  154. lData : TTestRunData;
  155. lID : Int64;
  156. Qry : TSQLQuery;
  157. begin
  158. lData:=Default(TTestRunData);
  159. lData.PlatformID:=PreparePlatform(lData);
  160. With lData do
  161. begin
  162. machine:='a';
  163. submitter:='b';
  164. description:='c';
  165. Date:=Sysutils.Date;
  166. CompilerDate:='ymd';
  167. CompilerFullVersion:='1.2';
  168. CompilerRevision:='1.3';
  169. TestsRevision:='1.4';
  170. RTLRevision:='1.5';
  171. PackagesRevision:='1.6';
  172. end;
  173. lID:=SQL.AddRun(lData);
  174. Qry:=TDBHelper.CreateQuery(Format('Select * from testrun where (tu_id=%d)',[lID]));
  175. try
  176. Qry.Open;
  177. AssertFalse('Have data',Qry.IsEmpty);
  178. AssertTestRunData(Qry,lData);
  179. finally
  180. Qry.Free;
  181. end;
  182. end;
  183. function TTestSQLCase.CreateResultData(out aData: TTestRunData; out aResult: TTestResultData; DateOffset: Integer): Int64;
  184. begin
  185. aData:=Default(TTestRunData);
  186. aData.PlatformID:=PreparePlatform(aData);
  187. aData.Date:=Date-DateOffset;
  188. aData.RunID:=SQL.AddRun(aData);
  189. aResult:=Default(TTestResultData);
  190. aResult.RunID:=aData.RunID;
  191. CreateSource('x');
  192. if SQL.GetTestID('x.pp')=-1 then
  193. aResult.TestID:=SQL.AddTest('x.pp',False);
  194. aResult.TestResult:=stSuccessCompilationFailed;
  195. aResult.Log:='xyz';
  196. With aData do
  197. Result:=SQL.AddTestResult(aResult);
  198. end;
  199. procedure TTestSQLCase.TestAddTestResult;
  200. var
  201. lData : TTestRunData;
  202. lResult : TTestResultData;
  203. lID : Int64;
  204. flt : String;
  205. OK,Skip : Boolean;
  206. begin
  207. lID:=CreateResultData(lData,lResult);
  208. OK:=TestOK[lResult.TestResult];
  209. Skip:=TestSkipped[lResult.TestResult];
  210. With lResult do
  211. flt:=Format(SQLTestResultFilter,[lID,RunID,TestID,Bools[OK],Bools[Skip],Ord(TestResult),Log]);
  212. AssertEquals('Platform',1,TDBHelper.CountRecords('TESTRESULTS',Flt));
  213. end;
  214. procedure TTestSQLCase.TestAddTestResultTwice;
  215. var
  216. lData : TTestRunData;
  217. lResult : TTestResultData;
  218. lID,lID2 : Int64;
  219. flt : String;
  220. OK,Skip : Boolean;
  221. begin
  222. CreateResultData(lData,lResult);
  223. OK:=TestOK[lResult.TestResult];
  224. Skip:=TestSkipped[lResult.TestResult];
  225. lID:=SQL.AddTestResult(lResult);
  226. // Change result
  227. lResult.TestResult:=stFailedToCompile;
  228. lResult.Log:='xyza';
  229. OK:=TestOK[lResult.TestResult];
  230. Skip:=TestSkipped[lResult.TestResult];
  231. // Insert again...
  232. lID2:=SQL.AddTestResult(lResult);
  233. AssertEquals('Same ID',lID,lID2);
  234. flt:=Format(SQLTestResultFilter,[lID,lResult.RunID,lResult.TestID,Bools[OK],Bools[Skip],Ord(lResult.TestResult),lResult.Log]);
  235. AssertEquals('Result',1,TDBHelper.CountRecords('TESTRESULTS',Flt));
  236. end;
  237. procedure TTestSQLCase.TestUpdateTestResult;
  238. var
  239. lData : TTestRunData;
  240. lResult : TTestResultData;
  241. lID2,lID : Int64;
  242. flt : String;
  243. OK,Skip : Boolean;
  244. begin
  245. lID:=CreateResultData(lData,lResult);
  246. // Change result
  247. lResult.ID:=lID;
  248. lResult.TestResult:=stFailedToCompile;
  249. lResult.Log:='xyza';
  250. OK:=TestOK[lResult.TestResult];
  251. Skip:=TestSkipped[lResult.TestResult];
  252. // Update
  253. lID2:=SQL.UpdateTestResult(lResult);
  254. AssertEquals('Same ID',lID,lID2);
  255. flt:=Format(SQLTestResultFilter,[lID,lResult.RunID,lResult.TestID,Bools[OK],Bools[Skip],Ord(lResult.TestResult),lResult.Log]);
  256. AssertEquals('Result',1,TDBHelper.CountRecords('TESTRESULTS',Flt));
  257. end;
  258. procedure TTestSQLCase.TestAddLastResult;
  259. var
  260. lData : TTestRunData;
  261. lResult : TTestResultData;
  262. lID : Int64;
  263. flt : String;
  264. begin
  265. lID:=CreateResultData(lData,lResult);
  266. AssertTrue('Add',SQL.AddLastResult(lResult.TestID,lData.PlatformID,lID));
  267. flt:=Format('(TL_TEST_FK=%d) and (TL_PLATFORM_FK=%d) and (TL_TESTRESULTS_FK=%d)',[lResult.TestID,lData.PlatformID,lID]);
  268. AssertEquals('Result',1,TDBHelper.CountRecords('TESTLASTRESULTS',Flt));
  269. end;
  270. procedure TTestSQLCase.TestAddLastResultTwice;
  271. var
  272. lData : TTestRunData;
  273. lResult : TTestResultData;
  274. lID,lID2 : Integer;
  275. flt : string;
  276. begin
  277. lID:=CreateResultData(lData,lResult,1);
  278. AssertTrue('Add',SQL.AddLastResult(lResult.TestID,lData.PlatformID,lID));
  279. lID2:=CreateResultData(lData,lResult,0);
  280. AssertTrue('Add',SQL.AddLastResult(lResult.TestID,lData.PlatformID,lID2));
  281. flt:=Format('(TL_TEST_FK=%d) and (TL_PLATFORM_FK=%d) and (TL_TESTRESULTS_FK=%d)',[lResult.TestID,lData.PlatformID,lID2]);
  282. AssertEquals('Result',1,TDBHelper.CountRecords('TESTLASTRESULTS',Flt));
  283. end;
  284. procedure TTestSQLCase.TestGetLastTestResult;
  285. var
  286. lData : TTestRunData;
  287. lResult2,lResult : TTestResultData;
  288. lID : Integer;
  289. begin
  290. lID:=CreateResultData(lData,lResult);
  291. AssertTrue('Add',SQL.AddLastResult(lResult.TestID,lData.PlatformID,lID));
  292. lResult2:=SQL.GetLastTestResult(lResult.TestID,lData.PlatformID);
  293. AssertEquals('ID',lID,lResult2.ID);
  294. AssertEquals('Run',lResult.RunID,lResult2.RunID);
  295. AssertTrue('Status',lResult.TestResult=lResult2.TestResult);
  296. AssertEquals('Log',lResult.Log,lResult2.Log);
  297. end;
  298. procedure TTestSQLCase.TestUpdateRun;
  299. var
  300. lData : TTestRunData;
  301. St : TTestStatus;
  302. Qry : TSQLQuery;
  303. begin
  304. lData:=Default(TTestRunData);
  305. lData.PlatformID:=PreparePlatform(lData);
  306. lData.RunID:=SQL.AddRun(lData);
  307. for St in TTestStatus do
  308. lData.StatusCount[st]:=(Ord(st)+1)*100;
  309. AssertTrue('Update',SQL.UpdateTestRun(lData));
  310. Qry:=TDBHelper.CreateQuery(Format('Select * from testrun where (tu_id=%d)',[lData.RunID]));
  311. try
  312. Qry.Open;
  313. AssertFalse('Have data',Qry.IsEmpty);
  314. AssertTestRunData(Qry,lData);
  315. finally
  316. Qry.Free;
  317. end;
  318. end;
  319. procedure TTestSQLCase.TestGetCPUID;
  320. begin
  321. TDBHelper.ExecSQL('INSERT INTO TESTCPU VALUES (1,''x'')');
  322. TDBHelper.ExecSQL('INSERT INTO TESTCPU VALUES (2,''y'')');
  323. AssertEquals('Count',2,TDBHelper.CountRecords('TESTCPU'));
  324. AssertEquals('Get x',1,SQL.GetCPUID('x'));
  325. AssertEquals('Get y',2,SQL.GetCPUID('y'));
  326. AssertEquals('Get z',-1,SQL.GetCPUID('z'));
  327. end;
  328. procedure TTestSQLCase.TestGetOSID;
  329. begin
  330. TDBHelper.ExecSQL('INSERT INTO TESTOS VALUES (1,''x'')');
  331. TDBHelper.ExecSQL('INSERT INTO TESTOS VALUES (2,''y'')');
  332. AssertEquals('Count',2,TDBHelper.CountRecords('TESTOS'));
  333. AssertEquals('Get x',1,SQL.GetOSID('x'));
  334. AssertEquals('Get y',2,SQL.GetOSID('y'));
  335. AssertEquals('Get z',-1,SQL.GetOSID('z'));
  336. end;
  337. procedure TTestSQLCase.TestGetCategoryID;
  338. begin
  339. TDBHelper.ExecSQL('INSERT INTO TESTCategory VALUES (1,''x'')');
  340. TDBHelper.ExecSQL('INSERT INTO TESTCategory VALUES (2,''y'')');
  341. AssertEquals('Count',2,TDBHelper.CountRecords('TESTCategory'));
  342. AssertEquals('Get x',1,SQL.GetCategoryID('x'));
  343. AssertEquals('Get y',2,SQL.GetCategoryID('y'));
  344. AssertEquals('Get z',-1,SQL.GetCategoryID('z'));
  345. end;
  346. procedure TTestSQLCase.TestGetVersionID;
  347. begin
  348. TDBHelper.ExecSQL('INSERT INTO TESTVERSION (TV_ID,TV_VERSION) VALUES (1,''x'')');
  349. TDBHelper.ExecSQL('INSERT INTO TESTVERSION (TV_ID,TV_VERSION) VALUES (2,''y'')');
  350. AssertEquals('Count',2,TDBHelper.CountRecords('TESTVERSION'));
  351. AssertEquals('Get x',1,SQL.GetVersionID('x'));
  352. AssertEquals('Get y',2,SQL.GetVersionID('y'));
  353. AssertEquals('Get z',-1,SQL.GetVersionID('z'));
  354. end;
  355. procedure TTestSQLCase.TestGetTestID;
  356. begin
  357. TDBHelper.ExecSQL('INSERT INTO TESTS (T_ID,T_NAME,T_ADDDATE) VALUES (1,''x.pp'',CURRENT_TIMESTAMP)');
  358. TDBHelper.ExecSQL('INSERT INTO TESTS (T_ID,T_NAME,T_ADDDATE) VALUES (2,''y.pp'',CURRENT_TIMESTAMP)');
  359. AssertEquals('Count',2,TDBHelper.CountRecords('TESTS'));
  360. AssertEquals('Get x',1,SQL.GetTestID('x.pp'));
  361. AssertEquals('Get y',2,SQL.GetTestID('y.pp'));
  362. AssertEquals('Get z',-1,SQL.GetCategoryID('z.pp'));
  363. end;
  364. procedure TTestSQLCase.TestGetRunID;
  365. var
  366. lData : TTestRunData;
  367. lPlatformID : integer;
  368. lRunID : Int64;
  369. begin
  370. lData:=Default(TTestRunData);
  371. lPlatformID:=PreparePlatform(lData);
  372. lData.PlatformID:=lPlatFormID;
  373. lData.Date:=Date;
  374. lRunID:=SQL.AddRun(lData);
  375. AssertEquals('Get run id',lRunID,SQL.GetRunID(lData));
  376. end;
  377. function TTestSQLCase.GetSQL: TTestSQL;
  378. begin
  379. Result:=TDBHelper.SQL;
  380. end;
  381. procedure TTestSQLCase.SetUp;
  382. begin
  383. TDBHelper.ClearTable('TESTOS');
  384. TDBHelper.ClearTable('TESTCPU');
  385. TDBHelper.ClearTable('TESTCATEGORY');
  386. TDBHelper.ClearTable('TESTVERSION');
  387. TDBHelper.ClearTable('TESTPLATFORM');
  388. TDBHelper.ClearTable('TESTRUN');
  389. TDBHelper.ClearTable('TESTS');
  390. TDBHelper.ClearTable('TESTRESULTS');
  391. TDBHelper.ClearTable('TESTLASTRESULTS');
  392. TDBHelper.ClearTable('TESTPREVIOUSRESULTS');
  393. SQL.TestSrcDir:='./';
  394. end;
  395. procedure TTestSQLCase.TearDown;
  396. begin
  397. TDBHelper.MaybeRollback;
  398. DeleteSource('x');
  399. end;
  400. procedure TTestSQLCase.DeleteSource(const aFileName: String);
  401. begin
  402. if FileExists(aFilename+'.pp') then
  403. if not DeleteFile(aFilename+'.pp') then
  404. Fail('Failed to delete '+aFileName+'.pp');
  405. end;
  406. procedure TTestSQLCase.CreateSource(const aFileName: String);
  407. var
  408. Src : TStrings;
  409. begin
  410. Src:=TStringList.Create;
  411. try
  412. Src.Add('program '+aFileName+';');
  413. Src.Add('begin');
  414. Src.Add('end.');
  415. Src.SaveToFile(afileName+'.pp');
  416. finally
  417. Src.Free;
  418. end;
  419. end;
  420. initialization
  421. RegisterTestDecorator(TDBDecorator,TTestSQLCase);
  422. end.