tcsetup.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. unit tcsetup;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, testdecorator, tsdb, sqldb, pqconnection;
  6. type
  7. { TDBHelper }
  8. TDBHelper = class
  9. class var SQL : TTestSQL;
  10. class var Conn : TPQConnection;
  11. class function CreateQuery(const aSQL : String) : TSQLQuery;
  12. class procedure setup;
  13. class procedure TearDown;
  14. class procedure ClearTable(const aTable : string);
  15. class procedure ClearAllTables;
  16. class function IDQuery(const aSQL : String) : Int64;
  17. class procedure ExecAndCommit(Qry: TSQLQuery);
  18. class procedure ExecSQL(const aSQL: String);
  19. class function CountRecords(const aTable : String; const aFilter : String = '') : Int64;
  20. class procedure MaybeRollback;
  21. end;
  22. { TDBDecorator }
  23. TDBDecorator = class(TTestSetup)
  24. Public
  25. procedure OneTimeSetup; override;
  26. procedure OneTimeTearDown; override;
  27. end;
  28. implementation
  29. uses inifiles;
  30. const
  31. SDatabase = 'Database';
  32. KeyName = 'Name';
  33. KeyHost = 'Host';
  34. KeyUser = 'UserName';
  35. KeyPassword = 'Password';
  36. KeyPort = 'Port';
  37. { TDBDecorator }
  38. class function TDBHelper.CreateQuery(const aSQL: String): TSQLQuery;
  39. begin
  40. Result:=TSQLQuery.Create(Conn);
  41. Result.DataBase:=Conn;
  42. Result.Transaction:=Conn.Transaction;
  43. Result.SQL.Text:=aSQL;
  44. end;
  45. class procedure TDBHelper.setup;
  46. var
  47. Ini : TCustomIniFile;
  48. lFileName,lName,lHost,lUser,lPassword: String;
  49. lPort : Integer;
  50. begin
  51. lFileName:=ExtractFilePath(Paramstr(0))+'testdigest.ini';
  52. if not FileExists(lFileName) then
  53. TAssert.Fail('No config filename %s',[lFileName]);
  54. Ini:=TMemIniFile.Create(lFileName);
  55. try
  56. lName:=Ini.ReadString(SDatabase,KeyName,'');
  57. if lName='testsuite' then
  58. TAssert.Fail('As a precaution, test database cannot be called testsuite');
  59. lHost:=Ini.ReadString(SDatabase,KeyHost,'');
  60. lUser:=Ini.ReadString(SDatabase,KeyUser,'');
  61. lPassword:=Ini.ReadString(SDatabase,KeyPassword,'');
  62. lPort:=Ini.ReadInteger(SDatabase,KeyPort,0);
  63. finally
  64. Ini.Free;
  65. end;
  66. SQL:=TTestSQL.create(lName,lHost,lUser,lPassword,lPort);
  67. if not SQL.ConnectToDatabase then
  68. TAssert.Fail('Could not connect to database');
  69. Conn:=TPQConnection.Create(Nil);
  70. Conn.DatabaseName:=lName;
  71. Conn.HostName:=lHost;
  72. Conn.UserName:=lUser;
  73. Conn.Password:=lPassword;
  74. if lPort<>0 then
  75. Conn.Params.values['port']:=IntToStr(lPort);
  76. conn.Transaction:=TSQLTransaction.Create(Conn);
  77. conn.Connected:=True;
  78. (*
  79. l:=TStringList.Create;
  80. try
  81. conn.GetTableNames(l);
  82. writeln('Tables:');
  83. Writeln('-------');
  84. Writeln(l.text);
  85. Writeln('-------');
  86. finally
  87. l.Free
  88. end;
  89. *)
  90. end;
  91. class procedure TDBHelper.TearDown;
  92. begin
  93. FreeAndNil(SQL);
  94. FreeAndNil(Conn);
  95. end;
  96. class procedure TDBHelper.ExecAndCommit(Qry : TSQLQuery);
  97. begin
  98. if not Qry.SQLTransaction.Active then
  99. Qry.SQLTransaction.StartTransaction;
  100. try
  101. Qry.ExecSQL;
  102. if Qry.SQLTransaction.Active then
  103. Qry.SQLTransaction.Commit;
  104. except
  105. if Qry.SQLTransaction.Active then
  106. Qry.SQLTransaction.RollBack;
  107. Raise;
  108. end;
  109. end;
  110. class procedure TDBHelper.ExecSQL(const aSQL : String);
  111. var
  112. Qry : TSQLQuery;
  113. begin
  114. // Truncate would be faster, but we have foreign keys
  115. Qry:=CreateQuery(aSQL);
  116. try
  117. ExecAndCommit(Qry);
  118. finally
  119. Qry.Free;
  120. end;
  121. end;
  122. class function TDBHelper.CountRecords(const aTable: String; const aFilter: String): Int64;
  123. var
  124. lSQL : String;
  125. begin
  126. lSQL:='select count(*) as thecount from '+aTable;
  127. if aFilter<>'' then
  128. lSQL:=lSQL+' where '+aFilter;
  129. Result:=IDQuery(lSQL);
  130. end;
  131. class procedure TDBHelper.MaybeRollback;
  132. begin
  133. if Assigned(Conn) and Assigned(Conn.Transaction) and Conn.Transaction.Active then
  134. Conn.Transaction.RollBack;
  135. end;
  136. class procedure TDBHelper.ClearTable(const aTable: string);
  137. begin
  138. // Truncate would be faster, but we have foreign keys
  139. ExecSQL('delete from '+aTable);
  140. end;
  141. class procedure TDBHelper.ClearAllTables;
  142. begin
  143. ClearTable('TESTRUNHISTORY');
  144. ClearTable('TESTPREVIOUSRESULTS');
  145. ClearTable('TESTLASTRESULTS');
  146. ClearTable('TESTRESULTS');
  147. ClearTable('TESTRUN');
  148. ClearTable('CHECKALLRTLLOG');
  149. ClearTable('CHECKALLRTL');
  150. ClearTable('TESTPLATFORM');
  151. ClearTable('TESTOS');
  152. ClearTable('TESTCPU');
  153. ClearTable('TESTCATEGORY');
  154. ClearTable('TESTVERSION');
  155. ClearTable('TESTS');
  156. end;
  157. class function TDBHelper.IDQuery(const aSQL: String): Int64;
  158. var
  159. Qry : TSQLQuery;
  160. begin
  161. Qry:=CreateQuery(aSQL);
  162. try
  163. if not Qry.SQLTransaction.Active then
  164. Qry.SQLTransaction.StartTransaction;
  165. try
  166. Qry.Open;
  167. Result:=Qry.Fields[0].AsLargeInt;
  168. if Qry.SQLTransaction.Active then
  169. Qry.SQLTransaction.Commit;
  170. except
  171. if Qry.SQLTransaction.Active then
  172. Qry.SQLTransaction.RollBack;
  173. Raise;
  174. end;
  175. finally
  176. Qry.Free;
  177. end;
  178. end;
  179. procedure TDBDecorator.OneTimeSetup;
  180. begin
  181. TDBHelper.Setup;
  182. end;
  183. procedure TDBDecorator.OneTimeTearDown;
  184. begin
  185. TDBHelper.TearDown;
  186. end;
  187. end.