mirror of
https://github.com/predis/predis.git
synced 2026-08-21 13:21:48 +00:00
6ceebbfbec
The new name is more explicit as it makes obvious that the commands added with it will be executed upon connect().
337 lines
11 KiB
PHP
337 lines
11 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Predis package.
|
|
*
|
|
* (c) Daniele Alessandri <suppakilla@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Predis\Connection;
|
|
|
|
use PredisTestCase;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
class FactoryTest extends PredisTestCase
|
|
{
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testImplementsCorrectInterface()
|
|
{
|
|
$factory = new Factory();
|
|
|
|
$this->assertInstanceOf('Predis\Connection\FactoryInterface', $factory);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testCreateConnection()
|
|
{
|
|
$factory = new Factory();
|
|
|
|
$tcp = new Parameters(array(
|
|
'scheme' => 'tcp',
|
|
'host' => 'locahost',
|
|
));
|
|
|
|
$connection = $factory->create($tcp);
|
|
$parameters = $connection->getParameters();
|
|
$this->assertInstanceOf('Predis\Connection\StreamConnection', $connection);
|
|
$this->assertEquals($tcp->scheme, $parameters->scheme);
|
|
$this->assertEquals($tcp->host, $parameters->host);
|
|
$this->assertEquals($tcp->database, $parameters->database);
|
|
|
|
|
|
$unix = new Parameters(array(
|
|
'scheme' => 'unix',
|
|
'path' => '/tmp/redis.sock',
|
|
));
|
|
|
|
$connection = $factory->create($tcp);
|
|
$parameters = $connection->getParameters();
|
|
$this->assertInstanceOf('Predis\Connection\StreamConnection', $connection);
|
|
$this->assertEquals($tcp->scheme, $parameters->scheme);
|
|
$this->assertEquals($tcp->database, $parameters->database);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testCreateConnectionWithNullParameters()
|
|
{
|
|
$factory = new Factory();
|
|
$connection = $factory->create(null);
|
|
$parameters = $connection->getParameters();
|
|
|
|
$this->assertInstanceOf('Predis\Connection\SingleConnectionInterface', $connection);
|
|
$this->assertEquals('tcp', $parameters->scheme);
|
|
|
|
$this->assertFalse(isset($parameters->custom));
|
|
$this->assertNull($parameters->custom);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testCreateConnectionWithArrayParameters()
|
|
{
|
|
$factory = new Factory();
|
|
$connection = $factory->create(array('scheme' => 'tcp', 'custom' => 'foobar'));
|
|
$parameters = $connection->getParameters();
|
|
|
|
$this->assertInstanceOf('Predis\Connection\SingleConnectionInterface', $connection);
|
|
$this->assertEquals('tcp', $parameters->scheme);
|
|
|
|
$this->assertTrue(isset($parameters->custom));
|
|
$this->assertSame('foobar', $parameters->custom);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testCreateConnectionWithStringURI()
|
|
{
|
|
$factory = new Factory();
|
|
$connection = $factory->create('tcp://127.0.0.1?custom=foobar');
|
|
$parameters = $connection->getParameters();
|
|
|
|
$this->assertInstanceOf('Predis\Connection\SingleConnectionInterface', $connection);
|
|
$this->assertEquals('tcp', $parameters->scheme);
|
|
|
|
$this->assertTrue(isset($parameters->custom));
|
|
$this->assertSame('foobar', $parameters->custom);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testCreateConnectionWithoutInitializationCommands()
|
|
{
|
|
$profile = $this->getMock('Predis\Profile\ProfileInterface');
|
|
$profile->expects($this->never())->method('create');
|
|
|
|
$factory = new Factory($profile);
|
|
$parameters = new Parameters();
|
|
$connection = $factory->create($parameters);
|
|
|
|
$this->assertInstanceOf('Predis\Connection\SingleConnectionInterface', $connection);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
* @todo This test smells but there's no other way around it right now.
|
|
*/
|
|
public function testCreateConnectionWithInitializationCommands()
|
|
{
|
|
$parameters = new Parameters(array(
|
|
'database' => '0',
|
|
'password' => 'foobar'
|
|
));
|
|
|
|
$connection = $this->getMock('Predis\Connection\SingleConnectionInterface');
|
|
$connection->expects($this->once())
|
|
->method('getParameters')
|
|
->will($this->returnValue($parameters));
|
|
$connection->expects($this->at(1))
|
|
->method('addConnectCommand')
|
|
->with($this->isRedisCommand('AUTH', array('foobar')));
|
|
$connection->expects($this->at(2))
|
|
->method('addConnectCommand')
|
|
->with($this->isRedisCommand('SELECT', array(0)));
|
|
|
|
$factory = new Factory();
|
|
|
|
$reflection = new \ReflectionObject($factory);
|
|
$prepareConnection = $reflection->getMethod('prepareConnection');
|
|
$prepareConnection->setAccessible(true);
|
|
$prepareConnection->invoke($factory, $connection);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testCreateUndefinedConnection()
|
|
{
|
|
$scheme = 'unknown';
|
|
$this->setExpectedException('InvalidArgumentException', "Unknown connection scheme: $scheme");
|
|
|
|
$factory = new Factory();
|
|
$factory->create(new Parameters(array('scheme' => $scheme)));
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testDefineConnectionWithFQN()
|
|
{
|
|
list(, $connectionClass) = $this->getMockConnectionClass();
|
|
|
|
$parameters = new Parameters(array('scheme' => 'foobar'));
|
|
$factory = new Factory();
|
|
|
|
$factory->define($parameters->scheme, $connectionClass);
|
|
$connection = $factory->create($parameters);
|
|
|
|
$this->assertInstanceOf($connectionClass, $connection);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testDefineConnectionWithCallable()
|
|
{
|
|
list(, $connectionClass) = $this->getMockConnectionClass();
|
|
|
|
$parameters = new Parameters(array('scheme' => 'foobar'));
|
|
|
|
$initializer = function ($parameters) use ($connectionClass) {
|
|
return new $connectionClass($parameters);
|
|
};
|
|
|
|
$initializerMock = $this->getMock('stdClass', array('__invoke'));
|
|
$initializerMock->expects($this->exactly(2))
|
|
->method('__invoke')
|
|
->with($parameters)
|
|
->will($this->returnCallback($initializer));
|
|
|
|
$factory = new Factory();
|
|
$factory->define($parameters->scheme, $initializerMock);
|
|
$connection1 = $factory->create($parameters);
|
|
$connection2 = $factory->create($parameters);
|
|
|
|
$this->assertInstanceOf($connectionClass, $connection1);
|
|
$this->assertInstanceOf($connectionClass, $connection2);
|
|
$this->assertNotSame($connection1, $connection2);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testDefineConnectionWithInvalidArgument()
|
|
{
|
|
$this->setExpectedException('InvalidArgumentException');
|
|
|
|
$factory = new Factory();
|
|
$factory->define('foobar', new \stdClass());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testUndefineDefinedConnection()
|
|
{
|
|
$this->setExpectedException('InvalidArgumentException', 'Unknown connection scheme: tcp');
|
|
|
|
$factory = new Factory();
|
|
$factory->undefine('tcp');
|
|
$factory->create('tcp://127.0.0.1');
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testUndefineUndefinedConnection()
|
|
{
|
|
$factory = new Factory();
|
|
$factory->undefine('unknown');
|
|
$connection = $factory->create('tcp://127.0.0.1');
|
|
|
|
$this->assertInstanceOf('Predis\Connection\SingleConnectionInterface', $connection);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testDefineAndUndefineConnection()
|
|
{
|
|
list(, $connectionClass) = $this->getMockConnectionClass();
|
|
|
|
$factory = new Factory();
|
|
|
|
$factory->define('redis', $connectionClass);
|
|
$this->assertInstanceOf($connectionClass, $factory->create('redis://127.0.0.1'));
|
|
|
|
$factory->undefine('redis');
|
|
$this->setExpectedException('InvalidArgumentException', 'Unknown connection scheme: redis');
|
|
$factory->create('redis://127.0.0.1');
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testAggregatedConnectionSkipCreationOnConnectionInstance()
|
|
{
|
|
list(, $connectionClass) = $this->getMockConnectionClass();
|
|
|
|
$cluster = $this->getMock('Predis\Connection\ClusterConnectionInterface');
|
|
$cluster->expects($this->exactly(2))
|
|
->method('add')
|
|
->with($this->isInstanceOf('Predis\Connection\SingleConnectionInterface'));
|
|
|
|
$factory = $this->getMock('Predis\Connection\Factory', array('create'));
|
|
$factory->expects($this->never())
|
|
->method('create');
|
|
|
|
$factory->aggregate($cluster, array(new $connectionClass(), new $connectionClass()));
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testAggregatedConnectionWithMixedParameters()
|
|
{
|
|
list(, $connectionClass) = $this->getMockConnectionClass();
|
|
|
|
$cluster = $this->getMock('Predis\Connection\ClusterConnectionInterface');
|
|
$cluster->expects($this->exactly(4))
|
|
->method('add')
|
|
->with($this->isInstanceOf('Predis\Connection\SingleConnectionInterface'));
|
|
|
|
$factory = $this->getMock('Predis\Connection\Factory', array('create'));
|
|
$factory->expects($this->exactly(3))
|
|
->method('create')
|
|
->will($this->returnCallback(function ($_) use ($connectionClass) {
|
|
return new $connectionClass;
|
|
}));
|
|
|
|
$factory->aggregate($cluster, array(null, 'tcp://127.0.0.1', array('scheme' => 'tcp'), new $connectionClass()));
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testAggregatedConnectionWithEmptyListOfParameters()
|
|
{
|
|
$cluster = $this->getMock('Predis\Connection\ClusterConnectionInterface');
|
|
$cluster->expects($this->never())->method('add');
|
|
|
|
$factory = $this->getMock('Predis\Connection\Factory', array('create'));
|
|
$factory->expects($this->never())->method('create');
|
|
|
|
$factory->aggregate($cluster, array());
|
|
}
|
|
|
|
|
|
// ******************************************************************** //
|
|
// ---- HELPER METHODS ------------------------------------------------ //
|
|
// ******************************************************************** //
|
|
|
|
/**
|
|
* Returns a mocked Predis\Connection\SingleConnectionInterface.
|
|
*
|
|
* @return array Mock instance and class name
|
|
*/
|
|
protected function getMockConnectionClass()
|
|
{
|
|
$connection = $this->getMock('Predis\Connection\SingleConnectionInterface');
|
|
|
|
return array($connection, get_class($connection));
|
|
}
|
|
}
|