3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
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 |
9 +--------------------------------------------------------------------+
13 * Ensure that various queue implementations comply with the interface
16 class CRM_Queue_QueueTest
extends CiviUnitTestCase
{
18 /* ----------------------- Queue providers ----------------------- */
20 /* Define a list of queue providers which should be tested */
23 * Return a list of persistent and transient queue providers.
25 public function getQueueSpecs() {
30 'name' => 'test-queue',
36 'name' => 'test-queue',
45 public function setUp() {
47 $this->queueService
= CRM_Queue_Service
::singleton(TRUE);
50 public function tearDown() {
51 CRM_Utils_Time
::resetTime();
53 $tablesToTruncate = ['civicrm_queue_item'];
54 $this->quickCleanup($tablesToTruncate);
58 * Create a few queue items; alternately enqueue and dequeue various
60 * @dataProvider getQueueSpecs
63 public function testBasicUsage($queueSpec) {
64 $this->queue
= $this->queueService
->create($queueSpec);
65 $this->assertTrue($this->queue
instanceof CRM_Queue_Queue
);
67 $this->queue
->createItem([
70 $this->queue
->createItem([
73 $this->queue
->createItem([
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);
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);
87 $this->queue
->createItem([
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);
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);
101 $this->assertEquals(0, $this->queue
->numberOfItems());
105 * Claim an item from the queue and release it back for subsequent processing.
107 * @dataProvider getQueueSpecs
110 public function testManualRelease($queueSpec) {
111 $this->queue
= $this->queueService
->create($queueSpec);
112 $this->assertTrue($this->queue
instanceof CRM_Queue_Queue
);
114 $this->queue
->createItem([
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);
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);
128 $this->assertEquals(0, $this->queue
->numberOfItems());
132 * Test that item leases expire at the expected time.
134 * @dataProvider getQueueSpecs
138 public function testTimeoutRelease($queueSpec) {
139 $this->queue
= $this->queueService
->create($queueSpec);
140 $this->assertTrue($this->queue
instanceof CRM_Queue_Queue
);
142 CRM_Utils_Time
::setTime('2012-04-01 1:00:00');
143 $this->queue
->createItem([
147 $item = $this->queue
->claimItem();
148 $this->assertEquals('a', $item->data
['test-key']);
149 $this->assertEquals(1, $this->queue
->numberOfItems());
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);
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);
164 $this->assertEquals(0, $this->queue
->numberOfItems());
168 * Test that item leases can be ignored.
170 * @dataProvider getQueueSpecs
173 public function testStealItem($queueSpec) {
174 $this->queue
= $this->queueService
->create($queueSpec);
175 $this->assertTrue($this->queue
instanceof CRM_Queue_Queue
);
177 CRM_Utils_Time
::setTime('2012-04-01 1:00:00');
178 $this->queue
->createItem([
182 $item = $this->queue
->claimItem();
183 $this->assertEquals('a', $item->data
['test-key']);
184 $this->assertEquals(1, $this->queue
->numberOfItems());
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);
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);
198 $this->assertEquals(0, $this->queue
->numberOfItems());
202 * Test that queue content is reset when reset=>TRUE
204 * @dataProvider getQueueSpecs
207 public function testCreateResetTrue($queueSpec) {
208 $this->queue
= $this->queueService
->create($queueSpec);
209 $this->queue
->createItem([
212 $this->queue
->createItem([
215 $this->assertEquals(2, $this->queue
->numberOfItems());
218 $queue2 = $this->queueService
->create(
219 $queueSpec +
['reset' => TRUE]
221 $this->assertEquals(0, $queue2->numberOfItems());
225 * Test that queue content is not reset when reset is omitted.
227 * @dataProvider getQueueSpecs
230 public function testCreateResetFalse($queueSpec) {
231 $this->queue
= $this->queueService
->create($queueSpec);
232 $this->queue
->createItem([
235 $this->queue
->createItem([
238 $this->assertEquals(2, $this->queue
->numberOfItems());
241 $queue2 = $this->queueService
->create($queueSpec);
242 $this->assertEquals(2, $queue2->numberOfItems());
244 $item = $queue2->claimItem();
245 $this->assertEquals('a', $item->data
['test-key']);
246 $queue2->releaseItem($item);
250 * Test that queue content is not reset when using load()
252 * @dataProvider getQueueSpecs
255 public function testLoad($queueSpec) {
256 $this->queue
= $this->queueService
->create($queueSpec);
257 $this->queue
->createItem([
260 $this->queue
->createItem([
263 $this->assertEquals(2, $this->queue
->numberOfItems());
266 $queue2 = $this->queueService
->create($queueSpec);
267 $this->assertEquals(2, $queue2->numberOfItems());
269 $item = $queue2->claimItem();
270 $this->assertEquals('a', $item->data
['test-key']);
271 $queue2->releaseItem($item);