Oefenweb /
cakephp-queue
| 1 | <?php |
||
| 2 | App::uses('QueuedTask', 'Queue.Model'); |
||
| 3 | |||
| 4 | /** |
||
| 5 | * QueuedTask Test. |
||
| 6 | * |
||
| 7 | * @property Queue.QueuedTask $QueuedTask |
||
| 8 | */ |
||
|
0 ignored issues
–
show
Documentation
Bug
introduced
by
Loading history...
|
|||
| 9 | class QueuedTaskTest extends CakeTestCase { |
||
|
0 ignored issues
–
show
The type
CakeTestCase was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths Loading history...
|
|||
| 10 | |||
| 11 | /** |
||
| 12 | * Fixtures to load. |
||
| 13 | * |
||
| 14 | * @var array |
||
| 15 | */ |
||
| 16 | public $fixtures = ['plugin.queue.queued_task']; |
||
| 17 | |||
| 18 | /** |
||
| 19 | * setUp method. |
||
| 20 | * |
||
| 21 | * @return void |
||
| 22 | */ |
||
| 23 | public function setUp() { |
||
| 24 | parent::setUp(); |
||
| 25 | |||
| 26 | $this->QueuedTask = ClassRegistry::init('Queue.QueuedTask'); |
||
|
0 ignored issues
–
show
The type
ClassRegistry was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths Loading history...
|
|||
| 27 | } |
||
| 28 | |||
| 29 | /** |
||
| 30 | * tearDown method. |
||
| 31 | * |
||
| 32 | * @return void |
||
| 33 | */ |
||
| 34 | public function tearDown() { |
||
| 35 | parent::tearDown(); |
||
| 36 | |||
| 37 | unset($this->QueuedTask); |
||
| 38 | } |
||
| 39 | |||
| 40 | /** |
||
| 41 | * Tests `QueuedTask` object type. |
||
| 42 | * |
||
| 43 | * @return void |
||
| 44 | */ |
||
| 45 | public function testQueueInstance() { |
||
| 46 | $this->assertTrue(is_a($this->QueuedTask, 'QueuedTask')); |
||
| 47 | } |
||
| 48 | |||
| 49 | /** |
||
| 50 | * Tests the basic create and length evaluation functions. |
||
| 51 | * |
||
| 52 | * @return void |
||
| 53 | */ |
||
| 54 | public function testCreateAndCount() { |
||
| 55 | // At first, the queue should contain 0 items |
||
| 56 | $this->assertEqual($this->QueuedTask->getLength(), 0); |
||
| 57 | |||
| 58 | // Create a task |
||
| 59 | $this->assertTrue((bool)$this->QueuedTask->createJob('test1', [ |
||
| 60 | 'some' => 'random', |
||
| 61 | 'test' => 'data' |
||
| 62 | ])); |
||
| 63 | |||
| 64 | // Test if queue Length is 1 now |
||
| 65 | $this->assertEqual($this->QueuedTask->getLength(), 1); |
||
| 66 | |||
| 67 | // Create some more tasks |
||
| 68 | $this->assertTrue((bool)$this->QueuedTask->createJob('test2', ['some' => 'random', 'test' => 'data2'])); |
||
| 69 | $this->assertTrue((bool)$this->QueuedTask->createJob('test2', ['some' => 'random', 'test' => 'data3'])); |
||
| 70 | $this->assertTrue((bool)$this->QueuedTask->createJob('test3', ['some' => 'random', 'test' => 'data4'])); |
||
| 71 | |||
| 72 | // Overall queueLength shpould now be 4 |
||
| 73 | $this->assertEqual($this->QueuedTask->getLength(), 4); |
||
| 74 | |||
| 75 | // There should be 1 task of type 'test1', one of type 'test3' and 2 of type 'test2' |
||
| 76 | $this->assertEqual($this->QueuedTask->getLength('test1'), 1); |
||
| 77 | $this->assertEqual($this->QueuedTask->getLength('test2'), 2); |
||
| 78 | $this->assertEqual($this->QueuedTask->getLength('test3'), 1); |
||
| 79 | } |
||
| 80 | |||
| 81 | /** |
||
| 82 | * Tests creation and fetching of tasks. |
||
| 83 | * |
||
| 84 | * @return void |
||
| 85 | */ |
||
| 86 | public function testCreateAndFetch() { |
||
| 87 | // Capabilities is a list of tasks the worker can run |
||
| 88 | $capabilities = [ |
||
| 89 | 'task1' => [ |
||
| 90 | 'name' => 'task1', |
||
| 91 | 'timeout' => 100, |
||
| 92 | 'retries' => 2 |
||
| 93 | ] |
||
| 94 | ]; |
||
| 95 | $testData = [ |
||
| 96 | 'x1' => 'y1', |
||
| 97 | 'x2' => 'y2', |
||
| 98 | 'x3' => 'y3', |
||
| 99 | 'x4' => 'y4' |
||
| 100 | ]; |
||
| 101 | |||
| 102 | // Start off empty |
||
| 103 | $this->QueuedTask->deleteAll(['1 = 1']); |
||
| 104 | |||
| 105 | $this->assertEqual($this->QueuedTask->find('all'), []); |
||
| 106 | // At first, the queue should contain 0 items |
||
| 107 | $this->assertEqual($this->QueuedTask->getLength(), 0); |
||
| 108 | // There are no tasks, so we cant fetch any |
||
| 109 | $this->assertFalse($this->QueuedTask->requestJob($capabilities)); |
||
| 110 | // Insert one task |
||
| 111 | $this->assertTrue((bool)$this->QueuedTask->createJob('task1', $testData)); |
||
| 112 | |||
| 113 | // Fetch and check the first task |
||
| 114 | $data = $this->QueuedTask->requestJob($capabilities); |
||
| 115 | $this->assertEqual($data['id'], 5); |
||
| 116 | $this->assertEqual('task1', $data['task']); |
||
| 117 | $this->assertEqual($data['failed_count'], 0); |
||
| 118 | $this->assertNull($data['completed']); |
||
| 119 | $this->assertEqual(unserialize($data['data']), $testData); |
||
| 120 | |||
| 121 | // After this task has been fetched, it may not be reassigned |
||
| 122 | $this->assertFalse($this->QueuedTask->requestJob($capabilities)); |
||
| 123 | |||
| 124 | // Queue length is still 1 since the first task did not finish |
||
| 125 | $this->assertEqual($this->QueuedTask->getLength(), 1); |
||
| 126 | |||
| 127 | // Now mark Task 5 as done |
||
| 128 | $this->assertTrue((bool)$this->QueuedTask->markJobDone(5)); |
||
| 129 | // Should be 0 again |
||
| 130 | $this->assertEqual($this->QueuedTask->getLength(), 0); |
||
| 131 | } |
||
| 132 | |||
| 133 | /** |
||
| 134 | * Test the delivery of tasks in sequence, skipping fetched but not completed tasks. |
||
| 135 | * |
||
| 136 | * @return void |
||
| 137 | */ |
||
| 138 | public function testSequence() { |
||
| 139 | // Capabilities is a list of tasks the worker can run |
||
| 140 | $capabilities = [ |
||
| 141 | 'task1' => [ |
||
| 142 | 'name' => 'task1', |
||
| 143 | 'timeout' => 100, |
||
| 144 | 'retries' => 2 |
||
| 145 | ] |
||
| 146 | ]; |
||
| 147 | // At first, the queue should contain 0 items |
||
| 148 | $this->assertEqual($this->QueuedTask->getLength(), 0); |
||
| 149 | // Create some more tasks |
||
| 150 | foreach (range(0, 9) as $num) { |
||
| 151 | $this->assertTrue((bool)$this->QueuedTask->createJob('task1', [ |
||
| 152 | 'tasknum' => $num |
||
| 153 | ])); |
||
| 154 | } |
||
| 155 | // 10 tasks in the queue |
||
| 156 | $this->assertEqual($this->QueuedTask->getLength(), 10); |
||
| 157 | |||
| 158 | // Tasks should be fetched in the original sequence |
||
| 159 | foreach (range(0, 4) as $num) { |
||
| 160 | $job = $this->QueuedTask->requestJob($capabilities); |
||
| 161 | $jobData = unserialize($job['data']); |
||
| 162 | $this->assertEqual($jobData['tasknum'], $num); |
||
| 163 | } |
||
| 164 | // Now mark them as done |
||
| 165 | foreach (range(0, 4) as $num) { |
||
| 166 | $this->assertTrue((bool)$this->QueuedTask->markJobDone($num + 5)); |
||
| 167 | $this->assertEqual($this->QueuedTask->getLength(), 9 - $num); |
||
| 168 | } |
||
| 169 | |||
| 170 | // Tasks should be fetched in the original sequence |
||
| 171 | foreach (range(5, 9) as $num) { |
||
| 172 | $job = $this->QueuedTask->requestJob($capabilities); |
||
| 173 | $jobData = unserialize($job['data']); |
||
| 174 | $this->assertEqual($jobData['tasknum'], $num); |
||
| 175 | $this->assertTrue((bool)$this->QueuedTask->markJobDone($job['id'])); |
||
| 176 | $this->assertEqual($this->QueuedTask->getLength(), 9 - $num); |
||
| 177 | } |
||
| 178 | } |
||
| 179 | |||
| 180 | /** |
||
| 181 | * Test creating Tasks to run close to a specified time, and strtotime parsing. |
||
| 182 | * |
||
| 183 | * @return void |
||
| 184 | */ |
||
| 185 | public function testNotBefore() { |
||
| 186 | $this->assertTrue((bool)$this->QueuedTask->createJob('task1', [], '+ 1 Min')); |
||
| 187 | $this->assertTrue((bool)$this->QueuedTask->createJob('task1', [], '+ 1 Day')); |
||
| 188 | $this->assertTrue((bool)$this->QueuedTask->createJob('task1', [], '2009-07-01 12:00:00')); |
||
| 189 | $data = $this->QueuedTask->find('all'); |
||
| 190 | $this->assertEqual($data[4]['QueuedTask']['not_before'], date('Y-m-d H:i:s', strtotime('+ 1 Min'))); |
||
| 191 | $this->assertEqual($data[5]['QueuedTask']['not_before'], date('Y-m-d H:i:s', strtotime('+ 1 Day'))); |
||
| 192 | $this->assertEqual($data[6]['QueuedTask']['not_before'], '2009-07-01 12:00:00'); |
||
| 193 | } |
||
| 194 | |||
| 195 | /** |
||
| 196 | * Test Job reordering depending on 'notBefore' field. |
||
| 197 | * |
||
| 198 | * Jobs with an expired notbefore field should be executed before any other job without specific timing info. |
||
| 199 | * |
||
| 200 | * @return void |
||
| 201 | */ |
||
| 202 | public function testNotBeforeOrder() { |
||
| 203 | $capabilities = [ |
||
| 204 | 'task1' => [ |
||
| 205 | 'name' => 'task1', |
||
| 206 | 'timeout' => 100, |
||
| 207 | 'retries' => 2 |
||
| 208 | ], |
||
| 209 | 'dummytask' => [ |
||
| 210 | 'name' => 'dummytask', |
||
| 211 | 'timeout' => 100, |
||
| 212 | 'retries' => 2 |
||
| 213 | ] |
||
| 214 | ]; |
||
| 215 | $this->assertTrue((bool)$this->QueuedTask->createJob('dummytask', [])); |
||
| 216 | $this->assertTrue((bool)$this->QueuedTask->createJob('dummytask', [])); |
||
| 217 | // Create a task with it's execution target some seconds in the past, so it should jump to the top of the list |
||
| 218 | $this->assertTrue((bool)$this->QueuedTask->createJob('task1', ['three'], '- 3 Seconds')); |
||
| 219 | $this->assertTrue((bool)$this->QueuedTask->createJob('task1', ['two'], '- 4 Seconds')); |
||
| 220 | $this->assertTrue((bool)$this->QueuedTask->createJob('task1', ['one'], '- 5 Seconds')); |
||
| 221 | |||
| 222 | // When usin requestJob, the jobs we just created should be delivered in this order, |
||
| 223 | // NOT the order in which they where created |
||
| 224 | $expected = [ |
||
| 225 | [ |
||
| 226 | 'name' => 'task1', |
||
| 227 | 'data' => ['one'] |
||
| 228 | ], |
||
| 229 | [ |
||
| 230 | 'name' => 'task1', |
||
| 231 | 'data' => ['two'] |
||
| 232 | ], |
||
| 233 | [ |
||
| 234 | 'name' => 'task1', |
||
| 235 | 'data' => ['three'] |
||
| 236 | ], |
||
| 237 | [ |
||
| 238 | 'name' => 'dummytask', |
||
| 239 | 'data' => [] |
||
| 240 | ], |
||
| 241 | [ |
||
| 242 | 'name' => 'dummytask', |
||
| 243 | 'data' => [] |
||
| 244 | ] |
||
| 245 | ]; |
||
| 246 | |||
| 247 | foreach ($expected as $item) { |
||
| 248 | $tmp = $this->QueuedTask->requestJob($capabilities); |
||
| 249 | $this->assertEqual($tmp['task'], $item['name']); |
||
| 250 | $this->assertEqual(unserialize($tmp['data']), $item['data']); |
||
| 251 | } |
||
| 252 | } |
||
| 253 | |||
| 254 | /** |
||
| 255 | * Tests requeueing after timeout is reached. |
||
| 256 | * |
||
| 257 | * @return void |
||
| 258 | */ |
||
| 259 | public function testRequeueAfterTimeout() { |
||
| 260 | $capabilities = [ |
||
| 261 | 'task1' => [ |
||
| 262 | 'name' => 'task1', |
||
| 263 | 'timeout' => 1, |
||
| 264 | 'retries' => 2 |
||
| 265 | ] |
||
| 266 | ]; |
||
| 267 | |||
| 268 | $this->assertTrue((bool)$this->QueuedTask->createJob('task1', ['1'])); |
||
| 269 | $tmp = $this->QueuedTask->requestJob($capabilities); |
||
| 270 | $this->assertEqual($tmp['task'], 'task1'); |
||
| 271 | $this->assertEqual(unserialize($tmp['data']), ['1']); |
||
| 272 | $this->assertEqual($tmp['failed_count'], '0'); |
||
| 273 | sleep(2); |
||
| 274 | $tmp = $this->QueuedTask->requestJob($capabilities); |
||
| 275 | $this->assertEqual($tmp['task'], 'task1'); |
||
| 276 | $this->assertEqual(unserialize($tmp['data']), ['1']); |
||
| 277 | $this->assertEqual($tmp['failed_count'], '1'); |
||
| 278 | $this->assertEqual($tmp['failure_message'], 'Restart after timeout'); |
||
| 279 | } |
||
| 280 | |||
| 281 | /** |
||
| 282 | * Tests `QueuedTask::markJobFailed`. |
||
| 283 | * |
||
| 284 | * @return void |
||
| 285 | */ |
||
| 286 | public function testMarkJobFailed() { |
||
| 287 | $this->QueuedTask->createJob('dummytask', []); |
||
| 288 | $id = $this->QueuedTask->id; |
||
| 289 | $expected = 'Timeout: 100'; |
||
| 290 | $this->QueuedTask->markJobFailed($id, $expected); |
||
| 291 | $result = $this->QueuedTask->field('failure_message'); |
||
| 292 | $this->assertEqual($result, $expected); |
||
| 293 | } |
||
| 294 | |||
| 295 | } |
||
| 296 |