/** * Runs the bare test sequence. * @return void */ final public 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. phpunit_util::display_debugging_messages(); phpunit_util::reset_debugging(); } 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(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) { 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'); } } }
/** * Call when no debugging() messages expected. * @param string $message */ public function assertDebuggingNotCalled($message = '') { $debugging = $this->getDebuggingMessages(); $count = count($debugging); if ($message === '') { $message = 'Expectation failed, debugging() was triggered.'; } $message .= "\n" . phpunit_util::display_debugging_messages(true); $this->resetDebugging(); $this->assertEquals(0, $count, $message); }