Completed
Push — master ( 745336...aadd5d )
by Matthew
06:17
created

BaseJobManagerTest::setUpBeforeClass()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 26
rs 8.8571
c 0
b 0
f 0
cc 1
eloc 17
nc 1
nop 0
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\BaseJobManager;
8
use Dtc\QueueBundle\Doctrine\DtcQueueListener;
9
use Dtc\QueueBundle\Model\BaseJob;
10
use Dtc\QueueBundle\Model\Job;
11
use Dtc\QueueBundle\Model\RetryableJob;
12
use Dtc\QueueBundle\Tests\FibonacciWorker;
13
use Dtc\QueueBundle\Tests\Model\BaseJobManagerTest as BaseBaseJobManagerTest;
14
use Dtc\QueueBundle\ODM\JobManager;
15
use Dtc\QueueBundle\Tests\ORM\JobManagerTest;
16
use Symfony\Component\DependencyInjection\Container;
17
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
18
19
/**
20
 * @author David
21
 *
22
 * This test requires local mongodb running
23
 */
24
abstract class BaseJobManagerTest extends BaseBaseJobManagerTest
25
{
26
    protected static $dtcQueueListener;
27
28
    /** @var DocumentManager|EntityManager */
29
    protected static $objectManager;
30
    protected static $objectName;
31
    protected static $archiveObjectName;
32
    protected static $runClass;
33
    protected static $runArchiveClass;
34
    protected static $jobManagerClass;
35
    protected static $runManagerClass;
36
    public static $runManager;
37
38
    public static function setUpBeforeClass()
39
    {
40
        self::$jobManager = new self::$jobManagerClass(self::$objectManager, self::$objectName, self::$archiveObjectName, self::$runClass, self::$runArchiveClass);
41
        self::$runManager = new self::$runManagerClass(self::$runClass);
42
        self::$runManager->setObjectManager(self::$objectManager);
43
        self::$runManager->setRunArchiveClass(self::$runArchiveClass);
44
45
        /** @var BaseJobManager $jobManager */
46
        $jobManager = self::$jobManager;
47
48
        $parameters = new ParameterBag();
49
50
        $container = new Container($parameters);
51
        $container->set('dtc_queue.job_manager', $jobManager);
52
        $container->set('dtc_queue.run_manager', self::$runManager);
53
54
        self::$dtcQueueListener = new DtcQueueListener($container);
55
        self::$objectManager->getEventManager()->addEventListener('preUpdate', self::$dtcQueueListener);
56
        self::$objectManager->getEventManager()->addEventListener('prePersist', self::$dtcQueueListener);
57
        self::$objectManager->getEventManager()->addEventListener('preRemove', self::$dtcQueueListener);
58
59
        self::$worker = new FibonacciWorker();
60
61
        self::$worker->setJobClass($jobManager->getRepository()->getClassName());
62
        parent::setUpBeforeClass();
63
    }
64
65
    public static function tearDownAfterClass()
66
    {
67
        self::$objectManager->getEventManager()->removeEventListener('preUpdate', self::$dtcQueueListener);
68
        self::$objectManager->getEventManager()->removeEventListener('prePersist', self::$dtcQueueListener);
69
        self::$objectManager->getEventManager()->removeEventListener('preRemove', self::$dtcQueueListener);
70
        parent::tearDownAfterClass();
71
    }
72
73
    public function testDeleteJob()
74
    {
75
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
76
        $jobManager = self::$jobManager;
77
78
        /** @var Job $job */
79
        $job = $this->getNewJob();
80
        $id = $job->getId();
81
        $jobManager->deleteJob($job);
82
83
        $nextJob = $jobManager->getJob();
84
        self::assertNull($nextJob, "Shouldn't be any jobs left in queue");
85
86
        $archiveObjectName = $jobManager->getArchiveObjectName();
87
88
        self::assertNotNull($id);
89
        $archiveRepository = $jobManager->getObjectManager()->getRepository($archiveObjectName);
90
        $result = $archiveRepository->find($id);
91
        self::assertNotNull($result);
92
        self::assertEquals($id, $result->getId());
93
    }
94
95
    public function testResetErroneousJobs()
96
    {
97
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
98
        $jobManager = self::$jobManager;
99
100
        /** @var Job $job */
101
        $job = $this->getNewJob();
102
        $id = $job->getId();
103
        $jobManager->deleteJob($job);
104
105
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
106
        $jobManager = self::$jobManager;
107
        $archiveObjectName = $jobManager->getArchiveObjectName();
108
109
        $objectManager = $jobManager->getObjectManager();
110
111
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
112
        $result = $archiveRepository->find($id);
113
        self::assertNotNull($result);
114
        self::assertEquals($id, $result->getId());
115
116
        $result->setStatus(BaseJob::STATUS_ERROR);
117
        $result->setLocked(true);
118
        $result->setLockedAt(new \DateTime());
119
        $result->setFinishedAt(new \DateTime());
120
        $result->setElapsed(12345);
121
        $result->setMessage('soomething');
122
        $objectManager->persist($result);
123
        $objectManager->flush();
124
125
        if ($objectManager instanceof EntityManager) {
126
            JobManagerTest::createObjectManager();
127
            $jobManager = new self::$jobManagerClass(self::$objectManager, self::$objectName, self::$archiveObjectName, self::$runClass, self::$runArchiveClass);
128
            $jobManager->getObjectManager()->clear();
129
            $objectManager = $jobManager->getObjectManager();
130
        }
131
132
        $count = $jobManager->resetErroneousJobs();
133
134
        self::assertEquals(1, $count);
135
        $repository = $jobManager->getRepository();
136
        $job = $repository->find($id);
137
138
        self::assertNotNull($job);
139
        self::assertEquals(BaseJob::STATUS_NEW, $job->getStatus());
140
        self::assertNull($job->getLockedAt());
141
        self::assertNull($job->getFinishedAt());
142
        self::assertNull($job->getElapsed());
143
        self::assertNull($job->getMessage());
144
        self::assertNull($job->getLocked());
145
146
        $objectManager->remove($job);
147
        $objectManager->flush();
148
    }
149
150
    public function testResetStalledJobs()
151
    {
152
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
153
        $jobManager = self::$jobManager;
154
155
        $job = new self::$jobClass(self::$worker, false, null);
156
        $job->fibonacci(1);
157
        self::assertNotNull($job->getId(), 'Job id should be generated');
158
        $job->setStatus(BaseJob::STATUS_RUNNING);
159
        $job->setLocked(true);
160
        $time = time();
161
        $date = new \DateTime("@$time");
162
        $job->setLockedAt($date);
163
        $id = $job->getId();
164
        $job = $jobManager->getRepository()->find($id);
165
166
        self::assertNotNull($job);
167
168
        $runClass = $jobManager->getRunClass();
169
170
        $objectManager = $jobManager->getObjectManager();
171
        $run = new $runClass();
172
        $run->setLastHeartbeatAt(new \DateTime());
173
        $objectManager->persist($run);
174
        $objectManager->flush();
175
        $runId = $run->getId();
176
        self::assertNotNull($runId);
177
        $job->setRunId($runId);
178
        $objectManager->persist($job);
179
        $objectManager->flush();
180
        $objectManager->remove($run);
181
        $objectManager->flush();
182
        $id = $job->getId();
183
        $job = $jobManager->getRepository()->find($id);
184
185
        self::assertNotNull($job);
186
187
        $archivedRun = $objectManager->getRepository($jobManager->getRunArchiveClass())->find($runId);
188
189
        $minusTime = $time - (BaseJobManager::STALLED_SECONDS + 1);
190
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
191
192
        $objectManager->persist($archivedRun);
193
        $objectManager->flush();
194
195
        $count = $jobManager->resetStalledJobs();
196
197
        self::assertEquals(1, $count);
198
199
        $id = $job->getId();
200
        $job = $jobManager->getRepository()->find($id);
201
202
        self::assertNotNull($job);
203
        self::assertEquals(BaseJob::STATUS_NEW, $job->getStatus());
204
        self::assertNull($job->getLockedAt());
205
        self::assertNull($job->getFinishedAt());
206
        self::assertNull($job->getElapsed());
207
        self::assertNull($job->getMessage());
208
        self::assertNull($job->getLocked());
209
        self::assertEquals(1, $job->getStalledCount());
210
211
        $objectManager->remove($job);
212
        $objectManager->flush();
213
    }
214
215
    public function testPruneErroneousJobs()
216
    {
217
        $job = $this->getJob();
218
        $id = $job->getId();
219
220
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
221
        $jobManager = self::$jobManager;
222
        $jobManager->deleteJob($job);
223
        $archiveObjectName = $jobManager->getArchiveObjectName();
224
225
        $objectManager = $jobManager->getObjectManager();
226
227
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
228
        $result = $archiveRepository->find($id);
229
        self::assertNotNull($result);
230
        self::assertEquals($id, $result->getId());
231
232
        $result->setStatus(BaseJob::STATUS_ERROR);
233
        $result->setLocked(true);
234
        $result->setLockedAt(new \DateTime());
235
        $result->setFinishedAt(new \DateTime());
236
        $result->setElapsed(12345);
237
        $result->setMessage('soomething');
238
        $objectManager->persist($result);
239
        $objectManager->flush();
240
241
        $count = $jobManager->pruneErroneousJobs('asdf');
242
        self::assertEquals(0, $count);
243
        $count = $jobManager->pruneErroneousJobs(null, 'asdf');
244
        self::assertEquals(0, $count);
245
        $count = $jobManager->pruneErroneousJobs('fibonacci', 'asdf');
246
        self::assertEquals(0, $count);
247
        $count = $jobManager->pruneErroneousJobs('fibonacci', 'asdf');
248
        self::assertEquals(0, $count);
249
        $count = $jobManager->pruneErroneousJobs('fibonacci', 'fibonacci');
250
        self::assertEquals(1, $count);
251
        $repository = $jobManager->getRepository();
252
        $job = $repository->find($id);
253
        $objectManager->clear();
254
        self::assertNull($job);
255
        $archiveJob = $archiveRepository->find($id);
256
        self::assertNull($archiveJob);
257
258
        $job = $this->getJob();
259
        $id = $job->getId();
260
        $objectManager->remove($job);
261
        $objectManager->flush();
262
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
263
        $jobManager = self::$jobManager;
264
        $archiveObjectName = $jobManager->getArchiveObjectName();
265
266
        $objectManager = $jobManager->getObjectManager();
267
268
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
269
        $result = $archiveRepository->find($id);
270
        self::assertNotNull($result);
271
        self::assertEquals($id, $result->getId());
272
273
        $result->setStatus(BaseJob::STATUS_ERROR);
274
        $result->setLocked(true);
275
        $result->setLockedAt(new \DateTime());
276
        $result->setFinishedAt(new \DateTime());
277
        $result->setElapsed(12345);
278
        $result->setMessage('soomething');
279
        $objectManager->persist($result);
280
        $objectManager->flush();
281
282
        $job = $this->getJob();
283
        $id = $job->getId();
284
        $objectManager->remove($job);
285
        $objectManager->flush();
286
287
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
288
        $jobManager = self::$jobManager;
289
        $archiveObjectName = $jobManager->getArchiveObjectName();
290
        $objectManager = $jobManager->getObjectManager();
291
292
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
293
        $result = $archiveRepository->find($id);
294
        self::assertNotNull($result);
295
        self::assertEquals($id, $result->getId());
296
297
        $result->setStatus(BaseJob::STATUS_ERROR);
298
        $result->setLocked(true);
299
        $result->setLockedAt(new \DateTime());
300
        $result->setFinishedAt(new \DateTime());
301
        $result->setElapsed(12345);
302
        $result->setMessage('soomething');
303
        $objectManager->persist($result);
304
        $objectManager->flush();
305
        $count = $jobManager->pruneErroneousJobs();
306
        self::assertEquals(2, $count);
307
    }
308
309
    public function testPruneStalledJobs()
310
    {
311
        static::setUpBeforeClass();
312
313
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
314
        $jobManager = self::$jobManager;
315
316
        $job = new self::$jobClass(self::$worker, false, null);
317
        $job->fibonacci(1);
318
        self::assertNotNull($job->getId(), 'Job id should be generated');
319
        $job->setStatus(BaseJob::STATUS_RUNNING);
320
        $job->setLocked(true);
321
        $time = time();
322
        $date = new \DateTime("@$time");
323
        $job->setLockedAt($date);
324
        $id = $job->getId();
325
        $job = $jobManager->getRepository()->find($id);
326
327
        self::assertNotNull($job);
328
329
        $runClass = $jobManager->getRunClass();
330
331
        $objectManager = $jobManager->getObjectManager();
332
        $run = new $runClass();
333
        $run->setLastHeartbeatAt(new \DateTime());
334
        $objectManager->persist($run);
335
        $objectManager->flush();
336
        $runId = $run->getId();
337
        self::assertNotNull($runId);
338
        $job->setRunId($runId);
339
        $objectManager->persist($job);
340
        $objectManager->flush();
341
        $objectManager->remove($run);
342
        $objectManager->flush();
343
        $id = $job->getId();
344
        $job = $jobManager->getRepository()->find($id);
345
346
        self::assertNotNull($job);
347
348
        $archivedRun = $objectManager->getRepository($jobManager->getRunArchiveClass())->find($runId);
349
350
        $minusTime = $time - (BaseJobManager::STALLED_SECONDS + 1);
351
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
352
353
        $objectManager->persist($archivedRun);
354
        $objectManager->flush();
355
356
        $count = $jobManager->pruneStalledJobs('asdf');
357
        self::assertEquals(0, $count);
358
        $count = $jobManager->pruneStalledJobs(null, 'asdf');
359
        self::assertEquals(0, $count);
360
        $count = $jobManager->pruneStalledJobs('fibonacci', 'asdf');
361
        self::assertEquals(0, $count);
362
        $count = $jobManager->pruneStalledJobs('fibonacci', 'fibonacci');
363
        self::assertEquals(1, $count);
364
365
        $job = $jobManager->getRepository()->find($id);
366
367
        self::assertNull($job);
368
369
        $archivedJob = $jobManager->getObjectManager()->getRepository($jobManager->getArchiveObjectName())->find($id);
370
371
        self::assertNotNull($archivedJob);
372
        self::assertEquals(BaseJob::STATUS_ERROR, $archivedJob->getStatus());
373
        self::assertEquals(1, $archivedJob->getStalledCount());
374
        $objectManager->remove($archivedJob);
375
        $objectManager->flush();
376
377
        // multiple
378
379
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
380
        $jobManager = self::$jobManager;
381
382
        $job = new self::$jobClass(self::$worker, false, null);
383
        $job->fibonacci(1);
384
        self::assertNotNull($job->getId(), 'Job id should be generated');
385
        $job->setStatus(BaseJob::STATUS_RUNNING);
386
        $job->setLocked(true);
387
        $time = time();
388
        $date = new \DateTime("@$time");
389
        $job->setLockedAt($date);
390
        $id = $job->getId();
391
        $job = $jobManager->getRepository()->find($id);
392
393
        self::assertNotNull($job);
394
395
        $runClass = $jobManager->getRunClass();
396
397
        $objectManager = $jobManager->getObjectManager();
398
        $run = new $runClass();
399
        $run->setLastHeartbeatAt(new \DateTime());
400
        $objectManager->persist($run);
401
        $objectManager->flush();
402
        $runId = $run->getId();
403
        self::assertNotNull($runId);
404
        $job->setRunId($runId);
405
        $objectManager->persist($job);
406
        $objectManager->flush();
407
        $objectManager->remove($run);
408
        $objectManager->flush();
409
        $id = $job->getId();
410
        $job = $jobManager->getRepository()->find($id);
411
412
        self::assertNotNull($job);
413
414
        $archivedRun = $objectManager->getRepository($jobManager->getRunArchiveClass())->find($runId);
415
416
        $minusTime = $time - (BaseJobManager::STALLED_SECONDS + 1);
417
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
418
419
        $objectManager->persist($archivedRun);
420
        $objectManager->flush();
421
422
        $job = new self::$jobClass(self::$worker, false, null);
423
        $job->fibonacci(1);
424
        self::assertNotNull($job->getId(), 'Job id should be generated');
425
        $job->setStatus(BaseJob::STATUS_RUNNING);
426
        $job->setLocked(true);
427
        $time = time();
428
        $date = new \DateTime("@$time");
429
        $job->setLockedAt($date);
430
        $id = $job->getId();
431
        $job = $jobManager->getRepository()->find($id);
432
433
        self::assertNotNull($job);
434
435
        $runClass = $jobManager->getRunClass();
436
437
        $objectManager = $jobManager->getObjectManager();
438
        $run = new $runClass();
439
        $objectManager->persist($run);
440
        $objectManager->flush();
441
        $runId = $run->getId();
442
        self::assertNotNull($runId);
443
        $job->setRunId($runId);
444
        $objectManager->persist($job);
445
        $objectManager->flush();
446
        $objectManager->remove($run);
447
        $objectManager->flush();
448
        $id = $job->getId();
449
        $job = $jobManager->getRepository()->find($id);
450
451
        self::assertNotNull($job);
452
453
        $archivedRun = $objectManager->getRepository($jobManager->getRunArchiveClass())->find($runId);
454
455
        $minusTime = $time - (BaseJobManager::STALLED_SECONDS + 1);
456
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
457
458
        $objectManager->persist($archivedRun);
459
        $objectManager->flush();
460
        $count = $jobManager->pruneStalledJobs();
461
        self::assertEquals(2, $count);
462
    }
463
464
    public function testPruneExpiredJobs()
465
    {
466
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
467
        $jobManager = self::$jobManager;
468
        $objectManager = $jobManager->getObjectManager();
469
470
        $job = new self::$jobClass(self::$worker, false, null);
471
        $job->fibonacci(1);
472
        self::assertNotNull($job->getId(), 'Job id should be generated');
473
        $time = time() - 1;
474
        $date = new \DateTime("@$time");
475
        $job->setExpiresAt($date);
476
        $objectManager->persist($job);
477
        $objectManager->flush();
478
479
        $count = $jobManager->pruneExpiredJobs('asdf');
480
        self::assertEquals(0, $count);
481
        $count = $jobManager->pruneExpiredJobs(null, 'asdf');
482
        self::assertEquals(0, $count);
483
        $count = $jobManager->pruneExpiredJobs(null, 'fibonacci');
484
        self::assertEquals(1, $count);
485
486
        $job = new self::$jobClass(self::$worker, false, null);
487
        $job->fibonacci(1);
488
        self::assertNotNull($job->getId(), 'Job id should be generated');
489
        $time = time() - 1;
490
        $date = new \DateTime("@$time");
491
        $job->setExpiresAt($date);
492
        $objectManager->persist($job);
493
        $objectManager->flush();
494
495
        $job = new self::$jobClass(self::$worker, false, null);
496
        $job->fibonacci(1);
497
        self::assertNotNull($job->getId(), 'Job id should be generated');
498
        $time = time() - 1;
499
        $date = new \DateTime("@$time");
500
        $job->setExpiresAt($date);
501
        $objectManager->persist($job);
502
        $objectManager->flush();
503
504
        $count = $jobManager->pruneExpiredJobs(null, 'fibonacci');
505
        self::assertEquals(2, $count);
506
507
        $job = new self::$jobClass(self::$worker, false, null);
508
        $job->fibonacci(1);
509
        self::assertNotNull($job->getId(), 'Job id should be generated');
510
        $time = time() - 1;
511
        $date = new \DateTime("@$time");
512
        $job->setExpiresAt($date);
513
        $objectManager->persist($job);
514
        $objectManager->flush();
515
516
        $job = new self::$jobClass(self::$worker, false, null);
517
        $job->fibonacci(1);
518
        self::assertNotNull($job->getId(), 'Job id should be generated');
519
        $time = time() - 1;
520
        $date = new \DateTime("@$time");
521
        $job->setExpiresAt($date);
522
        $objectManager->persist($job);
523
        $objectManager->flush();
524
525
        $count = $jobManager->pruneExpiredJobs('fibonacci', 'fibonacci');
526
        self::assertEquals(2, $count);
527
528
        $job = new self::$jobClass(self::$worker, false, null);
529
        $job->fibonacci(1);
530
        self::assertNotNull($job->getId(), 'Job id should be generated');
531
        $time = time() - 1;
532
        $date = new \DateTime("@$time");
533
        $job->setExpiresAt($date);
534
        $objectManager->persist($job);
535
        $objectManager->flush();
536
537
        $job = new self::$jobClass(self::$worker, false, null);
538
        $job->fibonacci(1);
539
        self::assertNotNull($job->getId(), 'Job id should be generated');
540
        $time = time() - 1;
541
        $date = new \DateTime("@$time");
542
        $job->setExpiresAt($date);
543
        $objectManager->persist($job);
544
        $objectManager->flush();
545
546
        $count = $jobManager->pruneExpiredJobs('fibonacci');
547
        self::assertEquals(2, $count);
548
549
        $job = new self::$jobClass(self::$worker, false, null);
550
        $job->fibonacci(1);
551
        self::assertNotNull($job->getId(), 'Job id should be generated');
552
        $time = time() - 1;
553
        $date = new \DateTime("@$time");
554
        $job->setExpiresAt($date);
555
        $objectManager->persist($job);
556
        $objectManager->flush();
557
558
        $jobId1 = $job->getId();
559
560
        $job = new self::$jobClass(self::$worker, false, null);
561
        $job->fibonacci(1);
562
        self::assertNotNull($job->getId(), 'Job id should be generated');
563
        $time = time() - 1;
564
        $date = new \DateTime("@$time");
565
        $job->setExpiresAt($date);
566
        $objectManager->persist($job);
567
        $objectManager->flush();
568
569
        $jobId2 = $job->getId();
570
571
        $count = $jobManager->pruneExpiredJobs();
572
        self::assertEquals(2, $count);
573
574
        $archiveRepository = $jobManager->getObjectManager()->getRepository($jobManager->getArchiveObjectName());
575
576
        $job = $archiveRepository->find($jobId1);
577
        self::assertNotNull($job);
578
        self::assertEquals(Job::STATUS_EXPIRED, $job->getStatus());
579
580
        $job = $archiveRepository->find($jobId2);
581
        self::assertNotNull($job);
582
        self::assertEquals(Job::STATUS_EXPIRED, $job->getStatus());
583
    }
584
585
    public function testPruneArchivedJobs()
586
    {
587
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
588
        $jobManager = self::$jobManager;
589
        $objectManager = $jobManager->getObjectManager();
590
        $jobArchiveClass = $jobManager->getArchiveObjectName();
591
        $jobArchiveRepository = $objectManager->getRepository($jobArchiveClass);
592
593
        self::$objectManager->getEventManager()->removeEventListener('preUpdate', self::$dtcQueueListener);
594
595
        $job = new self::$jobClass(self::$worker, false, null);
596
        $job->fibonacci(1);
597
        $id = $job->getId();
598
        $objectManager->remove($job);
599
        $objectManager->flush();
600
601
        $jobArchive = $jobArchiveRepository->find($id);
602
        self::assertNotNull($jobArchive);
603
        $time = time() - 86401;
604
        $jobArchive->setUpdatedAt(new \DateTime("@$time"));
605
        $objectManager->persist($jobArchive);
606
        $objectManager->flush();
607
608
        $older = $time + 1;
609
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$time"));
610
        self::assertEquals(0, $count);
611
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$older"));
612
        self::assertEquals(1, $count);
613
614
        $job = new self::$jobClass(self::$worker, false, null);
615
        $job->fibonacci(1);
616
        $id = $job->getId();
617
        $objectManager->remove($job);
618
        $objectManager->flush();
619
620
        $jobArchive = $jobArchiveRepository->find($id);
621
        self::assertNotNull($jobArchive);
622
        $time = time() - 86401;
623
        $jobArchive->setUpdatedAt(new \DateTime("@$time"));
624
        $objectManager->persist($jobArchive);
625
        $objectManager->flush();
626
627
        $job = new self::$jobClass(self::$worker, false, null);
628
        $job->fibonacci(1);
629
        $id = $job->getId();
630
        $objectManager->remove($job);
631
        $objectManager->flush();
632
633
        $jobArchive = $jobArchiveRepository->find($id);
634
        self::assertNotNull($jobArchive);
635
        $jobArchive->setUpdatedAt(new \DateTime("@$time"));
636
        $objectManager->persist($jobArchive);
637
        $objectManager->flush();
638
        $older = $time + 1;
639
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$time"));
640
        self::assertEquals(0, $count);
641
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$older"));
642
        self::assertEquals(2, $count);
643
644
        self::$objectManager->getEventManager()->addEventListener('preUpdate', self::$dtcQueueListener);
645
    }
646
647
    public function testPerformance()
648
    {
649
        $jobs = self::$jobManager->getRepository()->findAll();
650
        foreach ($jobs as $job) {
651
            self::$jobManager->getObjectManager()->remove($job);
652
        }
653
        self::$jobManager->getObjectManager()->flush();
654
655
        self::$jobManager->getObjectManager()->clear();
656
        parent::testPerformance();
657
    }
658
659
    protected function getBaseStatus()
660
    {
661
        /** @var BaseJobManager $jobManager */
662
        $jobManager = self::$jobManager;
663
        $job = new self::$jobClass(self::$worker, false, null);
664
        $job->fibonacci(1);
665
        $status = $jobManager->getStatus();
666
        self::assertArrayHasKey('fibonacci->fibonacci()', $status);
667
        $fibonacciStatus = $status['fibonacci->fibonacci()'];
668
669
        self::assertArrayHasKey(BaseJob::STATUS_NEW, $fibonacciStatus);
670
        self::assertArrayHasKey(BaseJob::STATUS_ERROR, $fibonacciStatus);
671
        self::assertArrayHasKey(BaseJob::STATUS_RUNNING, $fibonacciStatus);
672
        self::assertArrayHasKey(BaseJob::STATUS_SUCCESS, $fibonacciStatus);
673
        self::assertArrayHasKey(RetryableJob::STATUS_MAX_STALLED, $fibonacciStatus);
674
        self::assertArrayHasKey(RetryableJob::STATUS_MAX_ERROR, $fibonacciStatus);
675
        self::assertArrayHasKey(RetryableJob::STATUS_MAX_RETRIES, $fibonacciStatus);
676
        self::assertArrayHasKey(RetryableJob::STATUS_EXPIRED, $fibonacciStatus);
677
678
        return [$job, $status];
679
    }
680
681
    public function testGetStatus()
682
    {
683
        list($job1, $status1) = $this->getBaseStatus();
684
        list($job2, $status2) = $this->getBaseStatus();
685
        $fibonacciStatus1 = $status1['fibonacci->fibonacci()'];
686
        $fibonacciStatus2 = $status2['fibonacci->fibonacci()'];
687
688
        self::assertEquals($fibonacciStatus1[BaseJob::STATUS_NEW] + 1, $fibonacciStatus2[BaseJob::STATUS_NEW]);
689
        $jobManager = self::$jobManager;
690
        $objectManager = $jobManager->getObjectManager();
691
        $objectManager->remove($job1);
692
        $objectManager->remove($job2);
693
    }
694
}
695