/**
  * Tests CronTaskController::isTaskDue
  */
 public function testIsTaskDue()
 {
     $runner = CronTaskController::create();
     $task = new CronTaskTest_TestCron();
     $cron = Cron\CronExpression::factory($task->getSchedule());
     // Assuming first run, match the exact time (seconds are ignored)
     SS_Datetime::set_mock_now('2010-06-20 13:00:10');
     $this->assertTrue($runner->isTaskDue($task, $cron));
     // Assume first run, do not match time just before or just after schedule
     SS_Datetime::set_mock_now('2010-06-20 13:01:10');
     $this->assertFalse($runner->isTaskDue($task, $cron));
     SS_Datetime::set_mock_now('2010-06-20 12:59:50');
     $this->assertFalse($runner->isTaskDue($task, $cron));
     // Mock a run and test that subsequent runs are properly scheduled
     SS_Datetime::set_mock_now('2010-06-20 13:30:10');
     CronTaskStatus::update_status('CronTaskTest_TestCron', true);
     // Job prior to next hour mark should not run
     SS_Datetime::set_mock_now('2010-06-20 13:40:00');
     $this->assertFalse($runner->isTaskDue($task, $cron));
     // Jobs just after the next hour mark should run
     SS_Datetime::set_mock_now('2010-06-20 14:10:00');
     $this->assertTrue($runner->isTaskDue($task, $cron));
     // Jobs somehow delayed a whole day should be run
     SS_Datetime::set_mock_now('2010-06-21 13:40:00');
     $this->assertTrue($runner->isTaskDue($task, $cron));
 }
 /**
  * A helper to set the status on the CronTaskStatus object
  *
  * @param $status string
  * @param bool $wasRun Flag indicating that the task was run this request default: false
  * @return $this
  */
 public function setStatus($status, $wasRun = false)
 {
     CronTaskStatus::update_status(get_class($this), $wasRun, $status);
     return $this;
 }
 /**
  * Checks and runs a single CronTask
  *
  * @param CronTask $task
  */
 public function runTask(CronTask $task)
 {
     $class_name = get_class($task);
     $status = CronTaskStatus::get_status($class_name);
     $cron = CronExpression::factory($status->ScheduleString);
     $isDue = $this->isTaskDue($task, $cron);
     if ($isDue) {
         $this->output($class_name . ' will start now.');
         $task->doProcess();
         foreach ($task->getMessages() as $message) {
             $this->output($class_name . ': ' . $message);
         }
     } else {
         $this->output($class_name . ' will run at ' . $cron->getNextRunDate()->format('Y-m-d H:i:s') . '.');
     }
 }
 /**
  * Checks and runs a single CronTask
  *
  * @param CronTask $task
  * @param boolean $forceRun
  */
 protected function runTask(CronTask $task, $forceRun = false)
 {
     $cron = Cron\CronExpression::factory($task->getSchedule());
     $isDue = $this->isTaskDue($task, $cron);
     $willRun = $isDue || $forceRun;
     // Update status of this task prior to execution in case of interruption
     CronTaskStatus::update_status(get_class($task), $willRun);
     if ($isDue || $forceRun) {
         $msg = ' will start now';
         if (!$isDue && $forceRun) {
             $msg .= " (forced run)";
         }
         $this->output(get_class($task) . $msg);
         // Handle exceptions for tasks
         $error = null;
         try {
             $result = $task->process();
             $this->output(CronTaskResult::PrettifyResult($result));
         } catch (Exception $ex) {
             $result = false;
             $error = $ex->getMessage();
             $this->output(CronTaskResult::PrettifyResult($result));
         }
         // Store result if we return something
         if (self::config()->store_results && $result !== null) {
             $cronResult = new CronTaskResult();
             if ($result === false) {
                 $cronResult->Failed = true;
                 $cronResult->Result = $error;
             } else {
                 if (is_object($result)) {
                     $result = print_r($result, true);
                 } else {
                     if (is_array($result)) {
                         $result = json_encode($result);
                     }
                 }
                 $cronResult->Result = $result;
             }
             $cronResult->TaskClass = get_class($task);
             $cronResult->ForcedRun = $forceRun;
             $cronResult->write();
         }
     } else {
         $this->output(get_class($task) . ' will run at ' . $cron->getNextRunDate()->format('Y-m-d H:i:s') . '.');
     }
 }
 /**
  * Checks and runs a single CronTask
  *
  * @param CronTask $task
  */
 public function runTask(CronTask $task)
 {
     $canRunTask = true;
     $enforceSchedule = true;
     $isDue = true;
     if (method_exists($task, "canRunTask")) {
         $canRunTask = $task->canRunTask();
     }
     if (method_exists($task, "enforceSchedule")) {
         $enforceSchedule = $task->enforceSchedule();
     }
     if ($canRunTask) {
         if ($enforceSchedule) {
             $cron = Cron\CronExpression::factory($task->getSchedule());
             $isDue = $this->isTaskDue($task, $cron);
         }
         // Update status of this task prior to execution in case of interruption
         CronTaskStatus::update_status(get_class($task), $isDue);
         if ($isDue) {
             $this->output(get_class($task) . ' will start now.');
             $task->process();
         } else {
             $this->output(get_class($task) . ' will run at ' . $cron->getNextRunDate()->format('Y-m-d H:i:s') . '.');
         }
     } else {
         $this->output(get_class($task) . ' cannot run.');
     }
 }
 /**
  * Checks and runs a single CronTask
  *
  * @param CronTask $task
  */
 public function runTask(CronTask $task)
 {
     $cron = Cron\CronExpression::factory($task->getSchedule());
     $isDue = $this->isTaskDue($task, $cron);
     // Update status of this task prior to execution in case of interruption
     CronTaskStatus::update_status(get_class($task), $isDue);
     if ($isDue) {
         $this->output(get_class($task) . ' will start now.');
         $task->process();
     } else {
         $this->output(get_class($task) . ' will run at ' . $cron->getNextRunDate()->format('Y-m-d H:i:s') . '.');
     }
 }