ThreadTestCase.pas 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. unit ThreadTestCase;
  2. interface
  3. {$I zmq.inc}
  4. uses
  5. {$ifdef fpc}
  6. fpcunit, testutils, testregistry
  7. {$else}
  8. TestFramework
  9. {$endif}
  10. , Classes
  11. {$ifndef UNIX}
  12. , Windows
  13. {$endif}
  14. , zmqapi
  15. ;
  16. type
  17. TMyZMQThread = class( TZMQThread )
  18. protected
  19. procedure DoExecute; override;
  20. public
  21. tvar: Boolean;
  22. end;
  23. TThreadTestCase = class( TTestCase )
  24. strict private
  25. context: TZMQContext;
  26. tvar: Boolean;
  27. tmpI: Integer;
  28. tmpS: Utf8String;
  29. public
  30. myThr: TMyZMQThread;
  31. procedure SetUp; override;
  32. procedure TearDown; override;
  33. procedure DetachedTestMeth( args: Pointer; context: TZMQContext );
  34. procedure AttachedTestMeth( args: Pointer; context: TZMQContext; pipe: TZMQSocket );
  35. procedure AttachedPipeTestMeth( args: Pointer; context: TZMQContext; pipe: TZMQSocket );
  36. procedure InheritedThreadTerminate( Sender: TObject );
  37. published
  38. procedure CreateAttachedTest;
  39. procedure CreateDetachedTest;
  40. procedure CreateInheritedAttachedTest;
  41. procedure CreateInheritedDetachedTest;
  42. procedure AttachedPipeTest;
  43. end;
  44. implementation
  45. uses
  46. Sysutils
  47. ;
  48. var
  49. ehandle: THandle;
  50. { TMyZMQThread }
  51. procedure TMyZMQThread.doExecute;
  52. begin
  53. // custom code.
  54. tvar := true;
  55. SetEvent( ehandle );
  56. end;
  57. { TThreadTestCase }
  58. procedure TThreadTestCase.SetUp;
  59. begin
  60. inherited;
  61. ehandle := CreateEvent( nil, true, false, nil );
  62. context := TZMQContext.Create;
  63. tvar := false;
  64. end;
  65. procedure TThreadTestCase.TearDown;
  66. begin
  67. inherited;
  68. if context <> nil then
  69. context.Free;
  70. CloseHandle( ehandle );
  71. end;
  72. procedure TThreadTestCase.AttachedTestMeth( args: Pointer; context: TZMQContext; pipe: TZMQSocket );
  73. begin
  74. tvar := true;
  75. SetEvent( ehandle );
  76. end;
  77. procedure TThreadTestCase.CreateAttachedTest;
  78. var
  79. thr: TZMQThread;
  80. begin
  81. thr := TZMQThread.CreateAttached( AttachedTestMeth, context, nil );
  82. thr.FreeOnTerminate := true;
  83. thr.Resume;
  84. WaitForSingleObject( ehandle, INFINITE );
  85. CheckEquals( true, tvar, 'tvar didn''t set' );
  86. end;
  87. procedure TThreadTestCase.DetachedTestMeth( args: Pointer; context: TZMQContext );
  88. var
  89. socket: TZMQSocket;
  90. begin
  91. tvar := true;
  92. socket := context.Socket( TZMQSocketType( Args^ ) );
  93. Dispose( args );
  94. SetEvent( ehandle );
  95. end;
  96. procedure TThreadTestCase.CreateDetachedTest;
  97. var
  98. thr: TZMQThread;
  99. sockettype: ^TZMQSocketType;
  100. begin
  101. New( sockettype );
  102. sockettype^ := stDealer;
  103. thr := TZMQThread.CreateDetached( DetachedTestMeth, sockettype );
  104. thr.FreeOnTerminate := true;
  105. thr.Resume;
  106. WaitForSingleObject( ehandle, INFINITE );
  107. CheckEquals( true, tvar, 'tvar didn''t set' );
  108. end;
  109. procedure TThreadTestCase.InheritedThreadTerminate( Sender: TObject );
  110. begin
  111. // this executes in the main thread.
  112. tvar := myThr.tvar;
  113. end;
  114. procedure TThreadTestCase.CreateInheritedAttachedTest;
  115. begin
  116. mythr := TMyZMQThread.Create( nil, context );
  117. mythr.OnTerminate := InheritedThreadTerminate;
  118. mythr.Resume;
  119. WaitForSingleObject( ehandle, INFINITE );
  120. sleep(10);
  121. mythr.Free;
  122. CheckEquals( true, tvar, 'tvar didn''t set' );
  123. end;
  124. procedure TThreadTestCase.CreateInheritedDetachedTest;
  125. begin
  126. mythr := TMyZMQThread.Create( nil, nil );
  127. mythr.OnTerminate := InheritedThreadTerminate;
  128. mythr.Resume;
  129. WaitForSingleObject( ehandle, INFINITE );
  130. mythr.Free;
  131. CheckEquals( true, tvar, 'tvar didn''t set' );
  132. end;
  133. procedure TThreadTestCase.AttachedPipeTestMeth(args: Pointer;
  134. context: TZMQContext; pipe: TZMQSocket );
  135. begin
  136. pipe.recv( tmpS );
  137. SetEvent( ehandle );
  138. end;
  139. procedure TThreadTestCase.AttachedPipeTest;
  140. var
  141. thr: TZMQThread;
  142. begin
  143. thr := TZMQThread.CreateAttached( AttachedPipeTestMeth, context, nil );
  144. thr.FreeOnTerminate := true;
  145. thr.Resume;
  146. thr.pipe.send( 'hello pipe' );
  147. WaitForSingleObject( ehandle, INFINITE );
  148. CheckEquals( 'hello pipe', tmpS, 'pipe error' );
  149. end;
  150. initialization
  151. {$ifdef fpc}
  152. RegisterTest(TThreadTestCase);
  153. {$else}
  154. RegisterTest(TThreadTestCase.Suite);
  155. {$endif}
  156. end.