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
17 class CRM_Queue_RunnerTest
extends CiviUnitTestCase
{
19 public function setUp(): void
{
21 $this->queueService
= CRM_Queue_Service
::singleton(TRUE);
22 $this->queue
= $this->queueService
->create([
24 'name' => 'test-queue',
26 self
::$_recordedValues = [];
29 public function tearDown(): void
{
31 unset($this->queueService
);
33 CRM_Utils_Time
::resetTime();
35 $tablesToTruncate = ['civicrm_queue_item'];
36 $this->quickCleanup($tablesToTruncate);
40 public function testRunAllNormal() {
41 // prepare a list of tasks with an error in the middle
42 $this->queue
->createItem(new CRM_Queue_Task(
43 ['CRM_Queue_RunnerTest', '_recordValue'],
47 $this->queue
->createItem(new CRM_Queue_Task(
48 ['CRM_Queue_RunnerTest', '_recordValue'],
52 $this->queue
->createItem(new CRM_Queue_Task(
53 ['CRM_Queue_RunnerTest', '_recordValue'],
58 // run the list of tasks
59 $runner = new CRM_Queue_Runner([
60 'queue' => $this->queue
,
61 'errorMode' => CRM_Queue_Runner
::ERROR_ABORT
,
63 $this->assertEquals(self
::$_recordedValues, []);
64 $this->assertEquals(3, $this->queue
->numberOfItems());
65 $result = $runner->runAll();
66 $this->assertEquals(TRUE, $result);
67 $this->assertEquals(self
::$_recordedValues, ['a', 'b', 'c']);
68 $this->assertEquals(0, $this->queue
->numberOfItems());
72 * Run a series of tasks.
74 * One of the tasks will insert more TODOs at the start of the list.
76 public function testRunAll_AddMore() {
77 // Prepare a list of tasks with an error in the middle.
78 $this->queue
->createItem(new CRM_Queue_Task(
79 ['CRM_Queue_RunnerTest', '_recordValue'],
83 $this->queue
->createItem(new CRM_Queue_Task(
84 ['CRM_Queue_RunnerTest', '_enqueueNumbers'],
88 $this->queue
->createItem(new CRM_Queue_Task(
89 ['CRM_Queue_RunnerTest', '_recordValue'],
94 // run the list of tasks
95 $runner = new CRM_Queue_Runner([
96 'queue' => $this->queue
,
97 'errorMode' => CRM_Queue_Runner
::ERROR_ABORT
,
99 $this->assertEquals(self
::$_recordedValues, []);
100 $this->assertEquals(3, $this->queue
->numberOfItems());
101 $result = $runner->runAll();
102 $this->assertEquals(TRUE, $result);
103 $this->assertEquals(self
::$_recordedValues, ['a', 1, 2, 3, 'b']);
104 $this->assertEquals(0, $this->queue
->numberOfItems());
108 * Run a series of tasks; when one throws an
109 * exception, ignore it and continue
111 public function testRunAll_Continue_Exception() {
112 // prepare a list of tasks with an error in the middle
113 $this->queue
->createItem(new CRM_Queue_Task(
114 ['CRM_Queue_RunnerTest', '_recordValue'],
118 $this->queue
->createItem(new CRM_Queue_Task(
119 ['CRM_Queue_RunnerTest', '_throwException'],
123 $this->queue
->createItem(new CRM_Queue_Task(
124 ['CRM_Queue_RunnerTest', '_recordValue'],
129 // run the list of tasks
130 $runner = new CRM_Queue_Runner([
131 'queue' => $this->queue
,
132 'errorMode' => CRM_Queue_Runner
::ERROR_CONTINUE
,
134 $this->assertEquals(self
::$_recordedValues, []);
135 $this->assertEquals(3, $this->queue
->numberOfItems());
136 $result = $runner->runAll();
137 // FIXME useless return
138 $this->assertEquals(TRUE, $result);
139 $this->assertEquals(self
::$_recordedValues, ['a', 'c']);
140 $this->assertEquals(0, $this->queue
->numberOfItems());
144 * Run a series of tasks; when one throws an exception,
145 * abort processing and return it to the queue.
147 public function testRunAll_Abort_Exception() {
148 // prepare a list of tasks with an error in the middle
149 $this->queue
->createItem(new CRM_Queue_Task(
150 ['CRM_Queue_RunnerTest', '_recordValue'],
154 $this->queue
->createItem(new CRM_Queue_Task(
155 ['CRM_Queue_RunnerTest', '_throwException'],
159 $this->queue
->createItem(new CRM_Queue_Task(
160 ['CRM_Queue_RunnerTest', '_recordValue'],
165 // run the list of tasks
166 $runner = new CRM_Queue_Runner([
167 'queue' => $this->queue
,
168 'errorMode' => CRM_Queue_Runner
::ERROR_ABORT
,
170 $this->assertEquals(self
::$_recordedValues, []);
171 $this->assertEquals(3, $this->queue
->numberOfItems());
172 $result = $runner->runAll();
173 $this->assertEquals(1, $result['is_error']);
175 $this->assertEquals(self
::$_recordedValues, ['a']);
176 // 'b' and 'c' remain
177 $this->assertEquals(2, $this->queue
->numberOfItems());
181 * Run a series of tasks; when one returns false,
182 * abort processing and return it to the queue.
184 public function testRunAll_Abort_False() {
185 // prepare a list of tasks with an error in the middle
186 $this->queue
->createItem(new CRM_Queue_Task(
187 ['CRM_Queue_RunnerTest', '_recordValue'],
191 $this->queue
->createItem(new CRM_Queue_Task(
192 ['CRM_Queue_RunnerTest', '_returnFalse'],
196 $this->queue
->createItem(new CRM_Queue_Task(
197 ['CRM_Queue_RunnerTest', '_recordValue'],
202 // run the list of tasks
203 $runner = new CRM_Queue_Runner([
204 'queue' => $this->queue
,
205 'errorMode' => CRM_Queue_Runner
::ERROR_ABORT
,
207 $this->assertEquals(self
::$_recordedValues, []);
208 $this->assertEquals(3, $this->queue
->numberOfItems());
209 $result = $runner->runAll();
210 $this->assertEquals(1, $result['is_error']);
212 $this->assertEquals(self
::$_recordedValues, ['a']);
213 // 'b' and 'c' remain
214 $this->assertEquals(2, $this->queue
->numberOfItems());
221 protected static $_recordedValues;
229 public static function _recordValue($taskCtx, $value) {
230 self
::$_recordedValues[] = $value;
239 public static function _returnFalse($taskCtx) {
249 public static function _throwException($taskCtx, $value) {
250 throw new Exception("Manufactured error: $value");
260 public static function _enqueueNumbers($taskCtx, $low, $high) {
261 for ($i = $low; $i <= $high; $i++
) {
262 $taskCtx->queue
->createItem(new CRM_Queue_Task(
263 ['CRM_Queue_RunnerTest', '_recordValue'],
265 sprintf('Add number "%d"', $i)