PushPullTestCase.pas 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. unit PushPullTestCase;
  2. interface
  3. {$I zmq.inc}
  4. uses
  5. TestFramework
  6. , Classes
  7. , Windows
  8. , zmqapi
  9. ;
  10. const
  11. cBind = 'tcp://*:5555';
  12. cConnect = 'tcp://127.0.0.1:5555';
  13. type
  14. TPushPullTestCase = class(TTestCase)
  15. strict private
  16. context: TZMQContext;
  17. public
  18. procedure SetUp; override;
  19. procedure TearDown; override;
  20. published
  21. procedure SendString;
  22. procedure SendStringThread;
  23. procedure SendStringThreadFirstConnect;
  24. end;
  25. implementation
  26. uses
  27. Sysutils
  28. ;
  29. var
  30. ehandle: THandle;
  31. { TPushPullTestCase }
  32. procedure TPushPullTestCase.SetUp;
  33. begin
  34. inherited;
  35. context := TZMQContext.Create;
  36. end;
  37. procedure TPushPullTestCase.TearDown;
  38. begin
  39. inherited;
  40. if context <> nil then
  41. context.Free;
  42. end;
  43. procedure TPushPullTestCase.SendString;
  44. var
  45. sPush,sPull: TZMQSocket;
  46. s: Utf8String;
  47. rc: Integer;
  48. begin
  49. sPush := context.Socket( stPush );
  50. try
  51. sPush.bind( cBind );
  52. sPull := context.Socket( stPull );
  53. try
  54. sPull.connect( cConnect );
  55. sPush.send( 'Hello' );
  56. rc := sPull.recv( s );
  57. CheckEquals( 5, rc, 'checking result' );
  58. CheckEquals( 'Hello', s, 'checking value' );
  59. finally
  60. sPull.Free;
  61. end;
  62. finally
  63. sPush.Free;
  64. end;
  65. end;
  66. procedure PushProc( lcontext: TZMQContext );
  67. var
  68. sPush: TZMQSocket;
  69. begin
  70. WaitForSingleObject( ehandle, INFINITE );
  71. sPush := lcontext.Socket( stPush );
  72. try
  73. sPush.bind( cBind );
  74. sPush.send( 'Hello' );
  75. finally
  76. sPush.Free;
  77. end;
  78. end;
  79. procedure TPushPullTestCase.SendStringThread;
  80. var
  81. sPull: TZMQSocket;
  82. s: Utf8String;
  83. rc: Integer;
  84. tid: Cardinal;
  85. begin
  86. SetEvent( ehandle );
  87. BeginThread( nil, 0, @pushProc, context, 0, tid );
  88. sPull := context.Socket( stPull );
  89. try
  90. sPull.connect( cConnect );
  91. rc := sPull.recv( s );
  92. CheckEquals( 5, rc, 'checking result' );
  93. CheckEquals( 'Hello', s, 'checking value' );
  94. finally
  95. sPull.Free;
  96. end;
  97. end;
  98. // should work, because push blocks until a downstream node
  99. // become available.
  100. procedure TPushPullTestCase.SendStringThreadFirstConnect;
  101. var
  102. sPull: TZMQSocket;
  103. s: Utf8String;
  104. rc: Integer;
  105. tid: Cardinal;
  106. begin
  107. ResetEvent( ehandle );
  108. BeginThread( nil, 0, @pushProc, context, 0, tid );
  109. sPull := context.Socket( stPull );
  110. try
  111. sPull.connect( cConnect );
  112. SetEvent( ehandle );
  113. rc := sPull.recv( s );
  114. CheckEquals( 5, rc, 'checking result' );
  115. CheckEquals( 'Hello', s, 'checking value' );
  116. finally
  117. sPull.Free;
  118. end;
  119. end;
  120. {
  121. try
  122. SetEvent( ehandle );
  123. WaitForSingleObject( ehandle, INFINITE );
  124. finally
  125. end;
  126. }
  127. initialization
  128. RegisterTest(TPushPullTestCase.Suite);
  129. ehandle := CreateEvent( nil, true, true, nil );
  130. finalization
  131. CloseHandle( ehandle );
  132. end.