/** * Creates an empty skeleton of the wiki database by cloning its structure * to equivalent tables using the given $prefix. Then sets MediaWiki to * use the new set of tables (aka schema) instead of the original set. * * This is used to generate a dummy table set, typically consisting of temporary * tables, that will be used by tests instead of the original wiki database tables. * * @since 1.21 * * @note the original table prefix is stored in self::$oldTablePrefix. This is used * by teardownTestDB() to return the wiki to using the original table set. * * @note this method only works when first called. Subsequent calls have no effect, * even if using different parameters. * * @param DatabaseBase $db The database connection * @param string $prefix The prefix to use for the new table set (aka schema). * * @throws MWException If the database table prefix is already $prefix */ public static function setupTestDB(DatabaseBase $db, $prefix) { global $wgDBprefix; if ($wgDBprefix === $prefix) { throw new MWException('Cannot run unit tests, the database prefix is already "' . $prefix . '"'); } if (self::$dbSetup) { return; } $tablesCloned = self::listTables($db); $dbClone = new CloneDatabase($db, $tablesCloned, $prefix); $dbClone->useTemporaryTables(self::$useTemporaryTables); self::$dbSetup = true; self::$oldTablePrefix = $wgDBprefix; if (($db->getType() == 'oracle' || !self::$useTemporaryTables) && self::$reuseDB) { CloneDatabase::changePrefix($prefix); return; } else { $dbClone->cloneTableStructure(); } if ($db->getType() == 'oracle') { $db->query('BEGIN FILL_WIKI_INFO; END;'); } }
/** * Set up all test DBs */ public function setupAllTestDBs() { global $wgDBprefix; self::$oldTablePrefix = $wgDBprefix; $testPrefix = $this->dbPrefix(); // switch to a temporary clone of the database self::setupTestDB($this->db, $testPrefix); if (self::isUsingExternalStoreDB()) { self::setupExternalStoreTestDBs($testPrefix); } }