function run(PHPUnit_Framework_TestResult $result = NULL) { /* Some functions require some kind of caching, and will end up using the db, * which we can't allow, as that would open a new connection for mysql. * Replace with a HashBag. They would not be going to persist anyway. */ ObjectCache::$instances[CACHE_DB] = new HashBagOStuff(); if ($this->needsDB()) { global $wgDBprefix; $this->useTemporaryTables = !$this->getCliArg('use-normal-tables'); $this->reuseDB = $this->getCliArg('reuse-db'); $this->db = wfGetDB(DB_MASTER); $this->checkDbIsSupported(); $this->oldTablePrefix = $wgDBprefix; if (!self::$dbSetup) { $this->initDB(); self::$dbSetup = true; } $this->addCoreDBData(); $this->addDBData(); parent::run($result); $this->resetDB(); } else { parent::run($result); } }
/** * 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;'); } }
/** * 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 Database $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(Database $db, $prefix) { if (self::$dbSetup) { return; } if ($db->tablePrefix() === $prefix) { throw new MWException('Cannot run unit tests, the database prefix is already "' . $prefix . '"'); } // TODO: the below should be re-written as soon as LBFactory, LoadBalancer, // and Database no longer use global state. self::$dbSetup = true; if (!self::setupDatabaseWithTestPrefix($db, $prefix)) { return; } // Assuming this isn't needed for External Store database, and not sure if the procedure // would be available there. if ($db->getType() == 'oracle') { $db->query('BEGIN FILL_WIKI_INFO; END;'); } }