diff --git a/lib/tests/scheduled_task_test.php b/lib/tests/scheduled_task_test.php index 10ce44be66269..3e6c6efb6676f 100644 --- a/lib/tests/scheduled_task_test.php +++ b/lib/tests/scheduled_task_test.php @@ -148,73 +148,87 @@ public function test_timezones() { $this->assertContains('2:15 AM', core_text::strtoupper($userdate)); } - public function test_reset_scheduled_tasks_for_component() { - global $DB; - + public function test_reset_scheduled_tasks_for_component_customised() { $this->resetAfterTest(true); - // Remember the defaults. - $defaulttasks = \core\task\manager::load_scheduled_tasks_for_component('moodle'); - $initcount = count($defaulttasks); + + $tasks = \core\task\manager::load_scheduled_tasks_for_component('moodle'); + // Customise a task. - $firsttask = reset($defaulttasks); - $firsttask->set_minute('1'); - $firsttask->set_hour('2'); - $firsttask->set_month('3'); - $firsttask->set_day_of_week('4'); - $firsttask->set_day('5'); - $firsttask->set_customised('1'); - \core\task\manager::configure_scheduled_task($firsttask); - $firsttaskrecord = \core\task\manager::record_from_scheduled_task($firsttask); - // We reset this field, because we do not want to compare it. - $firsttaskrecord->nextruntime = '0'; + $task = reset($tasks); + $task->set_minute('1'); + $task->set_hour('2'); + $task->set_month('3'); + $task->set_day_of_week('4'); + $task->set_day('5'); + $task->set_customised('1'); + \core\task\manager::configure_scheduled_task($task); + + // Now call reset. + \core\task\manager::reset_scheduled_tasks_for_component('moodle'); + + // Fetch the task again. + $taskafterreset = \core\task\manager::get_scheduled_task(get_class($task)); + + // The task should still be the same as the customised. + $this->assertTaskEquals($task, $taskafterreset); + } + + public function test_reset_scheduled_tasks_for_component_deleted() { + global $DB; + $this->resetAfterTest(true); // Delete a task to simulate the fact that its new. - $secondtask = next($defaulttasks); - $DB->delete_records('task_scheduled', array('classname' => '\\' . trim(get_class($secondtask), '\\'))); - $this->assertFalse(\core\task\manager::get_scheduled_task(get_class($secondtask))); + $tasklist = \core\task\manager::load_scheduled_tasks_for_component('moodle'); - // Edit a task to simulate a change in its definition (as if it was not customised). - $thirdtask = next($defaulttasks); - $thirdtask->set_minute('1'); - $thirdtask->set_hour('2'); - $thirdtask->set_month('3'); - $thirdtask->set_day_of_week('4'); - $thirdtask->set_day('5'); - $thirdtaskbefore = \core\task\manager::get_scheduled_task(get_class($thirdtask)); - $thirdtaskbefore->set_next_run_time(null); // Ignore this value when comparing. - \core\task\manager::configure_scheduled_task($thirdtask); - $thirdtask = \core\task\manager::get_scheduled_task(get_class($thirdtask)); - $thirdtask->set_next_run_time(null); // Ignore this value when comparing. - $this->assertNotEquals($thirdtaskbefore, $thirdtask); + // Note: This test must use a task which does not use any random values. + $task = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class); + + $DB->delete_records('task_scheduled', array('classname' => '\\' . trim(get_class($task), '\\'))); + $this->assertFalse(\core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class)); // Now call reset on all the tasks. \core\task\manager::reset_scheduled_tasks_for_component('moodle'); - // Load the tasks again. - $defaulttasks = \core\task\manager::load_scheduled_tasks_for_component('moodle'); - $finalcount = count($defaulttasks); - // Compare the first task. - $newfirsttask = reset($defaulttasks); - $newfirsttaskrecord = \core\task\manager::record_from_scheduled_task($newfirsttask); - // We reset this field, because we do not want to compare it. - $newfirsttaskrecord->nextruntime = '0'; + // Assert that the second task was added back. + $taskafterreset = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class); + $this->assertNotFalse($taskafterreset); - // Assert a customised task was not altered by reset. - $this->assertEquals($firsttaskrecord, $newfirsttaskrecord); + $this->assertTaskEquals($task, $taskafterreset); + $this->assertCount(count($tasklist), \core\task\manager::load_scheduled_tasks_for_component('moodle')); + } - // Assert that the second task was added back. - $secondtaskafter = \core\task\manager::get_scheduled_task(get_class($secondtask)); - $secondtaskafter->set_next_run_time(null); // Do not compare the nextruntime. - $secondtask->set_next_run_time(null); - $this->assertEquals($secondtask, $secondtaskafter); - - // Assert that the third task edits were overridden. - $thirdtaskafter = \core\task\manager::get_scheduled_task(get_class($thirdtask)); - $thirdtaskafter->set_next_run_time(null); - $this->assertEquals($thirdtaskbefore, $thirdtaskafter); - - // Assert we have the same number of tasks. - $this->assertEquals($initcount, $finalcount); + public function test_reset_scheduled_tasks_for_component_changed_in_source() { + $this->resetAfterTest(true); + + // Delete a task to simulate the fact that its new. + // Note: This test must use a task which does not use any random values. + $task = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class); + + // Get a copy of the task before maing changes for later comparison. + $taskbeforechange = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class); + + // Edit a task to simulate a change in its definition (as if it was not customised). + $task->set_minute('1'); + $task->set_hour('2'); + $task->set_month('3'); + $task->set_day_of_week('4'); + $task->set_day('5'); + \core\task\manager::configure_scheduled_task($task); + + // Fetch the task out for comparison. + $taskafterchange = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class); + + // The task should now be different to the original. + $this->assertTaskNotEquals($taskbeforechange, $taskafterchange); + + // Now call reset. + \core\task\manager::reset_scheduled_tasks_for_component('moodle'); + + // Fetch the task again. + $taskafterreset = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class); + + // The task should now be the same as the original. + $this->assertTaskEquals($taskbeforechange, $taskafterreset); } /** @@ -502,4 +516,56 @@ public function test_clear_fail_delay() { $this->assertEquals(0, $task->get_fail_delay()); $this->assertLessThan($before + 70, $task->get_next_run_time()); } + + /** + * Assert that the specified tasks are equal. + * + * @param \core\task\task_base $task + * @param \core\task\task_base $comparisontask + */ + public function assertTaskEquals(\core\task\task_base $task, \core\task\task_base $comparisontask) { + // Convert both to an object. + $task = \core\task\manager::record_from_scheduled_task($task); + $comparisontask = \core\task\manager::record_from_scheduled_task($comparisontask); + + // Reset the nextruntime field as it is intentionally dynamic. + $task->nextruntime = null; + $comparisontask->nextruntime = null; + + $args = array_merge( + [ + $task, + $comparisontask, + ], + array_slice(func_get_args(), 2) + ); + + call_user_func_array([$this, 'assertEquals'], $args); + } + + /** + * Assert that the specified tasks are not equal. + * + * @param \core\task\task_base $task + * @param \core\task\task_base $comparisontask + */ + public function assertTaskNotEquals(\core\task\task_base $task, \core\task\task_base $comparisontask) { + // Convert both to an object. + $task = \core\task\manager::record_from_scheduled_task($task); + $comparisontask = \core\task\manager::record_from_scheduled_task($comparisontask); + + // Reset the nextruntime field as it is intentionally dynamic. + $task->nextruntime = null; + $comparisontask->nextruntime = null; + + $args = array_merge( + [ + $task, + $comparisontask, + ], + array_slice(func_get_args(), 2) + ); + + call_user_func_array([$this, 'assertNotEquals'], $args); + } }