Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F2750981
JpegMetadataExtractorTest.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
JpegMetadataExtractorTest.php
View Options
<?php
/**
* @todo Could use a test of extended XMP segments. Hard to find programs that
* create example files, and creating my own in vim probably wouldn't
* serve as a very good "test". (Adobe photoshop probably creates such files
* but it costs money). The implementation of it currently in MediaWiki is based
* solely on reading the standard, without any real world test files.
*
* @group Media
* @covers \JpegMetadataExtractor
*/
class
JpegMetadataExtractorTest
extends
MediaWikiIntegrationTestCase
{
private
const
FILE_PATH
=
__DIR__
.
'/../../data/media/'
;
/**
* We also use this test to test padding bytes don't
* screw stuff up
*
* @param string $file Filename
*
* @dataProvider provideUtf8Comment
*/
public
function
testUtf8Comment
(
$file
)
{
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
$file
);
$this
->
assertEquals
(
[
'UTF-8 JPEG Comment — ¼'
],
$res
[
'COM'
]
);
}
public
static
function
provideUtf8Comment
()
{
return
[
[
'jpeg-comment-utf.jpg'
],
[
'jpeg-padding-even.jpg'
],
[
'jpeg-padding-odd.jpg'
],
];
}
/** The file is iso-8859-1, but it should get auto converted */
public
function
testIso88591Comment
()
{
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-comment-iso8859-1.jpg'
);
$this
->
assertEquals
(
[
'ISO-8859-1 JPEG Comment - ¼'
],
$res
[
'COM'
]
);
}
/** Comment values that are non-textual (random binary junk) should not be shown.
* The example test file has a comment with a 0x5 byte in it which is a control character
* and considered binary junk for our purposes.
*/
public
function
testBinaryCommentStripped
()
{
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-comment-binary.jpg'
);
$this
->
assertSame
(
[],
$res
[
'COM'
]
);
}
/* Very rarely a file can have multiple comments.
* Order of comments is based on order inside the file.
*/
public
function
testMultipleComment
()
{
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-comment-multiple.jpg'
);
$this
->
assertEquals
(
[
'foo'
,
'bar'
],
$res
[
'COM'
]
);
}
public
function
testXMPExtraction
()
{
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-xmp-psir.jpg'
);
$expected
=
file_get_contents
(
self
::
FILE_PATH
.
'jpeg-xmp-psir.xmp'
);
$this
->
assertEquals
(
$expected
,
$res
[
'XMP'
]
);
}
public
function
testPSIRExtraction
()
{
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-xmp-psir.jpg'
);
$expected
=
'50686f746f73686f7020332e30003842494d04040000000'
.
'000181c02190004746573741c02190003666f6f1c020000020004'
;
$this
->
assertEquals
(
$expected
,
bin2hex
(
$res
[
'PSIR'
][
0
]
)
);
}
public
function
testXMPExtractionNullChar
()
{
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-xmp-nullchar.jpg'
);
$expected
=
file_get_contents
(
self
::
FILE_PATH
.
'jpeg-xmp-psir.xmp'
);
$this
->
assertEquals
(
$expected
,
$res
[
'XMP'
]
);
}
public
function
testXMPExtractionAltAppId
()
{
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-xmp-alt.jpg'
);
$expected
=
file_get_contents
(
self
::
FILE_PATH
.
'jpeg-xmp-psir.xmp'
);
$this
->
assertEquals
(
$expected
,
$res
[
'XMP'
]
);
}
public
function
testIPTCHashComparisionNoHash
()
{
$segments
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-xmp-psir.jpg'
);
$res
=
JpegMetadataExtractor
::
doPSIR
(
$segments
[
'PSIR'
][
0
]
);
$this
->
assertEquals
(
'iptc-no-hash'
,
$res
);
}
public
function
testIPTCHashComparisionBadHash
()
{
$segments
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-iptc-bad-hash.jpg'
);
$res
=
JpegMetadataExtractor
::
doPSIR
(
$segments
[
'PSIR'
][
0
]
);
$this
->
assertEquals
(
'iptc-bad-hash'
,
$res
);
}
public
function
testIPTCHashComparisionGoodHash
()
{
$segments
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-iptc-good-hash.jpg'
);
$res
=
JpegMetadataExtractor
::
doPSIR
(
$segments
[
'PSIR'
][
0
]
);
$this
->
assertEquals
(
'iptc-good-hash'
,
$res
);
}
public
function
testExifByteOrder
()
{
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'exif-user-comment.jpg'
);
$expected
=
'BE'
;
$this
->
assertEquals
(
$expected
,
$res
[
'byteOrder'
]
);
}
public
function
testInfiniteRead
()
{
// test file truncated right after a segment, which previously
// caused an infinite loop looking for the next segment byte.
// Should get past infinite loop and throw in StringUtils::unpack()
$this
->
expectException
(
InvalidJpegException
::
class
);
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-segment-loop1.jpg'
);
}
public
function
testInfiniteRead2
()
{
// test file truncated after a segment's marker and size, which
// would cause a seek past end of file. Seek past end of file
// doesn't actually fail, but prevents further reading and was
// devolving into the previous case (testInfiniteRead).
$this
->
expectException
(
InvalidJpegException
::
class
);
$res
=
JpegMetadataExtractor
::
segmentSplitter
(
self
::
FILE_PATH
.
'jpeg-segment-loop2.jpg'
);
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Fri, Jul 3, 17:36 (13 h, 23 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
31/ac/45fb6a93ed38d8d059dcad66345b
Default Alt Text
JpegMetadataExtractorTest.php (4 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment