* * 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:----ATcL+ETN+XyiqqbuEiVFfeV6o1IiOJDrPGK7203qMAVm+qT8XIGMeHiykeZGKDSmUOWBcHstL5hSdgIvFlmC8/ConkwezkAN6NFlpL1Ii9mFQamECrgAysa3vySgKGlRQXSc5qKtjQPoVla8Ue9p3QwTw39vLXSf7il5/HXMMYt8ZWs2cMWT2kNYZY8gikhfiihMmO9lTMU6mO7OB/dkZbzzZ2wYMG3KYmQH5+BhabaTA80qnApM1hSySIsgXRF4KGRVF1fU6rN/wGcCWQbDW/u/NPjQwog9mu9wEBF3BO3ajq3JazFKyev6u7JfXIqfd9aOIC0JuT5H9Ky06cHNMTCpGK3ziSw97QV+zd8U3q7uiXZRhoR8Ref1nS84bXxfvR1o+QnX7xEo8ORLXKv516yyEa+RMr7jjzRfw/s4T/9lPr0g/hRwtTg9uoxGiZOL3gxNNDEA+qkw8CzfJu+2isE+pHX/YFJevBbuKhNfc5ZPRpILbJvPCvM9qK2K9hkaPOFIh9pnArzYo5yJIsHHW/WlxpzOjx7YoidUv9fpWVlS5N2shXu2BmFmY3q/JuOw+PDdk/gIJrbplvxNhy6UlRUL/plIsmf9VKoyTMfkCCQTxppXxoSMqPkgVwwrPq92tZUuKqu9Q/HYg4cWUxQUjpt0y8cd+U1WKrubJctAGKk=----ATTACHMENT:----NjUyNjY0NDQzODUwNjM0MiA2MDI2NjU3NjI2OTY1OTcwIDI0MzM4ODA3NTEwNDUyMzI=