Bläddra i källkod

Functional test of websocket services

Chance 2 år sedan
förälder
incheckning
bbd0336eef
2 ändrade filer med 165 tillägg och 0 borttagningar
  1. 155 0
      tests/Feature/WebsocketServiceTest.php
  2. 10 0
      tests/Pest.php

+ 155 - 0
tests/Feature/WebsocketServiceTest.php

@@ -0,0 +1,155 @@
+<?php
+
+use Symfony\Component\Process\PhpProcess;
+
+$serverCode = <<<PHP
+<?php
+use Workerman\Connection\TcpConnection;
+use Workerman\Protocols\Http\Request;
+use Workerman\Worker;
+require_once __DIR__ . '/vendor/autoload.php';
+if (!defined('STDIN')) define('STDIN', fopen('php://stdin', 'r'));
+if (!defined('STDOUT')) define('STDOUT', fopen('php://stdout', 'w'));
+if (!defined('STDERR')) define('STDERR', fopen('php://stderr', 'w'));
+\$worker = new Worker("websocket://0.0.0.0:2000");
+%s
+Worker::\$pidFile = __DIR__ . '/WebsocketServer.pid';
+Worker::\$command = 'start';
+Worker::runAll();
+PHP;
+
+$clientCode = <<<PHP
+<?php
+use Workerman\Connection\AsyncTcpConnection;
+use Workerman\Worker;
+require_once __DIR__ . '/vendor/autoload.php';
+if (!defined('STDIN')) define('STDIN', fopen('php://stdin', 'r'));
+if (!defined('STDOUT')) define('STDOUT', fopen('php://stdout', 'w'));
+if (!defined('STDERR')) define('STDERR', fopen('php://stderr', 'w'));
+\$worker = new Worker();
+\$worker->onWorkerStart = function(\$worker){
+    \$con = new AsyncTcpConnection('ws://127.0.0.1:2000');
+    %s
+    \$con->connect();
+};
+Worker::\$pidFile = __DIR__ . '/WebsocketClient.pid';
+Worker::\$command = 'start';
+Worker::runAll();
+PHP;
+
+it('tests websocket connection', function () use ($serverCode, $clientCode) {
+    $serverProcess = new PhpProcess(sprintf($serverCode, <<<PHP
+        \$worker->onWebSocketConnect = function () {
+            echo "connected";
+        };
+        \$worker->onMessage = function () {};
+    PHP
+    ));
+    $serverProcess->start();
+    sleep(1);
+
+    $clientProcess = new PhpProcess(sprintf($clientCode, <<<PHP
+        \$con->onWebSocketConnect = function(AsyncTcpConnection \$con) {
+            \$con->send('connect');
+        };
+    PHP
+    ));
+    $clientProcess->start();
+    sleep(1);
+
+    expect(getNonFrameOutput($serverProcess->getOutput()))->toBe('connected')
+        ->and(getNonFrameOutput($clientProcess->getOutput()))->toBe('');
+
+    $serverProcess->stop();
+    $clientProcess->stop();
+});
+
+it('tests server and client sending and receiving messages', function () use ($serverCode, $clientCode) {
+    $serverProcess = new PhpProcess(sprintf($serverCode, <<<PHP
+        \$worker->onMessage = function (TcpConnection \$connection, \$data) {
+            echo \$data;
+            \$connection->send('Hi');
+        };
+    PHP
+    ));
+    $serverProcess->start();
+    sleep(1);
+
+    $clientProcess = new PhpProcess(sprintf($clientCode, <<<PHP
+        \$con->onWebSocketConnect = function(AsyncTcpConnection \$con) {
+            \$con->send('Hello Chance');
+        };
+        \$con->onMessage = function(\$con, \$data) {
+            echo \$data;
+        };
+    PHP
+    ));
+    $clientProcess->start();
+    sleep(1);
+
+    expect(getNonFrameOutput($serverProcess->getOutput()))->toBe('Hello Chance')
+        ->and(getNonFrameOutput($clientProcess->getOutput()))->toBe('Hi');
+
+    $serverProcess->stop();
+    $clientProcess->stop();
+});
+
+it('tests server close connection', function () use ($serverCode, $clientCode) {
+    $serverProcess = new PhpProcess(sprintf($serverCode, <<<PHP
+        \$worker->onWebSocketConnect = function (TcpConnection \$connection) {
+            echo 'close connection';
+            \$connection->close();
+        };
+        \$worker->onMessage = function () {};
+    PHP
+    ));
+    $serverProcess->start();
+    sleep(1);
+
+    $clientProcess = new PhpProcess(sprintf($clientCode, <<<PHP
+        \$con->onWebSocketConnect = function(AsyncTcpConnection \$con) {
+            \$con->send('connect');
+        };
+        \$con->onClose = function () {
+            echo 'closed';
+        };
+    PHP
+    ));
+    $clientProcess->start();
+    sleep(1);
+
+    expect(getNonFrameOutput($serverProcess->getOutput()))->toBe('close connection')
+        ->and(getNonFrameOutput($clientProcess->getOutput()))->toBe('closed');
+
+    $serverProcess->stop();
+    $clientProcess->stop();
+});
+
+it('tests client close connection', function () use ($serverCode, $clientCode) {
+    $serverProcess = new PhpProcess(sprintf($serverCode, <<<PHP
+        \$worker->onMessage = function () {};
+        \$worker->onClose = function () {
+            echo 'closed';
+        };
+    PHP
+    ));
+    $serverProcess->start();
+    sleep(1);
+
+    $clientProcess = new PhpProcess(sprintf($clientCode, <<<PHP
+        \$con->onWebSocketConnect = function(AsyncTcpConnection \$con) {
+            \$con->send('connect');
+            echo 'close connection';
+            \$con->close();
+        };
+    PHP
+    ));
+    $clientProcess->start();
+    sleep(1);
+
+    expect(getNonFrameOutput($serverProcess->getOutput()))->toBe('closed')
+        ->and(getNonFrameOutput($clientProcess->getOutput()))->toBe('close connection');
+
+    $serverProcess->stop();
+    $clientProcess->stop();
+});

+ 10 - 0
tests/Pest.php

@@ -58,3 +58,13 @@ function testWithConnectionClose(Closure $closure, string $dataContains = null,
         $tcpConnection->shouldHaveReceived('close');
     }
 }
+
+function getNonFrameOutput(string $output): string
+{
+    $end = "Start success.\n";
+    $pos = strpos($output, $end);
+    if ($pos !== false) {
+        return substr($output, $pos + strlen($end));
+    }
+    return $output;
+}