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.
272 lines
7.1 KiB
272 lines
7.1 KiB
<?php
|
|
|
|
namespace RouterOS\Tests\Streams;
|
|
|
|
use InvalidArgumentException;
|
|
use PHPUnit\Framework\TestCase;
|
|
use RouterOS\Exceptions\StreamException;
|
|
use RouterOS\Streams\ResourceStream;
|
|
use stdClass;
|
|
|
|
/**
|
|
* Limit code coverage to the class RouterOS\APIStream
|
|
*
|
|
* @coversDefaultClass \RouterOS\Streams\ResourceStream
|
|
*/
|
|
class ResourceStreamTest extends TestCase
|
|
{
|
|
/**
|
|
* Test that constructor throws an InvalidArgumentException on bad parameter type
|
|
*
|
|
* @covers ::__construct
|
|
* @dataProvider constructNotResourceProvider
|
|
*
|
|
* @param $notResource
|
|
*/
|
|
public function testConstructNotResource($notResource): void
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
new ResourceStream($notResource);
|
|
}
|
|
|
|
/**
|
|
* Data provider for test__constructNotResource
|
|
*
|
|
* returns data not of type resource
|
|
*/
|
|
public function constructNotResourceProvider(): array
|
|
{
|
|
return [
|
|
[0], // integer
|
|
[3.14], // float
|
|
['a string'], // string
|
|
[
|
|
[0, 3.14], // Array
|
|
],
|
|
[new stdClass()], // Object
|
|
// What else ?
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test that constructor is OK with different kinds of resources
|
|
*
|
|
* @covers ::__construct
|
|
* @dataProvider constructProvider
|
|
*
|
|
* @param resource $resource Cannot typehint, PHP refuse it
|
|
* @param bool $closeResource shall we close the resource ?
|
|
*/
|
|
public function testConstruct($resource, bool $closeResource = true): void
|
|
{
|
|
$resourceStream = new class($resource) extends ResourceStream {
|
|
public function getStream()
|
|
{
|
|
return $this->stream;
|
|
}
|
|
};
|
|
|
|
$stream = $resourceStream->getStream();
|
|
$this->assertIsResource($stream);
|
|
|
|
if ($closeResource) {
|
|
fclose($resource);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Data provider for test__construct
|
|
*
|
|
* @return array data of type resource
|
|
*/
|
|
public function constructProvider(): array
|
|
{
|
|
return [
|
|
[fopen(__FILE__, 'rb')], // Myself, sure I exists
|
|
[fsockopen('tcp://' . getenv('ROS_HOST'), getenv('ROS_PORT_MODERN'))], // Socket
|
|
[STDIN, false], // Try it, but do not close STDIN please !!!
|
|
// What else ?
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test that read function return expected values, and that consecutive reads return data
|
|
*
|
|
* @covers ::read
|
|
* @dataProvider readProvider
|
|
*
|
|
* @param ResourceStream $stream Cannot typehint, PHP refuse it
|
|
* @param string $expected the result we should have
|
|
*
|
|
* @throws \RouterOS\Exceptions\StreamException
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public function testRead(ResourceStream $stream, string $expected): void
|
|
{
|
|
$this->assertSame($expected, $stream->read(strlen($expected)));
|
|
}
|
|
|
|
public function readProvider(): array
|
|
{
|
|
$resource = fopen(__FILE__, 'rb');
|
|
$me = new ResourceStream($resource);
|
|
|
|
return [
|
|
[$me, '<'], // Read for byte
|
|
[$me, '?php'], // Read following bytes. File statrts with "<php"
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test that read invalid lengths
|
|
*
|
|
* @covers ::read
|
|
* @dataProvider readBadLengthProvider
|
|
*
|
|
* @param ResourceStream $stream Cannot typehint, PHP refuse it
|
|
* @param int $length
|
|
*
|
|
* @throws \RouterOS\Exceptions\StreamException
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public function testReadBadLength(ResourceStream $stream, int $length): void
|
|
{
|
|
$this->expectException(InvalidArgumentException::class);
|
|
$stream->read($length);
|
|
}
|
|
|
|
public function readBadLengthProvider(): array
|
|
{
|
|
$resource = fopen(__FILE__, 'rb');
|
|
$me = new ResourceStream($resource);
|
|
|
|
return [
|
|
[$me, 0],
|
|
[$me, -1],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test read to invalid resource
|
|
*
|
|
* @covers ::read
|
|
* @dataProvider readBadResourceProvider
|
|
*
|
|
* @param ResourceStream $stream Cannot typehint, PHP refuse it
|
|
* @param int $length
|
|
*/
|
|
public function testReadBadResource(ResourceStream $stream, int $length): void
|
|
{
|
|
$this->expectException(StreamException::class);
|
|
$stream->read($length);
|
|
}
|
|
|
|
public function readBadResourceProvider(): array
|
|
{
|
|
$resource = fopen(__FILE__, 'rb');
|
|
$me = new ResourceStream($resource);
|
|
fclose($resource);
|
|
|
|
return [
|
|
[$me, 1],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test that write function returns writen length
|
|
*
|
|
* @covers ::write
|
|
* @dataProvider writeProvider
|
|
*
|
|
* @param ResourceStream $stream to test
|
|
* @param string $toWrite the writed string
|
|
*
|
|
* @throws \RouterOS\Exceptions\StreamException
|
|
*/
|
|
public function testWrite(ResourceStream $stream, string $toWrite): void
|
|
{
|
|
$this->assertEquals(strlen($toWrite), $stream->write($toWrite));
|
|
}
|
|
|
|
public function writeProvider(): array
|
|
{
|
|
$resource = fopen('/dev/null', 'wb');
|
|
$null = new ResourceStream($resource);
|
|
|
|
return [
|
|
[$null, 'yyaagagagag'], // Take that
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test write to invalid resource
|
|
*
|
|
* @covers ::write
|
|
* @dataProvider writeBadResourceProvider
|
|
*
|
|
* @param ResourceStream $stream to test
|
|
* @param string $toWrite the written string
|
|
*/
|
|
public function testWriteBadResource(ResourceStream $stream, string $toWrite): void
|
|
{
|
|
$this->expectException(StreamException::class);
|
|
$stream->write($toWrite);
|
|
}
|
|
|
|
public function writeBadResourceProvider(): array
|
|
{
|
|
$resource = fopen('/dev/null', 'wb');
|
|
$me = new ResourceStream($resource);
|
|
fclose($resource);
|
|
|
|
return [
|
|
[$me, 'sasasaas'], // Take that
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test double close resource
|
|
*
|
|
* @covers ::close
|
|
* @dataProvider doubleCloseProvider
|
|
*
|
|
* @param ResourceStream $stream to test
|
|
*/
|
|
public function testDoubleClose(ResourceStream $stream): void
|
|
{
|
|
$this->expectException(StreamException::class);
|
|
$stream->close();
|
|
$stream->close();
|
|
}
|
|
|
|
public function doubleCloseProvider(): array
|
|
{
|
|
return [
|
|
[new ResourceStream(fopen('/dev/null', 'wb')), 'sasasaas'], // Take that
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test write to closed resource
|
|
*
|
|
* @covers ::close
|
|
* @covers ::write
|
|
* @dataProvider writeClosedResourceProvider
|
|
*
|
|
* @param ResourceStream $stream to test
|
|
* @param string $toWrite the written string
|
|
*/
|
|
public function testClose(ResourceStream $stream, string $toWrite)
|
|
{
|
|
$this->expectException(StreamException::class);
|
|
$stream->close();
|
|
$stream->write($toWrite);
|
|
}
|
|
|
|
public function writeClosedResourceProvider(): array
|
|
{
|
|
return [
|
|
[new ResourceStream(fopen('/dev/null', 'wb')), 'sasasaas'], // Take that
|
|
];
|
|
}
|
|
}
|