From 4fb5c877f6efb688106069ee914793d8e7a5497e Mon Sep 17 00:00:00 2001 From: Kunal Mehta Date: Sat, 28 Mar 2015 21:24:31 -0700 Subject: [PATCH] Don't trigger MessageBlobStore during tests The test for OutputPage::makeResourceLoaderLink was triggering database queries through MessageBlobStore even though it doesn't use any messages. In bb03d1a8e08 I had made MessageBlobStore a singleton instead of static functions, however there's no need for it to be one since the class is stateless. Callers can just create a new MessageBlobStore instance and call functions upon it. Using getInstance() is now deprecated. ResourceLoader now has a setMessageBlobStore setter to allow overriding which MessageBlobStore instance will be used. OutputPageTest uses this to set a NullMessageBlobStore, which makes no database queries. Change-Id: Ica7436fb6f1ea59bd445b02527829ab0742c0842 --- includes/MessageBlobStore.php | 9 +++----- includes/cache/LocalisationCache.php | 3 ++- includes/cache/MessageCache.php | 3 ++- includes/installer/DatabaseUpdater.php | 3 ++- includes/resourceloader/ResourceLoader.php | 16 ++++++++++++++- tests/phpunit/includes/OutputPageTest.php | 24 ++++++++++++++++++++++ 6 files changed, 48 insertions(+), 10 deletions(-) diff --git a/includes/MessageBlobStore.php b/includes/MessageBlobStore.php index c3841882bf..011cae6629 100644 --- a/includes/MessageBlobStore.php +++ b/includes/MessageBlobStore.php @@ -36,15 +36,12 @@ class MessageBlobStore { * Get the singleton instance * * @since 1.24 + * @deprecated since 1.25 * @return MessageBlobStore */ public static function getInstance() { - static $instance = null; - if ( $instance === null ) { - $instance = new self; - } - - return $instance; + wfDeprecated( __METHOD__, '1.25' ); + return new self; } /** diff --git a/includes/cache/LocalisationCache.php b/includes/cache/LocalisationCache.php index e270f5f46a..dc5a2eb6bc 100644 --- a/includes/cache/LocalisationCache.php +++ b/includes/cache/LocalisationCache.php @@ -1020,7 +1020,8 @@ class LocalisationCache { # HACK: If using a null (i.e. disabled) storage backend, we # can't write to the MessageBlobStore either if ( $purgeBlobs && !$this->store instanceof LCStoreNull ) { - MessageBlobStore::getInstance()->clear(); + $blobStore = new MessageBlobStore(); + $blobStore->clear(); } } diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index 04f588776f..82919c7409 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -562,7 +562,8 @@ class MessageCache { // Update the message in the message blob store global $wgContLang; - MessageBlobStore::getInstance()->updateMessage( $wgContLang->lcfirst( $msg ) ); + $blobStore = new MessageBlobStore(); + $blobStore->updateMessage( $wgContLang->lcfirst( $msg ) ); Hooks::run( 'MessageCacheReplace', array( $title, $text ) ); diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php index b676f45ccf..12ef91a3a7 100644 --- a/includes/installer/DatabaseUpdater.php +++ b/includes/installer/DatabaseUpdater.php @@ -932,7 +932,8 @@ abstract class DatabaseUpdater { if ( $wgLocalisationCacheConf['manualRecache'] ) { $this->rebuildLocalisationCache(); } - MessageBlobStore::getInstance()->clear(); + $blobStore = new MessageBlobStore(); + $blobStore->clear(); $this->output( "done.\n" ); } diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 5eab3cb66b..b9d1b2bd12 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -72,6 +72,11 @@ class ResourceLoader { */ protected $errors = array(); + /** + * @var MessageBlobStore + */ + protected $blobStore; + /** * Load information stored in the database about modules. * @@ -250,6 +255,7 @@ class ResourceLoader { $this->registerTestModules(); } + $this->setMessageBlobStore( new MessageBlobStore() ); } /** @@ -259,6 +265,14 @@ class ResourceLoader { return $this->config; } + /** + * @param MessageBlobStore $blobStore + * @since 1.25 + */ + public function setMessageBlobStore( MessageBlobStore $blobStore ) { + $this->blobStore = $blobStore; + } + /** * Register a module with the ResourceLoader system. * @@ -885,7 +899,7 @@ MESSAGE; // Pre-fetch blobs if ( $context->shouldIncludeMessages() ) { try { - $blobs = MessageBlobStore::getInstance()->get( $this, $modules, $context->getLanguage() ); + $blobs = $this->blobStore->get( $this, $modules, $context->getLanguage() ); } catch ( Exception $e ) { MWExceptionHandler::logException( $e ); wfDebugLog( diff --git a/tests/phpunit/includes/OutputPageTest.php b/tests/phpunit/includes/OutputPageTest.php index 2526fccd83..ee6a8cfc22 100644 --- a/tests/phpunit/includes/OutputPageTest.php +++ b/tests/phpunit/includes/OutputPageTest.php @@ -239,6 +239,7 @@ document.write("\u003Cscript src=\"http://127.0.0.1:8080/w/load.php?debug=false\ $ctx->setLanguage( 'en' ); $out = new OutputPage( $ctx ); $rl = $out->getResourceLoader(); + $rl->setMessageBlobStore( new NullMessageBlobStore() ); $rl->register( array( 'test.foo' => new ResourceLoaderTestModule( array( 'script' => 'mw.test.foo( { a: true } );', @@ -280,3 +281,26 @@ document.write("\u003Cscript src=\"http://127.0.0.1:8080/w/load.php?debug=false\ $this->assertEquals( $expectedHtml, $actualHtml ); } } + +/** + * MessageBlobStore that doesn't do anything + */ +class NullMessageBlobStore extends MessageBlobStore { + public function get ( ResourceLoader $resourceLoader, $modules, $lang ) { + return array(); + } + + public function insertMessageBlob ( $name, ResourceLoaderModule $module, $lang ) { + return false; + } + + public function updateModule ( $name, ResourceLoaderModule $module, $lang ) { + return; + } + + public function updateMessage ( $key ) { + } + public function clear() { + } +} + -- 2.20.1