Skip to content

Commit c095853

Browse files
committed
Add ReserverFactory.
This creates the various reserver implementations.
1 parent 7807f9e commit c095853

File tree

3 files changed

+166
-0
lines changed

3 files changed

+166
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?php
2+
3+
namespace Resque\Reserver;
4+
5+
use Psr\Log\LoggerInterface;
6+
7+
class ReserverFactory
8+
{
9+
/** @var string */
10+
const DEFAULT_RESERVER = 'queue_order';
11+
12+
/** @var LoggerInterface */
13+
private $logger;
14+
15+
/**
16+
* @param LoggerInterface $logger
17+
*/
18+
public function __construct(LoggerInterface $logger)
19+
{
20+
$this->logger = $logger;
21+
}
22+
23+
/**
24+
* Creates a reserver given its name in snake case format.
25+
*
26+
* @param string $name
27+
* @return ReserverInterface
28+
* @throws UnknownReserverException
29+
*/
30+
public function createReserverFromName($name, array $queues)
31+
{
32+
$parts = explode('_', $name);
33+
$parts = array_map(function ($word) {
34+
return ucfirst(strtolower($word));
35+
}, $parts);
36+
37+
$methodName = 'create' . implode('', $parts) . 'Reserver';
38+
39+
if (!method_exists($this, $methodName)) {
40+
throw new UnknownReserverException("Unknown reserver '$name' - could not find factory method $methodName");
41+
}
42+
43+
return $this->$methodName($queues);
44+
}
45+
46+
/**
47+
* Creates the default reserver.
48+
*
49+
* @param array $queues
50+
* @return ReserverInterface
51+
*/
52+
public function createDefaultReserver(array $queues)
53+
{
54+
return $this->createReserverFromName(self::DEFAULT_RESERVER, $queues);
55+
}
56+
57+
/**
58+
* @param array $queues
59+
* @return QueueOrderReserver
60+
*/
61+
public function createQueueOrderReserver(array $queues)
62+
{
63+
return new QueueOrderReserver($this->logger, $queues);
64+
}
65+
66+
/**
67+
* @param array $queues
68+
* @return RandomQueueOrderReserver
69+
*/
70+
public function createRandomQueueOrderReserver(array $queues)
71+
{
72+
return new RandomQueueOrderReserver($this->logger, $queues);
73+
}
74+
75+
/**
76+
* @param array $queues
77+
* @return BlockingListPopReserver
78+
*/
79+
public function createBlockingListPopReserver(array $queues)
80+
{
81+
$timeout = getenv('BPLOP_TIMEOUT');
82+
if ($timeout === false) {
83+
$timeout = getenv('INTERVAL');
84+
}
85+
86+
if ($timeout === false || $timeout < 0) {
87+
$timeout = BlockingListPopReserver::DEFAULT_TIMEOUT;
88+
}
89+
90+
return new BlockingListPopReserver($this->logger, $queues, (int)$timeout);
91+
}
92+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Resque\Reserver;
4+
5+
class UnknownReserverException extends \UnexpectedValueException
6+
{
7+
/**
8+
* @param string $reserver The name of the reserver.
9+
*/
10+
public function __construct($reserver)
11+
{
12+
parent::__construct("Unknown reserver '$reserver'");
13+
}
14+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace Resque\Tests\Reserver;
4+
5+
use Resque\Reserver\ReserverFactory;
6+
use Resque;
7+
8+
class ReserverFactoryTest extends \PHPUnit_Framework_TestCase
9+
{
10+
private function getFactory()
11+
{
12+
return new ReserverFactory(new \Resque_Log());
13+
}
14+
15+
/**
16+
* @expectedException Resque\Reserver\UnknownReserverException
17+
* @expectedExceptionMessage Unknown reserver 'foo'
18+
*/
19+
public function testCreateReserverFromNameThrowsExceptionForUnknownReserver()
20+
{
21+
$this->getFactory()->createReserverFromName('foo', array());
22+
}
23+
24+
public function createReserverFromNameDataProvider()
25+
{
26+
return array(
27+
array('queue_order', '\Resque\Reserver\QueueOrderReserver'),
28+
array('RANDOM_QUEUE_ORDER', '\Resque\Reserver\RandomQueueOrderReserver'),
29+
array('Blocking_List_Pop', '\Resque\Reserver\BlockingListPopReserver'),
30+
);
31+
}
32+
33+
/**
34+
* @dataProvider createReserverFromNameDataProvider
35+
*/
36+
public function testCreateReserverFromNameCreatesExpectedReserver($name, $expectedReserver)
37+
{
38+
$queues = array(
39+
'queue_a',
40+
'queue_b',
41+
'queue_c',
42+
'queue_d',
43+
);
44+
45+
$reserver = $this->getFactory()->createReserverFromName($name, $queues);
46+
$this->assertInstanceOf($expectedReserver, $reserver);
47+
48+
// account for shuffling by RandomQueueOrderReserver
49+
$actualQueues = $reserver->getQueues();
50+
sort($actualQueues);
51+
52+
$this->assertEquals($queues, $actualQueues);
53+
}
54+
55+
public function testCreateDefaultReserverCreatesExpectedReserver()
56+
{
57+
$reserver = $this->getFactory()->createDefaultReserver(array());
58+
$this->assertInstanceOf('\Resque\Reserver\QueueOrderReserver', $reserver);
59+
}
60+
}

0 commit comments

Comments
 (0)