diff --git a/.travis.yml b/.travis.yml index cf09978..a1f7a73 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,9 +6,11 @@ php: - 5.6 env: - REDIS_STANDALONE=0 - - REDIS_STANDALONE=1 before_script: - sh -c "if [ $REDIS_STANDALONE -eq 0 ]; then wget https://github.com/nicolasff/phpredis/archive/2.2.3.zip -O php-redis.zip && unzip php-redis.zip; fi" - sh -c "if [ $REDIS_STANDALONE -eq 0 ]; then cd phpredis-2.2.3/ && phpize && ./configure && make && make install; fi" - sh -c "if [ $REDIS_STANDALONE -eq 0 ]; then echo \"extension=redis.so\" >> `php --ini | grep \"Loaded Configuration\" | sed -e \"s|.*:\s*||\"`; fi" - composer install +script: + - composer lint + - composer test diff --git a/LICENSE b/LICENSE index 924f438..08d7061 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) BigCommerce, 2014 +Copyright (C) Bigcommerce, 2014 All rights reserved. Permission is hereby granted, free of charge, to any person obtaining diff --git a/README.md b/README.md index ae8a416..358cb3a 100644 --- a/README.md +++ b/README.md @@ -26,49 +26,32 @@ $ composer install ## Usage ## -php-resque has a basic event system that can be used by your application -to customize how some of the php-resque internals behave. +To use Resque Pause in your application you'll need to create a globally used instance, we use Pimple but you can use +globals, a static variable, or whatever else you like. Upon instantiation `Pause` will add a Resque listener to make +sure that any jobs pushed to a paused queue will be paused as well. On destruction `Pause` will remove said listener. -php-resque-pause uses beforeEnqueue hook, which called before a job is placed on queue. - -### before Enqueue - Pause Callback ### - -add below before `Resque::enqueue` method. ```php -//add this on top of your resque:enqueue -ResquePause::beforeEnqueuePauseCallback(); - -Resque::enqueue('My_Queue', 'My_Job'); +// Let's put it in a global since that's easy/familiar +$GLOBALS['ResquePause'] = new \Resque\Plugins\Pause(); // Your enqueues are now being listened to ``` + ### Pause it! ### ```php -ResquePause::pause('My_Queue'); +$GLOBALS['ResquePause']->pause('My_Queue'); ``` -### Unpause it! ### +### Resume it! ### ```php -ResquePause::unpause('My_Queue'); +$GLOBALS['ResquePause']->resume('My_Queue'); ``` ### Is it Paused? ### ```php -ResquePause::isPaused('My_Queue'); +$GLOBALS['ResquePause']->isPaused('My_Queue'); ``` -## Tests ## -we use phpunit for testing. you'll find a bunch of test in ```test```. - -Again if you are using composer, you can simply run ```vendor/bin/phpunit```. -Please make sure they pass when you submit a pull request. - -Please include tests with your Pull Request. - ## Contributing ## -1. Fork this repo -2. Create a branch ```git checkout -b my_branch``` -3. Push to your branch ```git push origin my_branch``` -4. Create a Pull Request from your branch -5. That's it! - -This project will be PSR-4 compliant. So please verify that all pull-requests are such. +This repo is fairly thoroughly tested so please add tests for any feature you add. We use PSR-4 conventions and have a +linter in place. To run the linter simply run `composer lint` and to run the tests locally run `composer test`. To have +your code reviewed please tag @gabelimon and @wedy. diff --git a/Tests/Integration/PauseTest.php b/Tests/Integration/PauseTest.php new file mode 100644 index 0000000..57da51d --- /dev/null +++ b/Tests/Integration/PauseTest.php @@ -0,0 +1,118 @@ + + * @license http://www.opensource.org/licenses/mit-license.php + */ +class PauseTest extends PHPUnit_Framework_TestCase +{ + /** @var Pause */ + protected $pauser = null; + + public static function setUpBeforeClass() + { + $testMisc = realpath(__DIR__ . '/misc/'); + $redisConf = "$testMisc/redis.conf"; + + // Attempt to start our own redis instance for tesitng. + exec('which redis-server', $output, $returnVar); + if ($returnVar != 0) { + echo "Cannot find redis-server in path. Please make sure redis is installed.\n"; + exit(1); + } + + exec("cd $testMisc; redis-server $redisConf", $output, $returnVar); + usleep(500000); + if ($returnVar != 0) { + echo "Cannot start redis-server.\n"; + exit(1); + } + + // Get redis port from conf + $config = file_get_contents($redisConf); + if (!preg_match('#^\s*port\s+([0-9]+)#m', $config, $matches)) { + echo "Could not determine redis port from redis.conf"; + exit(1); + } + + Resque::setBackend('localhost:' . $matches[1]); + } + + public function setUp() + { + Resque::redis()->flushAll(); + $this->pauser = new Pause(); + } + + public function testPause() + { + // Pause non-paused queue + Resque::enqueue('upgrade:test', 'test'); + Resque::enqueue('upgrade:test', 'test'); + $this->assertEquals(2, Resque::size('upgrade:test')); + $this->assertTrue($this->pauser->pause('upgrade:test')); + $this->assertEquals(0, Resque::size('upgrade:test')); + + // Pause paused queue + $this->assertFalse($this->pauser->pause('upgrade:test')); + + // Pause non-existent queue + $this->assertFalse($this->pauser->pause('upgrade:test2')); + } + + public function testResume() + { + // Resume paused queue + Resque::enqueue('upgrade:test3', 'test'); + Resque::enqueue('upgrade:test3', 'test'); + $this->pauser->pause('upgrade:test3'); + $this->assertTrue($this->pauser->resume('upgrade:test3')); + $this->assertEquals(2, Resque::size('upgrade:test3')); + + // Resume non-paused queue + Resque::enqueue('upgrade:test4', 'test'); + $this->assertFalse($this->pauser->resume('upgrade:test4')); + + // Resume non-existent queue + $this->assertFalse($this->pauser->resume('upgrade:idontexist')); + } + + public function testIsPaused() + { + // Paused queue + Resque::enqueue('upgrade:test5', 'test'); + $this->pauser->pause('upgrade:test5'); + $this->assertTrue($this->pauser->isPaused('upgrade:test5')); + + // Non-paused queue + Resque::enqueue('upgrade:test6', 'test'); + $this->assertFalse($this->pauser->isPaused('upgrade:test6')); + + // Paused and resumed queue + Resque::enqueue('upgrade:test7', 'test'); + $this->pauser->pause('upgrade:test7'); + $this->assertTrue($this->pauser->isPaused('upgrade:test7')); + $this->pauser->resume('upgrade:test7'); + $this->assertFalse($this->pauser->isPaused('upgrade:test7')); + + // Non-existent queue + $this->assertFalse($this->pauser->isPaused('upgrade:istilldontexist')); + } + + public function testPauseCallback() + { + $this->pauser->pause('upgrade:test8'); + Resque::enqueue('upgrade:test8', 'test'); + + $this->assertEquals(0, Resque::redis()->llen('queue:upgrade:test8')); + $this->assertEquals(1, Resque::redis()->llen('temp:upgrade:test8')); + } +} diff --git a/test/misc/redis.conf b/Tests/Integration/misc/redis.conf similarity index 100% rename from test/misc/redis.conf rename to Tests/Integration/misc/redis.conf diff --git a/Tests/Unit/JobPauserTest.php b/Tests/Unit/JobPauserTest.php new file mode 100644 index 0000000..0959f23 --- /dev/null +++ b/Tests/Unit/JobPauserTest.php @@ -0,0 +1,147 @@ + + * @license http://www.opensource.org/licenses/mit-license.php + */ +class JobPauserTest extends PHPUnit_Framework_TestCase +{ + /** @var \PHPUnit_Framework_MockObject_MockObject */ + protected $redisMock = null; + + public function setUp() + { + $this->redisMock = $this->getMockBuilder('Resque_Redis') + ->disableOriginalConstructor() + ->setMethods(array( + 'sadd', + 'srem', + 'getPrefix', + 'rename', + 'sismember', + )) + ->getMock(); + } + + public function createDataProvider() + { + return array( + array(true, true), + array(false, false), + ); + } + + /** + * @dataProvider createDataProvider + * @param bool $saddSuccess + */ + public function testCreate($saddSuccess, $returnSuccess) + { + $this->redisMock + ->expects($this->once()) + ->method('sadd') + ->with($this->equalTo('pauses'), $this->equalTo('upgrade:test')) + ->willReturn($saddSuccess); + + $pauser = new JobPauser($this->redisMock, 'resqueFaker:'); + $this->assertEquals($returnSuccess, $pauser->pause('upgrade:test')); + } + + public function removeDataProvider() + { + return array( + array(true, true), + array(false, false), + ); + } + + /** + * @dataProvider removeDataProvider + * @param bool $sremSuccess + */ + public function testRemove($sremSuccess, $returnSuccess) + { + $this->redisMock + ->expects($this->once()) + ->method('srem') + ->with($this->equalTo('pauses'), $this->equalTo('upgrade:test2')) + ->willReturn($sremSuccess); + + $pauser = new JobPauser($this->redisMock, 'resqueFaker:'); + $this->assertEquals($returnSuccess, $pauser->resume('upgrade:test2')); + } + + public function renameDataprovider() + { + return array( + array(true, true), + array(false, false), + ); + } + + /** + * @dataProvider renameDataProvider + * @param bool $renameSuccess + * @param bool $expectedResult + */ + public function testRenameToTemp($renameSuccess, $expectedResult) + { + $this->redisMock + ->expects($this->once()) + ->method('rename') + ->with($this->equalTo('queue:upgrade:test3'), $this->equalTo('resqueFaker:temp:upgrade:test3')) + ->willReturn($renameSuccess); + + $pauser = new JobPauser($this->redisMock, 'resqueFaker:'); + $this->assertEquals($expectedResult, $pauser->renameToTemp('upgrade:test3')); + } + + /** + * @dataProvider renameDataProvider Reuses the renaming provider because the cases are the same + * @param bool $renameSuccess + * @param bool $expectedResult + */ + public function testRenameBackFromTemp($renameSuccess, $expectedResult) + { + $this->redisMock + ->expects($this->once()) + ->method('rename') + ->with($this->equalTo('temp:upgrade:test3'), $this->equalTo('resqueFaker:queue:upgrade:test3')) + ->willReturn($renameSuccess); + + $pauser = new JobPauser($this->redisMock, 'resqueFaker:'); + $this->assertEquals($expectedResult, $pauser->renameBackFromTemp('upgrade:test3')); + } + + public function existsDataProvider() + { + return array( + array(true, true), + array(false, false), + ); + } + + /** + * @dataProvider existsDataProvider + * @param bool $existsSuccess + * @param bool $expectedResult + */ + public function testExists($existsSuccess, $expectedResult) + { + $this->redisMock + ->expects($this->once()) + ->method('sismember') + ->with($this->equalTo('pauses'), $this->equalTo('upgrade:test8')) + ->willReturn($existsSuccess); + + $pauser = new JobPauser($this->redisMock, 'resqueFaker:'); + $this->assertEquals($expectedResult, $pauser->isPaused('upgrade:test8')); + } +} diff --git a/composer.json b/composer.json index f9cfd49..462ae33 100644 --- a/composer.json +++ b/composer.json @@ -1,25 +1,26 @@ { - "name": "wedy/php-resque-pause", - "type": "library", - "description": "php-resque-pause is a PHP port of resque-pause, which adds support for pausing / unpausing jobs to Resque.", - "authors": [ - { - "name": "Wedy Chainy", - "email": "askwedi@wedipedia.org" - } - ], - "repositories": [ - { "type": "git", "url": "https://github.com/chrisboulton/php-resque" } - ], - "require": { - "chrisboulton/php-resque": "dev-master" - }, + "name": "wedy/php-resque-pause", + "type": "library", + "description": "php-resque-pause is a PHP port of resque-pause, which adds support for pausing / unpausing Resque jobs.", + "authors": [{ + "name": "Wedy Chainy", + "email": "wedy.chainy@bigcommerce.com" + }], + "require": { + "chrisboulton/php-resque": "dev-master" + }, "require-dev": { - "phpunit/phpunit": "3.7.*" + "phpunit/phpunit": "4.5.*", + "squizlabs/php_codesniffer": "2.3.0" }, "autoload": { - "psr-0": { - "ResquePause": "lib" - } + "psr-4": { + "Resque\\Plugins\\": "src", + "Resque\\Plugins\\Tests\\": "Tests" + } + }, + "scripts": { + "test": "./vendor/bin/phpunit", + "lint": "./vendor/bin/phpcs --standard=PSR2 src/ Tests/" } } diff --git a/lib/ResquePause.php b/lib/ResquePause.php deleted file mode 100644 index 58a8b64..0000000 --- a/lib/ResquePause.php +++ /dev/null @@ -1,89 +0,0 @@ - - * @licence http://www.opensource.org/licenses/mit-license.php - */ - -class ResquePause -{ - const VERSION = '0.1'; - - /** - * Pause the job - * - * create a flag, and rename the original queue to temporary queue - * - * @param string $queue The name of the queue to fetch an item from. - * - * @return boolean - */ - public static function pause($queue) - { - $result = ResquePause_Job::create($queue); - if($result) { - return ResquePause_Job::renameToTemp($queue); - } - return false; - } - - /** - * Unpause the job - * - * remove flag, and rename the temporary queue back to the original one - * - * @param string $queue The name of the queue to fetch an item from. - * - * @return boolean - */ - public static function unpause($queue) - { - $result = ResquePause_Job::remove($queue); - if($result) { - return ResquePause_Job::renameBackFromTemp($queue); - } - return false; - } - - /** - * is paused? - * - * @param string $queue The name of the queue to fetch an item from. - * - * @return boolean - */ - public static function isPaused($queue) - { - return ResquePause_Job::exists($queue); - } - - /** - * beforeEnqueue Callback - */ - public static function beforeEnqueuePauseCallback() - { - Resque_Event::Listen('beforeEnqueue', "ResquePause::pauseCallback"); - } - - /** - * pause callback - */ - public static function pauseCallback($class, $args, $queue, $id) - { - if(self::isPaused($queue)) - { - if($args !== null && !is_array($args)) { - throw new InvalidArgumentException('Supplied $args must be an array.'); - } - - $item = array('class' => $class, - 'args' => array($args), - 'id' => $id, - 'queue_time' => microtime(true)); - Resque::redis()->rpush('temp:' . $queue, json_encode($item)); - throw new Resque_Job_DontCreate; - } - } -} diff --git a/lib/ResquePause/Job.php b/lib/ResquePause/Job.php deleted file mode 100755 index 35082b8..0000000 --- a/lib/ResquePause/Job.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @license http://www.opensource.org/licenses/mit-license.php - */ -class ResquePause_Job -{ - /** - * @var string default namespace for pause - */ - private static $defaultNamespace = 'pause:'; - - /* - * @var string default namespace for temporary pause - */ - private static $defaultTempNamespace = 'temp:'; - - - /* - * @var string default original queue prefix - */ - private static $defaultOriginalQueueNamespace = 'queue:'; - - /** - * @var string default set for pause - */ - private static $defaultSet = 'pauses'; - - /** - * Create a new pause job - * - * @param string $queue The name of the queue to place the job in. - */ - public static function create($queue) - { - Resque::redis()->sadd(self::$defaultSet, $queue); - return Resque::redis()->set(self::$defaultNamespace . $queue, true); - } - - /** - * Delete a pause job - * - * @param string $queue The name of the queue to place the job in. - */ - public static function remove($queue) - { - Resque::redis()->del(self::$defaultNamespace . $queue); - return Resque::redis()->srem(self::$defaultSet, $queue); - } - - /** - * Rename original queue to temp queue - * - * @param string $queue - * @param string original queue's prefix , by default if you use PHP-resque it's 'queue' - * - * @return boolean - */ - public static function renameToTemp($queue, $queuePrefix = "") - { - if($queuePrefix == "") { - $queuePrefix = self::$defaultOriginalQueueNamespace; - } - return Resque::redis()->rename($queuePrefix . $queue, - Resque::redis()->getPrefix() . self::$defaultTempNamespace . $queue); - } - - /** - * Rename back from temp to original - * - * @param string $queue - * @param string original queue's prefix , by default if you use PHP-resque it's 'queue' - * - * @return boolean - */ - public static function renameBackFromTemp($queue, $queuePrefix = "") - { - if($queuePrefix == "") { - $queuePrefix = self::$defaultOriginalQueueNamespace; - } - return Resque::redis()->rename(self::$defaultTempNamespace . $queue, - Resque::redis()->getPrefix(). $queuePrefix . $queue); - } - - /** - * Return all pause jobs known to Resque as instantiated instances. - * @return array - */ - public static function all() - { - return Resque::redis()->smembers(self::$defaultSet); - } - - /** - * Simply Is this Job paused? - * - * @param string $queue The name of the queue to place the job in. - * - * @return bool/integer - */ - public static function exists($queue) - { - return (bool)Resque::redis()->sismember(self::$defaultSet, $queue); - } - -} -?> diff --git a/phpunit.xml b/phpunit.xml index e7101a4..64cf626 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,25 +1,25 @@ - - - ./test/ResquePause/ - - + + + ./Tests/ + + - - - ./lib/ResquePause/ - ./lib/ - - + + + ./src/ + ./src/Jobs/ + + diff --git a/src/JobPauser.php b/src/JobPauser.php new file mode 100755 index 0000000..103aa97 --- /dev/null +++ b/src/JobPauser.php @@ -0,0 +1,110 @@ + + * @license http://www.opensource.org/licenses/mit-license.php + */ +class JobPauser +{ + /** @var string default namespace for temporary pause */ + private static $tempQueuePrefix = 'temp:'; + + /** @var string default set for pause */ + private static $pausedSetName = 'pauses'; + + /** @var \Resque_Redis */ + private $redis = null; + + /** @var string */ + private $resqueRedisPrefix = null; + + public function __construct($redis, $resqueRedisPrefix) + { + $this->redis = $redis; + $this->resqueRedisPrefix = $resqueRedisPrefix; + } + + /** + * Create a new pause job + * + * @param string $queue The name of the queue to place the job in. + * @return bool + */ + public function pause($queue) + { + return $this->redis->sadd(self::$pausedSetName, $queue); + } + + /** + * Delete a pause job + * + * @param string $queue The name of the queue to place the job in. + * @return bool + */ + public function resume($queue) + { + return $this->redis->srem(self::$pausedSetName, $queue); + } + + /** + * Rename original queue to temp queue + * + * @param string $queue + * @param string $queuePrefix original queue's prefix , by default if you use PHP-resque it's 'queue' + * @return bool + */ + public function renameToTemp($queue, $queuePrefix = 'queue:') + { + return $this->redis->rename( + $queuePrefix . $queue, + $this->resqueRedisPrefix . self::$tempQueuePrefix . $queue + ); + } + + /** + * Rename back from temp to original + * + * @param string $queue + * @param string $queuePrefix original queue's prefix , by default if you use PHP-resque it's 'queue' + * @return bool + */ + public function renameBackFromTemp($queue, $queuePrefix = 'queue:') + { + return $this->redis->rename( + self::$tempQueuePrefix . $queue, + $this->resqueRedisPrefix . $queuePrefix . $queue + ); + } + + /** + * Push a job to the paused queue + * + * @param string $queue + * @param string $class + * @param array $args + * @param string $id + */ + public function pushPausedJob($queue, $class, array $args, $id) + { + $this->redis->rpush("temp:$queue", json_encode(array( + 'class' => $class, + 'args' => $args, + 'id' => $id, + 'queue_time' => microtime(true) + ))); + } + + /** + * + * + * @param string $queue The name of the queue to place the job in. + * @return bool + */ + public function isPaused($queue) + { + return (bool)$this->redis->sismember(self::$pausedSetName, $queue); + } +} diff --git a/src/Pause.php b/src/Pause.php new file mode 100644 index 0000000..7a9409e --- /dev/null +++ b/src/Pause.php @@ -0,0 +1,83 @@ + + * @licence http://www.opensource.org/licenses/mit-license.php + */ +class Pause +{ + /** @var JobPauser */ + private $pauser = null; + + /** @var JobPauser */ + private $listener = null; + + public function __construct() + { + // Create object for pausing jobs + $this->pauser = new JobPauser(Resque::redis(), \Resque_Redis::getPrefix()); + $pauser = $this->pauser; + + // Listen for enqueue and move any new jobs to temp queue + $this->listener = function ($class, $args, $queue, $id) use ($pauser) { + if ($pauser->isPaused($queue)) { + $args = !is_null($args) ? $args : array(); + if (!is_array($args)) { + throw new \InvalidArgumentException('Supplied $args must be an array.'); + } + + $pauser->pushPausedJob($queue, $class, $args, $id); + // Stop the original job from being created + throw new Resque_Job_DontCreate; + } + }; + Resque_Event::listen('beforeEnqueue', $this->listener); + } + + public function __destruct() + { + Resque_Event::stopListening('beforeEnqueue', $this->listener); + + } + + /** + * Pause the job — create a flag and rename the original queue to temporary queue + * + * @param string $queue The name of the queue to fetch an item from. + * @return boolean + */ + public function pause($queue) + { + return $this->pauser->pause($queue) && $this->pauser->renameToTemp($queue); + } + + /** + * Resume the job — remove flag and rename the temporary queue back to the original one + * + * @param string $queue The name of the queue to fetch an item from. + * @return boolean + */ + public function resume($queue) + { + return $this->pauser->resume($queue) && $this->pauser->renameBackFromTemp($queue); + } + + /** + * Check if the queue is paused + * + * @param string $queue The name of the queue to be used + * @return bool + */ + public function isPaused($queue) + { + return $this->pauser->isPaused($queue); + } +} diff --git a/test/ResquePause/Tests/JobTest.php b/test/ResquePause/Tests/JobTest.php deleted file mode 100644 index 28e5c71..0000000 --- a/test/ResquePause/Tests/JobTest.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @license http://www.opensource.org/licenses/mit-license.php - */ -class ResquePause_Tests_JobTest extends PHPUnit_Framework_TestCase -{ - protected $resque; - protected $redis; - - public function setUp() - { - $config = file_get_contents(REDIS_CONF); - preg_match('#^\s*port\s+([0-9]+)#m', $config, $matches); - $this->redis = new Credis_Client('localhost', $matches[1]); - $this->redis->flushAll(); - - } - - public function testCreate() - { - $this->assertTrue((bool)ResquePause_Job::create('upgrade:test')); - $this->assertTrue((bool)ResquePause_Job::exists('upgrade:test')); - } - - public function testRemove() - { - $this->assertFalse((bool)ResquePause_Job::remove('upgrade:test2')); - $this->assertFalse((bool)ResquePause_Job::exists('upgrade:test2')); - } - - public function testRenameToTemp() - { - $this->assertFalse((bool)ResquePause_Job::renameToTemp('upgrade:test3')); - } - - public function testRenameToTempAfterCreated() - { - Resque::enqueue('upgrade:test4', 'test'); - $this->assertTrue((bool)ResquePause_Job::renameToTemp('upgrade:test4')); - } - - public function testRenameBackFromTempAfterCreatedAndSwapped() - { - Resque::enqueue('upgrade:test5', 'test'); - ResquePause_Job::renameToTemp('upgrade:test5'); - $this->assertTrue((bool)ResquePause_Job::renameBackFromTemp('upgrade:test5')); - } - - public function testAll() - { - $this->assertTrue((bool)ResquePause_Job::create('upgrade:test6')); - $this->assertTrue((bool)ResquePause_Job::create('upgrade:test7')); - $this->assertContains('upgrade:test6',ResquePause_Job::all()); - $this->assertContains('upgrade:test7',ResquePause_Job::all()); - $this->assertEquals(count(ResquePause_Job::all()), 2); - } - - public function testExists() - { - $this->assertTrue((bool)ResquePause_Job::create('upgrade:test8')); - $this->assertTrue((bool)ResquePause_Job::exists('upgrade:test8')); - } -} diff --git a/test/ResquePause/Tests/ResquePauseTest.php b/test/ResquePause/Tests/ResquePauseTest.php deleted file mode 100644 index 33fa953..0000000 --- a/test/ResquePause/Tests/ResquePauseTest.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @license http://www.opensource.org/licenses/mit-license.php - */ -class ResquePause_Tests_ResquePauseTest extends PHPUnit_Framework_TestCase -{ - protected $resque; - protected $redis; - - public function setUp() - { - $config = file_get_contents(REDIS_CONF); - preg_match('#^\s*port\s+([0-9]+)#m', $config, $matches); - $this->redis = new Credis_Client('localhost', $matches[1]); - $this->redis->flushAll(); - - } - - public function testPause() - { - Resque::enqueue('upgrade:test', 'test'); - Resque::enqueue('upgrade:test', 'test'); - $this->assertEquals(Resque::size('upgrade:test'), 2); - $this->assertTrue((bool)ResquePause::pause('upgrade:test')); - $this->assertEquals(Resque::size('upgrade:test'), 0); - } - - public function testPauseNonExistQueue() - { - $this->assertFalse((bool)ResquePause::pause('upgrade:test2')); - } - - public function testUnpause() - { - Resque::enqueue('upgrade:test3', 'test'); - Resque::enqueue('upgrade:test3', 'test'); - ResquePause::pause('upgrade:test3'); - $this->assertTrue((bool)ResquePause::unpause('upgrade:test3')); - $this->assertEquals(Resque::size('upgrade:test3'), 2); - } - - public function testUnpauseButNeverBeenPausedBefore() - { - Resque::enqueue('upgrade:test4', 'test'); - Resque::enqueue('upgrade:test4', 'test'); - $this->assertFalse((bool)ResquePause::unpause('upgrade:test4')); - } - - public function testIsPaused() - { - Resque::enqueue('upgrade:test5', 'test'); - ResquePause::pause('upgrade:test5'); - $this->assertTrue((bool)ResquePause::isPaused('upgrade:test5')); - } - - public function testIsPaused2() - { - Resque::enqueue('upgrade:test6', 'test'); - $this->assertFalse((bool)ResquePause::isPaused('upgrade:test6')); - } - - public function testIsPaused3() - { - Resque::enqueue('upgrade:test7', 'test'); - ResquePause::pause('upgrade:test7'); - ResquePause::unpause('upgrade:test7'); - $this->assertFalse((bool)ResquePause::isPaused('upgrade:test7')); - } - - public function testPauseCallback() - { - # we have 2 in queue:upgrade:test8 - Resque::enqueue('upgrade:test8', 'test'); - Resque::enqueue('upgrade:test8', 'test'); - - # pause it! - ResquePause::pause('upgrade:test8'); - - try { - # before enqueue pauseCallback - ResquePause::pauseCallback('test', array(), 'upgrade:test8', 'dummyid'); - } - catch(Resque_Job_DontCreate $e) {} - $this->assertEquals(Resque::redis()->llen('queue:upgrade:test8'), 0); - $this->assertEquals(Resque::redis()->llen('temp:upgrade:test8'), 3); - } - public function testbeforeEnqueuePauseCallback() - { - ResquePause::beforeEnqueuePauseCallback(); - - #UNPAUSE - Resque::enqueue('upgrade:test3', 'test'); - Resque::enqueue('upgrade:test3', 'test'); - $this->assertEquals(Resque::redis()->llen('queue:upgrade:test3'), 2); - - #PAUSE IT - ResquePause::pause('upgrade:test3'); - $this->assertEquals(Resque::redis()->llen('queue:upgrade:test3'), 0); - $this->assertEquals(Resque::redis()->llen('temp:upgrade:test3'), 2); - - #QUEUE IT while PAUSED - Resque::enqueue('upgrade:test3', 'test'); - $this->assertEquals(Resque::redis()->llen('queue:upgrade:test3'), 0); - $this->assertEquals(Resque::redis()->llen('temp:upgrade:test3'), 3); - - #UNPAUSE - ResquePause::unpause('upgrade:test3'); - $this->assertEquals(Resque::redis()->llen('queue:upgrade:test3'), 3); - $this->assertEquals(Resque::redis()->llen('temp:upgrade:test3'), 0); - - #QUEUE it again - Resque::enqueue('upgrade:test3', 'test'); - $this->assertEquals(Resque::redis()->llen('queue:upgrade:test3'), 4); - $this->assertEquals(Resque::redis()->llen('temp:upgrade:test3'), 0); - - } -} diff --git a/test/bootstrap.php b/test/bootstrap.php deleted file mode 100644 index a4b6837..0000000 --- a/test/bootstrap.php +++ /dev/null @@ -1,148 +0,0 @@ - - * @license http://www.opensource.org/licenses/mit-license.php - */ - -$loader = require __DIR__ . '/../vendor/autoload.php'; -$loader->add('Resque_Tests', __DIR__); - -define('TEST_MISC', realpath(__DIR__ . '/misc/')); -define('REDIS_CONF', TEST_MISC . '/redis.conf'); - -// Attempt to start our own redis instance for tesitng. -exec('which redis-server', $output, $returnVar); -if($returnVar != 0) { - echo "Cannot find redis-server in path. Please make sure redis is installed.\n"; - exit(1); -} - -exec('cd ' . TEST_MISC . '; redis-server ' . REDIS_CONF, $output, $returnVar); -usleep(500000); -if($returnVar != 0) { - echo "Cannot start redis-server.\n"; - exit(1); - -} - -// Get redis port from conf -$config = file_get_contents(REDIS_CONF); -if(!preg_match('#^\s*port\s+([0-9]+)#m', $config, $matches)) { - echo "Could not determine redis port from redis.conf"; - exit(1); -} - -Resque::setBackend('localhost:' . $matches[1]); - -// Shutdown -function killRedis($pid) -{ - if (getmypid() !== $pid) { - return; // don't kill from a forked worker - } - $config = file_get_contents(REDIS_CONF); - if(!preg_match('#^\s*pidfile\s+([^\s]+)#m', $config, $matches)) { - return; - } - - $pidFile = TEST_MISC . '/' . $matches[1]; - if (file_exists($pidFile)) { - $pid = trim(file_get_contents($pidFile)); - posix_kill((int) $pid, 9); - - if(is_file($pidFile)) { - unlink($pidFile); - } - } - - // Remove the redis database - if(!preg_match('#^\s*dir\s+([^\s]+)#m', $config, $matches)) { - return; - } - $dir = $matches[1]; - - if(!preg_match('#^\s*dbfilename\s+([^\s]+)#m', $config, $matches)) { - return; - } - - $filename = TEST_MISC . '/' . $dir . '/' . $matches[1]; - if(is_file($filename)) { - unlink($filename); - } -} -register_shutdown_function('killRedis', getmypid()); - -if(function_exists('pcntl_signal')) { - // Override INT and TERM signals, so they do a clean shutdown and also - // clean up redis-server as well. - function sigint() - { - exit; - } - pcntl_signal(SIGINT, 'sigint'); - pcntl_signal(SIGTERM, 'sigint'); -} - -class Test_Job -{ - public static $called = false; - - public function perform() - { - self::$called = true; - } -} - -class Failing_Job_Exception extends Exception -{ - -} - -class Failing_Job -{ - public function perform() - { - throw new Failing_Job_Exception('Message!'); - } -} - -class Test_Job_Without_Perform_Method -{ - -} - -class Test_Job_With_SetUp -{ - public static $called = false; - public $args = false; - - public function setUp() - { - self::$called = true; - } - - public function perform() - { - - } -} - - -class Test_Job_With_TearDown -{ - public static $called = false; - public $args = false; - - public function perform() - { - - } - - public function tearDown() - { - self::$called = true; - } -} \ No newline at end of file