loop = $this->createLoop(); $this->server = new Server($this->loop); $this->server->listen(0); $this->port = $this->server->getPort(); } /** * @covers React\EventLoop\StreamSelectLoop::tick * @covers React\Socket\Server::handleConnection * @covers React\Socket\Server::createConnection */ public function testConnection() { $client = stream_socket_client('tcp://localhost:'.$this->port); $this->server->on('connection', $this->expectCallableOnce()); $this->loop->tick(); } /** * @covers React\EventLoop\StreamSelectLoop::tick * @covers React\Socket\Server::handleConnection * @covers React\Socket\Server::createConnection */ public function testConnectionWithManyClients() { $client1 = stream_socket_client('tcp://localhost:'.$this->port); $client2 = stream_socket_client('tcp://localhost:'.$this->port); $client3 = stream_socket_client('tcp://localhost:'.$this->port); $this->server->on('connection', $this->expectCallableExactly(3)); $this->loop->tick(); $this->loop->tick(); $this->loop->tick(); } /** * @covers React\EventLoop\StreamSelectLoop::tick * @covers React\Socket\Connection::handleData */ public function testDataWithNoData() { $client = stream_socket_client('tcp://localhost:'.$this->port); $mock = $this->expectCallableNever(); $this->server->on('connection', function ($conn) use ($mock) { $conn->on('data', $mock); }); $this->loop->tick(); $this->loop->tick(); } /** * @covers React\EventLoop\StreamSelectLoop::tick * @covers React\Socket\Connection::handleData */ public function testData() { $client = stream_socket_client('tcp://localhost:'.$this->port); fwrite($client, "foo\n"); $mock = $this->createCallableMock(); $mock ->expects($this->once()) ->method('__invoke') ->with("foo\n"); $this->server->on('connection', function ($conn) use ($mock) { $conn->on('data', $mock); }); $this->loop->tick(); $this->loop->tick(); } /** * Test data sent from python language * * @covers React\EventLoop\StreamSelectLoop::tick * @covers React\Socket\Connection::handleData */ public function testDataSentFromPy() { $client = stream_socket_client('tcp://localhost:' . $this->port); fwrite($client, "foo\n"); stream_socket_shutdown($client, STREAM_SHUT_WR); $mock = $this->createCallableMock(); $mock ->expects($this->once()) ->method('__invoke') ->with("foo\n"); $this->server->on('connection', function ($conn) use ($mock) { $conn->on('data', $mock); }); $this->loop->tick(); $this->loop->tick(); } public function testFragmentedMessage() { $client = stream_socket_client('tcp://localhost:' . $this->port); fwrite($client, "Hello World!\n"); $mock = $this->createCallableMock(); $mock ->expects($this->once()) ->method('__invoke') ->with("He"); $this->server->on('connection', function ($conn) use ($mock) { $conn->bufferSize = 2; $conn->on('data', $mock); }); $this->loop->tick(); $this->loop->tick(); } /** * @covers React\EventLoop\StreamSelectLoop::tick */ public function testDisconnectWithoutDisconnect() { $client = stream_socket_client('tcp://localhost:'.$this->port); $mock = $this->expectCallableNever(); $this->server->on('connection', function ($conn) use ($mock) { $conn->on('end', $mock); }); $this->loop->tick(); $this->loop->tick(); } /** * @covers React\EventLoop\StreamSelectLoop::tick * @covers React\Socket\Connection::end */ public function testDisconnect() { $client = stream_socket_client('tcp://localhost:'.$this->port); fclose($client); $mock = $this->expectCallableOnce(); $this->server->on('connection', function ($conn) use ($mock) { $conn->on('end', $mock); }); $this->loop->tick(); $this->loop->tick(); } /** * @covers React\Socket\Server::shutdown */ public function tearDown() { if ($this->server) { $this->server->shutdown(); } } }