NOBUG: I hate the shut-up operator, really!
[moodle.git] / admin / report / unittest / dbtest.php
1 <?php
2 /**
3  * Run database functional tests.
4  * @package SimpleTestEx
5  */
7 /** */
8 require_once(dirname(__FILE__).'/../../../config.php');
9 require_once($CFG->libdir.'/adminlib.php');
10 require_once($CFG->libdir.'/simpletestcoveragelib.php');
11 require_once('ex_simple_test.php');
12 require_once('ex_reporter.php');
14 $showpasses   = optional_param('showpasses', false, PARAM_BOOL);
15 $codecoverage = optional_param('codecoverage', false, PARAM_BOOL);
16 $selected     = optional_param('selected', array(), PARAM_INT);
18 // Print the header and check access.
19 admin_externalpage_setup('reportdbtest');
20 echo $OUTPUT->header();
22 global $UNITTEST;
23 $UNITTEST = new stdClass();
25 if (!data_submitted()) {
26     $selected = array();
27     for ($i=0; $i<=10; $i++) {
28         $selected[$i] = 1;
29     }
30 }
33 $dbinfos     = array();
34 $tests       = array();
36 $dbinfos[0]     = array('name'=>"Current database ($CFG->dblibrary/$CFG->dbtype)", 'installed'=>true, 'configured'=>true); // TODO: localise
37 if (data_submitted() and !empty($selected[0])) {
38     $tests[0] = $DB;
39 }
41 for ($i=1; $i<=10; $i++) {
42     $name = 'func_test_db_'.$i;
43     if (!isset($CFG->$name)) {
44         continue;
45     }
46     list($library, $driver, $dbhost, $dbuser, $dbpass, $dbname, $prefix, $dboptions) = $CFG->$name;
47     $dbinfos[$i] = array('name'=>"External database $i ($library/$driver/$dbhost/$dbname/$prefix)", 'installed'=>false, 'configured'=>false);
49     $classname = "{$driver}_{$library}_moodle_database";
50     require_once("$CFG->libdir/dml/$classname.php");
51     $d = new $classname();
52     if (!$d->driver_installed()) {
53         continue;
54     }
55     $dbinfos[$i]['installed'] = true;
57     try {
58         $d->connect($dbhost, $dbuser, $dbpass, $dbname, $prefix, $dboptions);
59         $dbinfos[$i]['configured'] = true;
60         if (data_submitted() and !empty($selected[$i])) {
61             $tests[$i] = $d;
62         } else {
63             $d->dispose();
64         }
65     } catch (dml_connection_exception $e) {
66         $dbinfos[$i]['configured'] = false;
67     }
68 }
70 if (!empty($tests)) {
71     @ob_implicit_flush(true);
72     while(ob_get_level()) {
73         ob_end_flush();
74     }
76     $covreporter = new moodle_coverage_reporter('Functional DB Tests Code Coverage Report', 'dbtest');
77     $covrecorder = new moodle_coverage_recorder($covreporter);
79     foreach ($tests as $i=>$database) {
80         $dbinfo = $dbinfos[$i];
82         $UNITTEST->func_test_db = $database; // pass the db to the tests through global
84         echo $OUTPUT->heading('Running tests on: '.$dbinfo['name'], 3); // TODO: localise
86         // Create the group of tests.
87         $test = new autogroup_test_coverage(false, true, $codecoverage);
90         $test->addTestFile($CFG->libdir.'/dml/simpletest/testdml.php');
91         $test->addTestFile($CFG->libdir.'/ddl/simpletest/testddl.php');
93         // Make the reporter, which is what displays the results.
94         $reporter = new ExHtmlReporter($showpasses);
96         set_time_limit(300); // 5 mins per DB should be enough
97         $test->run_with_external_coverage($reporter, $covrecorder);
99         unset($UNITTEST->func_test_db);
101         echo '<hr />';
102     }
103     if ($codecoverage) {
104         $covrecorder->generate_report();
105         moodle_coverage_reporter::print_summary_info('dbtest');
106     }
110 // Print the form for adjusting options.
111 echo $OUTPUT->box_start('generalbox boxwidthwide boxaligncenter');
112 echo '<form method="post" action="dbtest.php">';
113 echo '<div>';
114 echo $OUTPUT->heading("Run functional database tests"); // TODO: localise
115 echo '<p>'.html_writer::checkbox('showpasses', 1, $showpasses, get_string('showpasses', 'simpletest')).'</p>';
116 if (moodle_coverage_recorder::can_run_codecoverage()) {
117     echo '<p>'.html_writer::checkbox('codecoverage', 1, $codecoverage, get_string('codecoverageanalysis', 'simpletest')).'</p>';
118 } else {
119     echo '<p>'; print_string('codecoveragedisabled', 'simpletest'); echo '<input type="hidden" name="codecoverage" value="0" /></p>';
121 echo '<p><strong>'."Databases:".'</strong></p>';
122 echo '<ul>';
123 foreach ($dbinfos as $i=>$dbinfo) {
124     $name = $dbinfo['name'];
125     if ($dbinfo['installed']) {
126         if (!$dbinfo['configured']) {
127             $name = "$name (misconfigured)"; // TODO: localise
128         }
129         echo '<li>'.html_writer::checkbox('selected['.$i.']', 1, intval(!empty($selected[$i])), $name).'</li>';
130     } else {
131         echo '<li>'."$name: driver not installed".'</li>'; // TODO: localise
132     }
134 echo '</ul>';
135 echo '<p>External databases are configured in config.php, add lines:</p>
136 <pre>
137 $CFG->func_test_db_1 = array("native", "pgsql", "localhost", "moodleuser", "password", "moodle", "test", null);
138 $CFG->func_test_db_2 = array("native", "mssql", "localhost", "moodleuser", "password", "moodle", "test", null);
139 </pre>
140 <p>where order of parameters is: dblibrary, dbtype, dbhost, dbuser, dbpass, dbname, prefix, dboptions</p>';
141 echo '<p><input type="submit" value="' . get_string('runtests', 'simpletest') . '" /></p>';
142 echo '</div>';
143 echo '</form>';
144 echo $OUTPUT->box_end();
146 // Print link to latest code coverage for this report type
147 if (!data_submitted() || !$codecoverage) {
148     moodle_coverage_reporter::print_link_to_latest('dbtest');
151 // Footer.
152 echo $OUTPUT->footer();