use Wikimedia\Rdbms\IMaintainableDatabase;
use Wikimedia\Rdbms\Database;
use Wikimedia\TestingAccessWrapper;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
* @since 1.18
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();
$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;
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();
}
$instantiator
);
- self::resetLegacyGlobals();
+ if ( $name === 'ContentLanguage' ) {
+ $this->setMwGlobals( [ 'wgContLang' => $this->localServices->getContentLanguage() ] );
+ }
}
/**
$this->localServices->resetServiceForTesting( $name, true );
}
- self::resetLegacyGlobals();
+ self::resetGlobalParser();
Language::clearCaches();
}
$newInstance->redefineService( $name, $callback );
}
- self::resetLegacyGlobals();
+ self::resetGlobalParser();
return $newInstance;
}
MediaWikiServices::forceGlobalInstance( $newServices );
- self::resetLegacyGlobals();
+ self::resetGlobalParser();
return $newServices;
}
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();
+ } );
}
/**
}
/**
- * @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
*/
$this->setService( 'ContentLanguage', $lang );
$this->setMwGlobals( 'wgLanguageCode', $lang->getCode() );
} else {
- $this->setMwGlobals( 'wgLanguageCode', $lang );
+ $this->setMwGlobals( [
+ 'wgLanguageCode' => $lang,
+ 'wgContLang' => Language::factory( $lang ),
+ ] );
}
}
$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 );