Commit 84ebf08d authored by skodak's avatar skodak
Browse files

MDL-16483 $CFG->unittestprefix not required anymore to run unit tests that do...

MDL-16483 $CFG->unittestprefix not required anymore to run unit tests that do not need fake db; it should be saer to let admins modify the prefix in config.php instead of modifying it from php
parent efd8c7fc
......@@ -16,23 +16,21 @@ require_once($CFG->libdir.'/simpletestlib.php');
require_once('ex_simple_test.php');
require_once('ex_reporter.php');
// CGI arguments
$path = optional_param('path', null, PARAM_PATH);
$showpasses = optional_param('showpasses', false, PARAM_BOOL);
$showsearch = optional_param('showsearch', false, PARAM_BOOL);
$addconfigprefix = optional_param('addconfigprefix', false, PARAM_RAW);
$setuptesttables = optional_param('setuptesttables', false, PARAM_BOOL);
$upgradetesttables = optional_param('upgradetesttables', false, PARAM_BOOL);
// page parameters
$path = optional_param('path', null, PARAM_PATH);
$showpasses = optional_param('showpasses', false, PARAM_BOOL);
$showsearch = optional_param('showsearch', false, PARAM_BOOL);
$setuptesttables = optional_param('setuptesttables', false, PARAM_BOOL);
$upgradetesttables = optional_param('upgradetesttables', false, PARAM_BOOL);
$continuesetuptesttables = optional_param('continuesetuptesttables', false, PARAM_BOOL);
$droptesttables = optional_param('droptesttables', false, PARAM_BOOL);
$testtablesok = optional_param('testtablesok', false, PARAM_BOOL);
$droptesttables = optional_param('droptesttables', false, PARAM_BOOL);
$testtablesok = optional_param('testtablesok', false, PARAM_BOOL);
if ($setuptesttables || $continuesetuptesttables || $upgradetesttables) {
// Make sure this option is off during upgrade. It is not very helpful, and can break things.
$CFG->xmlstrictheaders = false;
}
admin_externalpage_setup('reportsimpletest', '', array('showpasses' => $showpasses,
'showsearch' => $showsearch));
admin_externalpage_setup('reportsimpletest', '', array('showpasses'=>$showpasses, 'showsearch'=>$showsearch));
admin_externalpage_print_header();
$langfile = 'simpletest';
......@@ -48,149 +46,97 @@ if ($testtablesok) {
print_heading(get_string('testtablesok', 'simpletest'));
}
$baseurl = "$CFG->wwwroot/$CFG->admin/report/unittest/index.php";
// Add unittest prefix to config.php if needed
if ($addconfigprefix && !isset($CFG->unittestprefix)) {
// Open config file, search for $CFG->prefix and append a new line under it
if ($handle = @fopen($CFG->dirroot.'/config.php', 'r+')) {
$new_file = '';
while (!feof($handle)) {
$line = fgets($handle, 4096);
$prefix_line = null;
if (preg_match('/CFG\-\>prefix/', $line, $matches)) {
$prefix_line = "\$CFG->unittestprefix = '$addconfigprefix';\n";
}
$new_file .= $line;
$new_file .= $prefix_line;
if (!empty($CFG->unittestprefix)) {
// Temporarily override $DB and $CFG for a fresh install on the unit test prefix
$real_version = $CFG->version;
$real_db = $DB;
$real_cfg = $CFG;
$CFG = new stdClass();
$CFG->dbhost = $real_cfg->dbhost;
$CFG->dbtype = $real_cfg->dbtype;
$CFG->dblibrary = $real_cfg->dblibrary;
$CFG->dbuser = $real_cfg->dbuser;
$CFG->dbpass = $real_cfg->dbpass;
$CFG->dbname = $real_cfg->dbname;
$CFG->unittestprefix = $real_cfg->unittestprefix;
$CFG->wwwroot = $real_cfg->wwwroot;
$CFG->dirroot = $real_cfg->dirroot;
$CFG->libdir = $real_cfg->libdir;
$CFG->dataroot = $real_cfg->dataroot;
$CFG->admin = $real_cfg->admin;
$CFG->release = $real_cfg->release;
$CFG->version = $real_cfg->version;
$CFG->config_php_settings = $real_cfg->config_php_settings;
$CFG->frametarget = $real_cfg->frametarget;
$CFG->framename = $real_cfg->framename;
$CFG->footer = $real_cfg->footer;
$CFG->debug = $real_cfg->debug;
$DB = moodle_database::get_driver_instance($CFG->dbtype, $CFG->dblibrary);
$DB->connect($CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->unittestprefix);
if ($DB->get_manager()->table_exists(new xmldb_table('config')) && $config = $DB->get_records('config')) {
foreach ($config as $conf) {
$CFG->{$conf->name} = $conf->value;
}
fclose($handle);
$handle = fopen($CFG->dirroot.'/config.php', 'w');
fwrite($handle, $new_file);
fclose($handle);
$CFG->unittestprefix = $addconfigprefix;
} else {
notify(get_string('confignonwritable', 'simpletest'));
die();
$testtablesok = true;
}
}
if (empty($CFG->unittestprefix)) {
// TODO replace error with proper admin dialog
print_box_start('generalbox', 'notice');
if (is_writable($CFG->dirroot.'/config.php')) {
echo '<p>'.get_string("prefixnotset", 'simpletest').'</p>';
echo '<form method="post" action="'.$baseurl.'">
<table class="generaltable">
<tr>
<th class="header"><label for="prefix">'.get_string('prefix', 'simpletest').'</label></th>
<td class="cell"><input type="text" size="5" name="addconfigprefix" id="prefix" value="tst_" /></td>
<td class="cell"><input type="submit" value="'.get_string('addconfigprefix', 'simpletest').'" /></td>
</tr>
</table>
</form>';
} else {
notify(get_string('confignonwritable', 'simpletest'));
}
print_box_end();
admin_externalpage_print_footer();
exit();
}
$test_tables = $DB->get_tables();
// Temporarily override $DB and $CFG for a fresh install on the unit test prefix
$real_version = $CFG->version;
$real_db = clone($DB);
$real_cfg = clone($CFG);
$CFG = new stdClass();
$CFG->dbhost = $real_cfg->dbhost;
$CFG->dbtype = $real_cfg->dbtype;
$CFG->dblibrary = $real_cfg->dblibrary;
$CFG->dbuser = $real_cfg->dbuser;
$CFG->dbpass = $real_cfg->dbpass;
$CFG->dbname = $real_cfg->dbname;
$CFG->unittestprefix = $real_cfg->unittestprefix;
$CFG->wwwroot = $real_cfg->wwwroot;
$CFG->dirroot = $real_cfg->dirroot;
$CFG->libdir = $real_cfg->libdir;
$CFG->dataroot = $real_cfg->dataroot;
$CFG->admin = $real_cfg->admin;
$CFG->release = $real_cfg->release;
$CFG->version = $real_cfg->version;
$CFG->config_php_settings = $real_cfg->config_php_settings;
$CFG->frametarget = $real_cfg->frametarget;
$CFG->framename = $real_cfg->framename;
$CFG->footer = $real_cfg->footer;
$CFG->debug = $real_cfg->debug;
$DB = moodle_database::get_driver_instance($CFG->dbtype, $CFG->dblibrary);
$DB->connect($CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->unittestprefix);
if ($DB->get_manager()->table_exists(new xmldb_table('config')) && $config = $DB->get_records('config')) {
foreach ($config as $conf) {
$CFG->{$conf->name} = $conf->value;
// Test DB upgrade
if (!$upgradetesttables && $real_version != $CFG->version) {
notice_yesno(get_string('testtablesneedupgrade', 'simpletest'), $FULLSCRIPT . '?upgradetesttables=1', $FULLSCRIPT);
$DB->dispose();
$DB = $real_db;
admin_externalpage_print_footer();
exit();
}
$testtablesok = true;
}
$test_tables = $DB->get_tables();
// Build/upgrade test tables if requested and needed
if ($setuptesttables || $continuesetuptesttables || $upgradetesttables) {
// Test DB upgrade
if (!$upgradetesttables && $real_version != $CFG->version) {
notice_yesno(get_string('testtablesneedupgrade', 'simpletest'), $baseurl . '?upgradetesttables=1', $baseurl);
$DB->dispose();
$DB = $real_db;
admin_externalpage_print_footer();
exit();
}
$version = null;
$release = null;
include("$CFG->dirroot/version.php"); // defines $version and $release
// Build/upgrade test tables if requested and needed
if ($setuptesttables || $continuesetuptesttables || $upgradetesttables) {
if (!$continuesetuptesttables && !$upgradetesttables) {
// Drop all tables first if they exist
$manager = $DB->get_manager();
foreach ($test_tables as $table) {
$xmldbtable = new xmldb_table($table);
$manager->drop_table($xmldbtable);
}
}
$version = null;
$release = null;
include("$CFG->dirroot/version.php"); // defines $version and $release
upgrade_db($version, $release, true);
}
if (!$continuesetuptesttables && !$upgradetesttables) {
// Drop all tables first if they exist
if ($droptesttables) {
$manager = $DB->get_manager();
foreach ($test_tables as $table) {
$xmldbtable = new xmldb_table($table);
$manager->drop_table($xmldbtable);
}
$test_tables = $DB->get_tables();
$testtablesok = false;
}
upgrade_db($version, $release, true);
}
if ($droptesttables) {
$manager = $DB->get_manager();
foreach ($test_tables as $table) {
$xmldbtable = new xmldb_table($table);
$manager->drop_table($xmldbtable);
if (empty($test_tables['config'])) {
// TODO replace error with proper admin dialog
notice_yesno(get_string('tablesnotsetup', 'simpletest'), $FULLSCRIPT . '?setuptesttables=1', $FULLSCRIPT);
$DB = $real_db;
admin_externalpage_print_footer();
exit();
}
$test_tables = $DB->get_tables();
$testtablesok = false;
}
if (empty($test_tables['config'])) {
// TODO replace error with proper admin dialog
notice_yesno(get_string('tablesnotsetup', 'simpletest'), $baseurl . '?setuptesttables=1', $baseurl);
$DB->dispose();
$DB = $real_db;
admin_externalpage_print_footer();
exit();
}
$CFG = $real_cfg;
$DB->dispose();
$DB = $real_db;
$CFG = $real_cfg;
// end of ugly hack
}
if (!is_null($path)) {
// Create the group of tests.
......@@ -261,7 +207,12 @@ echo '</form>';
print_box_end();
print_box_start('generalbox boxwidthwide boxaligncenter');
if ($testtablesok) {
if (empty($CFG->unittestprefix)) {
print_heading(get_string('testdboperations', 'simpletest'));
// TODO: localise
echo '<p>Please add $CFG->unittestprefix="tst_"; or some other unique test table prefix if you want to execute all tests';
} else {
print_heading(get_string('testdboperations', 'simpletest'));
echo '<p>'.get_string('unittestprefixsetting', 'simpletest', $CFG).'</p>';
echo '<form style="display:inline" method="get" action="index.php">';
......
......@@ -54,7 +54,6 @@ $CFG->dbname = 'moodle'; // database name, eg moodle
$CFG->dbuser = 'username'; // your database username
$CFG->dbpass = 'password'; // your database password
$CFG->prefix = 'mdl_'; // Prefix to use for all table names
// $CFG->unittest_prefix = 'tst_'; // Prefix used for unit test tables. Needs to be un-commented for test tables installation to proceed
$CFG->dbpersist = false; // Should database connections be reused?
// "false" is the most stable setting
......@@ -287,18 +286,6 @@ $CFG->admin = 'admin';
//
// NOTE: if you are using custompix in your theme, see /fixpix.php.
//
// special magic evil developer only wanting to edit the xmldb files manually
// AND don't use the XMLDBEditor nor the prev/next stuff at all (Mahara and others)
// Uncomment these if you're lazy like Penny
// $CFG->xmldbdisablecommentchecking = true;
// $CFG->xmldbdisablenextprevchecking = true;
//
// special magig evil developer only wanting to edit xmldb files manually
// AND allowing the XMLDBEditor to recostruct the prev/next elements every
// time one file is loaded and saved (Moodle).
// Uncomment this if you're lazy like Petr
// $CFG->xmldbreconstructprevnext = true;
//
// Set the priority of themes from highest to lowest. This is useful (for
// example) in sites where the user theme should override all other theme
// settings for accessibility reasons. You can also disable types of themes
......@@ -310,7 +297,28 @@ $CFG->admin = 'admin';
// When working with production data on test servers, no emails should ever be send to real users
// $CFG->noemailever = true;
//
//=========================================================================
// 8. SETTINGS FOR DEVELOPMENT SERVERS - not intended for production use!!!
//=========================================================================
//
// Specify prefix for fake unit test tables. If not specified only tests
// taht do not need fake tables will be executed.
// $CFG->unittestprefix = 'tst_';
//
// special magic evil developer only wanting to edit the xmldb files manually
// AND don't use the XMLDBEditor nor the prev/next stuff at all (Mahara and others)
// Uncomment these if you're lazy like Penny
// $CFG->xmldbdisablecommentchecking = true;
// $CFG->xmldbdisablenextprevchecking = true;
//
// special magig evil developer only wanting to edit xmldb files manually
// AND allowing the XMLDBEditor to recostruct the prev/next elements every
// time one file is loaded and saved (Moodle).
// Uncomment this if you're lazy like Petr
// $CFG->xmldbreconstructprevnext = true;
//
//=========================================================================
// ALL DONE! To continue installation, visit your main page with a browser
//=========================================================================
......
......@@ -163,9 +163,15 @@ class FakeDBUnitTestCase extends UnitTestCase {
* @throws moodle_exception if CSV file cannot be created
*/
public function __construct($label = false) {
global $DB, $CFG;
if (empty($CFG->unittestprefix)) {
return;
}
parent::UnitTestCase($label);
// MDL-16483 Get PKs and save data to text file
global $DB, $CFG;
$this->pkfile = $CFG->dataroot.'/testtablespks.csv';
$this->cfg = $CFG;
......@@ -203,6 +209,10 @@ class FakeDBUnitTestCase extends UnitTestCase {
private function truncate_test_tables($tabledata) {
global $CFG, $DB;
if (empty($CFG->unittestprefix)) {
return;
}
$tables = $DB->get_tables();
foreach ($tables as $table) {
......@@ -220,6 +230,12 @@ class FakeDBUnitTestCase extends UnitTestCase {
* @throws moodle_exception if file doesn't exist
*/
public function get_table_data($filename) {
global $CFG;
if (empty($CFG->unittestprefix)) {
return;
}
if (file_exists($this->pkfile)) {
$handle = fopen($this->pkfile, 'r');
$tabledata = array();
......@@ -243,8 +259,13 @@ class FakeDBUnitTestCase extends UnitTestCase {
* TODO Improve detection of incorrectly built DB test tables (e.g. detect version discrepancy and offer to upgrade/rebuild)
*/
public function setUp() {
global $DB, $CFG;
if (empty($CFG->unittestprefix)) {
return;
}
parent::setUp();
global $DB;
$this->DB =& $DB;
ob_start();
}
......@@ -253,7 +274,12 @@ class FakeDBUnitTestCase extends UnitTestCase {
* Method called after each test method. Doesn't do anything extraordinary except restore the global $DB to the real one.
*/
public function tearDown() {
global $DB;
global $DB, $CFG;
if (empty($CFG->unittestprefix)) {
return;
}
if (empty($DB)) {
$DB = $this->DB;
}
......@@ -273,6 +299,10 @@ class FakeDBUnitTestCase extends UnitTestCase {
public function __destruct() {
global $CFG, $DB;
if (empty($CFG->unittestprefix)) {
return;
}
$CFG = $this->cfg;
$this->tearDown();
UnitTestDB::restore();
......@@ -295,7 +325,12 @@ class FakeDBUnitTestCase extends UnitTestCase {
* @return array $objects corresponding to $data.
*/
public function load_test_data($table, array $cols, array $data) {
global $DB;
global $CFG, $DB;
if (empty($CFG->unittestprefix)) {
return;
}
$results = array();
foreach ($data as $rowid => $row) {
$obj = new stdClass;
......@@ -318,7 +353,12 @@ class FakeDBUnitTestCase extends UnitTestCase {
* @param array $rows the rows to delete. Actually, only $rows[$key]->id is used.
*/
public function delete_test_data($table, array $rows) {
global $DB;
global $CFG, $DB;
if (empty($CFG->unittestprefix)) {
return;
}
$ids = array();
foreach ($rows as $row) {
$ids[] = $row->id;
......
......@@ -8,6 +8,7 @@ Changes:
* Bug fix in simpletest.php and test_case.php. Marked with //moodlefix begins,
//moodlefix ends comments. This has been reported back to the simpletest mailing
list. Hopefully will be included in a future release.
* modified run() in test_case.php - skipping tests that need fake db if prefix not set
skodak, Tim
......
......@@ -596,6 +596,16 @@ class TestSuite {
if (is_string($this->_test_cases[$i])) {
$class = $this->_test_cases[$i];
$test = &new $class();
// moodle hack start
global $CFG;
if (empty($CFG->unittestprefix)) {
if ($test instanceof FakeDBUnitTestCase) {
// do not execute this test because test tables not present!
unset($test);
continue;
}
}
// moodle hack end
$test->run($reporter);
unset($test);
} else {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment