From 89c9a90689ab1162bdaa15878d9dc22c0cc12c46 Mon Sep 17 00:00:00 2001 From: Benoit GALATI Date: Tue, 8 May 2018 00:02:58 +0200 Subject: [PATCH] Remove env placeholder regexp (#422) fix #356 This is an internal detail that is not covered by the BC policy of Symfony and can thus break on any version We now detect if env variable is used by checking the 3rd parameter of method ContainerBuilder::resolveEnvPlaceholders (cherry picked from commit 6b3d92f) --- .../Configuration/RedisDsn.php | 42 +++- .../Configuration/RedisDsnInterface.php | 16 -- .../Configuration/RedisEnvDsn.php | 43 ---- DependencyInjection/SncRedisExtension.php | 77 +++----- .../Configuration/RedisDsnTest.php | 47 +++-- .../Configuration/RedisEnvDsnTest.php | 79 -------- .../Fixtures/config/{ => xml}/invalid.xml | 0 .../Fixtures/config/{ => xml}/valid.xml | 0 .../Fixtures/config/yaml/env_cluster.yaml | 14 ++ .../Fixtures/config/yaml/env_minimal.yaml | 9 + .../Fixtures/config/yaml/env_profile.yaml | 12 ++ .../SncRedisExtensionEnvTest.php | 186 +++--------------- .../SncRedisExtensionTest.php | 4 +- 13 files changed, 140 insertions(+), 389 deletions(-) delete mode 100644 DependencyInjection/Configuration/RedisDsnInterface.php delete mode 100644 DependencyInjection/Configuration/RedisEnvDsn.php delete mode 100644 Tests/DependencyInjection/Configuration/RedisEnvDsnTest.php rename Tests/DependencyInjection/Fixtures/config/{ => xml}/invalid.xml (100%) rename Tests/DependencyInjection/Fixtures/config/{ => xml}/valid.xml (100%) create mode 100644 Tests/DependencyInjection/Fixtures/config/yaml/env_cluster.yaml create mode 100644 Tests/DependencyInjection/Fixtures/config/yaml/env_minimal.yaml create mode 100644 Tests/DependencyInjection/Fixtures/config/yaml/env_profile.yaml diff --git a/DependencyInjection/Configuration/RedisDsn.php b/DependencyInjection/Configuration/RedisDsn.php index 1fa75752..37506a8f 100644 --- a/DependencyInjection/Configuration/RedisDsn.php +++ b/DependencyInjection/Configuration/RedisDsn.php @@ -11,10 +11,7 @@ namespace Snc\RedisBundle\DependencyInjection\Configuration; -/** - * RedisDsn - */ -class RedisDsn implements RedisDsnInterface +class RedisDsn { /** * @var string @@ -57,12 +54,17 @@ class RedisDsn implements RedisDsnInterface protected $alias; /** - * Constructor - * + * @var bool + */ + protected $isEnv; + + /** * @param string $dsn + * @param bool $isEnv */ - public function __construct($dsn) + public function __construct($dsn, $isEnv) { + $this->isEnv = $isEnv; $this->dsn = $dsn; $this->parseDsn($dsn); } @@ -135,11 +137,33 @@ public function getPersistentId() return md5($this->dsn); } + /** + * Return the env DSNĀ if one exists, null otherwise + * + * @return string|null + */ + public function getEnvDsn() + { + return $this->isEnv() ? $this->dsn : null; + } + + /** + * @return bool + */ + public function isEnv() + { + return $this->isEnv; + } + /** * @return bool */ public function isValid() { + if ($this->isEnv()) { + return true; + } + if (0 !== strpos($this->dsn, 'redis://')) { return false; } @@ -160,6 +184,10 @@ public function isValid() */ protected function parseDsn($dsn) { + if ($this->isEnv()) { + return; + } + $dsn = str_replace('redis://', '', $dsn); // remove "redis://" if (false !== $pos = strrpos($dsn, '@')) { // parse password diff --git a/DependencyInjection/Configuration/RedisDsnInterface.php b/DependencyInjection/Configuration/RedisDsnInterface.php deleted file mode 100644 index 06693e9f..00000000 --- a/DependencyInjection/Configuration/RedisDsnInterface.php +++ /dev/null @@ -1,16 +0,0 @@ -dsn = $dsn; - } - - /** - * @return bool - */ - public function isValid() - { - return (bool)preg_match('#^(env_\w+_[0-9a-fA-F]{32}|%?env\(\w++\)%?)$#', $this->dsn); - } - - /** - * @return null - */ - public function getAlias() - { - return null; - } - - /** - * @return string - */ - public function getDsn() - { - return $this->dsn; - } -} diff --git a/DependencyInjection/SncRedisExtension.php b/DependencyInjection/SncRedisExtension.php index 06dc3e81..bcaec527 100644 --- a/DependencyInjection/SncRedisExtension.php +++ b/DependencyInjection/SncRedisExtension.php @@ -13,8 +13,6 @@ use Snc\RedisBundle\DependencyInjection\Configuration\Configuration; use Snc\RedisBundle\DependencyInjection\Configuration\RedisDsn; -use Snc\RedisBundle\DependencyInjection\Configuration\RedisDsnInterface; -use Snc\RedisBundle\DependencyInjection\Configuration\RedisEnvDsn; use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; @@ -23,9 +21,6 @@ use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; -/** - * SncRedisExtension - */ class SncRedisExtension extends Extension { /** @@ -100,17 +95,13 @@ public function getXsdValidationBasePath() */ protected function loadClient(array $client, ContainerBuilder $container) { - $parameterBag = $container->getParameterBag(); - - $dsnResolver = function ($dsn) use ($parameterBag) { - $dsn = $parameterBag->resolveValue($dsn); - $parsedDsn = new RedisDsn($dsn); - - if ($parsedDsn->isValid()) { - return $parsedDsn; + $dsnResolver = function ($dsn) use ($container) { + $usedEnvs = null; + if (method_exists($container, 'resolveEnvPlaceholders')) { + $container->resolveEnvPlaceholders($dsn, null, $usedEnvs); } - $parsedDsn = new RedisEnvDsn($dsn); + $parsedDsn = new RedisDsn($dsn, !empty($usedEnvs)); if ($parsedDsn->isValid()) { return $parsedDsn; @@ -155,7 +146,8 @@ protected function loadPredisClient(array $client, ContainerBuilder $container) $connectionAliases = array(); $connectionCount = count($client['dsns']); - /** @var RedisDsnInterface $dsn */ + + /** @var RedisDsn $dsn */ foreach ($client['dsns'] as $i => $dsn) { if (!$connectionAlias = $dsn->getAlias()) { $connectionAlias = 1 === $connectionCount ? $client['alias'] : $client['alias'] . ($i + 1); @@ -166,7 +158,7 @@ protected function loadPredisClient(array $client, ContainerBuilder $container) $connection['logging'] = $client['logging']; $connection['alias'] = $connectionAlias; - if ($dsn instanceof RedisDsn) { + if (!$dsn->isEnv()) { if (null !== $dsn->getSocket()) { $connection['scheme'] = 'unix'; $connection['path'] = $dsn->getSocket(); @@ -183,16 +175,16 @@ protected function loadPredisClient(array $client, ContainerBuilder $container) } $connection['password'] = $dsn->getPassword(); $connection['weight'] = $dsn->getWeight(); - - $this->loadPredisConnectionParameters($client['alias'], $connection, $container); - } - if ($dsn instanceof RedisEnvDsn) { - $this->loadEnvPredisConnectionParameters($client['alias'], $connection, $dsn->getDsn(), $container); } + + $this->loadPredisConnectionParameters($client['alias'], $connection, $container, $dsn); } + $profile = $client['options']['profile']; // TODO can be shared between clients?! - $profile = self::tryResolveEnvPlaceholders($client['options']['profile'], $container); + if (method_exists($container, 'resolveEnvPlaceholders')) { + $profile = $container->resolveEnvPlaceholders($profile, true); + } $profile = !is_string($profile) ? sprintf('%.1F', $profile) : $profile; $profileId = sprintf('snc_redis.client.%s_profile', $client['alias']); $profileDef = new Definition(get_class(\Predis\Profile\Factory::get($profile))); // TODO get_class alternative? @@ -235,34 +227,23 @@ protected function loadPredisClient(array $client, ContainerBuilder $container) * @param string $clientAlias The client alias * @param array $connection A connection configuration * @param ContainerBuilder $container A ContainerBuilder instance + * @param string|null $envDsn Env DSN */ - protected function loadPredisConnectionParameters($clientAlias, array $connection, ContainerBuilder $container) - { - $parameterId = sprintf('snc_redis.connection.%s_parameters.%s', $connection['alias'], $clientAlias); - $parameterDef = new Definition($container->getParameter('snc_redis.connection_parameters.class')); - $parameterDef->setPublic(false); - $parameterDef->addArgument($connection); - $parameterDef->addTag('snc_redis.connection_parameters', array('clientAlias' => $clientAlias)); - $container->setDefinition($parameterId, $parameterDef); - } - - /** - * @param string $clientAlias The client alias - * @param array $connection A connection configuration - * @param string $dsn The DSN placeholder - * @param ContainerBuilder $container A ContainerBuilder instance - */ - protected function loadEnvPredisConnectionParameters($clientAlias, array $connection, $dsn, ContainerBuilder $container) + protected function loadPredisConnectionParameters($clientAlias, array $connection, ContainerBuilder $container, RedisDsn $dsn) { $parametersClass = $container->getParameter('snc_redis.connection_parameters.class'); $parameterId = sprintf('snc_redis.connection.%s_parameters.%s', $connection['alias'], $clientAlias); $parameterDef = new Definition($parametersClass); $parameterDef->setPublic(false); - $parameterDef->setFactory(array('Snc\RedisBundle\Factory\EnvParametersFactory', 'create')); $parameterDef->addArgument($connection); - $parameterDef->addArgument($parametersClass); - $parameterDef->addArgument($dsn); + + if ($dsn->isEnv()) { + $parameterDef->setFactory(array('Snc\RedisBundle\Factory\EnvParametersFactory', 'create')); + $parameterDef->addArgument($parametersClass); + $parameterDef->addArgument($dsn->getEnvDsn()); + } + $parameterDef->addTag('snc_redis.connection_parameters', array('clientAlias' => $clientAlias)); $container->setDefinition($parameterId, $parameterDef); } @@ -515,16 +496,4 @@ public function getConfiguration(array $config, ContainerBuilder $container) { return new Configuration($container->getParameter('kernel.debug')); } - - /** - * @internal - */ - public static function tryResolveEnvPlaceholders($value, ContainerBuilder $container) - { - if (!class_exists('Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag')) { - return $value; - } - - return $container->resolveEnvPlaceholders($value, true); - } } diff --git a/Tests/DependencyInjection/Configuration/RedisDsnTest.php b/Tests/DependencyInjection/Configuration/RedisDsnTest.php index e5f14f48..85e3e92d 100644 --- a/Tests/DependencyInjection/Configuration/RedisDsnTest.php +++ b/Tests/DependencyInjection/Configuration/RedisDsnTest.php @@ -14,17 +14,12 @@ use Snc\RedisBundle\DependencyInjection\Configuration\RedisDsn; use PHPUnit\Framework\TestCase; -/** - * RedisDsnTest - */ class RedisDsnTest extends TestCase { /** - * @static - * * @return array */ - public static function hostValues() + public function hostValues() { return array( array('redis://localhost', 'localhost'), @@ -67,11 +62,6 @@ public static function hostValues() array('redis://%redis_host%:%redis_port%', '%redis_host%'), array('redis://%redis_host%:%redis_port%/%redis_db%', '%redis_host%'), array('redis://%redis_pass%@%redis_host%:%redis_port%/%redis_db%', '%redis_host%'), - array('redis://env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed', 'env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed'), - array('redis://env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed/env_REDIS_DB_0d1da5bfb707f91e21a1f78cd11fcd0a', 'env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed'), - array('redis://env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed:env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21', 'env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed'), - array('redis://env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed:env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21/env_REDIS_DB_0d1da5bfb707f91e21a1f78cd11fcd0a', 'env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed'), - array('redis://env_REDIS_PW_e7406513a853fd4692343d101baecb7c@env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed:env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21/env_REDIS_DB_0d1da5bfb707f91e21a1f78cd11fcd0a', 'env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed'), ); } @@ -83,7 +73,7 @@ public static function hostValues() */ public function testHost($dsn, $host) { - $dsn = new RedisDsn($dsn); + $dsn = new RedisDsn($dsn, false); $this->assertSame($host, $dsn->getHost()); } @@ -116,7 +106,7 @@ public static function socketValues() */ public function testSocket($dsn, $socket) { - $dsn = new RedisDsn($dsn); + $dsn = new RedisDsn($dsn, false); $this->assertSame($socket, $dsn->getSocket()); } @@ -141,9 +131,6 @@ public static function portValues() array('redis://%redis_host%:%redis_port%', '%redis_port%'), array('redis://%redis_host%:%redis_port%/%redis_db%', '%redis_port%'), array('redis://%redis_pass%@%redis_host%:%redis_port%/%redis_db%', '%redis_port%'), - array('redis://env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed:env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21', 'env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21'), - array('redis://env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed:env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21/env_REDIS_DB_0d1da5bfb707f91e21a1f78cd11fcd0a', 'env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21'), - array('redis://env_REDIS_PW_e7406513a853fd4692343d101baecb7c@env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed:env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21/env_REDIS_DB_0d1da5bfb707f91e21a1f78cd11fcd0a', 'env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21'), array('redis:///redis.sock', null), array('redis:///redis.sock/1', null), array('redis:///redis.sock:63790', null), @@ -160,7 +147,7 @@ public static function portValues() */ public function testPort($dsn, $port) { - $dsn = new RedisDsn($dsn); + $dsn = new RedisDsn($dsn, false); $this->assertSame($port, $dsn->getPort()); } @@ -211,7 +198,7 @@ public static function databaseValues() */ public function testDatabase($dsn, $database) { - $dsn = new RedisDsn($dsn); + $dsn = new RedisDsn($dsn, false); $this->assertSame($database, $dsn->getDatabase()); } @@ -239,9 +226,6 @@ public static function passwordValues() array('redis://%redis_host%', null), array('redis://%redis_host%/%redis_db%', null), array('redis://%redis_pass%@%redis_host%:%redis_port%', '%redis_pass%'), - array('redis://env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed', null), - array('redis://env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed/env_REDIS_DB_0d1da5bfb707f91e21a1f78cd11fcd0a', null), - array('redis://env_REDIS_PW_e7406513a853fd4692343d101baecb7c@env_REDIS_HOST_1ef60d9ef7a55747f99d0a42206e58ed:env_REDIS_PORT_0458150d4bf631c8ac63b0fa4d257a21/env_REDIS_DB_0d1da5bfb707f91e21a1f78cd11fcd0a', 'env_REDIS_PW_e7406513a853fd4692343d101baecb7c'), array('redis:///redis.sock', null), array('redis:///redis.sock/1', null), array('redis://pw@/redis.sock/10', 'pw'), @@ -258,7 +242,7 @@ public static function passwordValues() */ public function testPassword($dsn, $password) { - $dsn = new RedisDsn($dsn); + $dsn = new RedisDsn($dsn, false); $this->assertSame($password, $dsn->getPassword()); } @@ -305,8 +289,23 @@ public static function isValidValues() */ public function testIsValid($dsn, $valid) { - $dsn = new RedisDsn($dsn); + $dsn = new RedisDsn($dsn, false); $this->assertSame($valid, $dsn->isValid()); + $this->assertFalse($dsn->isEnv()); + $this->assertNull($dsn->getEnvDsn()); + } + + /** + * @param string $dsn DSN + * + * @dataProvider isValidValues + */ + public function testIsValidEnvDsn($dsn) + { + $dsnObject = new RedisDsn($dsn, true); + $this->assertTrue($dsnObject->isValid()); + $this->assertTrue($dsnObject->isEnv()); + $this->assertSame($dsn, $dsnObject->getEnvDsn()); } /** @@ -340,7 +339,7 @@ public static function parameterValues() */ public function testParameterValues($dsn, $weight, $alias) { - $dsn = new RedisDsn($dsn); + $dsn = new RedisDsn($dsn, false); $this->assertSame($weight, $dsn->getWeight()); $this->assertSame($alias, $dsn->getAlias()); } diff --git a/Tests/DependencyInjection/Configuration/RedisEnvDsnTest.php b/Tests/DependencyInjection/Configuration/RedisEnvDsnTest.php deleted file mode 100644 index 19ed9228..00000000 --- a/Tests/DependencyInjection/Configuration/RedisEnvDsnTest.php +++ /dev/null @@ -1,79 +0,0 @@ -assertSame($valid, $dsn->isValid()); - } - - /** - * @param string $dsn DSN - * - * @dataProvider isValidValues - */ - public function testAliasIsNull($dsn) - { - $dsn = new RedisEnvDsn($dsn); - $this->assertNull($dsn->getAlias()); - } - - /** - * @param string $dsn DSN - * - * @dataProvider isValidValues - */ - public function testDsnIsUnmodified($providedDsn) - { - $dsn = new RedisEnvDsn($providedDsn); - $this->assertEquals($providedDsn, $dsn->getDsn()); - } -} diff --git a/Tests/DependencyInjection/Fixtures/config/invalid.xml b/Tests/DependencyInjection/Fixtures/config/xml/invalid.xml similarity index 100% rename from Tests/DependencyInjection/Fixtures/config/invalid.xml rename to Tests/DependencyInjection/Fixtures/config/xml/invalid.xml diff --git a/Tests/DependencyInjection/Fixtures/config/valid.xml b/Tests/DependencyInjection/Fixtures/config/xml/valid.xml similarity index 100% rename from Tests/DependencyInjection/Fixtures/config/valid.xml rename to Tests/DependencyInjection/Fixtures/config/xml/valid.xml diff --git a/Tests/DependencyInjection/Fixtures/config/yaml/env_cluster.yaml b/Tests/DependencyInjection/Fixtures/config/yaml/env_cluster.yaml new file mode 100644 index 00000000..bdffdd71 --- /dev/null +++ b/Tests/DependencyInjection/Fixtures/config/yaml/env_cluster.yaml @@ -0,0 +1,14 @@ +parameters: + env(REDIS_URL_1): redis://localhost + env(REDIS_URL_2): redis://localhost2 + +snc_redis: + clients: + default: + type: predis + alias: default + dsn: + - "%env(REDIS_URL_1)%" + - "%env(REDIS_URL_2)%" + options: + cluster: "redis" diff --git a/Tests/DependencyInjection/Fixtures/config/yaml/env_minimal.yaml b/Tests/DependencyInjection/Fixtures/config/yaml/env_minimal.yaml new file mode 100644 index 00000000..a5bc43cd --- /dev/null +++ b/Tests/DependencyInjection/Fixtures/config/yaml/env_minimal.yaml @@ -0,0 +1,9 @@ +parameters: + env(REDIS_URL): redis://localhost + +snc_redis: + clients: + default: + type: predis + alias: default + dsn: "%env(REDIS_URL)%" diff --git a/Tests/DependencyInjection/Fixtures/config/yaml/env_profile.yaml b/Tests/DependencyInjection/Fixtures/config/yaml/env_profile.yaml new file mode 100644 index 00000000..a21087eb --- /dev/null +++ b/Tests/DependencyInjection/Fixtures/config/yaml/env_profile.yaml @@ -0,0 +1,12 @@ +parameters: + env(REDIS_URL): redis://localhost + env(REDIS_PROFILE): 2.6 + +snc_redis: + clients: + default: + type: predis + alias: default + dsn: "%env(REDIS_URL)%" + options: + profile: "%env(REDIS_PROFILE)%" diff --git a/Tests/DependencyInjection/SncRedisExtensionEnvTest.php b/Tests/DependencyInjection/SncRedisExtensionEnvTest.php index 2704737e..e59a37b4 100644 --- a/Tests/DependencyInjection/SncRedisExtensionEnvTest.php +++ b/Tests/DependencyInjection/SncRedisExtensionEnvTest.php @@ -2,13 +2,12 @@ namespace Snc\RedisBundle\Tests\DependencyInjection; +use PHPUnit\Framework\TestCase; use Snc\RedisBundle\DependencyInjection\SncRedisExtension; -use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass; +use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag; +use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; use Symfony\Component\HttpKernel\Kernel; -use Symfony\Component\Yaml\Parser; -use PHPUnit\Framework\TestCase; /** * SncRedisExtensionTest @@ -27,99 +26,14 @@ protected function setUp() } } - /** - * @static - * - * @return array - */ - public static function parameterValues() - { - return array( - array('snc_redis.client.class', 'Predis\Client'), - array('snc_redis.client_options.class', 'Predis\Configuration\Options'), - array('snc_redis.connection_parameters.class', 'Predis\Connection\Parameters'), - array('snc_redis.connection_factory.class', 'Snc\RedisBundle\Client\Predis\Connection\ConnectionFactory'), - array('snc_redis.connection_wrapper.class', 'Snc\RedisBundle\Client\Predis\Connection\ConnectionWrapper'), - array('snc_redis.logger.class', 'Snc\RedisBundle\Logger\RedisLogger'), - array('snc_redis.data_collector.class', 'Snc\RedisBundle\DataCollector\RedisDataCollector'), - array('snc_redis.doctrine_cache_phpredis.class', 'Doctrine\Common\Cache\RedisCache'), - array('snc_redis.doctrine_cache_predis.class', 'Doctrine\Common\Cache\PredisCache'), - array('snc_redis.monolog_handler.class', 'Monolog\Handler\RedisHandler'), - array('snc_redis.swiftmailer_spool.class', 'Snc\RedisBundle\SwiftMailer\RedisSpool'), - ); - } - - public function testEmptyConfigLoad() - { - $extension = new SncRedisExtension(); - $config = array(); - $extension->load(array($config), $this->getContainer()); - - $this->markTestIncomplete('No assertions written for this test'); - } - - /** - * @param string $name Name - * @param string $expected Expected value - * - * @dataProvider parameterValues - */ - public function testDefaultParameterConfigLoad($name, $expected) - { - $container = $this->getConfiguredContainer($this->getMinimalYamlConfig()); - - $this->assertEquals($expected, $container->getParameter($name)); - } - - /** - * Test default config for resulting tagged services - */ - public function testDefaultClientTaggedServicesConfigLoad() - { - $container = $this->getConfiguredContainer($this->getMinimalYamlConfig()); - - $this->assertInternalType('array', $container->findTaggedServiceIds('snc_redis.client')); - $this->assertCount(1, $container->findTaggedServiceIds('snc_redis.client'), 'Minimal Yaml should have tagged 1 client'); - } - - /** - * Test loading of minimal config - */ - public function testMinimalConfigLoad() + public function testDefaultParameterConfigLoad() { - $container = $this->getConfiguredContainer($this->getMinimalYamlConfig()); - - $this->assertTrue($container->hasDefinition('snc_redis.logger')); - $this->assertTrue($container->hasDefinition('snc_redis.data_collector')); - - $this->assertTrue($container->hasDefinition('snc_redis.connection.default_parameters.default')); - $this->assertTrue($container->hasDefinition('snc_redis.client.default_profile')); - $this->assertTrue($container->hasDefinition('snc_redis.client.default_options')); - $this->assertTrue($container->hasDefinition('snc_redis.default')); - $this->assertTrue($container->hasAlias('snc_redis.default_client')); - $this->assertInternalType('array', $container->findTaggedServiceIds('snc_redis.client')); - $this->assertEquals(array('snc_redis.default' => array(array('alias' => 'default'))), $container->findTaggedServiceIds('snc_redis.client')); + $container = $this->getConfiguredContainer('env_minimal'); - $connectionArguments = $container->getDefinition('snc_redis.connection.default_parameters.default')->getArguments(); - $this->assertCount(3, $connectionArguments); $this->assertSame( - array( - 'read_write_timeout' => null, - 'iterable_multibulk' => false, - 'serialization' => 'default', - 'profile' => 'default', - 'prefix' => null, - 'service' => null, - 'async_connect' => false, - 'timeout' => 5, - 'persistent' => false, - 'exceptions' => true, - 'logging' => false, - 'alias' => 'default', - ), - $connectionArguments[0] + ['Snc\RedisBundle\Factory\EnvParametersFactory', 'create'], + $container->findDefinition('snc_redis.connection.default_parameters.default')->getFactory() ); - $this->assertSame('Predis\Connection\Parameters', $connectionArguments[1]); } /** @@ -127,18 +41,15 @@ public function testMinimalConfigLoad() */ public function testProfileOption() { - $container = $this->getConfiguredContainer($this->getProfileYamlConfig()); + $container = $this->getConfiguredContainer('env_profile'); $this->assertTrue($container->hasDefinition('snc_redis.client.default_profile')); $this->assertSame('Predis\Profile\RedisVersion260', $container->getDefinition('snc_redis.client.default_profile')->getClass()); } - /** - * Test valid config of the cluster option - */ public function testClusterOption() { - $container = $this->getConfiguredContainer($this->getClusterYamlConfig()); + $container = $this->getConfiguredContainer('env_cluster'); $options = $container->getDefinition('snc_redis.client.default_options')->getArgument(0); $this->assertEquals('redis', $options['cluster']); @@ -152,77 +63,24 @@ public function testClusterOption() $this->assertEquals(array('snc_redis.default' => array(array('alias' => 'default'))), $container->findTaggedServiceIds('snc_redis.client')); } - private function parseYaml($yaml) - { - $parser = new Parser(); - - return $parser->parse($yaml); - } - - private function getMinimalYamlConfig() - { - return <<<'EOF' -clients: - default: - type: predis - dsn: "%env(REDIS_URL)%" -EOF; - } - - public function getClusterYamlConfig() - { - return <<<'EOF' -clients: - default: - type: predis - alias: default - dsn: - - "%env(REDIS_URL_1)%" - - "%env(REDIS_URL_2)%" - options: - cluster: "redis" -EOF; - } - - private function getProfileYamlConfig() + private function getConfiguredContainer($file) { - return <<<'EOF' -clients: - default: - type: predis - alias: default - dsn: "%env(REDIS_URL)%" - options: - profile: "%env(REDIS_PROFILE)%" -EOF; - } + $container = new ContainerBuilder(); - private function getContainer() - { - return new ContainerBuilder(new EnvPlaceholderParameterBag(array( - 'kernel.debug' => false, - 'kernel.bundles' => array(), - 'kernel.cache_dir' => sys_get_temp_dir(), - 'kernel.environment' => 'test', - 'kernel.root_dir' => __DIR__ . '/../../', - 'env(REDIS_URL)' => 'redis://localhost', - 'env(REDIS_URL_1)' => 'redis://localhost', - 'env(REDIS_URL_2)' => 'redis://localhost', - 'env(REDIS_PROFILE)' => '2.6', - ))); - } + $container->setParameter('kernel.debug', false); + $container->setParameter('kernel.bundles', array()); + $container->setParameter('kernel.cache_dir', sys_get_temp_dir()); + $container->setParameter('kernel.environment', 'test'); + $container->setParameter('kernel.root_dir', __DIR__ . '/../../'); - private function getConfiguredContainer($yaml) - { - $extension = new SncRedisExtension(); - $config = $this->parseYaml($yaml); + $container->registerExtension(new SncRedisExtension()); - $container = $this->getContainer(); + $locator = new FileLocator(__DIR__.'/Fixtures/config/yaml'); + $loader = new YamlFileLoader($container, $locator); + $loader->load($file.'.yaml'); - $container->registerExtension($extension); - $container->prependExtensionConfig($extension->getAlias(), $config); - $pass = new MergeExtensionConfigurationPass(); - $pass->process($container); + $container->getCompilerPassConfig()->setRemovingPasses(array()); + $container->compile(); return $container; } diff --git a/Tests/DependencyInjection/SncRedisExtensionTest.php b/Tests/DependencyInjection/SncRedisExtensionTest.php index 7ba97fa7..f6530932 100644 --- a/Tests/DependencyInjection/SncRedisExtensionTest.php +++ b/Tests/DependencyInjection/SncRedisExtensionTest.php @@ -270,7 +270,7 @@ public function testValidXmlConfig() { $container = $this->getContainer(); $container->registerExtension(new SncRedisExtension()); - $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/Fixtures/config')); + $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/Fixtures/config/xml')); $loader->load('valid.xml'); } @@ -281,7 +281,7 @@ public function testInvalidXmlConfig() { $container = $this->getContainer(); $container->registerExtension(new SncRedisExtension()); - $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/Fixtures/config')); + $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/Fixtures/config/xml')); $loader->load('invalid.xml'); }