WebsocketServiceTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. use Symfony\Component\Process\PhpProcess;
  3. $serverCode = <<<PHP
  4. <?php
  5. use Workerman\Connection\TcpConnection;
  6. use Workerman\Protocols\Http\Request;
  7. use Workerman\Worker;
  8. require_once __DIR__ . '/vendor/autoload.php';
  9. if (!defined('STDIN')) define('STDIN', fopen('php://stdin', 'r'));
  10. if (!defined('STDOUT')) define('STDOUT', fopen('php://stdout', 'w'));
  11. if (!defined('STDERR')) define('STDERR', fopen('php://stderr', 'w'));
  12. \$worker = new Worker("websocket://127.0.0.1:8081");
  13. %s
  14. Worker::\$pidFile = __DIR__ . '/WebsocketServer.pid';
  15. Worker::\$command = 'start';
  16. Worker::runAll();
  17. PHP;
  18. $clientCode = <<<PHP
  19. <?php
  20. use Workerman\Connection\AsyncTcpConnection;
  21. use Workerman\Worker;
  22. require_once __DIR__ . '/vendor/autoload.php';
  23. if (!defined('STDIN')) define('STDIN', fopen('php://stdin', 'r'));
  24. if (!defined('STDOUT')) define('STDOUT', fopen('php://stdout', 'w'));
  25. if (!defined('STDERR')) define('STDERR', fopen('php://stderr', 'w'));
  26. \$worker = new Worker();
  27. \$worker->onWorkerStart = function(\$worker){
  28. \$con = new AsyncTcpConnection('ws://127.0.0.1:8081');
  29. %s
  30. \$con->connect();
  31. };
  32. Worker::\$pidFile = __DIR__ . '/WebsocketClient.pid';
  33. Worker::\$command = 'start';
  34. Worker::runAll();
  35. PHP;
  36. it('tests websocket connection', function () use ($serverCode, $clientCode) {
  37. $serverProcess = new PhpProcess(sprintf($serverCode, <<<PHP
  38. \$worker->onWebSocketConnect = function () {
  39. echo "connected";
  40. };
  41. \$worker->onMessage = function () {};
  42. PHP
  43. ));
  44. $serverProcess->start();
  45. sleep(1);
  46. $clientProcess = new PhpProcess(sprintf($clientCode, <<<PHP
  47. \$con->onWebSocketConnect = function(AsyncTcpConnection \$con) {
  48. \$con->send('connect');
  49. };
  50. PHP
  51. ));
  52. $clientProcess->start();
  53. sleep(1);
  54. expect(getNonFrameOutput($serverProcess->getOutput()))->toBe('connected')
  55. ->and(getNonFrameOutput($clientProcess->getOutput()))->toBe('');
  56. $serverProcess->stop();
  57. $clientProcess->stop();
  58. });
  59. it('tests server and client sending and receiving messages', function () use ($serverCode, $clientCode) {
  60. $serverProcess = new PhpProcess(sprintf($serverCode, <<<PHP
  61. \$worker->onMessage = function (TcpConnection \$connection, \$data) {
  62. echo \$data;
  63. \$connection->send('Hi');
  64. };
  65. PHP
  66. ));
  67. $serverProcess->start();
  68. sleep(1);
  69. $clientProcess = new PhpProcess(sprintf($clientCode, <<<PHP
  70. \$con->onWebSocketConnect = function(AsyncTcpConnection \$con) {
  71. \$con->send('Hello Chance');
  72. };
  73. \$con->onMessage = function(\$con, \$data) {
  74. echo \$data;
  75. };
  76. PHP
  77. ));
  78. $clientProcess->start();
  79. sleep(1);
  80. expect(getNonFrameOutput($serverProcess->getOutput()))->toBe('Hello Chance')
  81. ->and(getNonFrameOutput($clientProcess->getOutput()))->toBe('Hi');
  82. $serverProcess->stop();
  83. $clientProcess->stop();
  84. });
  85. it('tests server close connection', function () use ($serverCode, $clientCode) {
  86. $serverProcess = new PhpProcess(sprintf($serverCode, <<<PHP
  87. \$worker->onWebSocketConnect = function (TcpConnection \$connection) {
  88. echo 'close connection';
  89. \$connection->close();
  90. };
  91. \$worker->onMessage = function () {};
  92. PHP
  93. ));
  94. $serverProcess->start();
  95. sleep(1);
  96. $clientProcess = new PhpProcess(sprintf($clientCode, <<<PHP
  97. \$con->onWebSocketConnect = function(AsyncTcpConnection \$con) {
  98. \$con->send('connect');
  99. };
  100. \$con->onClose = function () {
  101. echo 'closed';
  102. };
  103. PHP
  104. ));
  105. $clientProcess->start();
  106. sleep(1);
  107. expect(getNonFrameOutput($serverProcess->getOutput()))->toBe('close connection')
  108. ->and(getNonFrameOutput($clientProcess->getOutput()))->toBe('closed');
  109. $serverProcess->stop();
  110. $clientProcess->stop();
  111. });
  112. it('tests client close connection', function () use ($serverCode, $clientCode) {
  113. $serverProcess = new PhpProcess(sprintf($serverCode, <<<PHP
  114. \$worker->onMessage = function () {};
  115. \$worker->onClose = function () {
  116. echo 'closed';
  117. };
  118. PHP
  119. ));
  120. $serverProcess->start();
  121. sleep(1);
  122. $clientProcess = new PhpProcess(sprintf($clientCode, <<<PHP
  123. \$con->onWebSocketConnect = function(AsyncTcpConnection \$con) {
  124. \$con->send('connect');
  125. echo 'close connection';
  126. \$con->close();
  127. };
  128. PHP
  129. ));
  130. $clientProcess->start();
  131. sleep(1);
  132. expect(getNonFrameOutput($serverProcess->getOutput()))->toBe('closed')
  133. ->and(getNonFrameOutput($clientProcess->getOutput()))->toBe('close connection');
  134. $serverProcess->stop();
  135. $clientProcess->stop();
  136. });