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 83a520d..08d7061 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ -(c) 2014 Wedy Chainy +Copyright (C) Bigcommerce, 2014 +All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -17,4 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index a42864d..358cb3a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -php-resque-pause: PHP Resque Pause +php-resque-pause: PHP Resque Pause [![Build Status](https://secure.travis-ci.org/bigcommerce/php-resque-pause.png?branch=master)](https://travis-ci.org/bigcommerce/php-resque-pause) ================================== A [PHP-Resque](http://github.com/chrisboulton/php-resque) plugin. @@ -7,8 +7,51 @@ resque-pause adds functionality to pause resque jobs Using a pause allows you to stop the worker without stop the enqueue -TBA -TBA -TBA +For further information re: php-resque, visit this official repo: -WIP WIP WIP +## Requirements ## +* PHP 5.3+ +* Redis 2.2+ +* Composer + +## Getting Started ## +resque-pause is installed via composer. To install: + +```bash +$ # Add php-resque-pause to your project's composer.json +$ composer require "bigcommerce/php-resque-pause" +$ # Install composer dependencies +$ composer install +``` + +## Usage ## + +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 +// 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 +$GLOBALS['ResquePause']->pause('My_Queue'); +``` + +### Resume it! ### +```php +$GLOBALS['ResquePause']->resume('My_Queue'); +``` + +### Is it Paused? ### +```php +$GLOBALS['ResquePause']->isPaused('My_Queue'); +``` + +## Contributing ## + +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 15fdbf7..0000000 --- a/lib/ResquePause.php +++ /dev/null @@ -1,95 +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($hookParams) - { - $class = $hookParams['class']; - $args = $hookParams['args']; - $queue = $hookParams['queue']; - $id = $hookParams['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)); - #TODO awaiting for chris-boulton https://github.com/chrisboulton/php-resque/pull/212 - #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 5cfea94..0000000 --- a/test/ResquePause/Tests/ResquePauseTest.php +++ /dev/null @@ -1,97 +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'); - - # new enqueue - $hookParams = array( - 'class' => 'test', - 'args' => array(), - 'id' => 'dummyid', - 'queue' => 'upgrade:test8'); - - # thie before enqueue pauseCallback - ResquePause::pauseCallback($hookParams); - - $this->assertEquals(Resque::redis()->llen('queue:upgrade:test8'), 0); - $this->assertEquals(Resque::redis()->llen('temp:upgrade:test8'), 3); - } - -} 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