NOBUG standardising prevention of output buffering
[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 // disable compression, it would prevent closing of buffers
15 if (ini_get('zlib.output_compression')) {
16     ini_set('zlib.output_compression', 'Off');
17 }
19 // try to flush everything all the time
20 ob_implicit_flush(true);
21 while(ob_get_level()) {
22     if (!ob_end_clean()) {
23         // prevent infinite loop
24         break;
25     }
26 }
28 $showpasses   = optional_param('showpasses', false, PARAM_BOOL);
29 $codecoverage = optional_param('codecoverage', false, PARAM_BOOL);
30 $selected     = optional_param('selected', array(), PARAM_INT);
32 // Print the header and check access.
33 admin_externalpage_setup('reportdbtest');
34 echo $OUTPUT->header();
36 global $UNITTEST;
37 $UNITTEST = new stdClass();
39 if (!data_submitted()) {
40     $selected = array();
41     for ($i=0; $i<=10; $i++) {
42         $selected[$i] = 1;
43     }
44 }
47 $dbinfos     = array();
48 $tests       = array();
50 $dbinfos[0]     = array('name'=>"Current database ($CFG->dblibrary/$CFG->dbtype)", 'installed'=>true, 'configured'=>true); // TODO: localise
51 if (data_submitted() and !empty($selected[0])) {
52     $tests[0] = $DB;
53 }
55 for ($i=1; $i<=10; $i++) {
56     $name = 'func_test_db_'.$i;
57     if (!isset($CFG->$name)) {
58         continue;
59     }
60     list($library, $driver, $dbhost, $dbuser, $dbpass, $dbname, $prefix, $dboptions) = $CFG->$name;
61     $dbinfos[$i] = array('name'=>"External database $i ($library/$driver/$dbhost/$dbname/$prefix)", 'installed'=>false, 'configured'=>false);
63     $classname = "{$driver}_{$library}_moodle_database";
64     require_once("$CFG->libdir/dml/$classname.php");
65     $d = new $classname();
66     if (!$d->driver_installed()) {
67         continue;
68     }
69     $dbinfos[$i]['installed'] = true;
71     try {
72         $d->connect($dbhost, $dbuser, $dbpass, $dbname, $prefix, $dboptions);
73         $dbinfos[$i]['configured'] = true;
74         if (data_submitted() and !empty($selected[$i])) {
75             $tests[$i] = $d;
76         } else {
77             $d->dispose();
78         }
79     } catch (dml_connection_exception $e) {
80         $dbinfos[$i]['configured'] = false;
81     }
82 }
84 if (!empty($tests)) {
85     $covreporter = new moodle_coverage_reporter('Functional DB Tests Code Coverage Report', 'dbtest');
86     $covrecorder = new moodle_coverage_recorder($covreporter);
88     foreach ($tests as $i=>$database) {
89         $dbinfo = $dbinfos[$i];
91         $UNITTEST->func_test_db = $database; // pass the db to the tests through global
93         echo $OUTPUT->heading('Running tests on: '.$dbinfo['name'], 3); // TODO: localise
95         // Create the group of tests.
96         $test = new autogroup_test_coverage(false, true, $codecoverage);
99         $test->addTestFile($CFG->libdir.'/dml/simpletest/testdml.php');
100         $test->addTestFile($CFG->libdir.'/ddl/simpletest/testddl.php');
102         // Make the reporter, which is what displays the results.
103         $reporter = new ExHtmlReporter($showpasses);
105         set_time_limit(300); // 5 mins per DB should be enough
106         $test->run_with_external_coverage($reporter, $covrecorder);
108         unset($UNITTEST->func_test_db);
110         echo '<hr />';
111     }
112     if ($codecoverage) {
113         $covrecorder->generate_report();
114         moodle_coverage_reporter::print_summary_info('dbtest');
115     }
119 // Print the form for adjusting options.
120 echo $OUTPUT->box_start('generalbox boxwidthwide boxaligncenter');
121 echo '<form method="post" action="dbtest.php">';
122 echo '<div>';
123 echo $OUTPUT->heading("Run functional database tests"); // TODO: localise
124 echo '<p>'.html_writer::checkbox('showpasses', 1, $showpasses, get_string('showpasses', 'simpletest')).'</p>';
125 if (moodle_coverage_recorder::can_run_codecoverage()) {
126     echo '<p>'.html_writer::checkbox('codecoverage', 1, $codecoverage, get_string('codecoverageanalysis', 'simpletest')).'</p>';
127 } else {
128     echo '<p>'; print_string('codecoveragedisabled', 'simpletest'); echo '<input type="hidden" name="codecoverage" value="0" /></p>';
130 echo '<p><strong>'."Databases:".'</strong></p>';
131 echo '<ul>';
132 foreach ($dbinfos as $i=>$dbinfo) {
133     $name = $dbinfo['name'];
134     if ($dbinfo['installed']) {
135         if (!$dbinfo['configured']) {
136             $name = "$name (misconfigured)"; // TODO: localise
137         }
138         echo '<li>'.html_writer::checkbox('selected['.$i.']', 1, intval(!empty($selected[$i])), $name).'</li>';
139     } else {
140         echo '<li>'."$name: driver not installed".'</li>'; // TODO: localise
141     }
143 echo '</ul>';
144 echo '<p>External databases are configured in config.php, add lines:</p>
145 <pre>
146 $CFG->func_test_db_1 = array("native", "pgsql", "localhost", "moodleuser", "password", "moodle", "test", null);
147 $CFG->func_test_db_2 = array("native", "mssql", "localhost", "moodleuser", "password", "moodle", "test", null);
148 </pre>
149 <p>where order of parameters is: dblibrary, dbtype, dbhost, dbuser, dbpass, dbname, prefix, dboptions</p>';
150 echo '<p><input type="submit" value="' . get_string('runtests', 'simpletest') . '" /></p>';
151 echo '</div>';
152 echo '</form>';
153 echo $OUTPUT->box_end();
155 // Print link to latest code coverage for this report type
156 if (!data_submitted() || !$codecoverage) {
157     moodle_coverage_reporter::print_link_to_latest('dbtest');
160 // Footer.
161 echo $OUTPUT->footer();