Remove test code that depends on extension
And allow extensions to add their own media handlers. I'm not too happy with the introduction of another global, but didn't like the alternatives either: * Add some hook to MockMediaHandlerFactory that would allow extensions to add their own stuff in. * Use another hook (like ParserTestTables or ParserTestGlobals) and then override the service with a new instance - seemed too hacky The good thing about this is that it lets us kill off a class. I'm other to other suggestions in case I missed something. Bug: T169258 Depends-On: I5875621c58597426ad5242bf3d07714555c439b5 Change-Id: I1c2e903fb235395a8de8e0f7bf65ce07739d2930
This commit is contained in:
parent
700e49dddd
commit
d6bc1b2589
8 changed files with 35 additions and 163 deletions
|
|
@ -53,6 +53,8 @@ section).
|
|||
'watchlistunwatchlinks' preference option is enabled). With JavaScript
|
||||
enabled, these links toggle so the user can also re-watch pages that have
|
||||
just been unwatched.
|
||||
* Added $wgParserTestMediaHandlers, where mock media handlers can be passed to
|
||||
MediaHandlerFactory for parser tests.
|
||||
|
||||
=== Languages updated in 1.30 ===
|
||||
|
||||
|
|
|
|||
|
|
@ -959,6 +959,23 @@ $wgTrustedMediaFormats = [
|
|||
*/
|
||||
$wgMediaHandlers = [];
|
||||
|
||||
/**
|
||||
* Media handler overrides for parser tests (they don't need to generate actual
|
||||
* thumbnails, so a mock will do)
|
||||
*/
|
||||
$wgParserTestMediaHandlers = [
|
||||
'image/jpeg' => 'MockBitmapHandler',
|
||||
'image/png' => 'MockBitmapHandler',
|
||||
'image/gif' => 'MockBitmapHandler',
|
||||
'image/tiff' => 'MockBitmapHandler',
|
||||
'image/webp' => 'MockBitmapHandler',
|
||||
'image/x-ms-bmp' => 'MockBitmapHandler',
|
||||
'image/x-bmp' => 'MockBitmapHandler',
|
||||
'image/x-xcf' => 'MockBitmapHandler',
|
||||
'image/svg+xml' => 'MockSvgHandler',
|
||||
'image/vnd.djvu' => 'MockDjVuHandler',
|
||||
];
|
||||
|
||||
/**
|
||||
* Plugins for page content model handling.
|
||||
* Each entry in the array maps a model id to a class name or callback
|
||||
|
|
|
|||
|
|
@ -158,8 +158,6 @@ $wgAutoloadClasses += [
|
|||
'MockImageHandler' => "$testDir/phpunit/mocks/media/MockImageHandler.php",
|
||||
'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockSvgHandler.php",
|
||||
'MockDjVuHandler' => "$testDir/phpunit/mocks/media/MockDjVuHandler.php",
|
||||
'MockOggHandler' => "$testDir/phpunit/mocks/media/MockOggHandler.php",
|
||||
'MockMediaHandlerFactory' => "$testDir/phpunit/mocks/media/MockMediaHandlerFactory.php",
|
||||
'MockChangesListFilter' => "$testDir/phpunit/mocks/MockChangesListFilter.php",
|
||||
'MockChangesListFilterGroup' => "$testDir/phpunit/mocks/MockChangesListFilterGroup.php",
|
||||
'MockWebRequest' => "$testDir/phpunit/mocks/MockWebRequest.php",
|
||||
|
|
|
|||
|
|
@ -341,8 +341,9 @@ class ParserTestRunner {
|
|||
MediaWikiServices::getInstance()->disableService( 'MediaHandlerFactory' );
|
||||
MediaWikiServices::getInstance()->redefineService(
|
||||
'MediaHandlerFactory',
|
||||
function () {
|
||||
return new MockMediaHandlerFactory();
|
||||
function ( MediaWikiServices $services ) {
|
||||
$handlers = $services->getMainConfig()->get( 'ParserTestMediaHandlers' );
|
||||
return new MediaHandlerFactory( $handlers );
|
||||
}
|
||||
);
|
||||
$teardown[] = function () {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
use MediaWiki\MediaWikiServices;
|
||||
|
||||
/**
|
||||
* @group GlobalFunctions
|
||||
* @covers ::wfThumbIsStandard
|
||||
|
|
@ -92,10 +94,11 @@ class WfThumbIsStandardTest extends MediaWikiTestCase {
|
|||
* @dataProvider provideThumbParams
|
||||
*/
|
||||
public function testIsStandard( $message, $expected, $params ) {
|
||||
$this->setService( 'MediaHandlerFactory', new MockMediaHandlerFactory() );
|
||||
$handlers = MediaWikiServices::getInstance()->getMainConfig()->get( 'ParserTestMediaHandlers' );
|
||||
$this->setService( 'MediaHandlerFactory', new MediaHandlerFactory( $handlers ) );
|
||||
$this->assertSame(
|
||||
$expected,
|
||||
wfThumbIsStandard( new FakeDimensionFile( [ 2000, 1800 ] ), $params ),
|
||||
wfThumbIsStandard( new FakeDimensionFile( [ 2000, 1800 ], 'image/jpeg' ), $params ),
|
||||
$message
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,12 +5,15 @@
|
|||
*/
|
||||
class FakeDimensionFile extends File {
|
||||
public $mustRender = false;
|
||||
public $mime;
|
||||
public $dimensions;
|
||||
|
||||
public function __construct( $dimensions ) {
|
||||
public function __construct( $dimensions, $mime = 'unknown/unknown' ) {
|
||||
parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
|
||||
new NullRepo( null ) );
|
||||
|
||||
$this->dimensions = $dimensions;
|
||||
$this->mime = $mime;
|
||||
}
|
||||
|
||||
public function getWidth( $page = 1 ) {
|
||||
|
|
@ -28,4 +31,8 @@ class FakeDimensionFile extends File {
|
|||
public function getPath() {
|
||||
return '';
|
||||
}
|
||||
|
||||
public function getMimeType() {
|
||||
return $this->mime;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,51 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Media-handling base classes and generic functionality.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*
|
||||
* @file
|
||||
* @ingroup Media
|
||||
*/
|
||||
|
||||
/**
|
||||
* Replace all media handlers with a mock. We do not need to generate
|
||||
* actual thumbnails to do parser testing, we only care about receiving
|
||||
* a ThumbnailImage properly initialized.
|
||||
*
|
||||
* @since 1.28
|
||||
*/
|
||||
class MockMediaHandlerFactory extends MediaHandlerFactory {
|
||||
|
||||
private static $overrides = [
|
||||
'image/svg+xml' => MockSvgHandler::class,
|
||||
'image/vnd.djvu' => MockDjVuHandler::class,
|
||||
'application/ogg' => MockOggHandler::class,
|
||||
];
|
||||
|
||||
public function __construct() {
|
||||
// override parent
|
||||
}
|
||||
|
||||
protected function getHandlerClass( $type ) {
|
||||
if ( isset( self::$overrides[$type] ) ) {
|
||||
return self::$overrides[$type];
|
||||
}
|
||||
|
||||
return MockBitmapHandler::class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,105 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Fake handler for Ogg videos.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*
|
||||
* @file
|
||||
* @ingroup Media
|
||||
*/
|
||||
|
||||
class MockOggHandler extends OggHandlerTMH {
|
||||
function doTransform( $file, $dstPath, $dstUrl, $params, $flags = 0 ) {
|
||||
# Important or height handling is wrong.
|
||||
if ( !$this->normaliseParams( $file, $params ) ) {
|
||||
return new TransformParameterError( $params );
|
||||
}
|
||||
|
||||
$srcWidth = $file->getWidth();
|
||||
$srcHeight = $file->getHeight();
|
||||
|
||||
// Audio should not be transformed by size, give it a default width and height
|
||||
if ( $this->isAudio( $file ) ) {
|
||||
$srcWidth = 220;
|
||||
$srcHeight = 23;
|
||||
}
|
||||
|
||||
$params['width'] = isset( $params['width'] ) ? $params['width'] : $srcWidth;
|
||||
|
||||
// if height overtakes width use height as max:
|
||||
$targetWidth = $params['width'];
|
||||
$targetHeight = $srcWidth == 0 ? $srcHeight : round( $params['width'] * $srcHeight / $srcWidth );
|
||||
if ( isset( $params['height'] ) && $targetHeight > $params['height'] ) {
|
||||
$targetHeight = $params['height'];
|
||||
$targetWidth = round( $params['height'] * $srcWidth / $srcHeight );
|
||||
}
|
||||
$options = [
|
||||
'file' => $file,
|
||||
'length' => $this->getLength( $file ),
|
||||
'offset' => $this->getOffset( $file ),
|
||||
'width' => $targetWidth,
|
||||
'height' => $targetHeight,
|
||||
'isVideo' => !$this->isAudio( $file ),
|
||||
'thumbtime' => isset(
|
||||
$params['thumbtime']
|
||||
) ? $params['thumbtime'] : intval( $file->getLength() / 2 ),
|
||||
'start' => isset( $params['start'] ) ? $params['start'] : false,
|
||||
'end' => isset( $params['end'] ) ? $params['end'] : false,
|
||||
'fillwindow' => isset( $params['fillwindow'] ) ? $params['fillwindow'] : false,
|
||||
'disablecontrols' => isset( $params['disablecontrols'] ) ? $params['disablecontrols'] : false
|
||||
];
|
||||
|
||||
// No thumbs for audio
|
||||
if ( !$options['isVideo'] ) {
|
||||
return new TimedMediaTransformOutput( $options );
|
||||
}
|
||||
|
||||
// Setup pointer to thumb arguments
|
||||
$options[ 'thumbUrl' ] = $dstUrl;
|
||||
$options[ 'dstPath' ] = $dstPath;
|
||||
$options[ 'path' ] = $dstPath;
|
||||
|
||||
return new TimedMediaTransformOutput( $options );
|
||||
}
|
||||
|
||||
function getLength( $file ) {
|
||||
if ( $this->isAudio( $file ) ) {
|
||||
return 0.99875;
|
||||
}
|
||||
return 4.3666666666667;
|
||||
}
|
||||
|
||||
function getBitRate( $file ) {
|
||||
if ( $this->isAudio( $file ) ) {
|
||||
return 41107;
|
||||
}
|
||||
return 590013;
|
||||
}
|
||||
|
||||
function getWebType( $file ) {
|
||||
if ( $this->isAudio( $file ) ) {
|
||||
return "audio/ogg; codecs=\"vorbis\"";
|
||||
}
|
||||
return "video/ogg; codecs=\"theora\"";
|
||||
}
|
||||
|
||||
function getFramerate( $file ) {
|
||||
if ( $this->isAudio( $file ) ) {
|
||||
return 0;
|
||||
}
|
||||
return 30;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue