public function testRequeueAfterTimeout() { $capabilities = array('task1' => array('name' => 'task1', 'timeout' => 1, 'retries' => 2, 'rate' => 0)); $this->assertTrue($this->QueuedTask->createJob('task1', '1')); $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp['jobtype'], 'task1'); $this->assertEqual(unserialize($tmp['data']), '1'); $this->assertEqual($tmp['failed'], '0'); sleep(2); $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp['jobtype'], 'task1'); $this->assertEqual(unserialize($tmp['data']), '1'); $this->assertEqual($tmp['failed'], '1'); }
/** * Job Rate limiting. * Do not execute jobs of a certain type more often than once every X seconds. */ public function testRateLimit() { $capabilities = array('task1' => array('name' => 'task1', 'timeout' => 100, 'retries' => 2, 'rate' => 1), 'dummytask' => array('name' => 'dummytask', 'timeout' => 100, 'retries' => 2)); // clear out the rate history $this->QueuedTask->rateHistory = array(); $this->assertTrue($this->QueuedTask->createJob('task1', '1')); $this->assertTrue($this->QueuedTask->createJob('task1', '2')); $this->assertTrue($this->QueuedTask->createJob('task1', '3')); $this->assertTrue($this->QueuedTask->createJob('dummytask', null)); $this->assertTrue($this->QueuedTask->createJob('dummytask', null)); $this->assertTrue($this->QueuedTask->createJob('dummytask', null)); $this->assertTrue($this->QueuedTask->createJob('dummytask', null)); //At first we get task1-1. $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp['jobtype'], 'task1'); $this->assertEqual(unserialize($tmp['data']), '1'); //The rate limit should now skip over task1-2 and fetch a dummytask. $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp['jobtype'], 'dummytask'); $this->assertEqual(unserialize($tmp['data']), null); //and again. $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp['jobtype'], 'dummytask'); $this->assertEqual(unserialize($tmp['data']), null); //Then some time passes sleep(1); //Now we should get task1-2 $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp['jobtype'], 'task1'); $this->assertEqual(unserialize($tmp['data']), '2'); //and again rate limit to dummytask. $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp['jobtype'], 'dummytask'); $this->assertEqual(unserialize($tmp['data']), null); //Then some more time passes sleep(1); //Now we should get task1-3 $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp['jobtype'], 'task1'); $this->assertEqual(unserialize($tmp['data']), '3'); //and again rate limit to dummytask. $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp['jobtype'], 'dummytask'); $this->assertEqual(unserialize($tmp['data']), null); //and now the queue is empty $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEqual($tmp, null); }
public function testRequestGroup() { $capabilities = ['task1' => ['name' => 'task1', 'timeout' => 1, 'retries' => 2, 'rate' => 0]]; // create an ungrouped task $this->assertTrue((bool) $this->QueuedTask->createJob('task1', 1)); //create a Grouped Task $this->assertTrue((bool) $this->QueuedTask->createJob('task1', 2, null, 'testgroup')); // Fetching without group should completely ignore the Group field. $this->QueuedTask->clearKey(); $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEquals($tmp['jobtype'], 'task1'); $this->assertEquals(1, unserialize($tmp['data'])); $this->QueuedTask->clearKey(); $tmp = $this->QueuedTask->requestJob($capabilities); $this->assertEquals($tmp['jobtype'], 'task1'); $this->assertEquals(2, unserialize($tmp['data'])); // well, lets tra that Again, while limiting by Group // create an ungrouped task $this->assertTrue((bool) $this->QueuedTask->createJob('task1', 3)); //create a Grouped Task $this->assertTrue((bool) $this->QueuedTask->createJob('task1', 4, null, 'testgroup', 'Job number 4')); $this->assertTrue((bool) $this->QueuedTask->createJob('task1', 5, null, null, 'Job number 5')); $this->assertTrue((bool) $this->QueuedTask->createJob('task1', 6, null, 'testgroup', 'Job number 6')); // we should only get tasks 4 and 6, in that order, when requesting inside the group $this->QueuedTask->clearKey(); $tmp = $this->QueuedTask->requestJob($capabilities, 'testgroup'); $this->assertEquals($tmp['jobtype'], 'task1'); $this->assertEquals(unserialize($tmp['data']), 4); $this->QueuedTask->clearKey(); $tmp = $this->QueuedTask->requestJob($capabilities, 'testgroup'); $this->assertEquals($tmp['jobtype'], 'task1'); $this->assertEquals(6, unserialize($tmp['data'])); // use FindProgress on the testgroup: $progress = $this->QueuedTask->find('progress', ['conditions' => ['group' => 'testgroup']]); $this->assertEquals(3, count($progress)); $this->assertNull($progress[0]['reference']); $this->assertEquals($progress[0]['status'], 'IN_PROGRESS'); $this->assertEquals($progress[1]['reference'], 'Job number 4'); $this->assertEquals($progress[1]['status'], 'IN_PROGRESS'); $this->assertEquals($progress[2]['reference'], 'Job number 6'); $this->assertEquals($progress[2]['status'], 'IN_PROGRESS'); }