mirror of
https://github.com/danog/byte-stream.git
synced 2024-12-02 09:17:50 +01:00
24484fa356
Whether writing to the socket fails is implementation defined, see https://stackoverflow.com/a/4022160/2373138. Shutting down the read side of the socket generally doesn't have any effect on the peer, seems like this is due to the local host implementation on Linux.
70 lines
1.9 KiB
PHP
70 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace Amp\ByteStream\Test;
|
|
|
|
use Amp\ByteStream\ResourceOutputStream;
|
|
use Amp\ByteStream\StreamException;
|
|
use PHPUnit\Framework\TestCase;
|
|
use function Amp\Promise\wait;
|
|
|
|
class ResourceOutputStreamTest extends TestCase
|
|
{
|
|
public function testGetResource()
|
|
{
|
|
$stream = new ResourceOutputStream(\STDOUT);
|
|
|
|
$this->assertSame(\STDOUT, $stream->getResource());
|
|
}
|
|
|
|
public function testNonStream()
|
|
{
|
|
$this->expectException(\Error::class);
|
|
$this->expectExceptionMessage("Expected a valid stream");
|
|
|
|
new ResourceOutputStream(42);
|
|
}
|
|
|
|
public function testNotWritable()
|
|
{
|
|
$this->expectException(\Error::class);
|
|
$this->expectExceptionMessage("Expected a writable stream");
|
|
|
|
new ResourceOutputStream(\STDIN);
|
|
}
|
|
|
|
public function testBrokenPipe()
|
|
{
|
|
if (($sockets = @\stream_socket_pair(\stripos(PHP_OS, "win") === 0 ? STREAM_PF_INET : STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP)) === false) {
|
|
$this->fail("Failed to create socket pair.");
|
|
}
|
|
|
|
list($a, $b) = $sockets;
|
|
|
|
$stream = new ResourceOutputStream($a);
|
|
\fclose($b);
|
|
|
|
$this->expectException(StreamException::class);
|
|
$this->expectExceptionMessage("The stream was closed by the peer");
|
|
wait($stream->write("foobar"));
|
|
}
|
|
|
|
public function testClosedRemoteSocket()
|
|
{
|
|
$server = \stream_socket_server("tcp://127.0.0.1:0");
|
|
$address = \stream_socket_get_name($server, false);
|
|
|
|
$a = \stream_socket_client("tcp://" . $address);
|
|
$b = \stream_socket_accept($server);
|
|
|
|
$stream = new ResourceOutputStream($a);
|
|
\fclose($b);
|
|
|
|
$this->expectException(StreamException::class);
|
|
$this->expectExceptionMessage("The stream was closed by the peer");
|
|
|
|
// The first write still succeeds somehow...
|
|
wait($stream->write("foobar"));
|
|
wait($stream->write("foobar"));
|
|
}
|
|
}
|