mirror of
https://github.com/moodle/moodle.git
synced 2025-04-14 04:52:36 +02:00
MDL-69419 core: Task reset tests cannot use random test times
If a scheduled task which uses a 'R' field is picked, then the reset of updated task times will not necessarily be correctly determined as the randomisation is picked during reset. This can lead to some random test failures. Actively specifying a test which does not make use of the 'R' random field time addresses this issue.
This commit is contained in:
parent
a0fc902eb1
commit
72616bfd46
@ -148,73 +148,87 @@ class core_scheduled_task_testcase extends advanced_testcase {
|
||||
$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(): void {
|
||||
$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(): void {
|
||||
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 a customised task was not altered by reset.
|
||||
$this->assertEquals($firsttaskrecord, $newfirsttaskrecord);
|
||||
|
||||
// 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);
|
||||
$taskafterreset = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class);
|
||||
$this->assertNotFalse($taskafterreset);
|
||||
|
||||
// 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);
|
||||
$this->assertTaskEquals($task, $taskafterreset);
|
||||
$this->assertCount(count($tasklist), \core\task\manager::load_scheduled_tasks_for_component('moodle'));
|
||||
}
|
||||
|
||||
// Assert we have the same number of tasks.
|
||||
$this->assertEquals($initcount, $finalcount);
|
||||
public function test_reset_scheduled_tasks_for_component_changed_in_source(): void {
|
||||
$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 @@ class core_scheduled_task_testcase extends advanced_testcase {
|
||||
$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): void {
|
||||
// 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): void {
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user