1
+ <?php
2
+ /**
3
+ * Copyright © Magento, Inc. All rights reserved.
4
+ * See COPYING.txt for license details.
5
+ */
6
+ namespace Magento \Cron \Model ;
7
+
8
+ use Magento \Framework \Stdlib \DateTime \DateTime ;
9
+ use \Magento \TestFramework \Helper \Bootstrap ;
10
+
11
+ /**
12
+ * Test \Magento\Cron\Model\Schedule
13
+ *
14
+ * @magentoDbIsolation enabled
15
+ */
16
+ class ScheduleTest extends \PHPUnit_Framework_TestCase
17
+ {
18
+ /**
19
+ * @var ScheduleFactory
20
+ */
21
+ private $ scheduleFactory ;
22
+
23
+ /**
24
+ * @var DateTime
25
+ */
26
+ protected $ dateTime ;
27
+
28
+ public function setUp ()
29
+ {
30
+ $ this ->dateTime = Bootstrap::getObjectManager ()->create (DateTime::class);
31
+ $ this ->scheduleFactory = Bootstrap::getObjectManager ()->create (ScheduleFactory::class);
32
+ }
33
+
34
+ /**
35
+ * If there are no currently locked jobs, locking one of them should succeed
36
+ */
37
+ public function testTryLockJob_NoLockedJobsSucceeds ()
38
+ {
39
+ for ($ i = 1 ; $ i < 6 ; $ i ++) {
40
+ $ this ->createSchedule ("test_job " , Schedule::STATUS_PENDING , 60 * $ i );
41
+ }
42
+ $ schedule = $ this ->createSchedule ("test_job " , Schedule::STATUS_PENDING );
43
+
44
+ $ this ->assertTrue ($ schedule ->tryLockJob ());
45
+ }
46
+
47
+ /**
48
+ * If the job is already locked, attempting to lock it again should fail
49
+ */
50
+ public function testTryLockJob_AlreadyLockedFails ()
51
+ {
52
+ $ schedule = $ this ->createSchedule ("test_job " , Schedule::STATUS_RUNNING );
53
+
54
+ $ this ->assertFalse ($ schedule ->tryLockJob ());
55
+ }
56
+
57
+ /**
58
+ * If there's a job already locked, should not be able to lock another job
59
+ */
60
+ public function testTryLockJob_OtherLockedFails ()
61
+ {
62
+ $ this ->createSchedule ("test_job " , Schedule::STATUS_RUNNING );
63
+ $ schedule = $ this ->createSchedule ("test_job " , Schedule::STATUS_PENDING , 60 );
64
+
65
+ $ this ->assertFalse ($ schedule ->tryLockJob ());
66
+ }
67
+
68
+ /**
69
+ * Should be able to lock a job if a job with a different code is locked
70
+ */
71
+ public function testTryLockJob_DifferentJobLocked ()
72
+ {
73
+ $ this ->createSchedule ("test_job_other " , Schedule::STATUS_RUNNING );
74
+ $ schedule = $ this ->createSchedule ("test_job " , Schedule::STATUS_PENDING );
75
+
76
+ $ this ->assertTrue ($ schedule ->tryLockJob ());
77
+ }
78
+
79
+ /**
80
+ * Creates a schedule with the given job code, status, and schedule time offset
81
+ *
82
+ * @param string $jobCode
83
+ * @param string $status
84
+ * @param int $timeOffset
85
+ * @return Schedule
86
+ */
87
+ private function createSchedule ($ jobCode , $ status , $ timeOffset = 0 )
88
+ {
89
+ $ schedule = $ this ->scheduleFactory ->create ()
90
+ ->setCronExpr ("* * * * * " )
91
+ ->setJobCode ($ jobCode )
92
+ ->setStatus ($ status )
93
+ ->setCreatedAt (strftime ('%Y-%m-%d %H:%M:%S ' , $ this ->dateTime ->gmtTimestamp ()))
94
+ ->setScheduledAt (strftime ('%Y-%m-%d %H:%M ' , $ this ->dateTime ->gmtTimestamp () + $ timeOffset ));
95
+ $ schedule ->save ();
96
+
97
+ return $ schedule ;
98
+ }
99
+ }
0 commit comments