2b8b7d1e19dc5ea47994a4bfb90ce201a8eca223
[moodle.git] / lib / tests / adhoc_task_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  * This file contains the unittests for adhock tasks.
19  *
20  * @package   core
21  * @category  phpunit
22  * @copyright 2013 Damyon Wiese
23  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die();
27 require_once(__DIR__ . '/fixtures/task_fixtures.php');
30 /**
31  * Test class for adhoc tasks.
32  *
33  * @package core
34  * @category task
35  * @copyright 2013 Damyon Wiese
36  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
37  */
38 class core_adhoc_task_testcase extends advanced_testcase {
40     /**
41      * Test basic adhoc task execution.
42      */
43     public function test_get_next_adhoc_task_now() {
44         $this->resetAfterTest(true);
46         // Create an adhoc task.
47         $task = new \core\task\adhoc_test_task();
49         // Queue it.
50         \core\task\manager::queue_adhoc_task($task);
52         $now = time();
53         // Get it from the scheduler.
54         $task = \core\task\manager::get_next_adhoc_task($now);
55         $this->assertInstanceOf('\\core\\task\\adhoc_test_task', $task);
56         $task->execute();
57         \core\task\manager::adhoc_task_complete($task);
58     }
60     /**
61      * Test adhoc task failure retry backoff.
62      */
63     public function test_get_next_adhoc_task_fail_retry() {
64         $this->resetAfterTest(true);
66         // Create an adhoc task.
67         $task = new \core\task\adhoc_test_task();
68         \core\task\manager::queue_adhoc_task($task);
70         $now = time();
72         // Get it from the scheduler, execute it, and mark it as failed.
73         $task = \core\task\manager::get_next_adhoc_task($now);
74         $task->execute();
75         \core\task\manager::adhoc_task_failed($task);
77         // The task will not be returned immediately.
78         $this->assertNull(\core\task\manager::get_next_adhoc_task($now));
80         // Should get the adhoc task (retry after delay).
81         $task = \core\task\manager::get_next_adhoc_task($now + 120);
82         $this->assertInstanceOf('\\core\\task\\adhoc_test_task', $task);
83         $task->execute();
85         \core\task\manager::adhoc_task_complete($task);
87         // Should not get any task.
88         $this->assertNull(\core\task\manager::get_next_adhoc_task($now));
89     }
91     /**
92      * Test future adhoc task execution.
93      */
94     public function test_get_next_adhoc_task_future() {
95         $this->resetAfterTest(true);
97         $now = time();
98         // Create an adhoc task in future.
99         $task = new \core\task\adhoc_test_task();
100         $task->set_next_run_time($now + 1000);
101         \core\task\manager::queue_adhoc_task($task);
103         // Fetching the next task should not return anything.
104         $this->assertNull(\core\task\manager::get_next_adhoc_task($now));
106         // Fetching in the future should return the task.
107         $task = \core\task\manager::get_next_adhoc_task($now + 1020);
108         $this->assertInstanceOf('\\core\\task\\adhoc_test_task', $task);
109         $task->execute();
110         \core\task\manager::adhoc_task_complete($task);
111     }
113     /**
114      * Test empty set of adhoc tasks
115      */
116     public function test_get_adhoc_tasks_empty_set() {
117         $this->resetAfterTest(true);
119         $this->assertEquals([], \core\task\manager::get_adhoc_tasks('\\core\\task\\adhoc_test_task'));
120     }
122     /**
123      * Test correct set of adhoc tasks is returned for class.
124      */
125     public function test_get_adhoc_tasks_result_set() {
126         $this->resetAfterTest(true);
128         for ($i = 0; $i < 3; $i++) {
129             $task = new \core\task\adhoc_test_task();
130             \core\task\manager::queue_adhoc_task($task);
131         }
133         for ($i = 0; $i < 3; $i++) {
134             $task = new \core\task\adhoc_test2_task();
135             \core\task\manager::queue_adhoc_task($task);
136         }
138         $adhoctests = \core\task\manager::get_adhoc_tasks('\\core\\task\\adhoc_test_task');
139         $adhoctest2s = \core\task\manager::get_adhoc_tasks('\\core\\task\\adhoc_test2_task');
141         $this->assertCount(3, $adhoctests);
142         $this->assertCount(3, $adhoctest2s);
144         foreach ($adhoctests as $task) {
145             $this->assertInstanceOf('\\core\\task\\adhoc_test_task', $task);
146         }
148         foreach ($adhoctest2s as $task) {
149             $this->assertInstanceOf('\\core\\task\\adhoc_test2_task', $task);
150         }
151     }
153     /**
154      * Test queue_adhoc_task "if not scheduled".
155      */
156     public function test_queue_adhoc_task_if_not_scheduled() {
157         $this->resetAfterTest(true);
158         $user = \core_user::get_user_by_username('admin');
160         // Schedule adhoc task.
161         $task = new \core\task\adhoc_test_task();
162         $task->set_custom_data(array('courseid' => 10));
163         $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
164         $this->assertEquals(1, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
166         // Schedule adhoc task with a user.
167         $task = new \core\task\adhoc_test_task();
168         $task->set_custom_data(array('courseid' => 10));
169         $task->set_userid($user->id);
170         $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
171         $this->assertEquals(2, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
173         // Schedule same adhoc task with different custom data.
174         $task = new \core\task\adhoc_test_task();
175         $task->set_custom_data(array('courseid' => 1));
176         $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
177         $this->assertEquals(3, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
179         // Schedule same adhoc task with same custom data.
180         $task = new \core\task\adhoc_test_task();
181         $task->set_custom_data(array('courseid' => 1));
182         $this->assertEmpty(\core\task\manager::queue_adhoc_task($task, true));
183         $this->assertEquals(3, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
185         // Schedule same adhoc task with same custom data and a user.
186         $task = new \core\task\adhoc_test_task();
187         $task->set_custom_data(array('courseid' => 1));
188         $task->set_userid($user->id);
189         $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
190         $this->assertEquals(4, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
192         // Schedule same adhoc task without custom data.
193         // Note: This task was created earlier.
194         $task = new \core\task\adhoc_test_task();
195         $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
196         $this->assertEquals(5, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
198         // Schedule same adhoc task without custom data (again).
199         $task5 = new \core\task\adhoc_test_task();
200         $this->assertEmpty(\core\task\manager::queue_adhoc_task($task5, true));
201         $this->assertEquals(5, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
203         // Schedule same adhoc task without custom data but with a userid.
204         $task6 = new \core\task\adhoc_test_task();
205         $user = \core_user::get_user_by_username('admin');
206         $task6->set_userid($user->id);
207         $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task6, true));
208         $this->assertEquals(6, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
210         // Schedule same adhoc task again without custom data but with a userid.
211         $task6 = new \core\task\adhoc_test_task();
212         $user = \core_user::get_user_by_username('admin');
213         $task6->set_userid($user->id);
214         $this->assertEmpty(\core\task\manager::queue_adhoc_task($task6, true));
215         $this->assertEquals(6, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
216     }
218     /**
219      * Test that when no userid is specified, it returns empty from the DB
220      * too.
221      */
222     public function test_adhoc_task_user_empty() {
223         $this->resetAfterTest(true);
225         // Create an adhoc task in future.
226         $task = new \core\task\adhoc_test_task();
227         \core\task\manager::queue_adhoc_task($task);
229         // Get it back from the scheduler.
230         $now = time();
231         $task = \core\task\manager::get_next_adhoc_task($now);
232         \core\task\manager::adhoc_task_complete($task);
234         $this->assertEmpty($task->get_userid());
235     }
237     /**
238      * Test that when a userid is specified, that userid is subsequently
239      * returned.
240      */
241     public function test_adhoc_task_user_set() {
242         $this->resetAfterTest(true);
244         // Create an adhoc task in future.
245         $task = new \core\task\adhoc_test_task();
246         $user = \core_user::get_user_by_username('admin');
247         $task->set_userid($user->id);
248         \core\task\manager::queue_adhoc_task($task);
250         // Get it back from the scheduler.
251         $now = time();
252         $task = \core\task\manager::get_next_adhoc_task($now);
253         \core\task\manager::adhoc_task_complete($task);
255         $this->assertEquals($user->id, $task->get_userid());
256     }