‪TYPO3CMS  11.5
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 
30 class ‪UploadedFileTest extends UnitTestCase
31 {
32  protected ‪$tmpFile;
33 
34  protected function ‪setUp(): void
35  {
36  parent::setUp();
37  $this->tmpFile = null;
38  }
39 
40  protected function ‪tearDown(): void
41  {
42  if (is_string($this->tmpFile) && file_exists($this->tmpFile)) {
43  unlink($this->tmpFile);
44  }
45  parent::tearDown();
46  }
47 
51  public function ‪invalidStreamsDataProvider(): array
52  {
53  return [
54  'null' => [null],
55  'true' => [true],
56  'false' => [false],
57  'int' => [1],
58  'float' => [1.1],
59  /* Have not figured out a valid way to test an invalid path yet; null byte injection
60  * appears to get caught by fopen()
61  'invalid-path' => [ ('WIN' === strtoupper(substr(PHP_OS, 0, 3))) ? '[:]' : 'foo' . "\0" ],
62  */
63  'array' => [['filename']],
64  'object' => [(object)['filename']],
65  ];
66  }
67 
72  public function ‪constructorRaisesExceptionOnInvalidStreamOrFile($streamOrFile): void
73  {
74  $this->expectException(\InvalidArgumentException::class);
75  new ‪UploadedFile($streamOrFile, 0, UPLOAD_ERR_OK);
76  }
77 
81  public function ‪invalidSizesDataProvider(): array
82  {
83  return [
84  'null' => [null],
85  'true' => [true],
86  'false' => [false],
87  'float' => [1.1],
88  'string' => ['1'],
89  'array' => [[1]],
90  'object' => [(object)[1]],
91  ];
92  }
93 
98  public function ‪constructorRaisesExceptionOnInvalidSize($size): void
99  {
100  $this->expectException(\InvalidArgumentException::class);
101  $this->expectExceptionCode(1436717302);
102  new ‪UploadedFile(fopen('php://temp', 'wb+'), $size, UPLOAD_ERR_OK);
103  }
104 
108  public function ‪invalidErrorStatusesDataProvider(): array
109  {
110  return [
111  'null' => [null],
112  'true' => [true],
113  'false' => [false],
114  'float' => [1.1],
115  'string' => ['1'],
116  'array' => [[1]],
117  'object' => [(object)[1]],
118  'negative' => [-1],
119  'too-big' => [9],
120  ];
121  }
122 
128  {
129  $this->expectException(\InvalidArgumentException::class);
130  $this->expectExceptionCode(1436717303);
131  new ‪UploadedFile(fopen('php://temp', 'wb+'), 0, $status);
132  }
133 
138  {
139  return [
140  'true' => [true],
141  'false' => [false],
142  'int' => [1],
143  'float' => [1.1],
144  'array' => [['string']],
145  'object' => [(object)['string']],
146  ];
147  }
148 
154  {
155  $this->expectException(\InvalidArgumentException::class);
156  $this->expectExceptionCode(1436717304);
157  new ‪UploadedFile(fopen('php://temp', 'wb+'), 0, UPLOAD_ERR_OK, $filename);
158  }
159 
165  {
166  $this->expectException(\InvalidArgumentException::class);
167  $this->expectExceptionCode(1436717305);
168  new ‪UploadedFile(fopen('php://temp', 'wb+'), 0, UPLOAD_ERR_OK, 'foobar.baz', $mediaType);
169  }
170 
175  {
176  $stream = new ‪Stream('php://temp');
177  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
178  self::assertSame($stream, $upload->getStream());
179  }
180 
184  public function ‪getStreamReturnsWrappedPhpStream(): void
185  {
186  $stream = fopen('php://temp', 'wb+');
187  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
188  $uploadStream = $upload->getStream()->detach();
189  self::assertSame($stream, $uploadStream);
190  }
191 
195  public function ‪getStreamReturnsStreamForFile(): void
196  {
197  $this->tmpFile = $stream = tempnam(sys_get_temp_dir(), 'phly');
198  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
199  $uploadStream = $upload->getStream();
200  $r = new \ReflectionProperty($uploadStream, 'stream');
201  $r->setAccessible(true);
202  self::assertSame($stream, $r->getValue($uploadStream));
203  }
204 
208  public function ‪moveToMovesFileToDesignatedPath(): void
209  {
210  $stream = new ‪Stream('php://temp', 'wb+');
211  $stream->write('Foo bar!');
212  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
213 
214  $this->tmpFile = $to = GeneralUtility::tempnam('psr7');
215  $upload->moveTo($to);
216  self::assertFileExists($to);
217  $contents = file_get_contents($to);
218  self::assertEquals($stream->__toString(), $contents);
219  }
220 
224  public function ‪invalidMovePathsDataProvider(): array
225  {
226  return [
227  'null' => [null],
228  'true' => [true],
229  'false' => [false],
230  'int' => [1],
231  'float' => [1.1],
232  'empty' => [''],
233  'array' => [['filename']],
234  'object' => [(object)['filename']],
235  ];
236  }
237 
242  public function ‪moveToRaisesExceptionForInvalidPath($path): void
243  {
244  $stream = new ‪Stream('php://temp', 'wb+');
245  $stream->write('Foo bar!');
246  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
247 
248  $this->tmpFile = $path;
249  $this->expectException(\InvalidArgumentException::class);
250  $this->expectExceptionCode(1436717307);
251  $upload->moveTo($path);
252  }
253 
257  public function ‪moveToCannotBeCalledMoreThanOnce(): void
258  {
259  $stream = new ‪Stream('php://temp', 'wb+');
260  $stream->write('Foo bar!');
261  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
262 
263  $this->tmpFile = $to = GeneralUtility::tempnam('psr7');
264  $upload->moveTo($to);
265  self::assertFileExists($to);
266 
267  $this->expectException(\RuntimeException::class);
268  $this->expectExceptionCode(1436717308);
269  $upload->moveTo($to);
270  }
271 
276  {
277  $stream = new ‪Stream('php://temp', 'wb+');
278  $stream->write('Foo bar!');
279  $upload = new ‪UploadedFile($stream, 0, UPLOAD_ERR_OK);
280 
281  $this->tmpFile = $to = GeneralUtility::tempnam('psr7');
282  $upload->moveTo($to);
283  self::assertFileExists($to);
284 
285  $this->expectException(\RuntimeException::class);
286  $this->expectExceptionCode(1436717306);
287  $upload->getStream();
288  }
289 
294  public function ‪nfdFileNameIsNormalized(): void
295  {
296  $clientFileName = hex2bin('6fcc88') . '.png';
297  $subject = new ‪UploadedFile(fopen('php://temp', 'wb+'), 0, 0, $clientFileName);
298  self::assertSame(hex2bin('c3b6') . '.png', $subject->getClientFilename());
299  }
300 }
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\moveToCannotBeCalledMoreThanOnce
‪moveToCannotBeCalledMoreThanOnce()
Definition: UploadedFileTest.php:257
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\constructorRaisesExceptionOnInvalidClientFilename
‪constructorRaisesExceptionOnInvalidClientFilename($filename)
Definition: UploadedFileTest.php:153
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\moveToMovesFileToDesignatedPath
‪moveToMovesFileToDesignatedPath()
Definition: UploadedFileTest.php:208
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest
Definition: UploadedFileTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\$tmpFile
‪$tmpFile
Definition: UploadedFileTest.php:32
‪TYPO3\CMS\Core\Tests\Unit\Http
Definition: ApplicationTypeTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\constructorRaisesExceptionOnInvalidClientMediaType
‪constructorRaisesExceptionOnInvalidClientMediaType($mediaType)
Definition: UploadedFileTest.php:164
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\getStreamReturnsOriginalStreamObject
‪getStreamReturnsOriginalStreamObject()
Definition: UploadedFileTest.php:174
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\invalidMovePathsDataProvider
‪array invalidMovePathsDataProvider()
Definition: UploadedFileTest.php:224
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\setUp
‪setUp()
Definition: UploadedFileTest.php:34
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\moveToRaisesExceptionForInvalidPath
‪moveToRaisesExceptionForInvalidPath($path)
Definition: UploadedFileTest.php:242
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\invalidFilenamesAndMediaTypesDataProvider
‪array invalidFilenamesAndMediaTypesDataProvider()
Definition: UploadedFileTest.php:137
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\constructorRaisesExceptionOnInvalidStreamOrFile
‪constructorRaisesExceptionOnInvalidStreamOrFile($streamOrFile)
Definition: UploadedFileTest.php:72
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\getGetStreamRaisesExceptionAfterMove
‪getGetStreamRaisesExceptionAfterMove()
Definition: UploadedFileTest.php:275
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\nfdFileNameIsNormalized
‪nfdFileNameIsNormalized()
Definition: UploadedFileTest.php:294
‪TYPO3\CMS\Core\Http\Stream
Definition: Stream.php:29
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\constructorRaisesExceptionOnInvalidErrorStatus
‪constructorRaisesExceptionOnInvalidErrorStatus($status)
Definition: UploadedFileTest.php:127
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\invalidStreamsDataProvider
‪array invalidStreamsDataProvider()
Definition: UploadedFileTest.php:51
‪TYPO3\CMS\Core\Http\UploadedFile
Definition: UploadedFile.php:31
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\tearDown
‪tearDown()
Definition: UploadedFileTest.php:40
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\constructorRaisesExceptionOnInvalidSize
‪constructorRaisesExceptionOnInvalidSize($size)
Definition: UploadedFileTest.php:98
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\getStreamReturnsWrappedPhpStream
‪getStreamReturnsWrappedPhpStream()
Definition: UploadedFileTest.php:184
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\invalidSizesDataProvider
‪array invalidSizesDataProvider()
Definition: UploadedFileTest.php:81
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\invalidErrorStatusesDataProvider
‪array invalidErrorStatusesDataProvider()
Definition: UploadedFileTest.php:108
‪TYPO3\CMS\Core\Tests\Unit\Http\UploadedFileTest\getStreamReturnsStreamForFile
‪getStreamReturnsStreamForFile()
Definition: UploadedFileTest.php:195