]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - tests/phpunit/includes/media/WebPTest.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / tests / phpunit / includes / media / WebPTest.php
1 <?php
2 class WebPHandlerTest extends MediaWikiTestCase {
3         public function setUp() {
4                 parent::setUp();
5                 // Allocated file for testing
6                 $this->tempFileName = tempnam( wfTempDir(), 'WEBP' );
7         }
8         public function tearDown() {
9                 parent::tearDown();
10                 unlink( $this->tempFileName );
11         }
12         /**
13          * @dataProvider provideTestExtractMetaData
14          */
15         public function testExtractMetaData( $header, $expectedResult ) {
16                 // Put header into file
17                 file_put_contents( $this->tempFileName, $header );
18
19                 $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $this->tempFileName ) );
20         }
21         public function provideTestExtractMetaData() {
22                 // @codingStandardsIgnoreStart Generic.Files.LineLength
23                 return [
24                         // Files from https://developers.google.com/speed/webp/gallery2
25                         [ "\x52\x49\x46\x46\x90\x68\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x83\x68\x01\x00\x2F\x8F\x01\x4B\x10\x8D\x38\x6C\xDB\x46\x92\xE0\xE0\x82\x7B\x6C",
26                                 [ 'compression' => 'lossless', 'width' => 400, 'height' => 301 ] ],
27                         [ "\x52\x49\x46\x46\x64\x5B\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x8F\x01\x00\x2C\x01\x00\x41\x4C\x50\x48\xE5\x0E",
28                                 [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 400, 'height' => 301 ] ],
29                         [ "\x52\x49\x46\x46\xA8\x72\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x9B\x72\x00\x00\x2F\x81\x81\x62\x10\x8D\x40\x8C\x24\x39\x6E\x73\x73\x38\x01\x96",
30                                 [ 'compression' => 'lossless', 'width' => 386, 'height' => 395 ] ],
31                         [ "\x52\x49\x46\x46\xE0\x42\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x81\x01\x00\x8A\x01\x00\x41\x4C\x50\x48\x56\x10",
32                                 [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 386, 'height' => 395 ] ],
33                         [ "\x52\x49\x46\x46\x70\x61\x02\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x63\x61\x02\x00\x2F\x1F\xC3\x95\x10\x8D\xC8\x72\xDB\xC8\x92\x24\xD8\x91\xD9\x91",
34                                 [ 'compression' => 'lossless', 'width' => 800, 'height' => 600 ] ],
35                         [ "\x52\x49\x46\x46\x1C\x1D\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x1F\x03\x00\x57\x02\x00\x41\x4C\x50\x48\x25\x8B",
36                                 [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 800, 'height' => 600 ] ],
37                         [ "\x52\x49\x46\x46\xFA\xC5\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xEE\xC5\x00\x00\x2F\xA4\x81\x28\x10\x8D\x40\x68\x24\xC9\x91\xA4\xAE\xF3\x97\x75",
38                                 [ 'compression' => 'lossless', 'width' => 421, 'height' => 163 ] ],
39                         [ "\x52\x49\x46\x46\xF6\x5D\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\xA4\x01\x00\xA2\x00\x00\x41\x4C\x50\x48\x38\x1A",
40                                 [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 421, 'height' => 163 ] ],
41                         [ "\x52\x49\x46\x46\xC4\x96\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xB8\x96\x01\x00\x2F\x2B\xC1\x4A\x10\x11\x87\x6D\xDB\x48\x12\xFC\x60\xB0\x83\x24",
42                                 [ 'compression' => 'lossless', 'width' => 300, 'height' => 300 ] ],
43                         [ "\x52\x49\x46\x46\x0A\x11\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x2B\x01\x00\x2B\x01\x00\x41\x4C\x50\x48\x67\x6E",
44                                 [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 300, 'height' => 300 ] ],
45
46                         // Lossy files from https://developers.google.com/speed/webp/gallery1
47                         [ "\x52\x49\x46\x46\x68\x76\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\x5C\x76\x00\x00\xD2\xBE\x01\x9D\x01\x2A\x26\x02\x70\x01\x3E\xD5\x4E\x97\x43\xA2",
48                                 [ 'compression' => 'lossy', 'width' => 550, 'height' => 368 ] ],
49                         [ "\x52\x49\x46\x46\xB0\xEC\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\xA4\xEC\x00\x00\xB2\x4B\x02\x9D\x01\x2A\x26\x02\x94\x01\x3E\xD1\x50\x96\x46\x26",
50                                 [ 'compression' => 'lossy', 'width' => 550, 'height' => 404 ] ],
51                         [ "\x52\x49\x46\x46\x7A\x19\x03\x00\x57\x45\x42\x50\x56\x50\x38\x20\x6E\x19\x03\x00\xB2\xF8\x09\x9D\x01\x2A\x00\x05\xD0\x02\x3E\xAD\x46\x99\x4A\xA5",
52                                 [ 'compression' => 'lossy', 'width' => 1280, 'height' => 720 ] ],
53                         [ "\x52\x49\x46\x46\x44\xB3\x02\x00\x57\x45\x42\x50\x56\x50\x38\x20\x38\xB3\x02\x00\x52\x57\x06\x9D\x01\x2A\x00\x04\x04\x03\x3E\xA5\x44\x96\x49\x26",
54                                 [ 'compression' => 'lossy', 'width' => 1024, 'height' => 772 ] ],
55                         [ "\x52\x49\x46\x46\x02\x43\x01\x00\x57\x45\x42\x50\x56\x50\x38\x20\xF6\x42\x01\x00\x12\xC0\x05\x9D\x01\x2A\x00\x04\xF0\x02\x3E\x79\x34\x93\x47\xA4",
56                                 [ 'compression' => 'lossy', 'width' => 1024, 'height' => 752 ] ],
57
58                         // Animated file from https://groups.google.com/a/chromium.org/d/topic/blink-dev/Y8tRC4mdQz8/discussion
59                         [ "\x52\x49\x46\x46\xD0\x0B\x02\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x12\x00\x00\x00\x3F\x01\x00\x3F\x01\x00\x41\x4E",
60                                 [ 'compression' => 'unknown', 'animated' => true, 'transparency' => true, 'width' => 320, 'height' => 320 ] ],
61
62                         // Error cases
63                         [ '', false ],
64                         [ '                                    ', false ],
65                         [ 'RIFF                                ', false ],
66                         [ 'RIFF1234WEBP                        ', false ],
67                         [ 'RIFF1234WEBPVP8                     ', false ],
68                         [ 'RIFF1234WEBPVP8L                    ', false ],
69                 ];
70                 // @codingStandardsIgnoreEnd
71         }
72
73         /**
74          * @dataProvider provideTestWithFileExtractMetaData
75          */
76         public function testWithFileExtractMetaData( $filename, $expectedResult ) {
77                 $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $filename ) );
78         }
79         public function provideTestWithFileExtractMetaData() {
80                 return [
81                         [ __DIR__ . '/../../data/media/2_webp_ll.webp',
82                                 [
83                                         'compression' => 'lossless',
84                                         'width' => 386,
85                                         'height' => 395
86                                 ]
87                         ],
88                         [ __DIR__ . '/../../data/media/2_webp_a.webp',
89                                 [
90                                         'compression' => 'lossy',
91                                         'animated' => false,
92                                         'transparency' => true,
93                                         'width' => 386,
94                                         'height' => 395
95                                 ]
96                         ],
97                 ];
98         }
99
100         /**
101          * @dataProvider provideTestGetImageSize
102          */
103         public function testGetImageSize( $path, $expectedResult ) {
104                 $handler = new WebPHandler();
105                 $this->assertEquals( $expectedResult, $handler->getImageSize( null, $path ) );
106         }
107         public function provideTestGetImageSize() {
108                 return [
109                         // Public domain files from https://developers.google.com/speed/webp/gallery2
110                         [ __DIR__ . '/../../data/media/2_webp_a.webp', [ 386, 395 ] ],
111                         [ __DIR__ . '/../../data/media/2_webp_ll.webp', [ 386, 395 ] ],
112                         [ __DIR__ . '/../../data/media/webp_animated.webp', [ 300, 225 ] ],
113
114                         // Error cases
115                         [ __FILE__, false ],
116                 ];
117         }
118
119         /**
120          * Tests the WebP MIME detection. This should really be a separate test, but sticking it
121          * here for now.
122          *
123          * @dataProvider provideTestGetMimeType
124          */
125         public function testGuessMimeType( $path ) {
126                 $mime = MimeMagic::singleton();
127                 $this->assertEquals( 'image/webp', $mime->guessMimeType( $path, false ) );
128         }
129         public function provideTestGetMimeType() {
130                 return [
131                                 // Public domain files from https://developers.google.com/speed/webp/gallery2
132                                 [ __DIR__ . '/../../data/media/2_webp_a.webp' ],
133                                 [ __DIR__ . '/../../data/media/2_webp_ll.webp' ],
134                                 [ __DIR__ . '/../../data/media/webp_animated.webp' ],
135                 ];
136         }
137 }
138
139 /* Python code to extract a header and convert to PHP format:
140  * print '"%s"' % ''.implode( '\\x%02X' % ord(c) for c in urllib.urlopen(url).read(36) )
141  */