laravel-webrtc/tests/SignalingServerTest.php

56 lines
1.9 KiB
PHP

<?php
declare(strict_types=1);
namespace Blax\WebRtc\Tests;
use Blax\WebRtc\Server\SignalingServer;
use Blax\WebRtc\Signaling\SignalingHandler;
use Blax\WebRtc\Tests\Fixtures\FakeMediaEngine;
use PHPUnit\Framework\TestCase;
use React\EventLoop\StreamSelectLoop;
use React\Socket\ConnectionInterface;
use React\Socket\Connector;
final class SignalingServerTest extends TestCase
{
public function test_it_answers_an_offer_over_a_real_socket_on_the_kernel_loop(): void
{
$loop = new StreamSelectLoop;
$engine = new FakeMediaEngine;
$server = new SignalingServer('127.0.0.1', 0, new SignalingHandler($engine));
$server->boot($loop);
$address = $server->address();
$this->assertNotNull($address, 'server should be bound after boot');
$port = (int) parse_url($address, PHP_URL_PORT);
$this->assertGreaterThan(0, $port);
$received = null;
(new Connector([], $loop))
->connect("127.0.0.1:{$port}")
->then(function (ConnectionInterface $conn) use (&$received, $loop) {
$buffer = '';
$conn->on('data', function ($chunk) use (&$buffer, &$received, $conn, $loop) {
$buffer .= $chunk;
if (($pos = strpos($buffer, "\n")) !== false) {
$received = json_decode(substr($buffer, 0, $pos), true);
$conn->close();
$loop->stop();
}
});
$conn->write(json_encode(['type' => 'offer', 'peer' => 'p1', 'sdp' => 'OFFER-SDP'])."\n");
});
// Safety net so a broken server can't hang the suite.
$loop->addTimer(2.0, fn () => $loop->stop());
$loop->run();
$server->shutdown();
$this->assertSame(['type' => 'answer', 'peer' => 'p1', 'sdp' => 'answer-for-p1'], $received);
$this->assertSame(['offer', 'p1', 'OFFER-SDP'], $engine->calls[0]);
}
}