Commit | Line | Data |
---|---|---|
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 | */ |
16 | class 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 | } |