‪TYPO3CMS  ‪main
UploadedFileTest.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 
23 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
24 
25 final class ‪UploadedFileTest extends UnitTestCase
26 {
27  protected ‪$tmpFile;
28 
29  protected function ‪setUp(): void
30  {
31  parent::setUp();
32  $this->tmpFile = null;
33  }
34 
35  protected function ‪tearDown(): void
36  {
37  if (is_string($this->tmpFile) && file_exists($this->tmpFile)) {
38  unlink($this->tmpFile);
39  }
40  parent::tearDown();
41  }
42 
43  public static function ‪invalidStreamsDataProvider(): array
44  {
45  return [
46  'int' => [1],
47  'float' => [1.1],
48  /* Have not figured out a valid way to test an invalid path yet; null byte injection
49  * appears to get caught by fopen()
50  'invalid-path' => [ ('WIN' === strtoupper(substr(PHP_OS, 0, 3))) ? '[:]' : 'foo' . "\0" ],
51  */
52  'array' => [['filename']],
53  'object' => [(object)['filename']],
54  ];
55  }
56 
61  public function ‪constructorRaisesExceptionOnInvalidStreamOrFile($streamOrFile): void
62  {
63  $this->expectException(\InvalidArgumentException::class);
64  new ‪UploadedFile($streamOrFile, 0, UPLOAD_ERR_OK);
65  }
66 
67  public static function ‪invalidErrorStatusesDataProvider(): array
68  {
69  return [
70  'negative' => [-1],
71  'too-big' => [9],
72  ];
73  }
74 
80  {
81  $this->expectException(\InvalidArgumentException::class);
82  $this->expectExceptionCode(1436717303);
83  new ‪UploadedFile(fopen('php://temp', 'wb+'), 0, $status);
84  }
85 
90  {
91  $stream = new ‪Stream('php://temp');
92  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
93  self::assertSame($stream, $upload->getStream());
94  }
95 
99  public function ‪getStreamReturnsWrappedPhpStream(): void
100  {
101  $stream = fopen('php://temp', 'wb+');
102  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
103  $uploadStream = $upload->getStream()->detach();
104  self::assertSame($stream, $uploadStream);
105  }
106 
110  public function ‪getStreamReturnsStreamForFile(): void
111  {
112  $this->tmpFile = $stream = tempnam(sys_get_temp_dir(), 'phly');
113  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
114  $uploadStream = $upload->getStream();
115  $r = new \ReflectionProperty($uploadStream, 'stream');
116  self::assertSame($stream, $r->getValue($uploadStream));
117  }
118 
122  public function ‪moveToMovesFileToDesignatedPath(): void
123  {
124  $stream = new ‪Stream('php://temp', 'wb+');
125  $stream->write('Foo bar!');
126  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
127 
128  $this->tmpFile = $to = GeneralUtility::tempnam('psr7');
129  $upload->moveTo($to);
130  self::assertFileExists($to);
131  $contents = file_get_contents($to);
132  self::assertEquals($stream->__toString(), $contents);
133  }
134 
138  public function ‪moveToRaisesExceptionForEmptyPath(): void
139  {
140  $stream = new ‪Stream('php://temp', 'wb+');
141  $stream->write('Foo bar!');
142  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
143  $this->expectException(\InvalidArgumentException::class);
144  $this->expectExceptionCode(1436717307);
145  $upload->moveTo('');
146  }
147 
151  public function ‪moveToCannotBeCalledMoreThanOnce(): void
152  {
153  $stream = new ‪Stream('php://temp', 'wb+');
154  $stream->write('Foo bar!');
155  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
156 
157  $this->tmpFile = $to = GeneralUtility::tempnam('psr7');
158  $upload->moveTo($to);
159  self::assertFileExists($to);
160 
161  $this->expectException(\RuntimeException::class);
162  $this->expectExceptionCode(1436717308);
163  $upload->moveTo($to);
164  }
165 
170  {
171  $stream = new ‪Stream('php://temp', 'wb+');
172  $stream->write('Foo bar!');
173  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
174 
175  $this->tmpFile = $to = GeneralUtility::tempnam('psr7');
176  $upload->moveTo($to);
177  self::assertFileExists($to);
178 
179  $this->expectException(\RuntimeException::class);
180  $this->expectExceptionCode(1436717306);
181  $upload->getStream();
182  }
183 
188  public function ‪nfdFileNameIsNormalized(): void
189  {
190  $clientFileName = hex2bin('6fcc88') . '.png';
191  $subject = new ‪UploadedFile(fopen('php://temp', 'wb+'), 0, 0, $clientFileName);
192  self::assertSame(hex2bin('c3b6') . '.png', $subject->getClientFilename());
193  }
194 }
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\moveToCannotBeCalledMoreThanOnce
‪moveToCannotBeCalledMoreThanOnce()
Definition: UploadedFileTest.php:151
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\moveToMovesFileToDesignatedPath
‪moveToMovesFileToDesignatedPath()
Definition: UploadedFileTest.php:122
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest
Definition: UploadedFileTest.php:26
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\$tmpFile
‪$tmpFile
Definition: UploadedFileTest.php:27
‪TYPO3\CMS\Core\Tests\Unit\Http
Definition: ApplicationTypeTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\getStreamReturnsOriginalStreamObject
‪getStreamReturnsOriginalStreamObject()
Definition: UploadedFileTest.php:89
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\setUp
‪setUp()
Definition: UploadedFileTest.php:29
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\constructorRaisesExceptionOnInvalidStreamOrFile
‪constructorRaisesExceptionOnInvalidStreamOrFile($streamOrFile)
Definition: UploadedFileTest.php:61
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\getGetStreamRaisesExceptionAfterMove
‪getGetStreamRaisesExceptionAfterMove()
Definition: UploadedFileTest.php:169
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\nfdFileNameIsNormalized
‪nfdFileNameIsNormalized()
Definition: UploadedFileTest.php:188
‪TYPO3\CMS\Core\Http\Stream
Definition: Stream.php:31
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\constructorRaisesExceptionOnInvalidErrorStatus
‪constructorRaisesExceptionOnInvalidErrorStatus($status)
Definition: UploadedFileTest.php:79
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\moveToRaisesExceptionForEmptyPath
‪moveToRaisesExceptionForEmptyPath()
Definition: UploadedFileTest.php:138
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\invalidStreamsDataProvider
‪static invalidStreamsDataProvider()
Definition: UploadedFileTest.php:43
‪TYPO3\CMS\Core\Http\UploadedFile
Definition: UploadedFile.php:34
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\tearDown
‪tearDown()
Definition: UploadedFileTest.php:35
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\invalidErrorStatusesDataProvider
‪static invalidErrorStatusesDataProvider()
Definition: UploadedFileTest.php:67
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\getStreamReturnsWrappedPhpStream
‪getStreamReturnsWrappedPhpStream()
Definition: UploadedFileTest.php:99
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\getStreamReturnsStreamForFile
‪getStreamReturnsStreamForFile()
Definition: UploadedFileTest.php:110