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 TO |
29 | 'type' => 'Sql', |
30 | 'name' => 'test-queue', | |
9099cab3 CW |
31 | ], |
32 | ]; | |
33 | $queueSpecs[] = [ | |
34 | [ | |
6a488035 TO |
35 | 'type' => 'Memory', |
36 | 'name' => 'test-queue', | |
9099cab3 CW |
37 | ], |
38 | ]; | |
6a488035 TO |
39 | return $queueSpecs; |
40 | } | |
41 | ||
28a04ea9 | 42 | /** |
43 | * Per-provider tests | |
44 | */ | |
00be9182 | 45 | public function setUp() { |
6a488035 TO |
46 | parent::setUp(); |
47 | $this->queueService = CRM_Queue_Service::singleton(TRUE); | |
48 | } | |
49 | ||
00be9182 | 50 | public function tearDown() { |
6a488035 TO |
51 | CRM_Utils_Time::resetTime(); |
52 | ||
9099cab3 | 53 | $tablesToTruncate = ['civicrm_queue_item']; |
6a488035 TO |
54 | $this->quickCleanup($tablesToTruncate); |
55 | } | |
56 | ||
57 | /** | |
58 | * Create a few queue items; alternately enqueue and dequeue various | |
59 | * | |
60 | * @dataProvider getQueueSpecs | |
1e1fdcf6 | 61 | * @param $queueSpec |
6a488035 | 62 | */ |
00be9182 | 63 | public function testBasicUsage($queueSpec) { |
6a488035 TO |
64 | $this->queue = $this->queueService->create($queueSpec); |
65 | $this->assertTrue($this->queue instanceof CRM_Queue_Queue); | |
66 | ||
9099cab3 | 67 | $this->queue->createItem([ |
92915c55 | 68 | 'test-key' => 'a', |
9099cab3 CW |
69 | ]); |
70 | $this->queue->createItem([ | |
92915c55 | 71 | 'test-key' => 'b', |
9099cab3 CW |
72 | ]); |
73 | $this->queue->createItem([ | |
92915c55 | 74 | 'test-key' => 'c', |
9099cab3 | 75 | ]); |
6a488035 TO |
76 | |
77 | $this->assertEquals(3, $this->queue->numberOfItems()); | |
78 | $item = $this->queue->claimItem(); | |
79 | $this->assertEquals('a', $item->data['test-key']); | |
80 | $this->queue->deleteItem($item); | |
81 | ||
82 | $this->assertEquals(2, $this->queue->numberOfItems()); | |
83 | $item = $this->queue->claimItem(); | |
84 | $this->assertEquals('b', $item->data['test-key']); | |
85 | $this->queue->deleteItem($item); | |
86 | ||
9099cab3 | 87 | $this->queue->createItem([ |
92915c55 | 88 | 'test-key' => 'd', |
9099cab3 | 89 | ]); |
6a488035 TO |
90 | |
91 | $this->assertEquals(2, $this->queue->numberOfItems()); | |
92 | $item = $this->queue->claimItem(); | |
93 | $this->assertEquals('c', $item->data['test-key']); | |
94 | $this->queue->deleteItem($item); | |
95 | ||
96 | $this->assertEquals(1, $this->queue->numberOfItems()); | |
97 | $item = $this->queue->claimItem(); | |
98 | $this->assertEquals('d', $item->data['test-key']); | |
99 | $this->queue->deleteItem($item); | |
100 | ||
101 | $this->assertEquals(0, $this->queue->numberOfItems()); | |
102 | } | |
103 | ||
104 | /** | |
eceb18cc | 105 | * Claim an item from the queue and release it back for subsequent processing. |
6a488035 TO |
106 | * |
107 | * @dataProvider getQueueSpecs | |
1e1fdcf6 | 108 | * @param $queueSpec |
6a488035 | 109 | */ |
00be9182 | 110 | public function testManualRelease($queueSpec) { |
6a488035 TO |
111 | $this->queue = $this->queueService->create($queueSpec); |
112 | $this->assertTrue($this->queue instanceof CRM_Queue_Queue); | |
113 | ||
9099cab3 | 114 | $this->queue->createItem([ |
92915c55 | 115 | 'test-key' => 'a', |
9099cab3 | 116 | ]); |
6a488035 TO |
117 | |
118 | $item = $this->queue->claimItem(); | |
119 | $this->assertEquals('a', $item->data['test-key']); | |
120 | $this->assertEquals(1, $this->queue->numberOfItems()); | |
121 | $this->queue->releaseItem($item); | |
122 | ||
123 | $this->assertEquals(1, $this->queue->numberOfItems()); | |
124 | $item = $this->queue->claimItem(); | |
125 | $this->assertEquals('a', $item->data['test-key']); | |
126 | $this->queue->deleteItem($item); | |
127 | ||
128 | $this->assertEquals(0, $this->queue->numberOfItems()); | |
129 | } | |
130 | ||
131 | /** | |
eceb18cc | 132 | * Test that item leases expire at the expected time. |
6a488035 TO |
133 | * |
134 | * @dataProvider getQueueSpecs | |
fe482240 | 135 | * |
1e1fdcf6 | 136 | * @param $queueSpec |
6a488035 | 137 | */ |
00be9182 | 138 | public function testTimeoutRelease($queueSpec) { |
6a488035 TO |
139 | $this->queue = $this->queueService->create($queueSpec); |
140 | $this->assertTrue($this->queue instanceof CRM_Queue_Queue); | |
141 | ||
142 | CRM_Utils_Time::setTime('2012-04-01 1:00:00'); | |
9099cab3 | 143 | $this->queue->createItem([ |
92915c55 | 144 | 'test-key' => 'a', |
9099cab3 | 145 | ]); |
6a488035 TO |
146 | |
147 | $item = $this->queue->claimItem(); | |
148 | $this->assertEquals('a', $item->data['test-key']); | |
149 | $this->assertEquals(1, $this->queue->numberOfItems()); | |
150 | // forget to release | |
151 | ||
152 | // haven't reach expiration yet | |
153 | CRM_Utils_Time::setTime('2012-04-01 1:59:00'); | |
154 | $item2 = $this->queue->claimItem(); | |
155 | $this->assertEquals(FALSE, $item2); | |
156 | ||
157 | // pass expiration mark | |
158 | CRM_Utils_Time::setTime('2012-04-01 2:00:01'); | |
159 | $item3 = $this->queue->claimItem(); | |
160 | $this->assertEquals('a', $item3->data['test-key']); | |
161 | $this->assertEquals(1, $this->queue->numberOfItems()); | |
162 | $this->queue->deleteItem($item3); | |
163 | ||
164 | $this->assertEquals(0, $this->queue->numberOfItems()); | |
165 | } | |
166 | ||
167 | /** | |
eceb18cc | 168 | * Test that item leases can be ignored. |
6a488035 TO |
169 | * |
170 | * @dataProvider getQueueSpecs | |
1e1fdcf6 | 171 | * @param $queueSpec |
6a488035 | 172 | */ |
00be9182 | 173 | public function testStealItem($queueSpec) { |
6a488035 TO |
174 | $this->queue = $this->queueService->create($queueSpec); |
175 | $this->assertTrue($this->queue instanceof CRM_Queue_Queue); | |
176 | ||
6a488035 | 177 | CRM_Utils_Time::setTime('2012-04-01 1:00:00'); |
9099cab3 | 178 | $this->queue->createItem([ |
92915c55 | 179 | 'test-key' => 'a', |
9099cab3 | 180 | ]); |
6a488035 TO |
181 | |
182 | $item = $this->queue->claimItem(); | |
183 | $this->assertEquals('a', $item->data['test-key']); | |
184 | $this->assertEquals(1, $this->queue->numberOfItems()); | |
185 | // forget to release | |
186 | ||
187 | // haven't reached expiration yet, so claimItem fails | |
188 | CRM_Utils_Time::setTime('2012-04-01 1:59:00'); | |
189 | $item2 = $this->queue->claimItem(); | |
190 | $this->assertEquals(FALSE, $item2); | |
191 | ||
192 | // but stealItem works | |
193 | $item3 = $this->queue->stealItem(); | |
194 | $this->assertEquals('a', $item3->data['test-key']); | |
195 | $this->assertEquals(1, $this->queue->numberOfItems()); | |
196 | $this->queue->deleteItem($item3); | |
197 | ||
198 | $this->assertEquals(0, $this->queue->numberOfItems()); | |
199 | } | |
200 | ||
201 | /** | |
202 | * Test that queue content is reset when reset=>TRUE | |
203 | * | |
204 | * @dataProvider getQueueSpecs | |
1e1fdcf6 | 205 | * @param $queueSpec |
6a488035 | 206 | */ |
00be9182 | 207 | public function testCreateResetTrue($queueSpec) { |
6a488035 | 208 | $this->queue = $this->queueService->create($queueSpec); |
9099cab3 | 209 | $this->queue->createItem([ |
92915c55 | 210 | 'test-key' => 'a', |
9099cab3 CW |
211 | ]); |
212 | $this->queue->createItem([ | |
92915c55 | 213 | 'test-key' => 'b', |
9099cab3 | 214 | ]); |
6a488035 TO |
215 | $this->assertEquals(2, $this->queue->numberOfItems()); |
216 | unset($this->queue); | |
217 | ||
218 | $queue2 = $this->queueService->create( | |
9099cab3 | 219 | $queueSpec + ['reset' => TRUE] |
6a488035 TO |
220 | ); |
221 | $this->assertEquals(0, $queue2->numberOfItems()); | |
222 | } | |
223 | ||
224 | /** | |
eceb18cc | 225 | * Test that queue content is not reset when reset is omitted. |
6a488035 TO |
226 | * |
227 | * @dataProvider getQueueSpecs | |
1e1fdcf6 | 228 | * @param $queueSpec |
6a488035 | 229 | */ |
00be9182 | 230 | public function testCreateResetFalse($queueSpec) { |
6a488035 | 231 | $this->queue = $this->queueService->create($queueSpec); |
9099cab3 | 232 | $this->queue->createItem([ |
92915c55 | 233 | 'test-key' => 'a', |
9099cab3 CW |
234 | ]); |
235 | $this->queue->createItem([ | |
92915c55 | 236 | 'test-key' => 'b', |
9099cab3 | 237 | ]); |
6a488035 TO |
238 | $this->assertEquals(2, $this->queue->numberOfItems()); |
239 | unset($this->queue); | |
240 | ||
241 | $queue2 = $this->queueService->create($queueSpec); | |
242 | $this->assertEquals(2, $queue2->numberOfItems()); | |
243 | ||
244 | $item = $queue2->claimItem(); | |
245 | $this->assertEquals('a', $item->data['test-key']); | |
246 | $queue2->releaseItem($item); | |
247 | } | |
248 | ||
249 | /** | |
250 | * Test that queue content is not reset when using load() | |
251 | * | |
252 | * @dataProvider getQueueSpecs | |
1e1fdcf6 | 253 | * @param $queueSpec |
6a488035 | 254 | */ |
00be9182 | 255 | public function testLoad($queueSpec) { |
6a488035 | 256 | $this->queue = $this->queueService->create($queueSpec); |
9099cab3 | 257 | $this->queue->createItem([ |
92915c55 | 258 | 'test-key' => 'a', |
9099cab3 CW |
259 | ]); |
260 | $this->queue->createItem([ | |
92915c55 | 261 | 'test-key' => 'b', |
9099cab3 | 262 | ]); |
6a488035 TO |
263 | $this->assertEquals(2, $this->queue->numberOfItems()); |
264 | unset($this->queue); | |
265 | ||
266 | $queue2 = $this->queueService->create($queueSpec); | |
267 | $this->assertEquals(2, $queue2->numberOfItems()); | |
268 | ||
269 | $item = $queue2->claimItem(); | |
270 | $this->assertEquals('a', $item->data['test-key']); | |
271 | $queue2->releaseItem($item); | |
272 | } | |
96025800 | 273 | |
6a488035 | 274 | } |