Merge "Automatically reset namespace caches when needed"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 2 Aug 2018 02:26:33 +0000 (02:26 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 2 Aug 2018 02:26:33 +0000 (02:26 +0000)
1  2 
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/PrefixSearchTest.php

@@@ -628,6 -628,12 +628,12 @@@ abstract class MediaWikiTestCase extend
                foreach ( $this->mwGlobalsToUnset as $value ) {
                        unset( $GLOBALS[$value] );
                }
+               if (
+                       array_key_exists( 'wgExtraNamespaces', $this->mwGlobals ) ||
+                       in_array( 'wgExtraNamespaces', $this->mwGlobalsToUnset )
+               ) {
+                       $this->resetNamespaces();
+               }
                $this->mwGlobals = [];
                $this->mwGlobalsToUnset = [];
                $this->restoreLoggers();
                foreach ( $pairs as $key => $value ) {
                        $GLOBALS[$key] = $value;
                }
+               if ( array_key_exists( 'wgExtraNamespaces', $pairs ) ) {
+                       $this->resetNamespaces();
+               }
+       }
+       /**
+        * Must be called whenever namespaces are changed, e.g., $wgExtraNamespaces is altered.
+        * Otherwise old namespace data will lurk and cause bugs.
+        */
+       private function resetNamespaces() {
+               MWNamespace::clearCaches();
+               Language::clearCaches();
+               // We can't have the TitleFormatter holding on to an old Language object either
+               // @todo We shouldn't need to reset all the aliases here.
+               $services = MediaWikiServices::getInstance();
+               $services->resetServiceForTesting( 'TitleFormatter' );
+               $services->resetServiceForTesting( 'TitleParser' );
+               $services->resetServiceForTesting( '_MediaWikiTitleCodec' );
        }
  
        /**
                return $loaded;
        }
  
 +      /**
 +       * Skip the test if using the specified database type
 +       *
 +       * @param string $type Database type
 +       * @since 1.32
 +       */
 +      protected function markTestSkippedIfDbType( $type ) {
 +              if ( $this->db->getType() === $type ) {
 +                      $this->markTestSkipped( "The $type database type isn't supported for this test" );
 +              }
 +      }
 +
        /**
         * Used as a marker to prevent wfResetOutputBuffers from breaking PHPUnit.
         * @param string $buffer
@@@ -50,7 -50,7 +50,7 @@@ class PrefixSearchTest extends MediaWik
                        $this->markTestSkipped( 'Main namespace does not support wikitext.' );
                }
  
-               // Avoid special pages from extensions interferring with the tests
+               // Avoid special pages from extensions interfering with the tests
                $this->setMwGlobals( [
                        'wgSpecialPages' => [],
                        'wgHooks' => [],
                $this->originalHandlers = TestingAccessWrapper::newFromClass( Hooks::class )->handlers;
                TestingAccessWrapper::newFromClass( Hooks::class )->handlers = [];
  
-               // Clear caches so that our new namespace appears
-               MWNamespace::clearCaches();
-               Language::factory( 'en' )->resetNamespaces();
                SpecialPageFactory::resetList();
        }
  
        public function tearDown() {
-               MWNamespace::clearCaches();
-               Language::factory( 'en' )->resetNamespaces();
                parent::tearDown();
  
                TestingAccessWrapper::newFromClass( Hooks::class )->handlers = $this->originalHandlers;
         * @covers PrefixSearch::searchBackend
         */
        public function testSearch( array $case ) {
 +              // FIXME: fails under postgres
 +              $this->markTestSkippedIfDbType( 'postgres' );
                $this->searchProvision( null );
  
                $namespaces = $case['namespaces'] ?? [];
         * @covers PrefixSearch::searchBackend
         */
        public function testSearchWithOffset( array $case ) {
 +              // FIXME: fails under postgres
 +              $this->markTestSkippedIfDbType( 'postgres' );
                $this->searchProvision( null );
  
                $namespaces = $case['namespaces'] ?? [];