/** * 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'); } } }
/** * 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'); } } }
/** * 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 }