commiting uncommited changes on live site
[weblabels.fsf.org.git] / crm.fsf.org / 20131203 / files / sites / all / modules-new / civicrm / tests / phpunit / CRM / Queue / QueueTest.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
26 */
27
28
29 require_once 'CiviTest/CiviUnitTestCase.php';
30
31 /**
32 * Ensure that various queue implementations comply with the interface
33 */
34 class CRM_Queue_QueueTest extends CiviUnitTestCase {
35
36 /* ----------------------- Queue providers ----------------------- */
37
38 /* Define a list of queue providers which should be tested */
39
40 /**
41 * Return a list of persistent and transient queue providers.
42 */
43 public function getQueueSpecs() {
44 $queueSpecs = array();
45 $queueSpecs[] = array(
46 array(
47 'type' => 'Sql',
48 'name' => 'test-queue',
49 ),
50 );
51 $queueSpecs[] = array(
52 array(
53 'type' => 'Memory',
54 'name' => 'test-queue',
55 ),
56 );
57 return $queueSpecs;
58 }
59
60 /**
61 * Per-provider tests
62 */
63 public function setUp() {
64 parent::setUp();
65 $this->queueService = CRM_Queue_Service::singleton(TRUE);
66 }
67
68 public function tearDown() {
69 CRM_Utils_Time::resetTime();
70
71 $tablesToTruncate = array('civicrm_queue_item');
72 $this->quickCleanup($tablesToTruncate);
73 }
74
75 /**
76 * Create a few queue items; alternately enqueue and dequeue various
77 *
78 * @dataProvider getQueueSpecs
79 * @param $queueSpec
80 */
81 public function testBasicUsage($queueSpec) {
82 $this->queue = $this->queueService->create($queueSpec);
83 $this->assertTrue($this->queue instanceof CRM_Queue_Queue);
84
85 $this->queue->createItem(array(
86 'test-key' => 'a',
87 ));
88 $this->queue->createItem(array(
89 'test-key' => 'b',
90 ));
91 $this->queue->createItem(array(
92 'test-key' => 'c',
93 ));
94
95 $this->assertEquals(3, $this->queue->numberOfItems());
96 $item = $this->queue->claimItem();
97 $this->assertEquals('a', $item->data['test-key']);
98 $this->queue->deleteItem($item);
99
100 $this->assertEquals(2, $this->queue->numberOfItems());
101 $item = $this->queue->claimItem();
102 $this->assertEquals('b', $item->data['test-key']);
103 $this->queue->deleteItem($item);
104
105 $this->queue->createItem(array(
106 'test-key' => 'd',
107 ));
108
109 $this->assertEquals(2, $this->queue->numberOfItems());
110 $item = $this->queue->claimItem();
111 $this->assertEquals('c', $item->data['test-key']);
112 $this->queue->deleteItem($item);
113
114 $this->assertEquals(1, $this->queue->numberOfItems());
115 $item = $this->queue->claimItem();
116 $this->assertEquals('d', $item->data['test-key']);
117 $this->queue->deleteItem($item);
118
119 $this->assertEquals(0, $this->queue->numberOfItems());
120 }
121
122 /**
123 * Claim an item from the queue and release it back for subsequent processing.
124 *
125 * @dataProvider getQueueSpecs
126 * @param $queueSpec
127 */
128 public function testManualRelease($queueSpec) {
129 $this->queue = $this->queueService->create($queueSpec);
130 $this->assertTrue($this->queue instanceof CRM_Queue_Queue);
131
132 $this->queue->createItem(array(
133 'test-key' => 'a',
134 ));
135
136 $item = $this->queue->claimItem();
137 $this->assertEquals('a', $item->data['test-key']);
138 $this->assertEquals(1, $this->queue->numberOfItems());
139 $this->queue->releaseItem($item);
140
141 $this->assertEquals(1, $this->queue->numberOfItems());
142 $item = $this->queue->claimItem();
143 $this->assertEquals('a', $item->data['test-key']);
144 $this->queue->deleteItem($item);
145
146 $this->assertEquals(0, $this->queue->numberOfItems());
147 }
148
149 /**
150 * Test that item leases expire at the expected time.
151 *
152 * @dataProvider getQueueSpecs
153 *
154 * @param $queueSpec
155 */
156 public function testTimeoutRelease($queueSpec) {
157 $this->queue = $this->queueService->create($queueSpec);
158 $this->assertTrue($this->queue instanceof CRM_Queue_Queue);
159
160 CRM_Utils_Time::setTime('2012-04-01 1:00:00');
161 $this->queue->createItem(array(
162 'test-key' => 'a',
163 ));
164
165 $item = $this->queue->claimItem();
166 $this->assertEquals('a', $item->data['test-key']);
167 $this->assertEquals(1, $this->queue->numberOfItems());
168 // forget to release
169
170 // haven't reach expiration yet
171 CRM_Utils_Time::setTime('2012-04-01 1:59:00');
172 $item2 = $this->queue->claimItem();
173 $this->assertEquals(FALSE, $item2);
174
175 // pass expiration mark
176 CRM_Utils_Time::setTime('2012-04-01 2:00:01');
177 $item3 = $this->queue->claimItem();
178 $this->assertEquals('a', $item3->data['test-key']);
179 $this->assertEquals(1, $this->queue->numberOfItems());
180 $this->queue->deleteItem($item3);
181
182 $this->assertEquals(0, $this->queue->numberOfItems());
183 }
184
185 /**
186 * Test that item leases can be ignored.
187 *
188 * @dataProvider getQueueSpecs
189 * @param $queueSpec
190 */
191 public function testStealItem($queueSpec) {
192 $this->queue = $this->queueService->create($queueSpec);
193 $this->assertTrue($this->queue instanceof CRM_Queue_Queue);
194
195 require_once 'CRM/Utils/Time.php';
196 CRM_Utils_Time::setTime('2012-04-01 1:00:00');
197 $this->queue->createItem(array(
198 'test-key' => 'a',
199 ));
200
201 $item = $this->queue->claimItem();
202 $this->assertEquals('a', $item->data['test-key']);
203 $this->assertEquals(1, $this->queue->numberOfItems());
204 // forget to release
205
206 // haven't reached expiration yet, so claimItem fails
207 CRM_Utils_Time::setTime('2012-04-01 1:59:00');
208 $item2 = $this->queue->claimItem();
209 $this->assertEquals(FALSE, $item2);
210
211 // but stealItem works
212 $item3 = $this->queue->stealItem();
213 $this->assertEquals('a', $item3->data['test-key']);
214 $this->assertEquals(1, $this->queue->numberOfItems());
215 $this->queue->deleteItem($item3);
216
217 $this->assertEquals(0, $this->queue->numberOfItems());
218 }
219
220 /**
221 * Test that queue content is reset when reset=>TRUE
222 *
223 * @dataProvider getQueueSpecs
224 * @param $queueSpec
225 */
226 public function testCreateResetTrue($queueSpec) {
227 $this->queue = $this->queueService->create($queueSpec);
228 $this->queue->createItem(array(
229 'test-key' => 'a',
230 ));
231 $this->queue->createItem(array(
232 'test-key' => 'b',
233 ));
234 $this->assertEquals(2, $this->queue->numberOfItems());
235 unset($this->queue);
236
237 $queue2 = $this->queueService->create(
238 $queueSpec + array('reset' => TRUE)
239 );
240 $this->assertEquals(0, $queue2->numberOfItems());
241 }
242
243 /**
244 * Test that queue content is not reset when reset is omitted.
245 *
246 * @dataProvider getQueueSpecs
247 * @param $queueSpec
248 */
249 public function testCreateResetFalse($queueSpec) {
250 $this->queue = $this->queueService->create($queueSpec);
251 $this->queue->createItem(array(
252 'test-key' => 'a',
253 ));
254 $this->queue->createItem(array(
255 'test-key' => 'b',
256 ));
257 $this->assertEquals(2, $this->queue->numberOfItems());
258 unset($this->queue);
259
260 $queue2 = $this->queueService->create($queueSpec);
261 $this->assertEquals(2, $queue2->numberOfItems());
262
263 $item = $queue2->claimItem();
264 $this->assertEquals('a', $item->data['test-key']);
265 $queue2->releaseItem($item);
266 }
267
268 /**
269 * Test that queue content is not reset when using load()
270 *
271 * @dataProvider getQueueSpecs
272 * @param $queueSpec
273 */
274 public function testLoad($queueSpec) {
275 $this->queue = $this->queueService->create($queueSpec);
276 $this->queue->createItem(array(
277 'test-key' => 'a',
278 ));
279 $this->queue->createItem(array(
280 'test-key' => 'b',
281 ));
282 $this->assertEquals(2, $this->queue->numberOfItems());
283 unset($this->queue);
284
285 $queue2 = $this->queueService->create($queueSpec);
286 $this->assertEquals(2, $queue2->numberOfItems());
287
288 $item = $queue2->claimItem();
289 $this->assertEquals('a', $item->data['test-key']);
290 $queue2->releaseItem($item);
291 }
292
293 }