2015-08-17 17:00:26 -07:00
< ? php
2015-08-27 12:03:05 -07:00
namespace GuzzleHttp\Tests\Psr7 ;
2015-08-17 17:00:26 -07:00
2015-08-27 12:03:05 -07:00
use GuzzleHttp\Psr7\NoSeekStream ;
use GuzzleHttp\Psr7\Stream ;
2015-08-17 17:00:26 -07:00
/**
2015-08-27 12:03:05 -07:00
* @ covers GuzzleHttp\Psr7\Stream
2015-08-17 17:00:26 -07:00
*/
class StreamTest extends \PHPUnit_Framework_TestCase
{
/**
* @ expectedException \InvalidArgumentException
*/
public function testConstructorThrowsExceptionOnInvalidArgument ()
{
new Stream ( true );
}
public function testConstructorInitializesProperties ()
{
$handle = fopen ( 'php://temp' , 'r+' );
fwrite ( $handle , 'data' );
$stream = new Stream ( $handle );
$this -> assertTrue ( $stream -> isReadable ());
$this -> assertTrue ( $stream -> isWritable ());
$this -> assertTrue ( $stream -> isSeekable ());
$this -> assertEquals ( 'php://temp' , $stream -> getMetadata ( 'uri' ));
$this -> assertInternalType ( 'array' , $stream -> getMetadata ());
$this -> assertEquals ( 4 , $stream -> getSize ());
$this -> assertFalse ( $stream -> eof ());
$stream -> close ();
}
public function testStreamClosesHandleOnDestruct ()
{
$handle = fopen ( 'php://temp' , 'r' );
$stream = new Stream ( $handle );
unset ( $stream );
$this -> assertFalse ( is_resource ( $handle ));
}
public function testConvertsToString ()
{
$handle = fopen ( 'php://temp' , 'w+' );
fwrite ( $handle , 'data' );
$stream = new Stream ( $handle );
$this -> assertEquals ( 'data' , ( string ) $stream );
$this -> assertEquals ( 'data' , ( string ) $stream );
$stream -> close ();
}
public function testGetsContents ()
{
$handle = fopen ( 'php://temp' , 'w+' );
fwrite ( $handle , 'data' );
$stream = new Stream ( $handle );
$this -> assertEquals ( '' , $stream -> getContents ());
$stream -> seek ( 0 );
$this -> assertEquals ( 'data' , $stream -> getContents ());
$this -> assertEquals ( '' , $stream -> getContents ());
}
public function testChecksEof ()
{
$handle = fopen ( 'php://temp' , 'w+' );
fwrite ( $handle , 'data' );
$stream = new Stream ( $handle );
$this -> assertFalse ( $stream -> eof ());
$stream -> read ( 4 );
$this -> assertTrue ( $stream -> eof ());
$stream -> close ();
}
public function testGetSize ()
{
$size = filesize ( __FILE__ );
$handle = fopen ( __FILE__ , 'r' );
$stream = new Stream ( $handle );
$this -> assertEquals ( $size , $stream -> getSize ());
// Load from cache
$this -> assertEquals ( $size , $stream -> getSize ());
$stream -> close ();
}
public function testEnsuresSizeIsConsistent ()
{
$h = fopen ( 'php://temp' , 'w+' );
$this -> assertEquals ( 3 , fwrite ( $h , 'foo' ));
$stream = new Stream ( $h );
$this -> assertEquals ( 3 , $stream -> getSize ());
$this -> assertEquals ( 4 , $stream -> write ( 'test' ));
$this -> assertEquals ( 7 , $stream -> getSize ());
$this -> assertEquals ( 7 , $stream -> getSize ());
$stream -> close ();
}
public function testProvidesStreamPosition ()
{
$handle = fopen ( 'php://temp' , 'w+' );
$stream = new Stream ( $handle );
$this -> assertEquals ( 0 , $stream -> tell ());
$stream -> write ( 'foo' );
$this -> assertEquals ( 3 , $stream -> tell ());
$stream -> seek ( 1 );
$this -> assertEquals ( 1 , $stream -> tell ());
$this -> assertSame ( ftell ( $handle ), $stream -> tell ());
$stream -> close ();
}
2015-08-27 12:03:05 -07:00
public function testCanDetachStream ()
2015-08-17 17:00:26 -07:00
{
$r = fopen ( 'php://temp' , 'w+' );
$stream = new Stream ( $r );
$stream -> write ( 'foo' );
$this -> assertTrue ( $stream -> isReadable ());
$this -> assertSame ( $r , $stream -> detach ());
2015-08-27 12:03:05 -07:00
$stream -> detach ();
2015-08-17 17:00:26 -07:00
$this -> assertFalse ( $stream -> isReadable ());
$this -> assertFalse ( $stream -> isWritable ());
$this -> assertFalse ( $stream -> isSeekable ());
2015-08-27 12:03:05 -07:00
$throws = function ( callable $fn ) use ( $stream ) {
try {
$fn ( $stream );
$this -> fail ();
} catch ( \Exception $e ) {}
};
$throws ( function ( $stream ) { $stream -> read ( 10 ); });
$throws ( function ( $stream ) { $stream -> write ( 'bar' ); });
$throws ( function ( $stream ) { $stream -> seek ( 10 ); });
$throws ( function ( $stream ) { $stream -> tell (); });
$throws ( function ( $stream ) { $stream -> eof (); });
$throws ( function ( $stream ) { $stream -> getSize (); });
$throws ( function ( $stream ) { $stream -> getContents (); });
$this -> assertSame ( '' , ( string ) $stream );
2015-08-17 17:00:26 -07:00
$stream -> close ();
}
public function testCloseClearProperties ()
{
$handle = fopen ( 'php://temp' , 'r+' );
$stream = new Stream ( $handle );
$stream -> close ();
$this -> assertFalse ( $stream -> isSeekable ());
$this -> assertFalse ( $stream -> isReadable ());
$this -> assertFalse ( $stream -> isWritable ());
$this -> assertNull ( $stream -> getSize ());
2015-08-27 12:03:05 -07:00
$this -> assertEmpty ( $stream -> getMetadata ());
2015-08-17 17:00:26 -07:00
}
2015-08-27 12:03:05 -07:00
public function testDoesNotThrowInToString ()
2015-08-17 17:00:26 -07:00
{
2015-08-27 12:03:05 -07:00
$s = \GuzzleHttp\Psr7\stream_for ( 'foo' );
$s = new NoSeekStream ( $s );
2015-08-17 17:00:26 -07:00
$this -> assertEquals ( 'foo' , ( string ) $s );
}
}