magento2-docker/dev/tests/integration/testsuite/Magento/Cron/Model/ScheduleTest.php

124 lines
3.8 KiB
PHP

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Cron\Model;
use Magento\Framework\Stdlib\DateTime\DateTime;
use \Magento\TestFramework\Helper\Bootstrap;
/**
* Test \Magento\Cron\Model\Schedule
*
* @magentoDbIsolation enabled
*/
class ScheduleTest extends \PHPUnit\Framework\TestCase
{
/**
* @var ScheduleFactory
*/
private $scheduleFactory;
/**
* @var DateTime
*/
protected $dateTime;
/**
* @ingeritdoc
*/
protected function setUp(): void
{
$this->dateTime = Bootstrap::getObjectManager()->create(DateTime::class);
$this->scheduleFactory = Bootstrap::getObjectManager()->create(ScheduleFactory::class);
}
/**
* If there are no currently locked jobs, locking one of them should succeed
*/
public function testTryLockJobNoLockedJobsSucceeds()
{
for ($i = 1; $i < 6; $i++) {
$this->createSchedule("test_job", Schedule::STATUS_PENDING, 60 * $i);
}
$schedule = $this->createSchedule("test_job", Schedule::STATUS_PENDING);
$this->assertTrue($schedule->tryLockJob());
}
/**
* If the job is already locked, attempting to lock it again should fail
*/
public function testTryLockJobAlreadyLockedFails()
{
$schedule = $this->createSchedule("test_job", Schedule::STATUS_RUNNING);
$this->assertFalse($schedule->tryLockJob());
}
/**
* If the job is already locked but lock time less than 1 day ago, attempting to lock it again should fail
*/
public function testTryLockJobAlreadyLockedSucceeds()
{
$offsetInThePast = 2*24*60*60;
$oldSchedule = $this->scheduleFactory->create()
->setCronExpr("* * * * *")
->setJobCode("test_job")
->setStatus(Schedule::STATUS_RUNNING)
->setCreatedAt(date('Y-m-d H:i:s', $this->dateTime->gmtTimestamp() - $offsetInThePast))
->setScheduledAt(date('Y-m-d H:i', $this->dateTime->gmtTimestamp() - $offsetInThePast + 60))
->setExecutedAt(date('Y-m-d H:i', $this->dateTime->gmtTimestamp() - $offsetInThePast + 61));
$oldSchedule->save();
$schedule = $this->createSchedule("test_job", Schedule::STATUS_PENDING);
$this->assertTrue($schedule->tryLockJob());
}
/**
* If there's a job already has running status, should be able to set this status for another job
*/
public function testTryLockJobOtherLockedFails()
{
$this->createSchedule("test_job", Schedule::STATUS_RUNNING);
$schedule = $this->createSchedule("test_job", Schedule::STATUS_PENDING, 60);
$this->assertTrue($schedule->tryLockJob());
}
/**
* Should be able to lock a job if a job with a different code is locked
*/
public function testTryLockJobDifferentJobLocked()
{
$this->createSchedule("test_job_other", Schedule::STATUS_RUNNING);
$schedule = $this->createSchedule("test_job", Schedule::STATUS_PENDING);
$this->assertTrue($schedule->tryLockJob());
}
/**
* Creates a schedule with the given job code, status, and schedule time offset
*
* @param string $jobCode
* @param string $status
* @param int $timeOffset
* @return Schedule
*/
private function createSchedule($jobCode, $status, $timeOffset = 0)
{
$schedule = $this->scheduleFactory->create()
->setCronExpr("* * * * *")
->setJobCode($jobCode)
->setStatus($status)
->setCreatedAt(date('Y-m-d H:i:s', $this->dateTime->gmtTimestamp()))
->setScheduledAt(date('Y-m-d H:i', $this->dateTime->gmtTimestamp() + $timeOffset));
$schedule->save();
return $schedule;
}
}