MDL-52752 mathjaxloader: version bump
[moodle.git] / admin / tool / log / store / database / tests / store_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * External database log store tests.
19  *
20  * @package    logstore_database
21  * @copyright  2014 Petr Skoda {@link http://skodak.org/}
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die();
27 require_once(__DIR__ . '/fixtures/event.php');
28 require_once(__DIR__ . '/fixtures/store.php');
30 class logstore_database_store_testcase extends advanced_testcase {
31     public function test_log_writing() {
32         global $DB, $CFG;
33         $this->resetAfterTest();
34         $this->preventResetByRollback(); // Logging waits till the transaction gets committed.
36         $dbman = $DB->get_manager();
37         $this->assertTrue($dbman->table_exists('logstore_standard_log'));
38         $DB->delete_records('logstore_standard_log');
40         $this->setAdminUser();
41         $user1 = $this->getDataGenerator()->create_user();
42         $user2 = $this->getDataGenerator()->create_user();
43         $course1 = $this->getDataGenerator()->create_course();
44         $module1 = $this->getDataGenerator()->create_module('resource', array('course' => $course1));
45         $course2 = $this->getDataGenerator()->create_course();
46         $module2 = $this->getDataGenerator()->create_module('resource', array('course' => $course2));
48         // Test all plugins are disabled by this command.
49         set_config('enabled_stores', '', 'tool_log');
50         $manager = get_log_manager(true);
51         $stores = $manager->get_readers();
52         $this->assertCount(0, $stores);
54         // Fake the settings, we will abuse the standard plugin table here...
55         $parts = explode('_', get_class($DB));
56         set_config('dbdriver', $parts[1] . '/' . $parts[0], 'logstore_database');
57         set_config('dbhost', $CFG->dbhost, 'logstore_database');
58         set_config('dbuser', $CFG->dbuser, 'logstore_database');
59         set_config('dbpass', $CFG->dbpass, 'logstore_database');
60         set_config('dbname', $CFG->dbname, 'logstore_database');
61         set_config('dbtable', $CFG->prefix . 'logstore_standard_log', 'logstore_database');
62         if (!empty($CFG->dboptions['dbpersist'])) {
63             set_config('dbpersist', 1, 'logstore_database');
64         } else {
65             set_config('dbpersist', 0, 'logstore_database');
66         }
67         if (!empty($CFG->dboptions['dbsocket'])) {
68             set_config('dbsocket', $CFG->dboptions['dbsocket'], 'logstore_database');
69         } else {
70             set_config('dbsocket', '', 'logstore_database');
71         }
72         if (!empty($CFG->dboptions['dbport'])) {
73             set_config('dbport', $CFG->dboptions['dbport'], 'logstore_database');
74         } else {
75             set_config('dbport', '', 'logstore_database');
76         }
77         if (!empty($CFG->dboptions['dbschema'])) {
78             set_config('dbschema', $CFG->dboptions['dbschema'], 'logstore_database');
79         } else {
80             set_config('dbschema', '', 'logstore_database');
81         }
82         if (!empty($CFG->dboptions['dbcollation'])) {
83             set_config('dbcollation', $CFG->dboptions['dbcollation'], 'logstore_database');
84         } else {
85             set_config('dbcollation', '', 'logstore_database');
86         }
88         // Enable logging plugin.
89         set_config('enabled_stores', 'logstore_database', 'tool_log');
90         set_config('buffersize', 0, 'logstore_database');
91         set_config('logguests', 1, 'logstore_database');
92         $manager = get_log_manager(true);
94         $stores = $manager->get_readers();
95         $this->assertCount(1, $stores);
96         $this->assertEquals(array('logstore_database'), array_keys($stores));
97         $store = $stores['logstore_database'];
98         $this->assertInstanceOf('logstore_database\log\store', $store);
99         $this->assertInstanceOf('tool_log\log\writer', $store);
100         $this->assertTrue($store->is_logging());
102         $logs = $DB->get_records('logstore_standard_log', array(), 'id ASC');
103         $this->assertCount(0, $logs);
105         $this->setCurrentTimeStart();
107         $this->setUser(0);
108         $event1 = \logstore_database\event\unittest_executed::create(
109             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)));
110         $event1->trigger();
112         $logs = $DB->get_records('logstore_standard_log', array(), 'id ASC');
113         $this->assertCount(1, $logs);
115         $log1 = reset($logs);
116         unset($log1->id);
117         $log1->other = unserialize($log1->other);
118         $log1 = (array)$log1;
119         $data = $event1->get_data();
120         $data['origin'] = 'cli';
121         $data['ip'] = null;
122         $data['realuserid'] = null;
123         $this->assertEquals($data, $log1);
125         $this->setAdminUser();
126         \core\session\manager::loginas($user1->id, context_system::instance());
127         $this->assertEquals(2, $DB->count_records('logstore_standard_log'));
129         $event2 = \logstore_database\event\unittest_executed::create(
130             array('context' => context_module::instance($module2->cmid), 'other' => array('sample' => 6, 'xx' => 9)));
131         $event2->trigger();
133         \core\session\manager::init_empty_session();
134         $this->assertFalse(\core\session\manager::is_loggedinas());
136         $logs = $DB->get_records('logstore_standard_log', array(), 'id ASC');
137         $this->assertCount(3, $logs);
138         array_shift($logs);
139         $log2 = array_shift($logs);
140         $this->assertSame('\core\event\user_loggedinas', $log2->eventname);
142         $log3 = array_shift($logs);
143         unset($log3->id);
144         $log3->other = unserialize($log3->other);
145         $log3 = (array)$log3;
146         $data = $event2->get_data();
147         $data['origin'] = 'cli';
148         $data['ip'] = null;
149         $data['realuserid'] = 2;
150         $this->assertEquals($data, $log3);
152         // Test reading.
153         $this->assertSame(3, $store->get_events_select_count('', array()));
154         $events = $store->get_events_select('', array(), 'timecreated ASC', 0, 0); // Is actually sorted by "timecreated ASC, id ASC".
155         $this->assertCount(3, $events);
156         $resev1 = array_shift($events);
157         array_shift($events);
158         $resev2 = array_shift($events);
159         $this->assertEquals($event1->get_data(), $resev1->get_data());
160         $this->assertEquals($event2->get_data(), $resev2->get_data());
162         // Test buffering.
163         set_config('buffersize', 3, 'logstore_database');
164         $manager = get_log_manager(true);
165         $stores = $manager->get_readers();
166         /** @var \logstore_database\log\store $store */
167         $store = $stores['logstore_database'];
168         $DB->delete_records('logstore_standard_log');
170         \logstore_database\event\unittest_executed::create(
171             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
172         $this->assertEquals(0, $DB->count_records('logstore_standard_log'));
173         \logstore_database\event\unittest_executed::create(
174             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
175         $this->assertEquals(0, $DB->count_records('logstore_standard_log'));
176         $store->flush();
177         $this->assertEquals(2, $DB->count_records('logstore_standard_log'));
178         \logstore_database\event\unittest_executed::create(
179             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
180         $this->assertEquals(2, $DB->count_records('logstore_standard_log'));
181         \logstore_database\event\unittest_executed::create(
182             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
183         $this->assertEquals(2, $DB->count_records('logstore_standard_log'));
184         \logstore_database\event\unittest_executed::create(
185             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
186         $this->assertEquals(5, $DB->count_records('logstore_standard_log'));
187         \logstore_database\event\unittest_executed::create(
188             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
189         $this->assertEquals(5, $DB->count_records('logstore_standard_log'));
190         \logstore_database\event\unittest_executed::create(
191             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
192         $this->assertEquals(5, $DB->count_records('logstore_standard_log'));
193         \logstore_database\event\unittest_executed::create(
194             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
195         $this->assertEquals(8, $DB->count_records('logstore_standard_log'));
197         // Test guest logging setting.
198         set_config('logguests', 0, 'logstore_database');
199         set_config('buffersize', 0, 'logstore_database');
200         get_log_manager(true);
201         $DB->delete_records('logstore_standard_log');
202         get_log_manager(true);
204         $this->setUser(null);
205         \logstore_database\event\unittest_executed::create(
206             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
207         $this->assertEquals(0, $DB->count_records('logstore_standard_log'));
209         $this->setGuestUser();
210         \logstore_database\event\unittest_executed::create(
211             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
212         $this->assertEquals(0, $DB->count_records('logstore_standard_log'));
214         $this->setUser($user1);
215         \logstore_database\event\unittest_executed::create(
216             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
217         $this->assertEquals(1, $DB->count_records('logstore_standard_log'));
219         $this->setUser($user2);
220         \logstore_database\event\unittest_executed::create(
221             array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
222         $this->assertEquals(2, $DB->count_records('logstore_standard_log'));
224         set_config('enabled_stores', '', 'tool_log');
225         get_log_manager(true);
226     }
228     /**
229      * Test method is_event_ignored.
230      */
231     public function test_is_event_ignored() {
232         $this->resetAfterTest();
234         // Test guest filtering.
235         set_config('logguests', 0, 'logstore_database');
236         $this->setGuestUser();
237         $event = \logstore_database\event\unittest_executed::create(
238                 array('context' => context_system::instance(), 'other' => array('sample' => 5, 'xx' => 10)));
239         $logmanager = get_log_manager();
240         $store = new \logstore_database\test\store($logmanager);
241         $this->assertTrue($store->is_event_ignored($event));
243         set_config('logguests', 1, 'logstore_database');
244         $store = new \logstore_database\test\store($logmanager); // Reload.
245         $this->assertFalse($store->is_event_ignored($event));
247         // Test action/level filtering.
248         set_config('includelevels', '', 'logstore_database');
249         set_config('includeactions', '', 'logstore_database');
250         $store = new \logstore_database\test\store($logmanager); // Reload.
251         $this->assertTrue($store->is_event_ignored($event));
253         set_config('includelevels', '0,1', 'logstore_database');
254         $store = new \logstore_database\test\store($logmanager); // Reload.
255         $this->assertTrue($store->is_event_ignored($event));
257         set_config('includelevels', '0,1,2', 'logstore_database');
258         $store = new \logstore_database\test\store($logmanager); // Reload.
259         $this->assertFalse($store->is_event_ignored($event));
261         set_config('includelevels', '', 'logstore_database');
262         set_config('includeactions', 'c,r,d', 'logstore_database');
263         $store = new \logstore_database\test\store($logmanager); // Reload.
264         $this->assertTrue($store->is_event_ignored($event));
266         set_config('includeactions', 'c,r,u,d', 'logstore_database');
267         $store = new \logstore_database\test\store($logmanager); // Reload.
268         $this->assertFalse($store->is_event_ignored($event));
269     }
271     /**
272      * Test logmanager::get_supported_reports returns all reports that require this store.
273      */
274     public function test_get_supported_reports() {
275         $logmanager = get_log_manager();
276         $allreports = \core_component::get_plugin_list('report');
278         $supportedreports = array(
279             'report_log' => '/report/log',
280             'report_loglive' => '/report/loglive'
281         );
283         // Make sure all supported reports are installed.
284         $expectedreports = array_keys(array_intersect_key($allreports, $supportedreports));
285         $reports = $logmanager->get_supported_reports('logstore_database');
286         $reports = array_keys($reports);
287         foreach ($expectedreports as $expectedreport) {
288             $this->assertContains($expectedreport, $reports);
289         }
290     }