ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ.. namespace core\task; /** * This file contains unit tests for the 'task running' data. * * @package core * @category test * @copyright 2019 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ final class running_test extends \advanced_testcase { public static function setUpBeforeClass(): void { require_once(__DIR__ . '/../fixtures/task_fixtures.php'); } /** * Test for ad-hoc tasks. */ public function test_adhoc_task_running() { $this->resetAfterTest(); // Specify lock factory. The reason is that Postgres locks don't work within a single // process (i.e. if you try to get a lock that you already locked, it will just let you) // which is usually OK but not here where we are simulating running two tasks at once in // the same process. set_config('lock_factory', '\core\lock\db_record_lock_factory'); // Create and queue 2 new ad-hoc tasks. $task1 = new adhoc_test_task(); $task1->set_next_run_time(time() - 20); manager::queue_adhoc_task($task1); $task2 = new adhoc_test2_task(); $task2->set_next_run_time(time() - 10); manager::queue_adhoc_task($task2); // Check no tasks are marked running. $running = manager::get_running_tasks(); $this->assertEmpty($running); // Mark the first task running and check results. $before = time(); $next1 = manager::get_next_adhoc_task(time()); manager::adhoc_task_starting($next1); $after = time(); $running = manager::get_running_tasks(); $this->assertCount(1, $running); foreach ($running as $item) { $this->assertEquals('adhoc', $item->type); $this->assertLessThanOrEqual($after, $item->timestarted); $this->assertGreaterThanOrEqual($before, $item->timestarted); } // Mark the second task running and check results. $next2 = manager::get_next_adhoc_task(time()); manager::adhoc_task_starting($next2); $running = manager::get_running_tasks(); $this->assertCount(2, $running); // Second task completes successfully. manager::adhoc_task_complete($next2); $running = manager::get_running_tasks(); $this->assertCount(1, $running); // First task fails. manager::adhoc_task_failed($next1); $running = manager::get_running_tasks(); $this->assertCount(0, $running); } /** * Test for scheduled tasks. */ public function test_scheduled_task_running() { global $DB; $this->resetAfterTest(); // Check no tasks are marked running. $running = manager::get_running_tasks(); $this->assertEmpty($running); // Disable all the tasks, except two, and set those two due to run. $DB->set_field_select('task_scheduled', 'disabled', 1, 'classname != ? AND classname != ?', ['\core\task\session_cleanup_task', '\core\task\file_trash_cleanup_task']); $DB->set_field('task_scheduled', 'nextruntime', 1, ['classname' => '\core\task\session_cleanup_task']); $DB->set_field('task_scheduled', 'nextruntime', 1, ['classname' => '\core\task\file_trash_cleanup_task']); $DB->set_field('task_scheduled', 'lastruntime', time() - 1000, ['classname' => '\core\task\session_cleanup_task']); $DB->set_field('task_scheduled', 'lastruntime', time() - 500, ['classname' => '\core\task\file_trash_cleanup_task']); // Get the first task and start it off. $next1 = manager::get_next_scheduled_task(time()); $before = time(); manager::scheduled_task_starting($next1); $after = time(); $running = manager::get_running_tasks(); $this->assertCount(1, $running); foreach ($running as $item) { $this->assertLessThanOrEqual($after, $item->timestarted); $this->assertGreaterThanOrEqual($before, $item->timestarted); $this->assertEquals('\core\task\session_cleanup_task', $item->classname); } // Mark the second task running and check results. We have to change the times so the other // one comes up first, otherwise it repeats the same one. $DB->set_field('task_scheduled', 'lastruntime', time() - 1500, ['classname' => '\core\task\file_trash_cleanup_task']); // Make sure that there is a time gap between task to sort them as expected. sleep(1); $next2 = manager::get_next_scheduled_task(time()); manager::scheduled_task_starting($next2); // Check default sorting by timestarted. $running = manager::get_running_tasks(); $this->assertCount(2, $running); $item = array_shift($running); $this->assertEquals('\core\task\session_cleanup_task', $item->classname); $item = array_shift($running); $this->assertEquals('\core\task\file_trash_cleanup_task', $item->classname); // Check sorting by time ASC. $running = manager::get_running_tasks('time ASC'); $this->assertCount(2, $running); $item = array_shift($running); $this->assertEquals('\core\task\file_trash_cleanup_task', $item->classname); $item = array_shift($running); $this->assertEquals('\core\task\session_cleanup_task', $item->classname); // Complete the file trash one. manager::scheduled_task_complete($next2); $running = manager::get_running_tasks(); $this->assertCount(1, $running); // Other task fails. manager::scheduled_task_failed($next1); $running = manager::get_running_tasks(); $this->assertCount(0, $running); } }