Merge "Disallow overriding services that were set"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 4 Oct 2018 16:20:25 +0000 (16:20 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 4 Oct 2018 16:20:25 +0000 (16:20 +0000)
tests/phpunit/MediaWikiTestCase.php

index dd85cc2..dfd4309 100644 (file)
@@ -112,6 +112,13 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
         */
        private $cliArgs = [];
 
+       /**
+        * Holds a list of services that were overridden with setService().  Used for printing an error
+        * if overrideMwServices() overrides a service that was previously set.
+        * @var string[]
+        */
+       private $overriddenServices = [];
+
        /**
         * Table name prefixes. Oracle likes it shorter.
         */
@@ -408,6 +415,9 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
 
                parent::run( $result );
 
+               // We don't mind if we override already-overridden services during cleanup
+               $this->overriddenServices = [];
+
                if ( $needsResetDB ) {
                        $this->resetDB( $this->db, $this->tablesUsed );
                }
@@ -486,6 +496,8 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
 
                $this->phpErrorLevel = intval( ini_get( 'error_reporting' ) );
 
+               $this->overriddenServices = [];
+
                // Cleaning up temporary files
                foreach ( $this->tmpFiles as $fileName ) {
                        if ( is_file( $fileName ) || ( is_link( $fileName ) ) ) {
@@ -630,6 +642,8 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                                . 'instance has been replaced by test code.' );
                }
 
+               $this->overriddenServices[] = $name;
+
                $this->localServices->disableService( $name );
                $this->localServices->redefineService(
                        $name,
@@ -891,6 +905,12 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
        protected function overrideMwServices(
                Config $configOverrides = null, array $services = []
        ) {
+               if ( $this->overriddenServices ) {
+                       throw new MWException(
+                               'The following services were set and are now being unset by overrideMwServices: ' .
+                                       implode( ', ', $this->overriddenServices )
+                       );
+               }
                $newInstance = self::installMockMwServices( $configOverrides );
 
                if ( $this->localServices ) {
@@ -1013,14 +1033,17 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
         */
        public function setContentLang( $lang ) {
                if ( $lang instanceof Language ) {
-                       $langCode = $lang->getCode();
-                       $langObj = $lang;
+                       $this->setMwGlobals( 'wgLanguageCode', $lang->getCode() );
+                       // Set to the exact object requested
+                       $this->setService( 'ContentLanguage', $lang );
                } else {
-                       $langCode = $lang;
-                       $langObj = Language::factory( $langCode );
+                       $this->setMwGlobals( 'wgLanguageCode', $lang );
+                       // Let the service handler make up the object.  Avoid calling setService(), because if
+                       // we do, overrideMwServices() will complain if it's called later on.
+                       $services = MediaWikiServices::getInstance();
+                       $services->resetServiceForTesting( 'ContentLanguage' );
+                       $this->doSetMwGlobals( [ 'wgContLang' => $services->getContentLanguage() ] );
                }
-               $this->setMwGlobals( 'wgLanguageCode', $langCode );
-               $this->setService( 'ContentLanguage', $langObj );
        }
 
        /**