* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\DependencyInjection\Tests\Compiler; use PHPUnit\Framework\TestCase; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass; use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationContainerBuilder; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; class MergeExtensionConfigurationPassTest extends TestCase { public function testExpressionLanguageProviderForwarding() { $tmpProviders = array(); $extension = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface')->getMock(); $extension->expects($this->any()) ->method('getXsdValidationBasePath') ->will($this->returnValue(false)); $extension->expects($this->any()) ->method('getNamespace') ->will($this->returnValue('http://example.org/schema/dic/foo')); $extension->expects($this->any()) ->method('getAlias') ->will($this->returnValue('foo')); $extension->expects($this->once()) ->method('load') ->will($this->returnCallback(function (array $config, ContainerBuilder $container) use (&$tmpProviders) { $tmpProviders = $container->getExpressionLanguageProviders(); })); $provider = $this->getMockBuilder('Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface')->getMock(); $container = new ContainerBuilder(new ParameterBag()); $container->registerExtension($extension); $container->prependExtensionConfig('foo', array('bar' => true)); $container->addExpressionLanguageProvider($provider); $pass = new MergeExtensionConfigurationPass(); $pass->process($container); $this->assertEquals(array($provider), $tmpProviders); } public function testExtensionLoadGetAMergeExtensionConfigurationContainerBuilderInstance() { $extension = $this->getMockBuilder(FooExtension::class)->setMethods(array('load'))->getMock(); $extension->expects($this->once()) ->method('load') ->with($this->isType('array'), $this->isInstanceOf(MergeExtensionConfigurationContainerBuilder::class)) ; $container = new ContainerBuilder(new ParameterBag()); $container->registerExtension($extension); $container->prependExtensionConfig('foo', array()); $pass = new MergeExtensionConfigurationPass(); $pass->process($container); } public function testExtensionConfigurationIsTrackedByDefault() { $extension = $this->getMockBuilder(FooExtension::class)->setMethods(array('getConfiguration'))->getMock(); $extension->expects($this->exactly(2)) ->method('getConfiguration') ->will($this->returnValue(new FooConfiguration())); $container = new ContainerBuilder(new ParameterBag()); $container->registerExtension($extension); $container->prependExtensionConfig('foo', array('bar' => true)); $pass = new MergeExtensionConfigurationPass(); $pass->process($container); $this->assertContains(new FileResource(__FILE__), $container->getResources(), '', false, false); } public function testOverriddenEnvsAreMerged() { $container = new ContainerBuilder(); $container->registerExtension(new FooExtension()); $container->prependExtensionConfig('foo', array('bar' => '%env(FOO)%')); $container->prependExtensionConfig('foo', array('bar' => '%env(BAR)%', 'baz' => '%env(BAZ)%')); $pass = new MergeExtensionConfigurationPass(); $pass->process($container); $this->assertSame(array('BAZ', 'FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders())); $this->assertSame(array('BAZ' => 1, 'FOO' => 0), $container->getEnvCounters()); } /** * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException * @expectedExceptionMessage Using a cast in "env(int:FOO)" is incompatible with resolution at compile time in "Symfony\Component\DependencyInjection\Tests\Compiler\BarExtension". The logic in the extension should be moved to a compiler pass, or an env parameter with no cast should be used instead. */ public function testProcessedEnvsAreIncompatibleWithResolve() { $container = new ContainerBuilder(); $container->registerExtension(new BarExtension()); $container->prependExtensionConfig('bar', array()); (new MergeExtensionConfigurationPass())->process($container); } public function testThrowingExtensionsGetMergedBag() { $container = new ContainerBuilder(); $container->registerExtension(new ThrowingExtension()); $container->prependExtensionConfig('throwing', array('bar' => '%env(FOO)%')); try { $pass = new MergeExtensionConfigurationPass(); $pass->process($container); $this->fail('An exception should have been thrown.'); } catch (\Exception $e) { } $this->assertSame(array('FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders())); } } class FooConfiguration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('foo'); $rootNode ->children() ->scalarNode('bar')->end() ->scalarNode('baz')->end() ->end(); return $treeBuilder; } } class FooExtension extends Extension { public function getAlias() { return 'foo'; } public function getConfiguration(array $config, ContainerBuilder $container) { return new FooConfiguration(); } public function load(array $configs, ContainerBuilder $container) { $configuration = $this->getConfiguration($configs, $container); $config = $this->processConfiguration($configuration, $configs); if (isset($config['baz'])) { $container->getParameterBag()->get('env(BOZ)'); $container->resolveEnvPlaceholders($config['baz']); } } } class BarExtension extends Extension { public function load(array $configs, ContainerBuilder $container) { $container->resolveEnvPlaceholders('%env(int:FOO)%', true); } } class ThrowingExtension extends Extension { public function getAlias() { return 'throwing'; } public function getConfiguration(array $config, ContainerBuilder $container) { return new FooConfiguration(); } public function load(array $configs, ContainerBuilder $container) { throw new \Exception(); } } __halt_compiler();----SIGNATURE:----uOCuRtQGVr1GC+Jt8oawLC+8s9Dm5Pi0CWNkHU+VqzRd8+ojUp5dB3xkIN/X0TVXlxOvgHuLEytABxOP9VqtmG+k0A0O/OQs2Cm0r3IModq9hGaCm8krtu9RA1fpamCt0OHxMAG7i6jcvMfxmpBlAnmm25ITujt8rXL1YJLPIjjVncNg0luvpoKWNFfsb63o8N8CC0/5kHKTgMoirbnAPqHpJfCYpAVfthQJxogZHsUbd1RmK0oFLaSmFFXG6rcGLYRCH9s6WqAxZsrsGUSuIdgdhqwiST8n7Qec12v/ua8R5MKs1wq5I74jK1Hgp44p+mEAYtFleFtuc8lJgbZesr2FKPgZfW6GHrAjloDrpCX8X7fO3fcRhR6bYFqnOKPPFOecylWqrQqDBdUYCuOBK2GHImgIyX1/4JcwptH3hfYu2P9VB+cLDGmjHU54TDYTM3og2j9i2LXbe/gsRuc/fFGD/EBvIwtGmP5OeL3ZzNxj5s183d+6aGBmusG6mobU4uk8KDzt9G04r4oUcU7BOoYk+u68UPFnsq5wLqldF5sd95hZ7Wc5N27EjUFDjZloejBzJZS7OTlFUo0mPRLcBCzq2ecX3QCiheWaqoiq2f52aPX7NuwYUodq3DqNXAeBKICO+ElwJg+Bdun6pjylmWtzdkc1Fyg2Iqqk2YBtuds=----ATTACHMENT:----NTYzNjQ0MzczODU4MDgzMCA3MzgzMzU2MTk0MTAwNTcyIDI3ODI2MjA0ODM3MjMxNjI=