‪TYPO3CMS  ‪main
StreamTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
24 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
25 
26 final class ‪StreamTest extends UnitTestCase
27 {
32  private function ‪getTestDirectory(): string
33  {
34  $path = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId('root_');
35  $this->testFilesToDelete[] = $path;
37  return $path;
38  }
39 
43  public function ‪canInstantiateWithStreamIdentifier(): void
44  {
45  self::assertInstanceOf(Stream::class, new ‪Stream('php://memory', 'wb+'));
46  }
47 
51  public function ‪canInstantiateWithStreamResource(): void
52  {
53  $resource = fopen('php://memory', 'wb+');
54  $subject = new ‪Stream($resource);
55  self::assertInstanceOf(Stream::class, $subject);
56  }
57 
62  {
63  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
64  touch($fileName);
65  $subject = new ‪Stream($fileName, 'w');
66  self::assertFalse($subject->isReadable());
67  }
68 
73  {
74  $subject = new ‪Stream('php://memory', 'r');
75  self::assertFalse($subject->isWritable());
76  }
77 
82  {
83  $message = 'foo bar';
84  $subject = new ‪Stream('php://memory', 'wb+');
85  $subject->write($message);
86  self::assertEquals($message, (string)$subject);
87  }
88 
92  public function ‪detachReturnsResource(): void
93  {
94  $resource = fopen('php://memory', 'wb+');
95  $subject = new ‪Stream($resource);
96  self::assertSame($resource, $subject->detach());
97  }
98 
103  {
104  $this->expectException(\InvalidArgumentException::class);
105  new ‪Stream([' THIS WILL NOT WORK ']);
106  }
107 
112  {
113  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
114  touch($fileName);
115  file_put_contents($fileName, 'FOO BAR');
116  $subject = new ‪Stream($fileName, 'w');
117  self::assertEquals('', $subject->__toString());
118  }
119 
123  public function ‪closeClosesResource(): void
124  {
125  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
126  touch($fileName);
127  $resource = fopen($fileName, 'wb+');
128  $subject = new ‪Stream($resource);
129  $subject->close();
130  // Testing with a variable here, otherwise the suggested assertion would be assertIsNotResource, which fails.
131  $isResource = is_resource($resource);
132  self::assertFalse($isResource);
133  }
134 
138  public function ‪closeUnsetsResource(): void
139  {
140  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
141  touch($fileName);
142  $resource = fopen($fileName, 'wb+');
143  $subject = new ‪Stream($resource);
144  $subject->close();
145  self::assertNull($subject->detach());
146  }
147 
151  public function ‪closeDoesNothingAfterDetach(): void
152  {
153  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
154  touch($fileName);
155  $resource = fopen($fileName, 'wb+');
156  $subject = new ‪Stream($resource);
157  $detached = $subject->detach();
158  $subject->close();
159  self::assertIsResource($detached);
160  self::assertSame($resource, $detached);
161  }
162 
167  {
168  $subject = new ‪Stream('php://memory', 'wb+');
169  $subject->detach();
170  self::assertNull($subject->getSize());
171  }
172 
177  {
178  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
179  file_put_contents($fileName, 'FOO BAR');
180  $resource = fopen($fileName, 'wb+');
181  $subject = new ‪Stream($resource);
182  fseek($resource, 2);
183  self::assertEquals(2, $subject->tell());
184  }
185 
190  {
191  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
192  file_put_contents($fileName, 'FOO BAR');
193  $resource = fopen($fileName, 'wb+');
194  $subject = new ‪Stream($resource);
195  fseek($resource, 2);
196  $subject->detach();
197  $this->expectException(\RuntimeException::class);
198  $this->expectExceptionCode(1436717285);
199  $subject->tell();
200  }
201 
206  {
207  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
208  file_put_contents($fileName, 'FOO BAR');
209  $resource = fopen($fileName, 'wb+');
210  $subject = new ‪Stream($resource);
211  fseek($resource, 2);
212  self::assertFalse($subject->eof());
213  }
214 
218  public function ‪eofReportsTrueWhenAtEndOfStream(): void
219  {
220  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
221  file_put_contents($fileName, 'FOO BAR');
222  $resource = fopen($fileName, 'wb+');
223  $subject = new ‪Stream($resource);
224  while (!feof($resource)) {
225  fread($resource, 4096);
226  }
227  self::assertTrue($subject->eof());
228  }
229 
234  {
235  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
236  file_put_contents($fileName, 'FOO BAR');
237  $resource = fopen($fileName, 'wb+');
238  $subject = new ‪Stream($resource);
239  fseek($resource, 2);
240  $subject->detach();
241  self::assertTrue($subject->eof());
242  }
243 
248  {
249  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
250  file_put_contents($fileName, 'FOO BAR');
251  $resource = fopen($fileName, 'wb+');
252  $subject = new ‪Stream($resource);
253  self::assertTrue($subject->isSeekable());
254  }
255 
260  {
261  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
262  file_put_contents($fileName, 'FOO BAR');
263  $resource = fopen($fileName, 'wb+');
264  $subject = new ‪Stream($resource);
265  $subject->detach();
266  self::assertFalse($subject->isSeekable());
267  }
268 
272  public function ‪seekAdvancesToGivenOffsetOfStream(): void
273  {
274  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
275  file_put_contents($fileName, 'FOO BAR');
276  $resource = fopen($fileName, 'wb+');
277  $subject = new ‪Stream($resource);
278  $subject->seek(2);
279  self::assertEquals(2, $subject->tell());
280  }
281 
285  public function ‪rewindResetsToStartOfStream(): void
286  {
287  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
288  file_put_contents($fileName, 'FOO BAR');
289  $resource = fopen($fileName, 'wb+');
290  $subject = new ‪Stream($resource);
291  $subject->seek(2);
292  $subject->rewind();
293  self::assertEquals(0, $subject->tell());
294  }
295 
300  {
301  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
302  file_put_contents($fileName, 'FOO BAR');
303  $resource = fopen($fileName, 'wb+');
304  $subject = new ‪Stream($resource);
305  $subject->detach();
306  $this->expectException(\RuntimeException::class);
307  $this->expectExceptionCode(1436717287);
308  $subject->seek(2);
309  }
310 
315  {
316  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
317  file_put_contents($fileName, 'FOO BAR');
318  $resource = fopen($fileName, 'wb+');
319  $subject = new ‪Stream($resource);
320  $subject->detach();
321  self::assertFalse($subject->isWritable());
322  }
323 
328  {
329  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
330  file_put_contents($fileName, 'FOO BAR');
331  $resource = fopen($fileName, 'wb+');
332  $subject = new ‪Stream($resource);
333  $subject->detach();
334  $this->expectException(\RuntimeException::class);
335  $this->expectExceptionCode(1436717290);
336  $subject->write('bar');
337  }
338 
343  {
344  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
345  file_put_contents($fileName, 'FOO BAR');
346  $resource = fopen($fileName, 'wb+');
347  $subject = new ‪Stream($resource);
348  $subject->detach();
349  self::assertFalse($subject->isReadable());
350  }
351 
356  {
357  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
358  file_put_contents($fileName, 'FOO BAR');
359  $resource = fopen($fileName, 'r');
360  $subject = new ‪Stream($resource);
361  $subject->detach();
362  $this->expectException(\RuntimeException::class);
363  $this->expectExceptionCode(1436717292);
364  $subject->read(4096);
365  }
366 
371  {
372  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
373  file_put_contents($fileName, 'FOO BAR');
374  $resource = fopen($fileName, 'r');
375  $subject = new ‪Stream($resource);
376  while (!feof($resource)) {
377  fread($resource, 4096);
378  }
379  self::assertEquals('', $subject->read(4096));
380  }
381 
386  {
387  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
388  file_put_contents($fileName, 'FOO BAR');
389  $resource = fopen($fileName, 'w');
390  $subject = new ‪Stream($resource);
391  self::assertEquals('', $subject->getContents());
392  }
393 
394  public static function ‪invalidResourcesDataProvider(): array
395  {
396  return [
397  'null' => [null],
398  'false' => [false],
399  'true' => [true],
400  'int' => [1],
401  'float' => [1.1],
402  'array' => [[]],
403  'object' => [new \stdClass()],
404  ];
405  }
406 
412  {
413  $this->expectException(\InvalidArgumentException::class);
414  $this->expectExceptionCode(1436717297);
415  $subject = new ‪Stream('php://memory', 'wb+');
416  $subject->attach($resource);
417  }
418 
423  {
424  $this->expectException(\InvalidArgumentException::class);
425  $this->expectExceptionCode(1436717296);
426  $subject = new ‪Stream('php://memory', 'wb+');
427  $subject->attach('foo-bar-baz');
428  }
429 
434  {
435  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
436  touch($fileName);
437  $resource = fopen($fileName, 'r+');
438  $subject = new ‪Stream('php://memory', 'wb+');
439  $subject->attach($resource);
440  $reflection = new \ReflectionProperty($subject, 'resource');
441  self::assertSame($resource, $reflection->getValue($subject));
442  }
443 
448  {
449  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
450  touch($fileName);
451  $subject = new ‪Stream('php://memory', 'wb+');
452  $subject->attach($fileName);
453  $resource = fopen($fileName, 'r+');
454  fwrite($resource, 'FooBar');
455  $subject->rewind();
456  self::assertEquals('FooBar', (string)$subject);
457  }
458 
463  {
464  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
465  touch($fileName);
466  $resource = fopen($fileName, 'r+');
467  $subject = new ‪Stream('php://memory', 'wb+');
468  $subject->attach($resource);
469  fwrite($resource, 'FooBar');
470  // rewind, because current pointer is at end of stream!
471  $subject->rewind();
472  self::assertEquals('FooBar', $subject->getContents());
473  }
474 
479  {
480  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
481  touch($fileName);
482  $resource = fopen($fileName, 'r+');
483  $subject = new ‪Stream('php://memory', 'wb+');
484  $subject->attach($resource);
485  fwrite($resource, 'FooBar');
486  // seek to position 3
487  $subject->seek(3);
488  self::assertEquals('Bar', $subject->getContents());
489  }
490 
495  {
496  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
497  touch($fileName);
498  $resource = fopen($fileName, 'r+');
499  $subject = new ‪Stream('php://memory', 'wb+');
500  $subject->attach($resource);
501  $expected = stream_get_meta_data($resource);
502  self::assertEquals($expected, $subject->getMetadata());
503  }
504 
509  {
510  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
511  touch($fileName);
512  $resource = fopen($fileName, 'r+');
513  $subject = new ‪Stream('php://memory', 'wb+');
514  $subject->attach($resource);
515  $metadata = stream_get_meta_data($resource);
516  $expected = $metadata['uri'];
517  self::assertEquals($expected, $subject->getMetadata('uri'));
518  }
519 
524  {
525  $fileName = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('test_');
526  touch($fileName);
527  $resource = fopen($fileName, 'r+');
528  $subject = new ‪Stream('php://memory', 'wb+');
529  $subject->attach($resource);
530  self::assertNull($subject->getMetadata('TOTALLY_MADE_UP'));
531  }
532 
536  public function ‪getSizeReturnsStreamSize(): void
537  {
538  $resource = fopen(__FILE__, 'r');
539  $expected = fstat($resource);
540  $subject = new ‪Stream($resource);
541  self::assertEquals($expected['size'], $subject->getSize());
542  }
543 }
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\closeUnsetsResource
‪closeUnsetsResource()
Definition: StreamTest.php:138
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\attachWithStringRepresentingResourceCreatesAndAttachesResource
‪attachWithStringRepresentingResourceCreatesAndAttachesResource()
Definition: StreamTest.php:447
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\readRaisesExceptionWhenStreamIsDetached
‪readRaisesExceptionWhenStreamIsDetached()
Definition: StreamTest.php:355
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\tellReportsCurrentPositionInResource
‪tellReportsCurrentPositionInResource()
Definition: StreamTest.php:176
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\getContentsReturnsEmptyStringIfStreamIsNotReadable
‪getContentsReturnsEmptyStringIfStreamIsNotReadable()
Definition: StreamTest.php:385
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\attachWithResourceAttachesResource
‪attachWithResourceAttachesResource()
Definition: StreamTest.php:433
‪TYPO3\CMS\Core\Tests\Unit\Http
Definition: ApplicationTypeTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\isSeekableReturnsFalseForDetachedStreams
‪isSeekableReturnsFalseForDetachedStreams()
Definition: StreamTest.php:259
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\writeRaisesExceptionWhenStreamIsDetached
‪writeRaisesExceptionWhenStreamIsDetached()
Definition: StreamTest.php:327
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\attachWithNonStringNonResourceRaisesExceptionByType
‪attachWithNonStringNonResourceRaisesExceptionByType($resource)
Definition: StreamTest.php:411
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\closeClosesResource
‪closeClosesResource()
Definition: StreamTest.php:123
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\invalidResourcesDataProvider
‪static invalidResourcesDataProvider()
Definition: StreamTest.php:394
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\isWritableReturnsFalseIfStreamIsNotWritable
‪isWritableReturnsFalseIfStreamIsNotWritable()
Definition: StreamTest.php:72
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\getMetadataReturnsAllMetadataWhenNoKeyPresent
‪getMetadataReturnsAllMetadataWhenNoKeyPresent()
Definition: StreamTest.php:494
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\getContentsShouldReturnStreamContentsFromCurrentPointer
‪getContentsShouldReturnStreamContentsFromCurrentPointer()
Definition: StreamTest.php:478
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\toStringSerializationReturnsEmptyStringWhenStreamIsNotReadable
‪toStringSerializationReturnsEmptyStringWhenStreamIsNotReadable()
Definition: StreamTest.php:111
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\eofReportsFalseWhenNotAtEndOfStream
‪eofReportsFalseWhenNotAtEndOfStream()
Definition: StreamTest.php:205
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\constructorRaisesExceptionWhenPassingInvalidStreamResource
‪constructorRaisesExceptionWhenPassingInvalidStreamResource()
Definition: StreamTest.php:102
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\canInstantiateWithStreamResource
‪canInstantiateWithStreamResource()
Definition: StreamTest.php:51
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep($directory)
Definition: GeneralUtility.php:1638
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\getSizeReturnsStreamSize
‪getSizeReturnsStreamSize()
Definition: StreamTest.php:536
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\getMetadataReturnsNullIfNoDataExistsForKey
‪getMetadataReturnsNullIfNoDataExistsForKey()
Definition: StreamTest.php:523
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\isReadableReturnsFalseWhenStreamIsDetached
‪isReadableReturnsFalseWhenStreamIsDetached()
Definition: StreamTest.php:342
‪TYPO3\CMS\Core\Http\Stream
Definition: Stream.php:31
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\rewindResetsToStartOfStream
‪rewindResetsToStartOfStream()
Definition: StreamTest.php:285
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\eofReportsTrueWhenAtEndOfStream
‪eofReportsTrueWhenAtEndOfStream()
Definition: StreamTest.php:218
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\seekAdvancesToGivenOffsetOfStream
‪seekAdvancesToGivenOffsetOfStream()
Definition: StreamTest.php:272
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\toStringRetrievesFullContentsOfStream
‪toStringRetrievesFullContentsOfStream()
Definition: StreamTest.php:81
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\isWritableReturnsFalseWhenStreamIsDetached
‪isWritableReturnsFalseWhenStreamIsDetached()
Definition: StreamTest.php:314
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\attachWithNonStringNonResourceRaisesExceptionByString
‪attachWithNonStringNonResourceRaisesExceptionByString()
Definition: StreamTest.php:422
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\getContentsShouldGetFullStreamContents
‪getContentsShouldGetFullStreamContents()
Definition: StreamTest.php:462
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\isReadableReturnsFalseIfStreamIsNotReadable
‪isReadableReturnsFalseIfStreamIsNotReadable()
Definition: StreamTest.php:61
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\tellRaisesExceptionIfResourceIsDetached
‪tellRaisesExceptionIfResourceIsDetached()
Definition: StreamTest.php:189
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\getTestDirectory
‪getTestDirectory()
Definition: StreamTest.php:32
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\eofReportsTrueWhenStreamIsDetached
‪eofReportsTrueWhenStreamIsDetached()
Definition: StreamTest.php:233
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\getMetadataReturnsDataForSpecifiedKey
‪getMetadataReturnsDataForSpecifiedKey()
Definition: StreamTest.php:508
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\readReturnsEmptyStringWhenAtEndOfFile
‪readReturnsEmptyStringWhenAtEndOfFile()
Definition: StreamTest.php:370
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\closeDoesNothingAfterDetach
‪closeDoesNothingAfterDetach()
Definition: StreamTest.php:151
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest
Definition: StreamTest.php:27
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\seekRaisesExceptionWhenStreamIsDetached
‪seekRaisesExceptionWhenStreamIsDetached()
Definition: StreamTest.php:299
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\isSeekableReturnsTrueForReadableStreams
‪isSeekableReturnsTrueForReadableStreams()
Definition: StreamTest.php:247
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\getSizeReportsNullWhenNoResourcePresent
‪getSizeReportsNullWhenNoResourcePresent()
Definition: StreamTest.php:166
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\canInstantiateWithStreamIdentifier
‪canInstantiateWithStreamIdentifier()
Definition: StreamTest.php:43
‪TYPO3\CMS\Core\Tests\Unit\Http\StreamTest\detachReturnsResource
‪detachReturnsResource()
Definition: StreamTest.php:92