Merge "Cleanup and document some LCStoreDB fields"
[lhc/web/wiklou.git] / tests / phpunit / MediaWikiIntegrationTestCase.php
index c22bf45..b738312 100644 (file)
@@ -10,6 +10,7 @@ use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\IMaintainableDatabase;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\TestingAccessWrapper;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @since 1.18
@@ -182,8 +183,10 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                global $IP;
                parent::setUpBeforeClass();
                if ( !file_exists( "$IP/LocalSettings.php" ) ) {
-                       echo 'A working MediaWiki installation with a configured LocalSettings.php file is'
-                       . ' required for tests that extend ' . self::class;
+                               echo "File \"$IP/LocalSettings.php\" could not be found. "
+                               . "Test case " . static::class . " extends " . self::class . " "
+                               . "which requires a working MediaWiki installation.\n"
+                               . ( new RuntimeException() )->getTraceAsString();
                        die();
                }
                self::initializeForStandardPhpunitEntrypointIfNeeded();
@@ -584,6 +587,17 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                $this->tmpFiles = array_merge( $this->tmpFiles, (array)$files );
        }
 
+       private static function formatErrorLevel( $errorLevel ) {
+               switch ( gettype( $errorLevel ) ) {
+               case 'integer':
+                       return '0x' . strtoupper( dechex( $errorLevel ) );
+               case 'NULL':
+                       return 'null';
+               default:
+                       throw new MWException( 'Unexpected error level type ' . gettype( $errorLevel ) );
+               }
+       }
+
        protected function tearDown() {
                global $wgRequest, $wgSQLMode;
 
@@ -649,14 +663,17 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                if ( $phpErrorLevel !== $this->phpErrorLevel ) {
                        ini_set( 'error_reporting', $this->phpErrorLevel );
 
-                       $oldHex = strtoupper( dechex( $this->phpErrorLevel ) );
-                       $newHex = strtoupper( dechex( $phpErrorLevel ) );
+                       $oldVal = self::formatErrorLevel( $this->phpErrorLevel );
+                       $newVal = self::formatErrorLevel( $phpErrorLevel );
                        $message = "PHP error_reporting setting was left dirty: "
-                               . "was 0x$oldHex before test, 0x$newHex after test!";
+                               . "was $oldVal before test, $newVal after test!";
 
                        $this->fail( $message );
                }
 
+               // If anything faked the time, reset it
+               ConvertibleTimestamp::setFakeTime( false );
+
                parent::tearDown();
        }
 
@@ -717,7 +734,9 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        $instantiator
                );
 
-               self::resetLegacyGlobals();
+               if ( $name === 'ContentLanguage' ) {
+                       $this->setMwGlobals( [ 'wgContLang' => $this->localServices->getContentLanguage() ] );
+               }
        }
 
        /**
@@ -930,7 +949,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        $this->localServices->resetServiceForTesting( $name, true );
                }
 
-               self::resetLegacyGlobals();
+               self::resetGlobalParser();
                Language::clearCaches();
        }
 
@@ -984,7 +1003,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        $newInstance->redefineService( $name, $callback );
                }
 
-               self::resetLegacyGlobals();
+               self::resetGlobalParser();
 
                return $newInstance;
        }
@@ -1051,7 +1070,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
 
                MediaWikiServices::forceGlobalInstance( $newServices );
 
-               self::resetLegacyGlobals();
+               self::resetGlobalParser();
 
                return $newServices;
        }
@@ -1081,29 +1100,24 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                MediaWikiServices::forceGlobalInstance( self::$originalServices );
                $currentServices->destroy();
 
-               self::resetLegacyGlobals();
+               self::resetGlobalParser();
 
                return true;
        }
 
        /**
-        * If legacy globals such as $wgParser or $wgContLang have been unstubbed, replace them with
-        * fresh ones so they pick up any config changes. They're deprecated, but we still support them
-        * for now.
+        * If $wgParser has been unstubbed, replace it with a fresh one so it picks up any config
+        * changes. $wgParser is deprecated, but we still support it for now.
         */
-       private static function resetLegacyGlobals() {
+       private static function resetGlobalParser() {
                // phpcs:ignore MediaWiki.Usage.DeprecatedGlobalVariables.Deprecated$wgParser
-               global $wgParser, $wgContLang;
-               if ( !( $wgParser instanceof StubObject ) ) {
-                       $wgParser = new StubObject( 'wgParser', function () {
-                               return MediaWikiServices::getInstance()->getParser();
-                       } );
-               }
-               if ( !( $wgContLang instanceof StubObject ) ) {
-                       $wgContlang = new StubObject( 'wgContLang', function () {
-                               return MediaWikiServices::getInstance()->getContLang();
-                       } );
+               global $wgParser;
+               if ( $wgParser instanceof StubObject ) {
+                       return;
                }
+               $wgParser = new StubObject( 'wgParser', function () {
+                       return MediaWikiServices::getInstance()->getParser();
+               } );
        }
 
        /**
@@ -1116,8 +1130,6 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
        }
 
        /**
-        * @deprecated since 1.34, use setMwGlobals( 'wgLanguageCode' ) to set the code or
-        *   setService( 'ContentLanguage' ) to set an object
         * @since 1.27
         * @param string|Language $lang
         */
@@ -1127,7 +1139,10 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        $this->setService( 'ContentLanguage', $lang );
                        $this->setMwGlobals( 'wgLanguageCode', $lang->getCode() );
                } else {
-                       $this->setMwGlobals( 'wgLanguageCode', $lang );
+                       $this->setMwGlobals( [
+                               'wgLanguageCode' => $lang,
+                               'wgContLang' => Language::factory( $lang ),
+                       ] );
                }
        }
 
@@ -1815,6 +1830,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        $pageTables = [
                                'page', 'revision', 'ip_changes', 'revision_comment_temp', 'comment', 'archive',
                                'revision_actor_temp', 'slots', 'content', 'content_models', 'slot_roles',
+                               'change_tag',
                        ];
                        $coreDBDataTables = array_merge( $userTables, $pageTables );