source: moodle/trunk/fuentes/admin/tool/log/store/database/tests/store_test.php @ 136

Last change on this file since 136 was 136, checked in by mabarracus, 4 years ago

Ported code to xenial

File size: 13.6 KB
Line 
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/>.
16
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 */
24
25defined('MOODLE_INTERNAL') || die();
26
27require_once(__DIR__ . '/fixtures/event.php');
28require_once(__DIR__ . '/fixtures/store.php');
29
30class 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.
35
36        $dbman = $DB->get_manager();
37        $this->assertTrue($dbman->table_exists('logstore_standard_log'));
38        $DB->delete_records('logstore_standard_log');
39
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));
47
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);
53
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        }
87
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);
93
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());
101
102        $logs = $DB->get_records('logstore_standard_log', array(), 'id ASC');
103        $this->assertCount(0, $logs);
104
105        $this->setCurrentTimeStart();
106
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();
111
112        $logs = $DB->get_records('logstore_standard_log', array(), 'id ASC');
113        $this->assertCount(1, $logs);
114
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);
124
125        $this->setAdminUser();
126        \core\session\manager::loginas($user1->id, context_system::instance());
127        $this->assertEquals(2, $DB->count_records('logstore_standard_log'));
128
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();
132
133        \core\session\manager::init_empty_session();
134        $this->assertFalse(\core\session\manager::is_loggedinas());
135
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);
141
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);
151
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());
161
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');
169
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'));
196
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);
203
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'));
208
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'));
213
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'));
218
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'));
223
224        set_config('enabled_stores', '', 'tool_log');
225        get_log_manager(true);
226    }
227
228    /**
229     * Test method is_event_ignored.
230     */
231    public function test_is_event_ignored() {
232        $this->resetAfterTest();
233
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));
242
243        set_config('logguests', 1, 'logstore_database');
244        $store = new \logstore_database\test\store($logmanager); // Reload.
245        $this->assertFalse($store->is_event_ignored($event));
246
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));
252
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));
256
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));
260
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));
265
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    }
270
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');
277
278        $supportedreports = array(
279            'report_log' => '/report/log',
280            'report_loglive' => '/report/loglive'
281        );
282
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    }
291}
Note: See TracBrowser for help on using the repository browser.