MonologExtensionTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bundle\MonologBundle\Tests\DependencyInjection;
  11. use Symfony\Bundle\MonologBundle\Tests\TestCase;
  12. use Symfony\Bundle\MonologBundle\DependencyInjection\MonologExtension;
  13. use Symfony\Component\DependencyInjection\ContainerBuilder;
  14. use Symfony\Component\DependencyInjection\Reference;
  15. class MonologExtensionTest extends TestCase
  16. {
  17. public function testLoadWithDefault()
  18. {
  19. $container = new ContainerBuilder();
  20. $loader = new MonologExtension();
  21. $loader->load(array(array('handlers' => array('main' => array('type' => 'stream')))), $container);
  22. $this->assertTrue($container->hasDefinition('monolog.logger'));
  23. $this->assertTrue($container->hasDefinition('monolog.handler.main'));
  24. $logger = $container->getDefinition('monolog.logger');
  25. $this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.main')));
  26. $handler = $container->getDefinition('monolog.handler.main');
  27. $this->assertDICDefinitionClass($handler, '%monolog.handler.stream.class%');
  28. $this->assertDICConstructorArguments($handler, array('%kernel.logs_dir%/%kernel.environment%.log', \Monolog\Logger::DEBUG, false));
  29. }
  30. public function testLoadWithCustomValues()
  31. {
  32. $container = new ContainerBuilder();
  33. $loader = new MonologExtension();
  34. $loader->load(array(array('handlers' => array('custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'ERROR')))), $container);
  35. $this->assertTrue($container->hasDefinition('monolog.logger'));
  36. $this->assertTrue($container->hasDefinition('monolog.handler.custom'));
  37. $logger = $container->getDefinition('monolog.logger');
  38. $this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.custom')));
  39. $handler = $container->getDefinition('monolog.handler.custom');
  40. $this->assertDICDefinitionClass($handler, '%monolog.handler.stream.class%');
  41. $this->assertDICConstructorArguments($handler, array('/tmp/symfony.log', \Monolog\Logger::ERROR, true));
  42. }
  43. public function testLoadWithSeveralHandlers()
  44. {
  45. $container = new ContainerBuilder();
  46. $loader = new MonologExtension();
  47. $loader->load(array(array('handlers' => array(
  48. 'custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'ERROR'),
  49. 'main' => array('type' => 'fingers_crossed', 'action_level' => 'ERROR', 'handler' => 'nested'),
  50. 'nested' => array('type' => 'stream')
  51. ))), $container);
  52. $this->assertTrue($container->hasDefinition('monolog.logger'));
  53. $this->assertTrue($container->hasDefinition('monolog.handler.custom'));
  54. $this->assertTrue($container->hasDefinition('monolog.handler.main'));
  55. $this->assertTrue($container->hasDefinition('monolog.handler.nested'));
  56. $logger = $container->getDefinition('monolog.logger');
  57. $this->assertDICDefinitionMethodCallAt(1, $logger, 'pushHandler', array(new Reference('monolog.handler.custom')));
  58. $this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.main')));
  59. $handler = $container->getDefinition('monolog.handler.custom');
  60. $this->assertDICDefinitionClass($handler, '%monolog.handler.stream.class%');
  61. $this->assertDICConstructorArguments($handler, array('/tmp/symfony.log', \Monolog\Logger::ERROR, true));
  62. $handler = $container->getDefinition('monolog.handler.main');
  63. $this->assertDICDefinitionClass($handler, '%monolog.handler.fingers_crossed.class%');
  64. $this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), \Monolog\Logger::ERROR, 0, false));
  65. }
  66. public function testLoadWithOverwriting()
  67. {
  68. $container = new ContainerBuilder();
  69. $loader = new MonologExtension();
  70. $loader->load(array(
  71. array('handlers' => array(
  72. 'custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'ERROR'),
  73. 'main' => array('type' => 'fingers_crossed', 'action_level' => 'ERROR', 'handler' => 'nested'),
  74. 'nested' => array('type' => 'stream')
  75. )),
  76. array('handlers' => array(
  77. 'custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'WARNING'),
  78. ))
  79. ), $container);
  80. $this->assertTrue($container->hasDefinition('monolog.logger'));
  81. $this->assertTrue($container->hasDefinition('monolog.handler.custom'));
  82. $this->assertTrue($container->hasDefinition('monolog.handler.main'));
  83. $this->assertTrue($container->hasDefinition('monolog.handler.nested'));
  84. $logger = $container->getDefinition('monolog.logger');
  85. $this->assertDICDefinitionMethodCallAt(1, $logger, 'pushHandler', array(new Reference('monolog.handler.custom')));
  86. $this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.main')));
  87. $handler = $container->getDefinition('monolog.handler.custom');
  88. $this->assertDICDefinitionClass($handler, '%monolog.handler.stream.class%');
  89. $this->assertDICConstructorArguments($handler, array('/tmp/symfony.log', \Monolog\Logger::WARNING, true));
  90. $handler = $container->getDefinition('monolog.handler.main');
  91. $this->assertDICDefinitionClass($handler, '%monolog.handler.fingers_crossed.class%');
  92. $this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), \Monolog\Logger::ERROR, 0, false));
  93. }
  94. public function testLoadWithNewAtEnd()
  95. {
  96. $container = new ContainerBuilder();
  97. $loader = new MonologExtension();
  98. $loader->load(array(
  99. array('handlers' => array(
  100. 'custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'ERROR'),
  101. 'main' => array('type' => 'fingers_crossed', 'action_level' => 'ERROR', 'handler' => 'nested'),
  102. 'nested' => array('type' => 'stream')
  103. )),
  104. array('handlers' => array(
  105. 'custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'WARNING'),
  106. 'new' => array('type' => 'stream', 'path' => '/tmp/monolog.log', 'bubble' => true, 'level' => 'ERROR'),
  107. ))
  108. ), $container);
  109. $this->assertTrue($container->hasDefinition('monolog.logger'));
  110. $this->assertTrue($container->hasDefinition('monolog.handler.custom'));
  111. $this->assertTrue($container->hasDefinition('monolog.handler.main'));
  112. $this->assertTrue($container->hasDefinition('monolog.handler.nested'));
  113. $this->assertTrue($container->hasDefinition('monolog.handler.new'));
  114. $logger = $container->getDefinition('monolog.logger');
  115. $this->assertDICDefinitionMethodCallAt(2, $logger, 'pushHandler', array(new Reference('monolog.handler.new')));
  116. $this->assertDICDefinitionMethodCallAt(1, $logger, 'pushHandler', array(new Reference('monolog.handler.custom')));
  117. $this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.main')));
  118. $handler = $container->getDefinition('monolog.handler.new');
  119. $this->assertDICDefinitionClass($handler, '%monolog.handler.stream.class%');
  120. $this->assertDICConstructorArguments($handler, array('/tmp/monolog.log', \Monolog\Logger::ERROR, true));
  121. }
  122. public function testLoadWithNewAndPriority()
  123. {
  124. $container = new ContainerBuilder();
  125. $loader = new MonologExtension();
  126. $loader->load(array(
  127. array('handlers' => array(
  128. 'custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'ERROR'),
  129. 'main' => array('type' => 'buffer', 'level' => 'INFO', 'handler' => 'nested'),
  130. 'nested' => array('type' => 'stream')
  131. )),
  132. array('handlers' => array(
  133. 'custom' => array('type' => 'stream', 'path' => '/tmp/symfony.log', 'bubble' => true, 'level' => 'WARNING'),
  134. 'first' => array('type' => 'rotating_file', 'path' => '/tmp/monolog.log', 'bubble' => true, 'level' => 'ERROR', 'priority' => 3),
  135. 'last' => array('type' => 'stream', 'path' => '/tmp/last.log', 'bubble' => true, 'level' => 'ERROR', 'priority' => -3),
  136. ))
  137. ), $container);
  138. $this->assertTrue($container->hasDefinition('monolog.logger'));
  139. $this->assertTrue($container->hasDefinition('monolog.handler.custom'));
  140. $this->assertTrue($container->hasDefinition('monolog.handler.main'));
  141. $this->assertTrue($container->hasDefinition('monolog.handler.nested'));
  142. $this->assertTrue($container->hasDefinition('monolog.handler.first'));
  143. $this->assertTrue($container->hasDefinition('monolog.handler.last'));
  144. $logger = $container->getDefinition('monolog.logger');
  145. $this->assertDICDefinitionMethodCallAt(2, $logger, 'pushHandler', array(new Reference('monolog.handler.last')));
  146. $this->assertDICDefinitionMethodCallAt(1, $logger, 'pushHandler', array(new Reference('monolog.handler.custom')));
  147. $this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.main')));
  148. $this->assertDICDefinitionMethodCallAt(2, $logger, 'pushHandler', array(new Reference('monolog.handler.first')));
  149. $handler = $container->getDefinition('monolog.handler.main');
  150. $this->assertDICDefinitionClass($handler, '%monolog.handler.buffer.class%');
  151. $this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), 0, \Monolog\Logger::INFO, false));
  152. $handler = $container->getDefinition('monolog.handler.first');
  153. $this->assertDICDefinitionClass($handler, '%monolog.handler.rotating_file.class%');
  154. $this->assertDICConstructorArguments($handler, array('/tmp/monolog.log', 0, \Monolog\Logger::ERROR, true));
  155. $handler = $container->getDefinition('monolog.handler.last');
  156. $this->assertDICDefinitionClass($handler, '%monolog.handler.stream.class%');
  157. $this->assertDICConstructorArguments($handler, array('/tmp/last.log', \Monolog\Logger::ERROR, true));
  158. }
  159. /**
  160. * @expectedException InvalidArgumentException
  161. */
  162. public function testExceptionWhenInvalidHandler()
  163. {
  164. $container = new ContainerBuilder();
  165. $loader = new MonologExtension();
  166. $loader->load(array(array('handlers' => array('main' => array('type' => 'invalid_handler')))), $container);
  167. }
  168. /**
  169. * @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  170. */
  171. public function testExceptionWhenUsingFingerscrossedWithoutHandler()
  172. {
  173. $container = new ContainerBuilder();
  174. $loader = new MonologExtension();
  175. $loader->load(array(array('handlers' => array('main' => array('type' => 'fingers_crossed')))), $container);
  176. }
  177. /**
  178. * @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  179. */
  180. public function testExceptionWhenUsingBufferWithoutHandler()
  181. {
  182. $container = new ContainerBuilder();
  183. $loader = new MonologExtension();
  184. $loader->load(array(array('handlers' => array('main' => array('type' => 'buffer')))), $container);
  185. }
  186. /**
  187. * @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  188. */
  189. public function testExceptionWhenUsingServiceWithoutId()
  190. {
  191. $container = new ContainerBuilder();
  192. $loader = new MonologExtension();
  193. $loader->load(array(array('handlers' => array('main' => array('type' => 'service')))), $container);
  194. }
  195. /**
  196. * @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  197. */
  198. public function testExceptionWhenUsingDebugName()
  199. {
  200. // logger
  201. $container = new ContainerBuilder();
  202. $loader = new MonologExtension();
  203. $loader->load(array(array('handlers' => array('debug' => array('type' => 'stream')))), $container);
  204. }
  205. /**
  206. * Assertion on the Class of a DIC Service Definition.
  207. *
  208. * @param \Symfony\Component\DependencyInjection\Definition $definition
  209. * @param string $expectedClass
  210. */
  211. protected function assertDICDefinitionClass($definition, $expectedClass)
  212. {
  213. $this->assertEquals($expectedClass, $definition->getClass(), "Expected Class of the DIC Container Service Definition is wrong.");
  214. }
  215. protected function assertDICConstructorArguments($definition, $args)
  216. {
  217. $this->assertEquals($args, $definition->getArguments(), "Expected and actual DIC Service constructor arguments of definition '" . $definition->getClass()."' don't match.");
  218. }
  219. protected function assertDICDefinitionMethodCallAt($pos, $definition, $methodName, array $params = null)
  220. {
  221. $calls = $definition->getMethodCalls();
  222. if (isset($calls[$pos][0])) {
  223. $this->assertEquals($methodName, $calls[$pos][0], "Method '".$methodName."' is expected to be called at position $pos.");
  224. if ($params !== null) {
  225. $this->assertEquals($params, $calls[$pos][1], "Expected parameters to methods '" . $methodName . "' do not match the actual parameters.");
  226. }
  227. }
  228. }
  229. }