Files
predis/tests/Predis/Connection/StreamConnectionTest.php
T
Daniele Alessandri 8277afc7a8 Use "persistent" with non-bool strings to open different persistent connections.
stream_socket_client() has the undocumented ability to open different persistent
streams by providing a path in the $address string. Previously we supported this
behaviour with a combination of "persistent" and "path" (see #139) but this can
be confusing, especially now that we support the redis:// scheme which uses the
path part of an URI string to specify a database number.

After this change, instead of using an URI string such as:

  $parameters = 'tcp://127.0.0.1/first?persistent=1&database=5';

You should use the following ones:

  $parameters = 'tcp://127.0.0.1?persistent=first&database=5';
  $parameters = 'redis://127.0.0.1/5?persistent=first';

Avoiding "path" makes even more sense when using array connection parameters:

  $parameters = [
    'host'       => '127.0.0.1',
    'database'   => 5,
    'persistent' => 'first',
  ]

This feature is not supported when using UNIX domain sockets because the path
trick of stream_socket_client() does not play well with the actual path of the
socket file. The client will throw an InvalidArgumentException exception to
notify the user.

NOTE: unfortunately we have to disable the tests for persistent connections when
running under HHVM due to a bug in their implementation of get_resource_type()
preventing us to recognize a persistent stream from userland code.
2015-07-25 18:34:51 +02:00

246 lines
7.7 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;
/**
*
*/
class StreamConnectionTest extends PredisConnectionTestCase
{
/**
* @group disconnected
*/
public function testConstructorDoesNotOpenConnection()
{
$connection = new StreamConnection($this->getParameters());
$this->assertFalse($connection->isConnected());
}
/**
* @group disconnected
*/
public function testSupportsSchemeTCP()
{
$parameters = $this->getParameters(array('scheme' => 'tcp'));
$connection = new StreamConnection($parameters);
$this->assertInstanceOf('Predis\Connection\NodeConnectionInterface', $connection);
}
/**
* @group disconnected
*/
public function testSupportsSchemeRedis()
{
$parameters = $this->getParameters(array('scheme' => 'redis'));
$connection = new StreamConnection($parameters);
$this->assertInstanceOf('Predis\Connection\NodeConnectionInterface', $connection);
}
/**
* @group disconnected
*/
public function testSupportsSchemeUnix()
{
$parameters = $this->getParameters(array('scheme' => 'unix'));
$connection = new StreamConnection($parameters);
$this->assertInstanceOf('Predis\Connection\NodeConnectionInterface', $connection);
}
/**
* @group disconnected
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage Invalid scheme: 'udp'.
*/
public function testThrowsExceptionOnInvalidScheme()
{
$parameters = $this->getParameters(array('scheme' => 'udp'));
new StreamConnection($parameters);
}
/**
* @group disconnected
*/
public function testExposesParameters()
{
$parameters = $this->getParameters();
$connection = new StreamConnection($parameters);
$this->assertSame($parameters, $connection->getParameters());
}
/**
* @group disconnected
*/
public function testCanBeSerialized()
{
$parameters = $this->getParameters(array('alias' => 'redis', 'read_write_timeout' => 10));
$connection = new StreamConnection($parameters);
$unserialized = unserialize(serialize($connection));
$this->assertEquals($connection, $unserialized);
}
// ******************************************************************** //
// ---- INTEGRATION TESTS --------------------------------------------- //
// ******************************************************************** //
/**
* @group connected
*/
public function testAcceptsTcpNodelayParameter()
{
if (!version_compare(PHP_VERSION, '5.4.0', '>=')) {
$this->markTestSkipped('Setting TCP_NODELAY on PHP socket streams works on PHP >= 5.4.0');
}
$connection = new StreamConnection($this->getParameters(array('tcp_nodelay' => false)));
$connection->connect();
$this->assertTrue($connection->isConnected());
$connection = new StreamConnection($this->getParameters(array('tcp_nodelay' => true)));
$connection->connect();
$this->assertTrue($connection->isConnected());
}
/**
* @group connected
*/
public function testPersistentParameterWithFalseLikeValues()
{
if ($this->isHHVM()) {
$this->markTestSkipped('This test does not currently work on HHVM.');
}
$connection1 = new StreamConnection($this->getParameters(array('persistent' => 0)));
$this->assertNonPersistentConnection($connection1);
$connection2 = new StreamConnection($this->getParameters(array('persistent' => false)));
$this->assertNonPersistentConnection($connection2);
$connection3 = new StreamConnection($this->getParameters(array('persistent' => '0')));
$this->assertNonPersistentConnection($connection3);
$connection4 = new StreamConnection($this->getParameters(array('persistent' => 'false')));
$this->assertNonPersistentConnection($connection4);
}
/**
* @group connected
*/
public function testPersistentParameterWithTrueLikeValues()
{
if ($this->isHHVM()) {
$this->markTestSkipped('This test does not currently work on HHVM.');
}
$connection1 = new StreamConnection($this->getParameters(array('persistent' => 1)));
$this->assertPersistentConnection($connection1);
$connection2 = new StreamConnection($this->getParameters(array('persistent' => true)));
$this->assertPersistentConnection($connection2);
$connection3 = new StreamConnection($this->getParameters(array('persistent' => '1')));
$this->assertPersistentConnection($connection3);
$connection4 = new StreamConnection($this->getParameters(array('persistent' => 'true')));
$this->assertPersistentConnection($connection4);
$connection1->disconnect();
}
/**
* @group connected
*/
public function testPersistentConnectionsToSameNodeShareResource()
{
if ($this->isHHVM()) {
$this->markTestSkipped('This test does not currently work on HHVM.');
}
$connection1 = new StreamConnection($this->getParameters(array('persistent' => true)));
$connection2 = new StreamConnection($this->getParameters(array('persistent' => true)));
$this->assertPersistentConnection($connection1);
$this->assertPersistentConnection($connection2);
$this->assertSame($connection1->getResource(), $connection2->getResource());
$connection1->disconnect();
}
/**
* @group connected
*/
public function testPersistentConnectionsToSameNodeDoNotShareResourceUsingDifferentPersistentID()
{
if ($this->isHHVM()) {
$this->markTestSkipped('This test does not currently work on HHVM.');
}
$connection1 = new StreamConnection($this->getParameters(array('persistent' => 'conn1')));
$connection2 = new StreamConnection($this->getParameters(array('persistent' => 'conn2')));
$this->assertPersistentConnection($connection1);
$this->assertPersistentConnection($connection2);
$this->assertNotSame($connection1->getResource(), $connection2->getResource());
}
/**
* @group connected
* @expectedException \Predis\Protocol\ProtocolException
* @expectedExceptionMessage Unknown response prefix: 'P'.
*/
public function testThrowsExceptionOnProtocolDesynchronizationErrors()
{
$connection = $this->getConnection($profile);
$stream = $connection->getResource();
$connection->writeRequest($profile->createCommand('ping'));
fread($stream, 1);
$connection->read();
}
// ******************************************************************** //
// ---- HELPER METHODS ------------------------------------------------ //
// ******************************************************************** //
/**
* {@inheritdoc}
*/
protected function getConnection(&$profile = null, $initialize = false, array $parameters = array())
{
$parameters = $this->getParameters($parameters);
$profile = $this->getProfile();
$connection = new StreamConnection($parameters);
if ($initialize) {
$connection->addConnectCommand(
$profile->createCommand('select', array($parameters->database))
);
$connection->addConnectCommand(
$profile->createCommand('flushdb')
);
}
return $connection;
}
}