56 lines
1.9 KiB
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]);
|
|
}
|
|
}
|