Skip to content

Commit

Permalink
Merge branch 'MDL-69419-35' of git://github.com/andrewnicols/moodle i…
Browse files Browse the repository at this point in the history
…nto MOODLE_35_STABLE
  • Loading branch information
abgreeve committed Aug 27, 2020
2 parents 738c06f + 26b0918 commit 15fd928
Showing 1 changed file with 122 additions and 56 deletions.
178 changes: 122 additions & 56 deletions lib/tests/scheduled_task_test.php
Expand Up @@ -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);
}

/**
Expand Down Expand Up @@ -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);
}
}

0 comments on commit 15fd928

Please sign in to comment.