StreamWrapperTest.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. declare(strict_types=1);
  3. namespace GuzzleHttp\Tests\Psr7;
  4. use GuzzleHttp\Psr7;
  5. use GuzzleHttp\Psr7\StreamWrapper;
  6. use PHPUnit\Framework\TestCase;
  7. use Psr\Http\Message\StreamInterface;
  8. /**
  9. * @covers \GuzzleHttp\Psr7\StreamWrapper
  10. */
  11. class StreamWrapperTest extends TestCase
  12. {
  13. public function testResource(): void
  14. {
  15. $stream = Psr7\Utils::streamFor('foo');
  16. $handle = StreamWrapper::getResource($stream);
  17. self::assertSame('foo', fread($handle, 3));
  18. self::assertSame(3, ftell($handle));
  19. self::assertSame(3, fwrite($handle, 'bar'));
  20. self::assertSame(0, fseek($handle, 0));
  21. self::assertSame('foobar', fread($handle, 6));
  22. self::assertSame('', fread($handle, 1));
  23. self::assertTrue(feof($handle));
  24. $stBlksize = defined('PHP_WINDOWS_VERSION_BUILD') ? -1 : 0;
  25. self::assertEquals([
  26. 'dev' => 0,
  27. 'ino' => 0,
  28. 'mode' => 33206,
  29. 'nlink' => 0,
  30. 'uid' => 0,
  31. 'gid' => 0,
  32. 'rdev' => 0,
  33. 'size' => 6,
  34. 'atime' => 0,
  35. 'mtime' => 0,
  36. 'ctime' => 0,
  37. 'blksize' => $stBlksize,
  38. 'blocks' => $stBlksize,
  39. 0 => 0,
  40. 1 => 0,
  41. 2 => 33206,
  42. 3 => 0,
  43. 4 => 0,
  44. 5 => 0,
  45. 6 => 0,
  46. 7 => 6,
  47. 8 => 0,
  48. 9 => 0,
  49. 10 => 0,
  50. 11 => $stBlksize,
  51. 12 => $stBlksize,
  52. ], fstat($handle));
  53. self::assertTrue(fclose($handle));
  54. self::assertSame('foobar', (string) $stream);
  55. }
  56. public function testStreamContext(): void
  57. {
  58. $stream = Psr7\Utils::streamFor('foo');
  59. self::assertSame('foo', file_get_contents('guzzle://stream', false, StreamWrapper::createStreamContext($stream)));
  60. }
  61. public function testStreamCast(): void
  62. {
  63. $streams = [
  64. StreamWrapper::getResource(Psr7\Utils::streamFor('foo')),
  65. StreamWrapper::getResource(Psr7\Utils::streamFor('bar')),
  66. ];
  67. $write = null;
  68. $except = null;
  69. self::assertIsInt(stream_select($streams, $write, $except, 0));
  70. }
  71. public function testValidatesStream(): void
  72. {
  73. $stream = $this->createMock(StreamInterface::class);
  74. $stream->expects(self::once())
  75. ->method('isReadable')
  76. ->willReturn(false);
  77. $stream->expects(self::once())
  78. ->method('isWritable')
  79. ->willReturn(false);
  80. $this->expectException(\InvalidArgumentException::class);
  81. StreamWrapper::getResource($stream);
  82. }
  83. public function testReturnsFalseWhenStreamDoesNotExist(): void
  84. {
  85. $this->expectWarning();
  86. fopen('guzzle://foo', 'r');
  87. }
  88. public function testCanOpenReadonlyStream(): void
  89. {
  90. $stream = $this->createMock(StreamInterface::class);
  91. $stream->expects(self::once())
  92. ->method('isReadable')
  93. ->willReturn(false);
  94. $stream->expects(self::once())
  95. ->method('isWritable')
  96. ->willReturn(true);
  97. $r = StreamWrapper::getResource($stream);
  98. self::assertIsResource($r);
  99. fclose($r);
  100. }
  101. public function testUrlStat(): void
  102. {
  103. StreamWrapper::register();
  104. $stBlksize = defined('PHP_WINDOWS_VERSION_BUILD') ? -1 : 0;
  105. self::assertEquals(
  106. [
  107. 'dev' => 0,
  108. 'ino' => 0,
  109. 'mode' => 0,
  110. 'nlink' => 0,
  111. 'uid' => 0,
  112. 'gid' => 0,
  113. 'rdev' => 0,
  114. 'size' => 0,
  115. 'atime' => 0,
  116. 'mtime' => 0,
  117. 'ctime' => 0,
  118. 'blksize' => $stBlksize,
  119. 'blocks' => $stBlksize,
  120. 0 => 0,
  121. 1 => 0,
  122. 2 => 0,
  123. 3 => 0,
  124. 4 => 0,
  125. 5 => 0,
  126. 6 => 0,
  127. 7 => 0,
  128. 8 => 0,
  129. 9 => 0,
  130. 10 => 0,
  131. 11 => $stBlksize,
  132. 12 => $stBlksize,
  133. ],
  134. stat('guzzle://stream')
  135. );
  136. }
  137. /**
  138. * @requires extension xmlreader
  139. */
  140. public function testXmlReaderWithStream(): void
  141. {
  142. $stream = Psr7\Utils::streamFor('<?xml version="1.0" encoding="utf-8"?><foo />');
  143. StreamWrapper::register();
  144. libxml_set_streams_context(StreamWrapper::createStreamContext($stream));
  145. $reader = new \XMLReader();
  146. self::assertTrue($reader->open('guzzle://stream'));
  147. self::assertTrue($reader->read());
  148. self::assertSame('foo', $reader->name);
  149. }
  150. /**
  151. * @requires extension xmlreader
  152. */
  153. public function testXmlWriterWithStream(): void
  154. {
  155. $stream = Psr7\Utils::streamFor(fopen('php://memory', 'wb'));
  156. StreamWrapper::register();
  157. libxml_set_streams_context(StreamWrapper::createStreamContext($stream));
  158. $writer = new \XMLWriter();
  159. self::assertTrue($writer->openURI('guzzle://stream'));
  160. self::assertTrue($writer->startDocument());
  161. self::assertTrue($writer->writeElement('foo'));
  162. self::assertTrue($writer->endDocument());
  163. $stream->rewind();
  164. self::assertXmlStringEqualsXmlString('<?xml version="1.0"?><foo />', (string) $stream);
  165. }
  166. }