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();
}
$db->_originalTablePrefix = $oldPrefix;
$lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
- $lb->setTempTablesOnlyMode( self::$useTemporaryTables, $lb->getLocalDomainID() );
+ $lb->setTempTablesOnlyMode( self::$useTemporaryTables, $db->getDomainID() );
}
return true;
/**
* Empty all tables so they can be repopulated for tests
*
- * @param Database $db|null Database to reset
- * @param array $tablesUsed Tables to reset
+ * @param IDatabase $db|null Database to reset
+ * @param string[] $tablesUsed Tables to reset
*/
- private function resetDB( $db, $tablesUsed ) {
+ private function resetDB( IDatabase $db = null, array $tablesUsed ) {
if ( $db ) {
- $userTables = [ 'user', 'user_groups', 'user_properties', 'actor' ];
- $pageTables = [
- 'page', 'revision', 'ip_changes', 'revision_comment_temp', 'comment', 'archive',
- 'revision_actor_temp', 'slots', 'content', 'content_models', 'slot_roles',
+ // some groups of tables are connected such that if any is used, all should be cleared
+ $extraTables = [
+ 'user' => [ 'user', 'user_groups', 'user_properties', 'actor' ],
+ 'page' => [ 'page', 'revision', 'ip_changes', 'revision_comment_temp', 'comment', 'archive',
+ 'revision_actor_temp', 'slots', 'content', 'content_models', 'slot_roles',
+ 'change_tag' ],
+ 'logging' => [ 'logging', 'log_search', 'change_tag' ],
];
- $coreDBDataTables = array_merge( $userTables, $pageTables );
+ $coreDBDataTables = array_merge( $extraTables['user'], $extraTables['page'] );
- // If any of the user or page tables were marked as used, we should clear all of them.
- if ( array_intersect( $tablesUsed, $userTables ) ) {
- $tablesUsed = array_unique( array_merge( $tablesUsed, $userTables ) );
+ foreach ( $extraTables as $i => $group ) {
+ if ( !array_intersect( $tablesUsed, $group ) ) {
+ unset( $extraTables[$i] );
+ }
+ }
+ $extraTables = array_values( $extraTables );
+ $tablesUsed = array_unique( array_merge( $tablesUsed, ...$extraTables ) );
+
+ if ( in_array( 'user', $tablesUsed ) ) {
TestUserRegistry::clear();
// Reset $wgUser, which is probably 127.0.0.1, as its loaded data is probably not valid
global $wgUser;
$wgUser->clearInstanceCache( $wgUser->mFrom );
}
- if ( array_intersect( $tablesUsed, $pageTables ) ) {
- $tablesUsed = array_unique( array_merge( $tablesUsed, $pageTables ) );
- }
// Postgres uses mwuser/pagecontent
// instead of user/text. But Postgres does not remap the
$this->mergeMwGlobalArrayValue( 'wgHooks', [ $hookName => [ $handler ] ] );
}
- /**
- * Check whether file contains given data.
- * @param string $fileName
- * @param string $actualData
- * @param bool $createIfMissing If true, and file does not exist, create it with given data
- * and skip the test.
- * @param string $msg
- * @since 1.30
- */
- protected function assertFileContains(
- $fileName,
- $actualData,
- $createIfMissing = false,
- $msg = ''
- ) {
- if ( $createIfMissing ) {
- if ( !file_exists( $fileName ) ) {
- file_put_contents( $fileName, $actualData );
- $this->markTestSkipped( "Data file $fileName does not exist" );
- }
- } else {
- self::assertFileExists( $fileName );
- }
- self::assertEquals( file_get_contents( $fileName ), $actualData, $msg );
- }
-
/**
* Edits or creates a page/revision
* @param string $pageName Page title