1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/movim_ynh.git synced 2024-09-03 19:46:19 +02:00
movim_ynh/sources/vendor/react/stream/tests/BufferTest.php
2016-03-14 23:16:11 +01:00

264 lines
7.3 KiB
PHP

<?php
namespace React\Tests\Stream;
use React\Stream\Buffer;
class BufferTest extends TestCase
{
/**
* @covers React\Stream\Buffer::__construct
*/
public function testConstructor()
{
$stream = fopen('php://temp', 'r+');
$loop = $this->createLoopMock();
$buffer = new Buffer($stream, $loop);
$buffer->on('error', $this->expectCallableNever());
}
/**
* @covers React\Stream\Buffer::write
* @covers React\Stream\Buffer::handleWrite
*/
public function testWrite()
{
$stream = fopen('php://temp', 'r+');
$loop = $this->createWriteableLoopMock();
$buffer = new Buffer($stream, $loop);
$buffer->on('error', $this->expectCallableNever());
$buffer->write("foobar\n");
rewind($stream);
$this->assertSame("foobar\n", fread($stream, 1024));
}
/**
* @covers React\Stream\Buffer::write
* @covers React\Stream\Buffer::handleWrite
*/
public function testWriteReturnsFalseWhenBufferIsFull()
{
$stream = fopen('php://temp', 'r+');
$loop = $this->createWriteableLoopMock();
$loop->preventWrites = true;
$buffer = new Buffer($stream, $loop);
$buffer->softLimit = 4;
$buffer->on('error', $this->expectCallableNever());
$this->assertTrue($buffer->write("foo"));
$loop->preventWrites = false;
$this->assertFalse($buffer->write("bar\n"));
}
/**
* @covers React\Stream\Buffer::write
* @covers React\Stream\Buffer::handleWrite
*/
public function testWriteDetectsWhenOtherSideIsClosed()
{
list($a, $b) = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$loop = $this->createWriteableLoopMock();
$buffer = new Buffer($a, $loop);
$buffer->softLimit = 4;
$buffer->on('error', $this->expectCallableOnce());
fclose($b);
$buffer->write("foo");
}
/**
* @covers React\Stream\Buffer::write
* @covers React\Stream\Buffer::handleWrite
*/
public function testDrain()
{
$stream = fopen('php://temp', 'r+');
$loop = $this->createWriteableLoopMock();
$loop->preventWrites = true;
$buffer = new Buffer($stream, $loop);
$buffer->softLimit = 4;
$buffer->on('error', $this->expectCallableNever());
$buffer->on('drain', $this->expectCallableOnce());
$buffer->write("foo");
$loop->preventWrites = false;
$buffer->listening = false;
$buffer->write("bar\n");
}
/**
* @covers React\Stream\Buffer::write
* @covers React\Stream\Buffer::handleWrite
*/
public function testWriteInDrain()
{
$writeStreams = array();
$stream = fopen('php://temp', 'r+');
$loop = $this->createWriteableLoopMock();
$loop->preventWrites = true;
$buffer = new Buffer($stream, $loop);
$buffer->softLimit = 2;
$buffer->on('error', $this->expectCallableNever());
$buffer->once('drain', function ($buffer) {
$buffer->listening = false;
$buffer->write("bar\n");
});
$this->assertFalse($buffer->write("foo"));
$loop->preventWrites = false;
$buffer->listening = false;
$buffer->write("\n");
fseek($stream, 0);
$this->assertSame("foo\nbar\n", stream_get_contents($stream));
}
/**
* @covers React\Stream\Buffer::end
*/
public function testEnd()
{
$stream = fopen('php://temp', 'r+');
$loop = $this->createLoopMock();
$buffer = new Buffer($stream, $loop);
$buffer->on('error', $this->expectCallableNever());
$buffer->on('close', $this->expectCallableOnce());
$this->assertTrue($buffer->isWritable());
$buffer->end();
$this->assertFalse($buffer->isWritable());
}
/**
* @covers React\Stream\Buffer::end
*/
public function testEndWithData()
{
$stream = fopen('php://temp', 'r+');
$loop = $this->createWriteableLoopMock();
$buffer = new Buffer($stream, $loop);
$buffer->on('error', $this->expectCallableNever());
$buffer->on('close', $this->expectCallableOnce());
$buffer->end('final words');
rewind($stream);
$this->assertSame('final words', stream_get_contents($stream));
}
/**
* @covers React\Stream\Buffer::isWritable
* @covers React\Stream\Buffer::close
*/
public function testClose()
{
$stream = fopen('php://temp', 'r+');
$loop = $this->createLoopMock();
$buffer = new Buffer($stream, $loop);
$buffer->on('error', $this->expectCallableNever());
$buffer->on('close', $this->expectCallableOnce());
$this->assertTrue($buffer->isWritable());
$buffer->close();
$this->assertFalse($buffer->isWritable());
}
/**
* @covers React\Stream\Buffer::write
* @covers React\Stream\Buffer::close
*/
public function testWritingToClosedBufferShouldNotWriteToStream()
{
$stream = fopen('php://temp', 'r+');
$loop = $this->createWriteableLoopMock();
$buffer = new Buffer($stream, $loop);
$buffer->close();
$buffer->write('foo');
rewind($stream);
$this->assertSame('', stream_get_contents($stream));
}
/**
* @covers React\Stream\Buffer::handleWrite
* @covers React\Stream\Buffer::errorHandler
*/
public function testError()
{
$stream = null;
$loop = $this->createWriteableLoopMock();
$error = null;
$buffer = new Buffer($stream, $loop);
$buffer->on('error', function ($message) use (&$error) {
$error = $message;
});
$buffer->write('Attempting to write to bad stream');
$this->assertInstanceOf('Exception', $error);
$this->assertSame('Tried to write to invalid stream.', $error->getMessage());
}
public function testWritingToClosedStream()
{
if ('Darwin' === PHP_OS) {
$this->markTestSkipped('OS X issue with shutting down pair for writing');
}
list($a, $b) = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$loop = $this->createWriteableLoopMock();
$error = null;
$buffer = new Buffer($a, $loop);
$buffer->on('error', function($message) use (&$error) {
$error = $message;
});
$buffer->write('foo');
stream_socket_shutdown($b, STREAM_SHUT_RD);
stream_socket_shutdown($a, STREAM_SHUT_RD);
$buffer->write('bar');
$this->assertInstanceOf('Exception', $error);
$this->assertSame('Tried to write to closed stream.', $error->getMessage());
}
private function createWriteableLoopMock()
{
$loop = $this->createLoopMock();
$loop->preventWrites = false;
$loop
->expects($this->any())
->method('addWriteStream')
->will($this->returnCallback(function ($stream, $listener) use ($loop) {
if (!$loop->preventWrites) {
call_user_func($listener, $stream);
}
}));
return $loop;
}
private function createLoopMock()
{
return $this->getMock('React\EventLoop\LoopInterface');
}
}