/**
  * Runs the bare test sequence.
  * @return void
  */
 public final function runBare()
 {
     global $DB;
     if (phpunit_util::$lastdbwrites != $DB->perf_get_writes()) {
         // this happens when previous test does not reset, we can not use transactions
         $this->testdbtransaction = null;
     } else {
         if ($DB->get_dbfamily() === 'postgres' or $DB->get_dbfamily() === 'mssql') {
             // database must allow rollback of DDL, so no mysql here
             $this->testdbtransaction = $DB->start_delegated_transaction();
         }
     }
     try {
         parent::runBare();
         // set DB reference in case somebody mocked it in test
         $DB = phpunit_util::get_global_backup('DB');
     } catch (Exception $e) {
         // cleanup after failed expectation
         phpunit_util::reset_all_data();
         throw $e;
     }
     if (!$this->testdbtransaction or $this->testdbtransaction->is_disposed()) {
         $this->testdbtransaction = null;
     }
     if ($this->resetAfterTest === true) {
         if ($this->testdbtransaction) {
             $DB->force_transaction_rollback();
             phpunit_util::reset_all_database_sequences();
             phpunit_util::$lastdbwrites = $DB->perf_get_writes();
             // no db reset necessary
         }
         phpunit_util::reset_all_data();
     } else {
         if ($this->resetAfterTest === false) {
             if ($this->testdbtransaction) {
                 $this->testdbtransaction->allow_commit();
             }
             // keep all data untouched for other tests
         } else {
             // reset but log what changed
             if ($this->testdbtransaction) {
                 try {
                     $this->testdbtransaction->allow_commit();
                 } catch (dml_transaction_exception $e) {
                     phpunit_util::reset_all_data();
                     throw new coding_exception('Invalid transaction state detected in test ' . $this->getName());
                 }
             }
             phpunit_util::reset_all_data(true);
         }
     }
     // make sure test did not forget to close transaction
     if ($DB->is_transaction_started()) {
         phpunit_util::reset_all_data();
         if ($this->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED or $this->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED or $this->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE) {
             throw new coding_exception('Test ' . $this->getName() . ' did not close database transaction');
         }
     }
 }
Exemplo n.º 2
0
 /**
  * Runs the bare test sequence.
  * @return void
  */
 public final function runBare()
 {
     global $DB;
     if (phpunit_util::$lastdbwrites != $DB->perf_get_writes()) {
         // this happens when previous test does not reset, we can not use transactions
         $this->testdbtransaction = null;
     } else {
         if ($DB->get_dbfamily() === 'postgres' or $DB->get_dbfamily() === 'mssql') {
             // database must allow rollback of DDL, so no mysql here
             $this->testdbtransaction = $DB->start_delegated_transaction();
         }
     }
     try {
         $this->setCurrentTimeStart();
         parent::runBare();
         // set DB reference in case somebody mocked it in test
         $DB = phpunit_util::get_global_backup('DB');
         // Deal with any debugging messages.
         $debugerror = phpunit_util::display_debugging_messages();
         $this->resetDebugging();
         if ($debugerror) {
             trigger_error('Unexpected debugging() call detected.', E_USER_NOTICE);
         }
     } catch (Exception $ex) {
         $e = $ex;
     } catch (Throwable $ex) {
         // Engine errors in PHP7 throw exceptions of type Throwable (this "catch" will be ignored in PHP5).
         $e = $ex;
     }
     if (isset($e)) {
         // cleanup after failed expectation
         self::resetAllData();
         throw $e;
     }
     if (!$this->testdbtransaction or $this->testdbtransaction->is_disposed()) {
         $this->testdbtransaction = null;
     }
     if ($this->resetAfterTest === true) {
         if ($this->testdbtransaction) {
             $DB->force_transaction_rollback();
             phpunit_util::reset_all_database_sequences();
             phpunit_util::$lastdbwrites = $DB->perf_get_writes();
             // no db reset necessary
         }
         self::resetAllData(null);
     } else {
         if ($this->resetAfterTest === false) {
             if ($this->testdbtransaction) {
                 $this->testdbtransaction->allow_commit();
             }
             // keep all data untouched for other tests
         } else {
             // reset but log what changed
             if ($this->testdbtransaction) {
                 try {
                     $this->testdbtransaction->allow_commit();
                 } catch (dml_transaction_exception $e) {
                     self::resetAllData();
                     throw new coding_exception('Invalid transaction state detected in test ' . $this->getName());
                 }
             }
             self::resetAllData(true);
         }
     }
     // make sure test did not forget to close transaction
     if ($DB->is_transaction_started()) {
         self::resetAllData();
         if ($this->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED or $this->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED or $this->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE) {
             throw new coding_exception('Test ' . $this->getName() . ' did not close database transaction');
         }
     }
 }
Exemplo n.º 3
0
 /**
  * Runs the bare test sequence.
  * @return void
  */
 public function runBare()
 {
     global $CFG, $USER, $DB;
     $dbwrites = $DB->perf_get_writes();
     parent::runBare();
     $oldcfg = phpunit_util::get_global_backup('CFG');
     foreach ($CFG as $k => $v) {
         if (!property_exists($oldcfg, $k)) {
             unset($CFG->{$k});
             error_log('warning: unexpected new $CFG->' . $k . ' value in testcase: ' . get_class($this) . '->' . $this->getName(true));
         } else {
             if ($oldcfg->{$k} !== $CFG->{$k}) {
                 $CFG->{$k} = $oldcfg->{$k};
                 error_log('warning: unexpected change of $CFG->' . $k . ' value in testcase: ' . get_class($this) . '->' . $this->getName(true));
             }
         }
         unset($oldcfg->{$k});
     }
     if ($oldcfg) {
         foreach ($oldcfg as $k => $v) {
             $CFG->{$k} = $v;
             error_log('warning: unexpected removal of $CFG->' . $k . ' in testcase: ' . get_class($this) . '->' . $this->getName(true));
         }
     }
     if ($USER->id != 0) {
         error_log('warning: unexpected change of $USER in testcase: ' . get_class($this) . '->' . $this->getName(true));
         $USER = new stdClass();
         $USER->id = 0;
     }
     if ($dbwrites != $DB->perf_get_writes()) {
         //TODO: find out what was changed exactly
         error_log('warning: unexpected database modification, resetting DB state in testcase: ' . get_class($this) . '->' . $this->getName(true));
         phpunit_util::reset_all_data();
     }
     //TODO: somehow find out if there are changes in dataroot
 }