(NFC) QueueTest - Extra cleanups and assertions.
[civicrm-core.git] / tests / phpunit / CRM / Queue / QueueTest.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
7d61e75f 4 | Copyright CiviCRM LLC. All rights reserved. |
6a488035 5 | |
7d61e75f
TO
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
6a488035 9 +--------------------------------------------------------------------+
d25dd0ee 10 */
6a488035 11
6a488035
TO
12/**
13 * Ensure that various queue implementations comply with the interface
acb109b7 14 * @group headless
6a488035
TO
15 */
16class CRM_Queue_QueueTest extends CiviUnitTestCase {
6a488035
TO
17
18 /* ----------------------- Queue providers ----------------------- */
19
20 /* Define a list of queue providers which should be tested */
21
22 /**
eceb18cc 23 * Return a list of persistent and transient queue providers.
6a488035 24 */
00be9182 25 public function getQueueSpecs() {
9099cab3
CW
26 $queueSpecs = [];
27 $queueSpecs[] = [
28 [
6a488035 29 'type' => 'Sql',
ff61f869 30 'name' => 'test-queue-sql',
9099cab3
CW
31 ],
32 ];
33 $queueSpecs[] = [
34 [
6a488035 35 'type' => 'Memory',
ff61f869 36 'name' => 'test-queue-mem',
9099cab3
CW
37 ],
38 ];
8ec1da43
TO
39 $queueSpecs[] = [
40 [
41 'type' => 'SqlParallel',
42 'name' => 'test-queue-sqlparallel',
43 ],
44 ];
6a488035
TO
45 return $queueSpecs;
46 }
47
28a04ea9 48 /**
49 * Per-provider tests
50 */
0b49aa04 51 public function setUp(): void {
6a488035
TO
52 parent::setUp();
53 $this->queueService = CRM_Queue_Service::singleton(TRUE);
54 }
55
dd09ee0c 56 public function tearDown(): void {
6a488035
TO
57 CRM_Utils_Time::resetTime();
58
ff61f869 59 $tablesToTruncate = ['civicrm_queue_item', 'civicrm_queue'];
6a488035 60 $this->quickCleanup($tablesToTruncate);
bc4d424d 61 parent::tearDown();
6a488035
TO
62 }
63
64 /**
65 * Create a few queue items; alternately enqueue and dequeue various
66 *
67 * @dataProvider getQueueSpecs
1e1fdcf6 68 * @param $queueSpec
6a488035 69 */
00be9182 70 public function testBasicUsage($queueSpec) {
ff61f869 71 $this->assertDBQuery(0, 'SELECT count(*) FROM civicrm_queue');
6a488035 72 $this->queue = $this->queueService->create($queueSpec);
ff61f869 73 $this->assertDBQuery(0, 'SELECT count(*) FROM civicrm_queue');
6a488035
TO
74 $this->assertTrue($this->queue instanceof CRM_Queue_Queue);
75
9099cab3 76 $this->queue->createItem([
92915c55 77 'test-key' => 'a',
9099cab3
CW
78 ]);
79 $this->queue->createItem([
92915c55 80 'test-key' => 'b',
9099cab3
CW
81 ]);
82 $this->queue->createItem([
92915c55 83 'test-key' => 'c',
9099cab3 84 ]);
6a488035
TO
85
86 $this->assertEquals(3, $this->queue->numberOfItems());
87 $item = $this->queue->claimItem();
88 $this->assertEquals('a', $item->data['test-key']);
89 $this->queue->deleteItem($item);
90
91 $this->assertEquals(2, $this->queue->numberOfItems());
92 $item = $this->queue->claimItem();
93 $this->assertEquals('b', $item->data['test-key']);
94 $this->queue->deleteItem($item);
95
9099cab3 96 $this->queue->createItem([
92915c55 97 'test-key' => 'd',
9099cab3 98 ]);
6a488035
TO
99
100 $this->assertEquals(2, $this->queue->numberOfItems());
101 $item = $this->queue->claimItem();
102 $this->assertEquals('c', $item->data['test-key']);
103 $this->queue->deleteItem($item);
104
105 $this->assertEquals(1, $this->queue->numberOfItems());
106 $item = $this->queue->claimItem();
107 $this->assertEquals('d', $item->data['test-key']);
108 $this->queue->deleteItem($item);
109
110 $this->assertEquals(0, $this->queue->numberOfItems());
111 }
112
113 /**
eceb18cc 114 * Claim an item from the queue and release it back for subsequent processing.
6a488035
TO
115 *
116 * @dataProvider getQueueSpecs
1e1fdcf6 117 * @param $queueSpec
6a488035 118 */
00be9182 119 public function testManualRelease($queueSpec) {
6a488035
TO
120 $this->queue = $this->queueService->create($queueSpec);
121 $this->assertTrue($this->queue instanceof CRM_Queue_Queue);
122
9099cab3 123 $this->queue->createItem([
92915c55 124 'test-key' => 'a',
9099cab3 125 ]);
6a488035
TO
126
127 $item = $this->queue->claimItem();
128 $this->assertEquals('a', $item->data['test-key']);
129 $this->assertEquals(1, $this->queue->numberOfItems());
130 $this->queue->releaseItem($item);
131
132 $this->assertEquals(1, $this->queue->numberOfItems());
133 $item = $this->queue->claimItem();
134 $this->assertEquals('a', $item->data['test-key']);
135 $this->queue->deleteItem($item);
136
137 $this->assertEquals(0, $this->queue->numberOfItems());
138 }
139
140 /**
eceb18cc 141 * Test that item leases expire at the expected time.
6a488035
TO
142 *
143 * @dataProvider getQueueSpecs
fe482240 144 *
1e1fdcf6 145 * @param $queueSpec
6a488035 146 */
00be9182 147 public function testTimeoutRelease($queueSpec) {
6a488035
TO
148 $this->queue = $this->queueService->create($queueSpec);
149 $this->assertTrue($this->queue instanceof CRM_Queue_Queue);
150
151 CRM_Utils_Time::setTime('2012-04-01 1:00:00');
9099cab3 152 $this->queue->createItem([
92915c55 153 'test-key' => 'a',
9099cab3 154 ]);
6a488035
TO
155
156 $item = $this->queue->claimItem();
157 $this->assertEquals('a', $item->data['test-key']);
158 $this->assertEquals(1, $this->queue->numberOfItems());
159 // forget to release
160
161 // haven't reach expiration yet
162 CRM_Utils_Time::setTime('2012-04-01 1:59:00');
163 $item2 = $this->queue->claimItem();
164 $this->assertEquals(FALSE, $item2);
165
166 // pass expiration mark
35d090e2 167 CRM_Utils_Time::setTime('2012-04-01 2:00:03');
6a488035
TO
168 $item3 = $this->queue->claimItem();
169 $this->assertEquals('a', $item3->data['test-key']);
170 $this->assertEquals(1, $this->queue->numberOfItems());
171 $this->queue->deleteItem($item3);
172
173 $this->assertEquals(0, $this->queue->numberOfItems());
174 }
175
176 /**
eceb18cc 177 * Test that item leases can be ignored.
6a488035
TO
178 *
179 * @dataProvider getQueueSpecs
1e1fdcf6 180 * @param $queueSpec
6a488035 181 */
00be9182 182 public function testStealItem($queueSpec) {
6a488035
TO
183 $this->queue = $this->queueService->create($queueSpec);
184 $this->assertTrue($this->queue instanceof CRM_Queue_Queue);
185
6a488035 186 CRM_Utils_Time::setTime('2012-04-01 1:00:00');
9099cab3 187 $this->queue->createItem([
92915c55 188 'test-key' => 'a',
9099cab3 189 ]);
6a488035
TO
190
191 $item = $this->queue->claimItem();
192 $this->assertEquals('a', $item->data['test-key']);
193 $this->assertEquals(1, $this->queue->numberOfItems());
194 // forget to release
195
196 // haven't reached expiration yet, so claimItem fails
197 CRM_Utils_Time::setTime('2012-04-01 1:59:00');
198 $item2 = $this->queue->claimItem();
199 $this->assertEquals(FALSE, $item2);
200
201 // but stealItem works
202 $item3 = $this->queue->stealItem();
203 $this->assertEquals('a', $item3->data['test-key']);
204 $this->assertEquals(1, $this->queue->numberOfItems());
205 $this->queue->deleteItem($item3);
206
207 $this->assertEquals(0, $this->queue->numberOfItems());
208 }
209
210 /**
211 * Test that queue content is reset when reset=>TRUE
212 *
213 * @dataProvider getQueueSpecs
1e1fdcf6 214 * @param $queueSpec
6a488035 215 */
00be9182 216 public function testCreateResetTrue($queueSpec) {
6a488035 217 $this->queue = $this->queueService->create($queueSpec);
9099cab3 218 $this->queue->createItem([
92915c55 219 'test-key' => 'a',
9099cab3
CW
220 ]);
221 $this->queue->createItem([
92915c55 222 'test-key' => 'b',
9099cab3 223 ]);
6a488035
TO
224 $this->assertEquals(2, $this->queue->numberOfItems());
225 unset($this->queue);
226
227 $queue2 = $this->queueService->create(
9099cab3 228 $queueSpec + ['reset' => TRUE]
6a488035
TO
229 );
230 $this->assertEquals(0, $queue2->numberOfItems());
231 }
232
233 /**
eceb18cc 234 * Test that queue content is not reset when reset is omitted.
6a488035
TO
235 *
236 * @dataProvider getQueueSpecs
1e1fdcf6 237 * @param $queueSpec
6a488035 238 */
00be9182 239 public function testCreateResetFalse($queueSpec) {
6a488035 240 $this->queue = $this->queueService->create($queueSpec);
9099cab3 241 $this->queue->createItem([
92915c55 242 'test-key' => 'a',
9099cab3
CW
243 ]);
244 $this->queue->createItem([
92915c55 245 'test-key' => 'b',
9099cab3 246 ]);
6a488035
TO
247 $this->assertEquals(2, $this->queue->numberOfItems());
248 unset($this->queue);
249
250 $queue2 = $this->queueService->create($queueSpec);
251 $this->assertEquals(2, $queue2->numberOfItems());
252
253 $item = $queue2->claimItem();
254 $this->assertEquals('a', $item->data['test-key']);
255 $queue2->releaseItem($item);
256 }
257
258 /**
259 * Test that queue content is not reset when using load()
260 *
261 * @dataProvider getQueueSpecs
1e1fdcf6 262 * @param $queueSpec
6a488035 263 */
00be9182 264 public function testLoad($queueSpec) {
6a488035 265 $this->queue = $this->queueService->create($queueSpec);
9099cab3 266 $this->queue->createItem([
92915c55 267 'test-key' => 'a',
9099cab3
CW
268 ]);
269 $this->queue->createItem([
92915c55 270 'test-key' => 'b',
9099cab3 271 ]);
6a488035
TO
272 $this->assertEquals(2, $this->queue->numberOfItems());
273 unset($this->queue);
274
275 $queue2 = $this->queueService->create($queueSpec);
276 $this->assertEquals(2, $queue2->numberOfItems());
277
278 $item = $queue2->claimItem();
279 $this->assertEquals('a', $item->data['test-key']);
280 $queue2->releaseItem($item);
281 }
96025800 282
6a488035 283}