Issue #1212992 by xjm, chx, beejeebus, rump, BTMash, bfroehle: Fixed Prevent tests from deleting main installation's tables when parent::setUp() is not called.

8.0.x
Nathaniel 2011-11-28 16:21:58 +09:00
parent f8fc0dba31
commit 07b29cbae4
3 changed files with 102 additions and 7 deletions

View File

@ -73,6 +73,18 @@ abstract class DrupalTestCase {
*/
protected $skipClasses = array(__CLASS__ => TRUE);
/**
* Flag to indicate whether the test has been set up.
*
* The setUp() method isolates the test from the parent Drupal site by
* creating a random prefix for the database and setting up a clean file
* storage directory. The tearDown() method then cleans up this test
* environment. We must ensure that setUp() has been run. Otherwise,
* tearDown() will act on the parent Drupal site rather than the test
* environment, destroying live data.
*/
protected $setup = FALSE;
/**
* Constructor for DrupalTestCase.
*
@ -127,7 +139,15 @@ abstract class DrupalTestCase {
);
// Store assertion for display after the test has completed.
Database::getConnection('default', 'simpletest_original_default')
try {
$connection = Database::getConnection('default', 'simpletest_original_default');
}
catch (DatabaseConnectionNotDefinedException $e) {
// If the test was not set up, the simpletest_original_default
// connection does not exist.
$connection = Database::getConnection('default', 'default');
}
$connection
->insert('simpletest')
->fields($assertion)
->execute();
@ -474,14 +494,19 @@ abstract class DrupalTestCase {
);
$completion_check_id = DrupalTestCase::insertAssert($this->testId, $class, FALSE, t('The test did not complete due to a fatal error.'), 'Completion check', $caller);
$this->setUp();
try {
$this->$method();
// Finish up.
if ($this->setup) {
try {
$this->$method();
// Finish up.
}
catch (Exception $e) {
$this->exceptionHandler($e);
}
$this->tearDown();
}
catch (Exception $e) {
$this->exceptionHandler($e);
else {
$this->fail(t("The test cannot be executed because it has not been set up properly."));
}
$this->tearDown();
// Remove the completion check record.
DrupalTestCase::deleteAssert($completion_check_id);
}
@ -691,6 +716,7 @@ class DrupalUnitTestCase extends DrupalTestCase {
unset($module_list['locale']);
module_list(TRUE, FALSE, FALSE, $module_list);
}
$this->setup = TRUE;
}
protected function tearDown() {
@ -1357,6 +1383,7 @@ class DrupalWebTestCase extends DrupalTestCase {
variable_set('mail_system', array('default-system' => 'TestingMailSystem'));
drupal_set_time_limit($this->timeLimit);
$this->setup = TRUE;
}
/**

View File

@ -503,3 +503,70 @@ class SimpleTestMissingDependentModuleUnitTest extends DrupalUnitTestCase {
$this->fail(t('Running test with missing required module.'));
}
}
/**
* Tests a test case that does not run parent::setUp() in its setUp() method.
*
* If a test case does not call parent::setUp(), running
* DrupalTestCase::tearDown() would destroy the main site's database tables.
* Therefore, we ensure that tests which are not set up properly are skipped.
*
* @see DrupalTestCase
*/
class SimpleTestBrokenSetUp extends DrupalWebTestCase {
public static function getInfo() {
return array(
'name' => 'Broken SimpleTest method',
'description' => 'Tests a test case that does not call parent::setUp().',
'group' => 'SimpleTest'
);
}
function setUp() {
// If the test is being run from the main site, set up normally.
if (!drupal_valid_test_ua()) {
parent::setUp('simpletest');
// Create and log in user.
$admin_user = $this->drupalCreateUser(array('administer unit tests'));
$this->drupalLogin($admin_user);
}
// If the test is being run from within simpletest, set up the broken test.
else {
$this->pass(t('The test setUp() method has been run.'));
// Don't call parent::setUp(). This should trigger an error message.
}
}
function tearDown() {
// If the test is being run from the main site, tear down normally.
if (!drupal_valid_test_ua()) {
parent::tearDown();
}
else {
// If the test is being run from within simpletest, output a message.
$this->pass(t('The tearDown() method has run.'));
}
}
/**
* Runs this test case from within the simpletest child site.
*/
function testBreakSetUp() {
// If the test is being run from the main site, run it again from the web
// interface within the simpletest child site.
if (!drupal_valid_test_ua()) {
$edit['SimpleTestBrokenSetUp'] = TRUE;
$this->drupalPost('admin/config/development/testing', $edit, t('Run tests'));
// Verify that the broken test and its tearDown() method are skipped.
$this->assertRaw(t('The test setUp() method has been run.'));
$this->assertRaw(t('The test cannot be executed because it has not been set up properly.'));
$this->assertNoRaw(t('The test method has run.'));
$this->assertNoRaw(t('The tearDown() method has run.'));
}
// If the test is being run from within simpletest, output a message.
else {
$this->pass(t('The test method has run.'));
}
}
}

View File

@ -136,6 +136,7 @@ abstract class UpgradePathTestCase extends DrupalWebTestCase {
$this->variable_set('site_mail', 'simpletest@example.com');
drupal_set_time_limit($this->timeLimit);
$this->setup = TRUE;
}
/**