fbeventstest.pp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. program fbeventstest;
  2. {$mode delphi}{$H+}
  3. uses
  4. {$IFDEF UNIX}
  5. cthreads,
  6. {$ENDIF}
  7. Classes,sysutils,
  8. FBEventMonitor,ibconnection,sqldb;
  9. const
  10. MAXEVENTS=35;
  11. NUMTESTS=100;
  12. type
  13. { TMyEventAlert }
  14. TMyEventAlert=class
  15. class procedure OnFBEvent(Sender: TObject; EventName: string; EventCount: longint;
  16. var CancelAlerts: boolean);
  17. end;
  18. var
  19. EvSent,EvReceived:Array [1..MAXEVENTS] of integer;
  20. TotalRecieved:integer;
  21. function testNEvents(IBConnection:TIBConnection;n:integer):boolean;
  22. var
  23. EventsM:TFBEventMonitor;
  24. i,j,k:integer;
  25. IBConnection2:TIBConnection;
  26. bExpectEvents:boolean;
  27. begin
  28. IBConnection.Close;
  29. //Create second connection to listen on. Events are not sent to current connection.
  30. IBConnection2:=TIBConnection.Create(nil);
  31. IBConnection2.HostName:=IBConnection.HostName;
  32. IBConnection2.DatabaseName:=IBConnection.DatabaseName;
  33. IBConnection2.UserName:=IBConnection.UserName;
  34. IBConnection2.Password:=IBConnection.Password;
  35. for i:=1 to MAXEVENTS do
  36. begin
  37. EvSent[i]:=0;
  38. EvReceived[i]:=0;
  39. end;
  40. EventsM:=TFBEventMonitor.create(nil);
  41. EventsM.Connection:=IBConnection2;
  42. for i:=1 to n do
  43. EventsM.Events.Add('E'+IntToStr(i));
  44. EventsM.OnEventAlert:=TMyEventAlert.OnFBEvent;
  45. EventsM.RegisterEvents;
  46. i:=NUMTESTS;
  47. TotalRecieved:=0;
  48. bExpectEvents:=false;
  49. Randomize;
  50. IBConnection.Open;
  51. IBConnection.ExecuteDirect('RECREATE PROCEDURE send_custom(event_name varchar(127)) '+
  52. 'AS '+
  53. 'BEGIN '+
  54. 'POST_EVENT event_name; '+
  55. 'END ');
  56. IBConnection.Transaction.Commit;
  57. j:=1+random(i); //random number of events per transaction
  58. while i>0 do
  59. begin
  60. k:=1+random(n);
  61. IBConnection.ExecuteDirect('execute PROCEDURE send_custom(''E'+IntTostr(k)+''');');
  62. EvSent[k]:=EvSent[k]+1;
  63. if i<j then
  64. begin
  65. IBConnection.Transaction.Commit;
  66. bExpectEvents:=true;
  67. j:=1+random(i);
  68. end;
  69. if bExpectEvents then
  70. CheckSynchronize;
  71. i:=i-1;
  72. end;
  73. IBConnection.Transaction.Commit;
  74. for i:=1 to 300 do //3 secs max
  75. begin
  76. Sleep(10); //wait until everything received
  77. CheckSynchronize;
  78. if TotalRecieved=NUMTESTS then
  79. break;
  80. end;
  81. result:=true;
  82. for i:=1 to n do
  83. begin
  84. result:=result and (EvSent[i]=EvReceived[i]);
  85. end;
  86. EventsM.Free;
  87. IBConnection2.Free;
  88. IBConnection.Close;
  89. end;
  90. { TMyEventAlert }
  91. class procedure TMyEventAlert.OnFBEvent(Sender: TObject; EventName: string;
  92. EventCount: longint; var CancelAlerts: boolean);
  93. var i:integer;
  94. begin
  95. i:=StrToInt(copy(EventName,2,2));
  96. EvReceived[i]:=EvReceived[i]+EventCount;
  97. TotalRecieved:=TotalRecieved+EventCount;
  98. end;
  99. var
  100. IBConnection1:TIBConnection;
  101. SQLTransaction1: TSQLTransaction;
  102. i:integer;
  103. begin
  104. if paramcount=0 then
  105. begin
  106. WriteLn('Usage:');
  107. WriteLn(' '+Paramstr(0) +' database [hostname] [username] [password]');
  108. WriteLn(' database : database name.');
  109. WriteLn(' hostname : default localhost');
  110. WriteLn(' username : default SYSDBA.');
  111. WriteLn(' password : default masterkey');
  112. exit;
  113. end;
  114. IBConnection1:=TIBConnection.Create(nil);
  115. SQLTransaction1:= TSQLTransaction.Create(nil);
  116. IBConnection1.Transaction:=SQLTransaction1;
  117. SQLTransaction1.DataBase:=IBConnection1;
  118. IBConnection1.Password:='masterkey';
  119. IBConnection1.UserName:='SYSDBA';
  120. IBConnection1.HostName:='';
  121. if paramcount=4 then
  122. IBConnection1.Password:=paramstr(4);
  123. if paramcount>=3 then
  124. IBConnection1.UserName:=paramstr(3);
  125. if paramcount>=2 then
  126. IBConnection1.HostName:=paramstr(2);
  127. IBConnection1.DatabaseName:=paramstr(1);
  128. for i:=1 to 16 do
  129. begin
  130. if testNEvents(IBConnection1,i) then
  131. WriteLn(inttostr(i)+' succeeded')
  132. else
  133. WriteLn(inttostr(i)+' failed. Missed '+ IntToStr(NUMTESTS-TotalRecieved)+' Events');
  134. end;
  135. SQLTransaction1.Free;
  136. IBConnection1.Free;
  137. WriteLn('Tests finished.');
  138. end.