Completed
Push — master ( c76232...ce4950 )
by Matthew
27:26 queued 01:28
created

DoctrineJobManagerTest::testResetStalledJobs()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 101
Code Lines 75

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 101
rs 8.2857
cc 1
eloc 75
nc 1
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Dtc\QueueBundle\Tests\Doctrine;
4
5
use Doctrine\ODM\MongoDB\DocumentManager;
6
use Doctrine\ORM\EntityManager;
7
use Dtc\QueueBundle\Doctrine\DoctrineJobManager;
8
use Dtc\QueueBundle\Doctrine\DtcQueueListener;
9
use Dtc\QueueBundle\Manager\StallableJobManager;
10
use Dtc\QueueBundle\Model\BaseJob;
11
use Dtc\QueueBundle\Model\Job;
12
use Dtc\QueueBundle\Model\RetryableJob;
13
use Dtc\QueueBundle\Tests\Manager\AutoRetryTrait;
14
use Dtc\QueueBundle\Tests\Manager\PriorityTestTrait;
15
use Dtc\QueueBundle\Model\StallableJob;
16
use Dtc\QueueBundle\Tests\FibonacciWorker;
17
use Dtc\QueueBundle\Tests\Manager\BaseJobManagerTest;
18
use Dtc\QueueBundle\ODM\JobManager;
19
use Dtc\QueueBundle\Tests\Manager\RetryableTrait;
20
use Dtc\QueueBundle\Tests\ORM\JobManagerTest;
21
use Dtc\QueueBundle\Util\Util;
22
use Symfony\Component\DependencyInjection\Container;
23
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
24
25
/**
26
 * @author David
27
 *
28
 * This test requires local mongodb running
29
 */
30
abstract class DoctrineJobManagerTest extends BaseJobManagerTest
31
{
32
    use PriorityTestTrait;
33
    use AutoRetryTrait;
34
    use RetryableTrait;
35
36
    protected static $dtcQueueListener;
37
38
    /** @var DocumentManager|EntityManager */
39
    protected static $objectManager;
40
    protected static $objectName;
41
    protected static $archiveObjectName;
42
    protected static $runClass;
43
    protected static $runArchiveClass;
44
    protected static $jobTimingClass;
45
    protected static $jobManagerClass;
46
    protected static $runManagerClass;
47
    protected static $jobTimingManagerClass;
48
    public static $runManager;
49
50
    public static function setUpBeforeClass()
51
    {
52
        self::$jobTimingManager = new self::$jobTimingManagerClass(self::$objectManager, self::$jobTimingClass, true);
53
        self::$runManager = new self::$runManagerClass(self::$objectManager, self::$runClass, self::$runArchiveClass);
54
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
55
        $jobManager = new self::$jobManagerClass(self::$runManager, self::$jobTimingManager, self::$objectManager, self::$objectName, self::$archiveObjectName);
56
        self::$jobManager = $jobManager;
57
        $jobManager->setMaxPriority(255);
58
59
        self::assertEquals(255, $jobManager->getMaxPriority());
60
        self::assertEquals(JobManager::PRIORITY_DESC, $jobManager->getPriorityDirection());
61
        $jobManager->setPriorityDirection(JobManager::PRIORITY_ASC);
62
        self::assertEquals(JobManager::PRIORITY_ASC, $jobManager->getPriorityDirection());
63
        $jobManager->setPriorityDirection(JobManager::PRIORITY_DESC);
64
65
        $parameters = new ParameterBag();
66
67
        $container = new Container($parameters);
68
        $container->set('dtc_queue.job_manager', $jobManager);
69
        $container->set('dtc_queue.run_manager', self::$runManager);
70
71
        self::$dtcQueueListener = new DtcQueueListener($jobManager->getJobArchiveClass(), self::$runManager->getRunArchiveClass());
72
        self::$objectManager->getEventManager()->addEventListener('preUpdate', self::$dtcQueueListener);
73
        self::$objectManager->getEventManager()->addEventListener('prePersist', self::$dtcQueueListener);
74
        self::$objectManager->getEventManager()->addEventListener('preRemove', self::$dtcQueueListener);
75
76
        self::$worker = new FibonacciWorker();
77
78
        parent::setUpBeforeClass();
79
    }
80
81
    public static function tearDownAfterClass()
82
    {
83
        self::$objectManager->getEventManager()->removeEventListener('preUpdate', self::$dtcQueueListener);
84
        self::$objectManager->getEventManager()->removeEventListener('prePersist', self::$dtcQueueListener);
85
        self::$objectManager->getEventManager()->removeEventListener('preRemove', self::$dtcQueueListener);
86
        parent::tearDownAfterClass();
87
    }
88
89
    public function testOrdering()
90
    {
91
        // priority when at
92
        /** @var DoctrineJobManager $jobManager */
93
        $jobManager = self::$jobManager;
94
95
        $time1 = time() - 2;
96
        $dateTime1 = new \DateTime("@$time1");
97
98
        $time2 = time();
99
        $dateTime2 = new \DateTime("@$time2");
100
101
        /** @var Job $job */
102
        $job = new static::$jobClass(static::$worker, false, null);
103
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
104
        $job->setWhenAt($dateTime1);
105
        $job->setPriority(3);
106
        $id = $job->getId();
107
108
        $job2 = new static::$jobClass(static::$worker, false, null);
109
        $job2->setPriority(1);
110
        $job2->setWhenAt($dateTime2);
111
        $job2->fibonacci(1);
112
        $id2 = $job2->getId();
113
114
        $job3 = new static::$jobClass(static::$worker, false, null);
115
        $job3->setPriority(1);
116
        $job3->setWhenAt($dateTime1);
117
        $job3->fibonacci(1);
118
        $id3 = $job3->getId();
119
120
        $job4 = new static::$jobClass(static::$worker, false, null);
121
        $job4->setPriority(1);
122
        $job4->setWhenAt($dateTime2);
123
        $job4->fibonacci(1);
124
        $id4 = $job4->getId();
125
126
        $nextJob = $jobManager->getJob();
127
        static::assertEquals($id3, $nextJob->getId());
128
        $nextNextJob = $jobManager->getJob();
129
        $nextNextId = $nextNextJob->getId();
130
        static::assertTrue($id4 == $nextNextId || $id2 == $nextNextId, "$nextNextId not equals $id4 or $id2, could be $id or $id3");
131
132
        static::assertNotNull($jobManager->getJob());
133
        static::assertNotNull($jobManager->getJob());
134
135
        // non-priority when at
136
        $time1 = time() - 2;
137
        $dateTime1 = new \DateTime("@$time1");
138
139
        $time2 = time();
140
        $dateTime2 = new \DateTime("@$time2");
141
142
        /** @var Job $job */
143
        $job = new static::$jobClass(static::$worker, false, null);
144
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
145
        $job->setWhenAt($dateTime1);
146
        $job->setPriority(3);
147
        $id = $job->getId();
148
149
        $job2 = new static::$jobClass(static::$worker, false, null);
150
        $job2->setPriority(1);
151
        $job2->setWhenAt($dateTime2);
152
        $job2->fibonacci(1);
153
154
        $job3 = new static::$jobClass(static::$worker, false, null);
155
        $job3->setPriority(1);
156
        $job3->setWhenAt($dateTime2);
157
        $job3->fibonacci(1);
158
159
        $job4 = new static::$jobClass(static::$worker, false, null);
160
        $job4->setPriority(1);
161
        $job4->setWhenAt($dateTime2);
162
        $job4->fibonacci(1);
163
164
        $nextJob = $jobManager->getJob(null, null, false);
165
        static::assertEquals($id, $nextJob->getId());
166
        static::assertNotNull($jobManager->getJob());
167
        static::assertNotNull($jobManager->getJob());
168
        static::assertNotNull($jobManager->getJob());
169
    }
170
171
    public function getJobBy()
172
    {
173
        /** @var DoctrineJobManager $jobManager */
174
        $jobManager = self::$jobManager;
175
176
        /** @var Job $job */
177
        $job = new static::$jobClass(static::$worker, false, null);
178
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
179
        $id = $job->getId();
180
        $nextJob = $jobManager->getJob('fibonacci', null);
181
        static::assertNotNull($nextJob);
182
        static::assertEquals($id, $nextJob->getId());
183
184
        /** @var Job $job */
185
        $job = new static::$jobClass(static::$worker, false, null);
186
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
187
        $id = $job->getId();
188
        $nextJob = $jobManager->getJob('fibonacci', 'fibonacci');
189
        static::assertNotNull($nextJob);
190
        static::assertEquals($id, $nextJob->getId());
191
192
        /** @var Job $job */
193
        $job = new static::$jobClass(static::$worker, false, null);
194
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
195
        $id = $job->getId();
196
        $nextJob = $jobManager->getJob(null, 'fibonacci');
197
        static::assertNotNull($nextJob);
198
        static::assertEquals($id, $nextJob->getId());
199
200
        /** @var Job $job */
201
        $job = new static::$jobClass(static::$worker, false, null);
202
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
203
        $id = $job->getId();
204
        $nextJob = $jobManager->getJob(null, 'fibonaccia');
205
        static::assertNull($nextJob);
206
        $nextJob = $jobManager->getJob('fibonacci', 'fibonaccia');
207
        static::assertNull($nextJob);
208
        $nextJob = $jobManager->getJob('fibonaccii', 'fibonacci');
209
        static::assertNull($nextJob);
210
        $nextJob = $jobManager->getJob();
211
        static::assertNotNull($nextJob);
212
        static::assertEquals($id, $nextJob->getId());
213
    }
214
215
    public function testDeleteJob()
216
    {
217
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
218
        $jobManager = self::$jobManager;
219
220
        /** @var Job $job */
221
        $job = $this->getJob();
222
        $id = $job->getId();
223
        $jobManager->deleteJob($job);
224
225
        $nextJob = $jobManager->getJob(null, null, true, 123);
226
        self::assertNull($nextJob, "Shouldn't be any jobs left in queue");
227
228
        $archiveObjectName = $jobManager->getJobArchiveClass();
229
230
        self::assertNotNull($id);
231
        $archiveRepository = $jobManager->getObjectManager()->getRepository($archiveObjectName);
232
        $result = $archiveRepository->find($id);
233
        self::assertNotNull($result);
234
        self::assertEquals($id, $result->getId());
235
    }
236
237
    public function testCountLiveJobs()
238
    {
239
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
240
        $jobManager = self::$jobManager;
241
242
        while ($job = $jobManager->getJob()) {
243
            $jobManager->deleteJob($job);
244
        }
245
246
        $this->getJob();
247
248
        $count = $jobManager->countLiveJobs();
249
        self::assertEquals(1, $count);
250
251
        $this->getJob();
252
253
        $count = $jobManager->countLiveJobs();
254
        self::assertEquals(2, $count);
255
256
        $this->getJob();
257
258
        $count = $jobManager->countLiveJobs();
259
        self::assertEquals(3, $count);
260
261
        $count = $jobManager->countLiveJobs('asdf');
262
        self::assertEquals(0, $count);
263
264
        $count = $jobManager->countLiveJobs('fibonacci');
265
        self::assertEquals(3, $count);
266
267
        $count = $jobManager->countLiveJobs('fibonacci', 'test');
268
        self::assertEquals(0, $count);
269
270
        $count = $jobManager->countLiveJobs('fibonacci', 'fibonacci');
271
        self::assertEquals(3, $count);
272
273
        while ($job = $jobManager->getJob()) {
274
            $jobManager->deleteJob($job);
275
        }
276
    }
277
278
    public function testArchiveAllJobs()
279
    {
280
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
281
        $jobManager = self::$jobManager;
282
283
        while ($job = $jobManager->getJob()) {
284
            $jobManager->deleteJob($job);
285
        }
286
287
        $this->getJob();
288
289
        $count = $jobManager->countLiveJobs();
290
        $archiveCount = $this->runCountQuery($jobManager->getJobArchiveClass());
291
        self::assertEquals(1, $count);
292
        $allCount = $this->runCountQuery($jobManager->getJobClass());
293
        $counter = 0;
294
        $countJobs = function ($count) use (&$counter) {
295
            $counter += $count;
296
        };
297
        $jobManager->archiveAllJobs(null, null, $countJobs);
298
        self::assertEquals(0, $jobManager->countLiveJobs());
299
        self::assertEquals($allCount - 1, $this->runCountQuery($jobManager->getJobClass()));
300
        self::assertEquals($archiveCount + 1, $this->runCountQuery($jobManager->getJobArchiveClass()));
301
        self::assertEquals(1, $counter);
302
303
        $this->getJob();
304
        $this->getJob();
305
306
        $count = $jobManager->countLiveJobs();
307
        self::assertEquals(2, $count);
308
        $archiveCount = $this->runCountQuery($jobManager->getJobArchiveClass());
309
        $counter = 0;
310
        $jobManager->archiveAllJobs('fibonacci', null, $countJobs);
311
        self::assertEquals(0, $jobManager->countLiveJobs());
312
        self::assertEquals(2, $counter);
313
        self::assertEquals($archiveCount + 2, $this->runCountQuery($jobManager->getJobArchiveClass()));
314
315
        $this->getJob();
316
        $this->getJob();
317
318
        $count = $jobManager->countLiveJobs();
319
        self::assertEquals(2, $count);
320
321
        $jobManager->archiveAllJobs('fibonacc', null, $countJobs);
322
        self::assertEquals(2, $jobManager->countLiveJobs());
323
324
        $jobManager->archiveAllJobs('fibonacci', 'fibo', $countJobs);
325
        self::assertEquals(2, $jobManager->countLiveJobs());
326
327
        $jobManager->archiveAllJobs('fibonacci', 'fibonacci', $countJobs);
328
        self::assertEquals(0, $jobManager->countLiveJobs());
329
330
        while ($job = $jobManager->getJob()) {
331
            $jobManager->deleteJob($job);
332
        }
333
    }
334
335
    abstract protected function runCountQuery($class);
336
337
    public function testResetExceptionJobs()
338
    {
339
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
340
        $jobManager = self::$jobManager;
341
342
        $id = $this->createExceptionJob();
343
        $archiveObjectName = $jobManager->getJobArchiveClass();
344
        $objectManager = $jobManager->getObjectManager();
345
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
346
        $result = $archiveRepository->find($id);
347
        self::assertNotNull($result);
348
        self::assertEquals(BaseJob::STATUS_EXCEPTION, $result->getStatus());
349
        if ($objectManager instanceof EntityManager) {
350
            JobManagerTest::createObjectManager();
351
            $jobManager = new self::$jobManagerClass(self::$runManager, self::$jobTimingManager, self::$objectManager, self::$objectName, self::$archiveObjectName);
352
            $jobManager->getObjectManager()->clear();
353
            $objectManager = $jobManager->getObjectManager();
354
        }
355
356
        $count = $jobManager->resetExceptionJobs();
357
358
        self::assertEquals(1, $count);
359
        $repository = $jobManager->getRepository();
360
        $job = $repository->find($id);
361
362
        self::assertNotNull($job);
363
        self::assertEquals(BaseJob::STATUS_NEW, $job->getStatus());
364
        self::assertNull($job->getStartedAt());
365
        self::assertNull($job->getFinishedAt());
366
        self::assertNull($job->getElapsed());
367
        self::assertNull($job->getMessage());
368
369
        $objectManager->remove($job);
370
        $objectManager->flush();
371
372
        $id = $this->createExceptionJob();
373
        $archiveObjectName = $jobManager->getJobArchiveClass();
374
        $objectManager = $jobManager->getObjectManager();
375
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
376
        $result = $archiveRepository->find($id);
377
        $result->setMaxRetries(10);
378
        $result->setRetries(10);
379
        $objectManager->persist($result);
380
        $objectManager->flush();
381
        $count = $jobManager->resetExceptionJobs();
382
        self::assertEquals(0, $count);
383
        $job = $repository->find($id);
384
        self::assertNull($job);
385
        $job = $archiveRepository->find($id);
386
        self::assertNotNull($job);
387
        $objectManager->remove($job);
388
        $objectManager->flush();
389
    }
390
391
    protected function createExceptionJob()
392
    {
393
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
394
        $jobManager = self::$jobManager;
395
396
        /** @var Job $job */
397
        $job = $this->getJob();
398
        $id = $job->getId();
399
        $jobManager->deleteJob($job);
400
401
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
402
        $archiveObjectName = $jobManager->getJobArchiveClass();
403
404
        $objectManager = $jobManager->getObjectManager();
405
406
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
407
        $result = $archiveRepository->find($id);
408
        self::assertNotNull($result);
409
        self::assertEquals($id, $result->getId());
410
411
        $result->setStatus(BaseJob::STATUS_EXCEPTION);
412
        $result->setStartedAt(Util::getMicrotimeDateTime());
413
        $result->setFinishedAt(new \DateTime());
414
        $result->setElapsed(12345);
415
        $result->setMessage('soomething');
416
        $objectManager->persist($result);
417
        $objectManager->flush();
418
419
        return $id;
420
    }
421
422
    /**
423
     * @param bool $endRun
424
     * @param bool $setId
425
     *
426
     * @return mixed
427
     */
428
    public function createStalledJob($endRun, $setId)
429
    {
430
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
431
        $jobManager = self::$jobManager;
432
433
        $job = new self::$jobClass(self::$worker, false, null);
434
        $job->fibonacci(1);
435
        self::assertNotNull($job->getId(), 'Job id should be generated');
436
        $job->setStatus(BaseJob::STATUS_RUNNING);
437
        $time = time();
438
        $date = new \DateTime("@$time");
439
        $job->setStartedAt($date);
440
        $id = $job->getId();
441
        $job = $jobManager->getRepository()->find($id);
442
443
        self::assertNotNull($job);
444
445
        $runClass = self::$runManager->getRunClass();
446
447
        $objectManager = $jobManager->getObjectManager();
448
        $run = new $runClass();
449
        $run->setLastHeartbeatAt(new \DateTime());
450
        if ($setId) {
451
            $run->setCurrentJobId($job->getId());
452
        }
453
        $objectManager->persist($run);
454
        $objectManager->flush();
455
        $runId = $run->getId();
456
        self::assertNotNull($runId);
457
        $job->setRunId($runId);
458
        $objectManager->persist($job);
459
        $objectManager->flush();
460
        if ($endRun) {
461
            $objectManager->remove($run);
462
            $objectManager->flush();
463
        }
464
        $id = $job->getId();
465
        $job = $jobManager->getRepository()->find($id);
466
467
        self::assertNotNull($job);
468
469
        if ($endRun) {
470
            $archivedRun = $objectManager->getRepository(self::$runManager->getRunArchiveClass())->find($runId);
471
472
            $minusTime = $time - (DoctrineJobManager::STALLED_SECONDS + 1);
473
            $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
474
475
            $objectManager->persist($archivedRun);
476
            $objectManager->flush();
477
        }
478
        $id = $job->getId();
479
480
        return $id;
481
    }
482
483
    public function testResetStalledJobs()
484
    {
485
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
486
        $jobManager = self::$jobManager;
487
        $id = $this->createStalledJob(true, false);
488
489
        $objectManager = $jobManager->getObjectManager();
490
        $count = $jobManager->resetStalledJobs();
491
        self::assertEquals(1, $count);
492
493
        $job = $jobManager->getRepository()->find($id);
494
495
        self::assertNotNull($job);
496
        self::assertEquals(BaseJob::STATUS_NEW, $job->getStatus());
497
        self::assertNull($job->getStartedAt());
498
        self::assertNull($job->getFinishedAt());
499
        self::assertNull($job->getElapsed());
500
        self::assertNull($job->getMessage());
501
        self::assertEquals(1, $job->getStalls());
502
503
        $objectManager->remove($job);
504
        $objectManager->flush();
505
506
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
507
        $jobManager = self::$jobManager;
508
        $id = $this->createStalledJob(true, true);
509
510
        $objectManager = $jobManager->getObjectManager();
511
        $count = $jobManager->resetStalledJobs();
512
        self::assertEquals(1, $count);
513
514
        $job = $jobManager->getRepository()->find($id);
515
516
        self::assertNotNull($job);
517
        $objectManager->remove($job);
518
        $objectManager->flush();
519
520
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
521
        $id = $this->createStalledJob(false, false);
522
523
        $objectManager = $jobManager->getObjectManager();
524
        $count = $jobManager->resetStalledJobs();
525
        self::assertEquals(1, $count);
526
527
        $job = $jobManager->getRepository()->find($id);
528
529
        self::assertNotNull($job);
530
        self::assertEquals(BaseJob::STATUS_NEW, $job->getStatus());
531
        self::assertNull($job->getStartedAt());
532
        self::assertNull($job->getFinishedAt());
533
        self::assertNull($job->getElapsed());
534
        self::assertNull($job->getMessage());
535
        self::assertEquals(1, $job->getStalls());
536
537
        $objectManager->remove($job);
538
        $objectManager->flush();
539
540
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
541
        $jobManager = self::$jobManager;
542
        $id = $this->createStalledJob(false, true);
543
544
        $job = $jobManager->getRepository()->find($id);
545
        $objectManager = $jobManager->getObjectManager();
546
        $count = $jobManager->resetStalledJobs();
547
        self::assertEquals(0, $count);
548
549
        $objectManager->remove($job);
550
        $objectManager->flush();
551
552
        $id = $this->createStalledJob(true, false);
553
        $job = $jobManager->getRepository()->find($id);
554
        $job->setMaxRetries(10);
555
        $job->setRetries(10);
556
        $objectManager->persist($job);
557
        $objectManager->flush();
558
559
        $count = $jobManager->resetStalledJobs();
560
        self::assertEquals(0, $count);
561
        $job = $jobManager->getRepository()->find($id);
562
        self::assertNull($job);
563
        $job = $objectManager->getRepository($jobManager->getJobArchiveClass())->find($id);
564
        self::assertNotNull($job);
565
        $objectManager->remove($job);
566
        $objectManager->flush();
567
568
        $id = $this->createStalledJob(true, false);
569
        $job = $jobManager->getRepository()->find($id);
570
        $job->setMaxStalls(10);
571
        $job->setStalls(10);
572
        $objectManager->persist($job);
573
        $objectManager->flush();
574
575
        $count = $jobManager->resetStalledJobs();
576
        self::assertEquals(0, $count);
577
        $job = $jobManager->getRepository()->find($id);
578
        self::assertNull($job);
579
        $job = $objectManager->getRepository($jobManager->getJobArchiveClass())->find($id);
580
        self::assertNotNull($job);
581
        $objectManager->remove($job);
582
        $objectManager->flush();
583
    }
584
585
    public function testpruneExceptionJobs()
586
    {
587
        $job = $this->getJob();
588
        $id = $job->getId();
589
590
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
591
        $jobManager = self::$jobManager;
592
        $jobManager->deleteJob($job);
593
        $archiveObjectName = $jobManager->getJobArchiveClass();
594
595
        $objectManager = $jobManager->getObjectManager();
596
597
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
598
        $result = $archiveRepository->find($id);
599
        self::assertNotNull($result);
600
        self::assertEquals($id, $result->getId());
601
602
        $result->setStatus(BaseJob::STATUS_EXCEPTION);
603
        $result->setStartedAt(new \DateTime());
604
        $result->setFinishedAt(new \DateTime());
605
        $result->setElapsed(12345);
606
        $result->setMessage('soomething');
607
        $objectManager->persist($result);
608
        $objectManager->flush();
609
610
        $count = $jobManager->pruneExceptionJobs('asdf');
611
        self::assertEquals(0, $count);
612
        $count = $jobManager->pruneExceptionJobs(null, 'asdf');
613
        self::assertEquals(0, $count);
614
        $count = $jobManager->pruneExceptionJobs('fibonacci', 'asdf');
615
        self::assertEquals(0, $count);
616
        $count = $jobManager->pruneExceptionJobs('fibonacci', 'asdf');
617
        self::assertEquals(0, $count);
618
        $count = $jobManager->pruneExceptionJobs('fibonacci', 'fibonacci');
619
        self::assertEquals(1, $count);
620
        $repository = $jobManager->getRepository();
621
        $job = $repository->find($id);
622
        $objectManager->clear();
623
        self::assertNull($job);
624
        $archiveJob = $archiveRepository->find($id);
625
        self::assertNull($archiveJob);
626
627
        $job = $this->getJob();
628
        $id = $job->getId();
629
        $objectManager->remove($job);
630
        $objectManager->flush();
631
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
632
        $jobManager = self::$jobManager;
633
        $archiveObjectName = $jobManager->getJobArchiveClass();
634
635
        $objectManager = $jobManager->getObjectManager();
636
637
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
638
        $result = $archiveRepository->find($id);
639
        self::assertNotNull($result);
640
        self::assertEquals($id, $result->getId());
641
642
        $result->setStatus(BaseJob::STATUS_EXCEPTION);
643
        $result->setStartedAt(new \DateTime());
644
        $result->setFinishedAt(new \DateTime());
645
        $result->setElapsed(12345);
646
        $result->setMessage('soomething');
647
        $objectManager->persist($result);
648
        $objectManager->flush();
649
650
        $job = $this->getJob();
651
        $id = $job->getId();
652
        $objectManager->remove($job);
653
        $objectManager->flush();
654
655
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
656
        $jobManager = self::$jobManager;
657
        $archiveObjectName = $jobManager->getJobArchiveClass();
658
        $objectManager = $jobManager->getObjectManager();
659
660
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
661
        $result = $archiveRepository->find($id);
662
        self::assertNotNull($result);
663
        self::assertEquals($id, $result->getId());
664
665
        $result->setStatus(BaseJob::STATUS_EXCEPTION);
666
        $result->setStartedAt(new \DateTime());
667
        $result->setFinishedAt(new \DateTime());
668
        $result->setElapsed(12345);
669
        $result->setMessage('soomething');
670
        $objectManager->persist($result);
671
        $objectManager->flush();
672
        $count = $jobManager->pruneExceptionJobs();
673
        self::assertEquals(2, $count);
674
    }
675
676
    public function testPruneStalledJobs()
677
    {
678
        static::setUpBeforeClass();
679
680
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
681
        $jobManager = self::$jobManager;
682
683
        $job = new self::$jobClass(self::$worker, false, null);
684
        $job->fibonacci(1);
685
        self::assertNotNull($job->getId(), 'Job id should be generated');
686
        $job->setStatus(BaseJob::STATUS_RUNNING);
687
        $time = time();
688
        $date = new \DateTime("@$time");
689
        $job->setStartedAt($date);
690
        $id = $job->getId();
691
        $job = $jobManager->getRepository()->find($id);
692
693
        self::assertNotNull($job);
694
695
        $runClass = self::$runManager->getRunClass();
696
697
        $objectManager = $jobManager->getObjectManager();
698
        $run = new $runClass();
699
        $run->setLastHeartbeatAt(new \DateTime());
700
        $objectManager->persist($run);
701
        $objectManager->flush();
702
        $runId = $run->getId();
703
        self::assertNotNull($runId);
704
        $job->setRunId($runId);
705
        $objectManager->persist($job);
706
        $objectManager->flush();
707
        $objectManager->remove($run);
708
        $objectManager->flush();
709
        $id = $job->getId();
710
        $job = $jobManager->getRepository()->find($id);
711
712
        self::assertNotNull($job);
713
714
        $archivedRun = $objectManager->getRepository(self::$runManager->getRunArchiveClass())->find($runId);
715
716
        $minusTime = $time - (DoctrineJobManager::STALLED_SECONDS + 1);
717
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
718
719
        $objectManager->persist($archivedRun);
720
        $objectManager->flush();
721
722
        $count = $jobManager->pruneStalledJobs('asdf');
723
        self::assertEquals(0, $count);
724
        $count = $jobManager->pruneStalledJobs(null, 'asdf');
725
        self::assertEquals(0, $count);
726
        $count = $jobManager->pruneStalledJobs('fibonacci', 'asdf');
727
        self::assertEquals(0, $count);
728
        $count = $jobManager->pruneStalledJobs('fibonacci', 'fibonacci');
729
        self::assertEquals(1, $count);
730
731
        $job = $jobManager->getRepository()->find($id);
732
733
        self::assertNull($job);
734
735
        $archivedJob = $jobManager->getObjectManager()->getRepository($jobManager->getJobArchiveClass())->find($id);
736
737
        self::assertNotNull($archivedJob);
738
        self::assertEquals(StallableJob::STATUS_STALLED, $archivedJob->getStatus());
739
        self::assertEquals(1, $archivedJob->getStalls());
740
        $objectManager->remove($archivedJob);
741
        $objectManager->flush();
742
743
        // multiple
744
745
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
746
        $jobManager = self::$jobManager;
747
748
        $job = new self::$jobClass(self::$worker, false, null);
749
        $job->fibonacci(1);
750
        self::assertNotNull($job->getId(), 'Job id should be generated');
751
        $job->setStatus(BaseJob::STATUS_RUNNING);
752
        $time = time();
753
        $date = new \DateTime("@$time");
754
        $job->setStartedAt($date);
755
        $id = $job->getId();
756
        $job = $jobManager->getRepository()->find($id);
757
758
        self::assertNotNull($job);
759
760
        $runClass = self::$runManager->getRunClass();
761
762
        $objectManager = $jobManager->getObjectManager();
763
        $run = new $runClass();
764
        $run->setLastHeartbeatAt(new \DateTime());
765
        $objectManager->persist($run);
766
        $objectManager->flush();
767
        $runId = $run->getId();
768
        self::assertNotNull($runId);
769
        $job->setRunId($runId);
770
        $objectManager->persist($job);
771
        $objectManager->flush();
772
        $objectManager->remove($run);
773
        $objectManager->flush();
774
        $id = $job->getId();
775
        $job = $jobManager->getRepository()->find($id);
776
777
        self::assertNotNull($job);
778
779
        $archivedRun = $objectManager->getRepository(self::$runManager->getRunArchiveClass())->find($runId);
780
781
        $minusTime = $time - (DoctrineJobManager::STALLED_SECONDS + 1);
782
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
783
784
        $objectManager->persist($archivedRun);
785
        $objectManager->flush();
786
787
        $job = new self::$jobClass(self::$worker, false, null);
788
        $job->fibonacci(1);
789
        self::assertNotNull($job->getId(), 'Job id should be generated');
790
        $job->setStatus(BaseJob::STATUS_RUNNING);
791
        $time = time();
792
        $date = new \DateTime("@$time");
793
        $job->setStartedAt($date);
794
        $id = $job->getId();
795
        $job = $jobManager->getRepository()->find($id);
796
797
        self::assertNotNull($job);
798
799
        $runClass = self::$runManager->getRunClass();
800
801
        $objectManager = $jobManager->getObjectManager();
802
        $run = new $runClass();
803
        $run->setLastHeartbeatAt(new \DateTime());
804
        $objectManager->persist($run);
805
        $objectManager->flush();
806
        $runId = $run->getId();
807
        self::assertNotNull($runId);
808
        $job->setRunId($runId);
809
        $objectManager->persist($job);
810
        $objectManager->flush();
811
        $objectManager->remove($run);
812
        $objectManager->flush();
813
        $id = $job->getId();
814
        $job = $jobManager->getRepository()->find($id);
815
816
        self::assertNotNull($job);
817
818
        $archivedRun = $objectManager->getRepository(self::$runManager->getRunArchiveClass())->find($runId);
819
820
        $minusTime = $time - (DoctrineJobManager::STALLED_SECONDS + 1);
821
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
822
823
        $objectManager->persist($archivedRun);
824
        $objectManager->flush();
825
        $count = $jobManager->pruneStalledJobs();
826
        self::assertEquals(2, $count);
827
    }
828
829
    public function testBatchJobs()
830
    {
831
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
832
        $jobManager = self::$jobManager;
833
834
        $jobs = $jobManager->getRepository()->findAll();
835
        foreach ($jobs as $job) {
836
            $jobManager->getObjectManager()->remove($job);
837
        }
838
        $jobManager->getObjectManager()->flush();
839
        $jobManager->getObjectManager()->clear();
840
841
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
842
        $worker = self::$worker;
843
        $job1 = $worker->later()->fibonacci(1);
844
        $job2 = $worker->batchLater()->fibonacci(1);
845
        self::assertEquals($job1, $job2);
846
847
        $jobs = $jobManager->getRepository()->findAll();
848
        self::assertCount(1, $jobs);
849
        self::assertEquals($job1, $jobs[0]);
850
        self::assertNull($jobs[0]->getPriority());
851
        $jobManager->getObjectManager()->remove($jobs[0]);
852
        $jobManager->getObjectManager()->flush();
853
        $jobManager->getObjectManager()->clear();
854
855
        $job1 = $worker->later()->fibonacci(1);
856
        self::assertNull($job1->getPriority());
857
        $job2 = $worker->batchLater()->setPriority(3)->fibonacci(1);
858
        self::assertEquals($job1, $job2);
859
        self::assertNotNull($job2->getPriority());
860
861
        $jobs = $jobManager->getRepository()->findAll();
862
        self::assertCount(1, $jobs);
863
        self::assertEquals($job1, $jobs[0]);
864
        self::assertNotNull($jobs[0]->getPriority());
865
866
        // Not
867
        $jobs = $jobManager->getRepository()->findAll();
868
        foreach ($jobs as $job) {
869
            $jobManager->getObjectManager()->remove($job);
870
        }
871
        $jobManager->getObjectManager()->remove($jobs[0]);
872
        $jobManager->getObjectManager()->flush();
873
        $jobManager->getObjectManager()->clear();
874
875
        $job1 = $worker->later(100)->fibonacci(1);
876
877
        $time1 = new \DateTime('@'.time());
878
        $job2 = $worker->batchLater(0)->fibonacci(1);
879
        $time2 = Util::getDateTimeFromDecimalFormat(Util::getMicrotimeDecimal());
880
881
        self::assertEquals($job1, $job2);
882
        self::assertGreaterThanOrEqual($time1, $job2->getWhenAt());
883
        self::assertLessThanOrEqual($time2, $job2->getWhenAt());
884
885
        $jobs = $jobManager->getRepository()->findAll();
886
        self::assertCount(1, $jobs);
887
        self::assertEquals($job1, $jobs[0]);
888
        self::assertGreaterThanOrEqual($time1, $jobs[0]->getWhenAt());
889
        self::assertLessThanOrEqual($time2, $jobs[0]->getWhenAt());
890
        $jobManager->getObjectManager()->remove($jobs[0]);
891
        $jobManager->getObjectManager()->flush();
892
        $jobManager->getObjectManager()->clear();
893
894
        $job1 = $worker->later(100)->setPriority(3)->fibonacci(1);
895
        $priority1 = $job1->getPriority();
896
        $time1 = Util::getDateTimeFromDecimalFormat(Util::getMicrotimeDecimal());
897
        $job2 = $worker->batchLater(0)->setPriority(1)->fibonacci(1);
898
        $time2 = Util::getDateTimeFromDecimalFormat(Util::getMicrotimeDecimal());
899
        self::assertEquals($job1, $job2);
900
        self::assertNotEquals($priority1, $job2->getPriority());
901
902
        self::assertEquals($job1, $job2);
903
        self::assertGreaterThanOrEqual($time1, $job2->getWhenAt());
904
        self::assertLessThanOrEqual($time2, $job2->getWhenAt());
905
    }
906
907
    public function testPruneExpiredJobs()
908
    {
909
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
910
        $jobManager = self::$jobManager;
911
        $objectManager = $jobManager->getObjectManager();
912
913
        $job = new self::$jobClass(self::$worker, false, null);
914
        $job->fibonacci(1);
915
        self::assertNotNull($job->getId(), 'Job id should be generated');
916
        $time = time() - 1;
917
        $date = new \DateTime("@$time");
918
        $job->setExpiresAt($date);
919
        $objectManager->persist($job);
920
        $objectManager->flush();
921
922
        $count = $jobManager->pruneExpiredJobs('asdf');
923
        self::assertEquals(0, $count);
924
        $count = $jobManager->pruneExpiredJobs(null, 'asdf');
925
        self::assertEquals(0, $count);
926
        $count = $jobManager->pruneExpiredJobs(null, 'fibonacci');
927
        self::assertEquals(1, $count);
928
929
        $job = new self::$jobClass(self::$worker, false, null);
930
        $job->fibonacci(1);
931
        self::assertNotNull($job->getId(), 'Job id should be generated');
932
        $time = time() - 1;
933
        $date = new \DateTime("@$time");
934
        $job->setExpiresAt($date);
935
        $objectManager->persist($job);
936
        $objectManager->flush();
937
938
        $job = new self::$jobClass(self::$worker, false, null);
939
        $job->fibonacci(1);
940
        self::assertNotNull($job->getId(), 'Job id should be generated');
941
        $time = time() - 1;
942
        $date = new \DateTime("@$time");
943
        $job->setExpiresAt($date);
944
        $objectManager->persist($job);
945
        $objectManager->flush();
946
947
        $count = $jobManager->pruneExpiredJobs(null, 'fibonacci');
948
        self::assertEquals(2, $count);
949
950
        $job = new self::$jobClass(self::$worker, false, null);
951
        $job->fibonacci(1);
952
        self::assertNotNull($job->getId(), 'Job id should be generated');
953
        $time = time() - 1;
954
        $date = new \DateTime("@$time");
955
        $job->setExpiresAt($date);
956
        $objectManager->persist($job);
957
        $objectManager->flush();
958
959
        $job = new self::$jobClass(self::$worker, false, null);
960
        $job->fibonacci(1);
961
        self::assertNotNull($job->getId(), 'Job id should be generated');
962
        $time = time() - 1;
963
        $date = new \DateTime("@$time");
964
        $job->setExpiresAt($date);
965
        $objectManager->persist($job);
966
        $objectManager->flush();
967
968
        $count = $jobManager->pruneExpiredJobs('fibonacci', 'fibonacci');
969
        self::assertEquals(2, $count);
970
971
        $job = new self::$jobClass(self::$worker, false, null);
972
        $job->fibonacci(1);
973
        self::assertNotNull($job->getId(), 'Job id should be generated');
974
        $time = time() - 1;
975
        $date = new \DateTime("@$time");
976
        $job->setExpiresAt($date);
977
        $objectManager->persist($job);
978
        $objectManager->flush();
979
980
        $job = new self::$jobClass(self::$worker, false, null);
981
        $job->fibonacci(1);
982
        self::assertNotNull($job->getId(), 'Job id should be generated');
983
        $time = time() - 1;
984
        $date = new \DateTime("@$time");
985
        $job->setExpiresAt($date);
986
        $objectManager->persist($job);
987
        $objectManager->flush();
988
989
        $count = $jobManager->pruneExpiredJobs('fibonacci');
990
        self::assertEquals(2, $count);
991
992
        $job = new self::$jobClass(self::$worker, false, null);
993
        $job->fibonacci(1);
994
        self::assertNotNull($job->getId(), 'Job id should be generated');
995
        $time = time() - 1;
996
        $date = new \DateTime("@$time");
997
        $job->setExpiresAt($date);
998
        $objectManager->persist($job);
999
        $objectManager->flush();
1000
1001
        $jobId1 = $job->getId();
1002
1003
        $job = new self::$jobClass(self::$worker, false, null);
1004
        $job->fibonacci(1);
1005
        self::assertNotNull($job->getId(), 'Job id should be generated');
1006
        $time = time() - 1;
1007
        $date = new \DateTime("@$time");
1008
        $job->setExpiresAt($date);
1009
        $objectManager->persist($job);
1010
        $objectManager->flush();
1011
1012
        $jobId2 = $job->getId();
1013
1014
        $count = $jobManager->pruneExpiredJobs();
1015
        self::assertEquals(2, $count);
1016
1017
        $archiveRepository = $jobManager->getObjectManager()->getRepository($jobManager->getJobArchiveClass());
1018
1019
        $job = $archiveRepository->find($jobId1);
1020
        self::assertNotNull($job);
1021
        self::assertEquals(Job::STATUS_EXPIRED, $job->getStatus());
1022
1023
        $job = $archiveRepository->find($jobId2);
1024
        self::assertNotNull($job);
1025
        self::assertEquals(Job::STATUS_EXPIRED, $job->getStatus());
1026
    }
1027
1028
    public function testPruneArchivedJobs()
1029
    {
1030
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
1031
        $jobManager = self::$jobManager;
1032
        $objectManager = $jobManager->getObjectManager();
1033
        $jobArchiveClass = $jobManager->getJobArchiveClass();
1034
        $jobArchiveRepository = $objectManager->getRepository($jobArchiveClass);
1035
1036
        self::$objectManager->getEventManager()->removeEventListener('preUpdate', self::$dtcQueueListener);
1037
1038
        $job = new self::$jobClass(self::$worker, false, null);
1039
        $job->fibonacci(1);
1040
        $id = $job->getId();
1041
        $objectManager->remove($job);
1042
        $objectManager->flush();
1043
1044
        $jobArchive = $jobArchiveRepository->find($id);
1045
        self::assertNotNull($jobArchive);
1046
        $time = time() - 86401;
1047
        $jobArchive->setUpdatedAt(new \DateTime("@$time"));
1048
        $objectManager->persist($jobArchive);
1049
        $objectManager->flush();
1050
1051
        $older = $time + 1;
1052
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$time"));
1053
        self::assertEquals(0, $count);
1054
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$older"));
1055
        self::assertEquals(1, $count);
1056
1057
        $job = new self::$jobClass(self::$worker, false, null);
1058
        $job->fibonacci(1);
1059
        $id = $job->getId();
1060
        $objectManager->remove($job);
1061
        $objectManager->flush();
1062
1063
        $jobArchive = $jobArchiveRepository->find($id);
1064
        self::assertNotNull($jobArchive);
1065
        $time = time() - 86401;
1066
        $jobArchive->setUpdatedAt(new \DateTime("@$time"));
1067
        $objectManager->persist($jobArchive);
1068
        $objectManager->flush();
1069
1070
        $job = new self::$jobClass(self::$worker, false, null);
1071
        $job->fibonacci(1);
1072
        $id = $job->getId();
1073
        $objectManager->remove($job);
1074
        $objectManager->flush();
1075
1076
        $jobArchive = $jobArchiveRepository->find($id);
1077
        self::assertNotNull($jobArchive);
1078
        $jobArchive->setUpdatedAt(new \DateTime("@$time"));
1079
        $objectManager->persist($jobArchive);
1080
        $objectManager->flush();
1081
        $older = $time + 1;
1082
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$time"));
1083
        self::assertEquals(0, $count);
1084
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$older"));
1085
        self::assertEquals(2, $count);
1086
1087
        self::$objectManager->getEventManager()->addEventListener('preUpdate', self::$dtcQueueListener);
1088
    }
1089
1090
    public function testPerformance()
1091
    {
1092
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
1093
        $jobManager = self::$jobManager;
1094
1095
        $jobs = $jobManager->getRepository()->findAll();
1096
        foreach ($jobs as $job) {
1097
            $jobManager->getObjectManager()->remove($job);
1098
        }
1099
        $jobManager->getObjectManager()->flush();
1100
1101
        $jobManager->getObjectManager()->clear();
1102
        parent::testPerformance();
1103
    }
1104
1105
    protected function getBaseStatus()
1106
    {
1107
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
1108
        $jobManager = self::$jobManager;
1109
        $job = new self::$jobClass(self::$worker, false, null);
1110
        $job->fibonacci(1);
1111
        $status = $jobManager->getStatus();
1112
        self::assertArrayHasKey('fibonacci->fibonacci()', $status);
1113
        $fibonacciStatus = $status['fibonacci->fibonacci()'];
1114
1115
        self::assertArrayHasKey(BaseJob::STATUS_NEW, $fibonacciStatus);
1116
        self::assertArrayHasKey(BaseJob::STATUS_EXCEPTION, $fibonacciStatus);
1117
        self::assertArrayHasKey(BaseJob::STATUS_RUNNING, $fibonacciStatus);
1118
        self::assertArrayHasKey(BaseJob::STATUS_SUCCESS, $fibonacciStatus);
1119
        self::assertArrayHasKey(Job::STATUS_EXPIRED, $fibonacciStatus);
1120
        self::assertArrayHasKey(StallableJob::STATUS_MAX_STALLS, $fibonacciStatus);
1121
        self::assertArrayHasKey(RetryableJob::STATUS_MAX_EXCEPTIONS, $fibonacciStatus);
1122
        self::assertArrayHasKey(RetryableJob::STATUS_MAX_FAILURES, $fibonacciStatus);
1123
        self::assertArrayHasKey(RetryableJob::STATUS_MAX_RETRIES, $fibonacciStatus);
1124
1125
        return [$job, $status];
1126
    }
1127
1128
    public function testGetStatus()
1129
    {
1130
        list($job1, $status1) = $this->getBaseStatus();
1131
        list($job2, $status2) = $this->getBaseStatus();
1132
        $fibonacciStatus1 = $status1['fibonacci->fibonacci()'];
1133
        $fibonacciStatus2 = $status2['fibonacci->fibonacci()'];
1134
1135
        self::assertEquals($fibonacciStatus1[BaseJob::STATUS_NEW] + 1, $fibonacciStatus2[BaseJob::STATUS_NEW]);
1136
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
1137
        $jobManager = self::$jobManager;
1138
        $objectManager = $jobManager->getObjectManager();
1139
        $objectManager->remove($job1);
1140
        $objectManager->remove($job2);
1141
    }
1142
1143
    public function testStallableJobManager()
1144
    {
1145
        /** @var StallableJobManager $jobManager */
1146
        $jobManager = self::$jobManager;
1147
1148
        $defaultMaxStalls = $jobManager->getDefaultMaxStalls();
1149
        $jobManager->setDefaultMaxStalls(123);
1150
        self::assertEquals(123, $jobManager->getDefaultMaxStalls());
1151
        $jobManager->setDefaultMaxStalls($defaultMaxStalls);
1152
        self::assertEquals($defaultMaxStalls, $jobManager->getDefaultMaxStalls());
1153
    }
1154
}
1155