Merge "Reset relevant DB tables before the first test of a suite."
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 7 Jun 2018 13:46:56 +0000 (13:46 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 7 Jun 2018 13:46:56 +0000 (13:46 +0000)
1  2 
tests/phpunit/MediaWikiTestCase.php

@@@ -402,10 -402,6 +402,6 @@@ abstract class MediaWikiTestCase extend
                        if ( !self::$dbSetup ) {
                                $this->setupAllTestDBs();
                                $this->addCoreDBData();
-                               if ( ( $this->db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
-                                       $this->resetDB( $this->db, $this->tablesUsed );
-                               }
                        }
  
                        // TODO: the DB setup should be done in setUpBeforeClass(), so the test DB
                        // This would also remove the need for the HACK that is oncePerClass().
                        if ( $this->oncePerClass() ) {
                                $this->setUpSchema( $this->db );
+                               $this->resetDB( $this->db, $this->tablesUsed );
                                $this->addDBDataOnce();
                        }
  
                $singletons = $wrappedProvider->singletons;
                if ( $provider instanceof MonologSpi ) {
                        if ( !isset( $this->loggers[$channel] ) ) {
 -                              $this->loggers[$channel] = isset( $singletons['loggers'][$channel] )
 -                                      ? $singletons['loggers'][$channel] : null;
 +                              $this->loggers[$channel] = $singletons['loggers'][$channel] ?? null;
                        }
                        $singletons['loggers'][$channel] = $logger;
                } elseif ( $provider instanceof LegacySpi ) {
                        if ( !isset( $this->loggers[$channel] ) ) {
 -                              $this->loggers[$channel] = isset( $singletons[$channel] ) ? $singletons[$channel] : null;
 +                              $this->loggers[$channel] = $singletons[$channel] ?? null;
                        }
                        $singletons[$channel] = $logger;
                } else {
        }
  
        /**
 -       * Undoes the dpecified schema overrides..
 +       * Undoes the specified schema overrides..
         * Called once per test class, just before addDataOnce().
         *
         * @param IMaintainableDatabase $db
                $this->ensureMockDatabaseConnection( $db );
  
                $oldOverrides = $oldOverrides + self::$schemaOverrideDefaults;
 -              $originalTables = $this->listOriginalTables( $db );
 +              $originalTables = $this->listOriginalTables( $db, 'unprefixed' );
  
                // Drop tables that need to be restored or removed.
                $tablesToDrop = array_merge( $oldOverrides['create'], $oldOverrides['alter'] );
         */
        private function setUpSchema( IMaintainableDatabase $db ) {
                // Undo any active overrides.
 -              $oldOverrides = isset( $db->_schemaOverrides ) ? $db->_schemaOverrides
 -                      : self::$schemaOverrideDefaults;
 +              $oldOverrides = $db->_schemaOverrides ?? self::$schemaOverrideDefaults;
  
                if ( $oldOverrides['alter'] || $oldOverrides['create'] || $oldOverrides['drop'] ) {
                        $this->undoSchemaOverrides( $db, $oldOverrides );
                $this->ensureMockDatabaseConnection( $db );
  
                // Drop the tables that will be created by the schema scripts.
 -              $originalTables = $this->listOriginalTables( $db );
 +              $originalTables = $this->listOriginalTables( $db, 'unprefixed' );
                $tablesToDrop = array_intersect( $originalTables, $overrides['create'] );
  
                if ( $tablesToDrop ) {
         * Lists all tables in the live database schema.
         *
         * @param IMaintainableDatabase $db
 +       * @param string $prefix Either 'prefixed' or 'unprefixed'
         * @return array
         */
 -      private function listOriginalTables( IMaintainableDatabase $db ) {
 +      private function listOriginalTables( IMaintainableDatabase $db, $prefix = 'prefixed' ) {
                if ( !isset( $db->_originalTablePrefix ) ) {
                        throw new LogicException( 'No original table prefix know, cannot list tables!' );
                }
  
                $originalTables = $db->listTables( $db->_originalTablePrefix, __METHOD__ );
 +              if ( $prefix === 'unprefixed' ) {
 +                      $originalPrefixRegex = '/^' . preg_quote( $db->_originalTablePrefix ) . '/';
 +                      $originalTables = array_map(
 +                              function ( $pt ) use ( $originalPrefixRegex ) {
 +                                      return preg_replace( $originalPrefixRegex, '', $pt );
 +                              },
 +                              $originalTables
 +                      );
 +              }
 +
                return $originalTables;
        }
  
                        throw new LogicException( 'No original table prefix know, cannot restore tables!' );
                }
  
 -              $originalTables = $this->listOriginalTables( $db );
 +              $originalTables = $this->listOriginalTables( $db, 'unprefixed' );
                $tables = array_intersect( $tables, $originalTables );
  
                $dbClone = new CloneDatabase( $db, $tables, $db->tablePrefix(), $db->_originalTablePrefix );
                if ( $db ) {
                        $userTables = [ 'user', 'user_groups', 'user_properties', 'actor' ];
                        $pageTables = [ 'page', 'revision', 'ip_changes', 'revision_comment_temp',
 -                              'revision_actor_temp', 'comment' ];
 +                              'revision_actor_temp', 'comment', 'archive' ];
                        $coreDBDataTables = array_merge( $userTables, $pageTables );
  
                        // If any of the user or page tables were marked as used, we should clear all of them.
                uasort(
                        $array,
                        function ( $a, $b ) {
 -                              return serialize( $a ) > serialize( $b ) ? 1 : -1;
 +                              return serialize( $a ) <=> serialize( $b );
                        }
                );
        }