From d6bc1b25899834be9b87e64ffb69007fb89dc52c Mon Sep 17 00:00:00 2001 From: Matthias Mullie Date: Tue, 11 Jul 2017 16:35:49 +0200 Subject: [PATCH] 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 --- RELEASE-NOTES-1.30 | 2 + includes/DefaultSettings.php | 17 +++ tests/common/TestsAutoLoader.php | 2 - tests/parser/ParserTestRunner.php | 5 +- .../GlobalFunctions/wfThumbIsStandardTest.php | 7 +- .../includes/media/FakeDimensionFile.php | 9 +- .../mocks/media/MockMediaHandlerFactory.php | 51 --------- tests/phpunit/mocks/media/MockOggHandler.php | 105 ------------------ 8 files changed, 35 insertions(+), 163 deletions(-) delete mode 100644 tests/phpunit/mocks/media/MockMediaHandlerFactory.php delete mode 100644 tests/phpunit/mocks/media/MockOggHandler.php diff --git a/RELEASE-NOTES-1.30 b/RELEASE-NOTES-1.30 index 9c4bcf044c..e8d9b48a3b 100644 --- a/RELEASE-NOTES-1.30 +++ b/RELEASE-NOTES-1.30 @@ -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 === diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 7fa55bc5d7..4e162f6ef5 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -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 diff --git a/tests/common/TestsAutoLoader.php b/tests/common/TestsAutoLoader.php index 9b9ea6d7d3..8f752df68b 100644 --- a/tests/common/TestsAutoLoader.php +++ b/tests/common/TestsAutoLoader.php @@ -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", diff --git a/tests/parser/ParserTestRunner.php b/tests/parser/ParserTestRunner.php index c2f396be8d..1d53344203 100644 --- a/tests/parser/ParserTestRunner.php +++ b/tests/parser/ParserTestRunner.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 () { diff --git a/tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php b/tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php index 9d9815b798..bdba6a355e 100644 --- a/tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php +++ b/tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php @@ -1,5 +1,7 @@ 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 ); } diff --git a/tests/phpunit/includes/media/FakeDimensionFile.php b/tests/phpunit/includes/media/FakeDimensionFile.php index 4b8f213eaa..81e820e0d6 100644 --- a/tests/phpunit/includes/media/FakeDimensionFile.php +++ b/tests/phpunit/includes/media/FakeDimensionFile.php @@ -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; + } } diff --git a/tests/phpunit/mocks/media/MockMediaHandlerFactory.php b/tests/phpunit/mocks/media/MockMediaHandlerFactory.php deleted file mode 100644 index 54d46b0271..0000000000 --- a/tests/phpunit/mocks/media/MockMediaHandlerFactory.php +++ /dev/null @@ -1,51 +0,0 @@ - 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; - } - -} diff --git a/tests/phpunit/mocks/media/MockOggHandler.php b/tests/phpunit/mocks/media/MockOggHandler.php deleted file mode 100644 index bb686fd846..0000000000 --- a/tests/phpunit/mocks/media/MockOggHandler.php +++ /dev/null @@ -1,105 +0,0 @@ -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; - } -} -- 2.20.1