You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.6 KiB
128 lines
3.6 KiB
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace GuzzleHttp\Tests\Psr7;
|
|
|
|
use GuzzleHttp\Psr7;
|
|
use GuzzleHttp\Psr7\FnStream;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* @covers \GuzzleHttp\Psr7\FnStream
|
|
*/
|
|
class FnStreamTest extends TestCase
|
|
{
|
|
public function testThrowsWhenNotImplemented(): void
|
|
{
|
|
$this->expectException(\BadMethodCallException::class);
|
|
$this->expectExceptionMessage('seek() is not implemented in the FnStream');
|
|
(new FnStream([]))->seek(1);
|
|
}
|
|
|
|
public function testProxiesToFunction(): void
|
|
{
|
|
$s = new FnStream([
|
|
'read' => function ($len) {
|
|
$this->assertSame(3, $len);
|
|
|
|
return 'foo';
|
|
},
|
|
]);
|
|
|
|
self::assertSame('foo', $s->read(3));
|
|
}
|
|
|
|
public function testCanCloseOnDestruct(): void
|
|
{
|
|
$called = false;
|
|
$s = new FnStream([
|
|
'close' => function () use (&$called): void {
|
|
$called = true;
|
|
},
|
|
]);
|
|
unset($s);
|
|
self::assertTrue($called);
|
|
}
|
|
|
|
public function testDoesNotRequireClose(): void
|
|
{
|
|
$s = new FnStream([]);
|
|
unset($s);
|
|
self::assertTrue(true); // strict mode requires an assertion
|
|
}
|
|
|
|
public function testDecoratesStream(): void
|
|
{
|
|
$a = Psr7\Utils::streamFor('foo');
|
|
$b = FnStream::decorate($a, []);
|
|
self::assertSame(3, $b->getSize());
|
|
self::assertSame($b->isWritable(), true);
|
|
self::assertSame($b->isReadable(), true);
|
|
self::assertSame($b->isSeekable(), true);
|
|
self::assertSame($b->read(3), 'foo');
|
|
self::assertSame($b->tell(), 3);
|
|
self::assertSame($a->tell(), 3);
|
|
self::assertSame('', $a->read(1));
|
|
self::assertSame($b->eof(), true);
|
|
self::assertSame($a->eof(), true);
|
|
$b->seek(0);
|
|
self::assertSame('foo', (string) $b);
|
|
$b->seek(0);
|
|
self::assertSame('foo', $b->getContents());
|
|
self::assertSame($a->getMetadata(), $b->getMetadata());
|
|
$b->seek(0, SEEK_END);
|
|
$b->write('bar');
|
|
self::assertSame('foobar', (string) $b);
|
|
self::assertIsResource($b->detach());
|
|
$b->close();
|
|
}
|
|
|
|
public function testDecoratesWithCustomizations(): void
|
|
{
|
|
$called = false;
|
|
$a = Psr7\Utils::streamFor('foo');
|
|
$b = FnStream::decorate($a, [
|
|
'read' => function ($len) use (&$called, $a) {
|
|
$called = true;
|
|
|
|
return $a->read($len);
|
|
},
|
|
]);
|
|
self::assertSame('foo', $b->read(3));
|
|
self::assertTrue($called);
|
|
}
|
|
|
|
public function testDoNotAllowUnserialization(): void
|
|
{
|
|
$a = new FnStream([]);
|
|
$b = serialize($a);
|
|
$this->expectException(\LogicException::class);
|
|
$this->expectExceptionMessage('FnStream should never be unserialized');
|
|
unserialize($b);
|
|
}
|
|
|
|
/**
|
|
* @requires PHP < 7.4
|
|
*/
|
|
public function testThatConvertingStreamToStringWillTriggerErrorAndWillReturnEmptyString(): void
|
|
{
|
|
$a = new FnStream([
|
|
'__toString' => function (): void {
|
|
throw new \Exception();
|
|
},
|
|
]);
|
|
|
|
$errors = [];
|
|
set_error_handler(function (int $errorNumber, string $errorMessage) use (&$errors): void {
|
|
$errors[] = ['number' => $errorNumber, 'message' => $errorMessage];
|
|
});
|
|
(string) $a;
|
|
|
|
restore_error_handler();
|
|
|
|
self::assertCount(1, $errors);
|
|
self::assertSame(E_USER_ERROR, $errors[0]['number']);
|
|
self::assertStringStartsWith('GuzzleHttp\Psr7\FnStream::__toString exception:', $errors[0]['message']);
|
|
}
|
|
}
|
|
|