Index: src/main/php/LoggerConfigurator.php =================================================================== --- src/main/php/LoggerConfigurator.php (revision 1203327) +++ src/main/php/LoggerConfigurator.php (working copy) @@ -218,12 +218,44 @@ // Configure renderers if (isset($config['renderers']) && is_array($config['renderers'])) { - foreach($config['renderers'] as $renderer) { - $hierarchy->getRendererMap()->addRenderer($renderer['renderedClass'], $renderer['renderingClass']); + foreach($config['renderers'] as $rendererConfig) { + $this->configureRenderer($hierarchy, $rendererConfig); } } } + private function configureRenderer(LoggerHierarchy $hierarchy, $config) { + if (!isset($config['renderingClass'])) { + $this->warn("Rendering class not specified. Skipping renderers definition."); + return; + } + + $renderingClass = $config['renderingClass']; + if (!class_exists($renderingClass)) { + $this->warn("Nonexistant rendering class [$renderingClass] specified. Skipping renderers definition."); + return; + } + + $renderingClassInstance = new $renderingClass(); + if (!$renderingClassInstance instanceof LoggerRendererObject) { + $this->warn("Invalid class [$renderingClass] given. Not a valid LoggerRenderer class. Skipping renderers definition."); + return; + } + + if (!isset($config['renderedClass'])) { + $this->warn("Rendered class not specified for rendering Class [$renderingClass]. Skipping renderers definition."); + return; + } + + $renderedClass = $config['renderedClass']; + if (!class_exists($renderedClass)) { + $this->warn("Nonexistant rendered class [$renderedClass] specified for renderer [$renderingClass]. Skipping renderers definition."); + return; + } + + $hierarchy->getRendererMap()->addRenderer($renderedClass, $renderingClassInstance); + } + /** * Configures an appender based on given config and saves it to * {@link $appenders} array so it can be later linked to loggers. @@ -256,7 +288,7 @@ $this->warn("Invalid class [$class] given for appender [$name]. Not a valid LoggerAppender class. Skipping appender definition."); return; } - + // Parse the appender threshold if (isset($config['threshold'])) { $threshold = LoggerLevel::toLevel($config['threshold']); Index: src/test/php/LoggerAppenderPoolTest.php =================================================================== --- src/test/php/LoggerAppenderPoolTest.php (revision 0) +++ src/test/php/LoggerAppenderPoolTest.php (revision 0) @@ -0,0 +1,65 @@ +appenderMock = $this->getMock('LoggerAppenderConsole', array(), array(), '', false); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage log4php: Cannot add unnamed appender to pool. + */ + public function testAppenderHasNoName() { + $this->appenderMock->expects($this->once()) + ->method('getName') + ->will($this->returnValue('')); + + LoggerAppenderPool::add($this->appenderMock); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage log4php: Appender [foo] already exists in pool. Overwriting existing appender. + */ + public function testAppenderIsAdded() { + $this->appenderMock->expects($this->any()) + ->method('getName') + ->will($this->returnValue('foo')); + + LoggerAppenderPool::add($this->appenderMock); + LoggerAppenderPool::add($this->appenderMock); + + $expected = 1; + $actual = count(LoggerAppenderPool::getAppenders()); + $this->assertEquals($expected, $actual); + } +} Index: src/test/php/LoggerConfiguratorTest.php =================================================================== --- src/test/php/LoggerConfiguratorTest.php (revision 1203327) +++ src/test/php/LoggerConfiguratorTest.php (working copy) @@ -47,6 +47,172 @@ } /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Invalid configuration param given. Reverting to default configuration. + */ + public function testInputIsInteger() { + Logger::configure(12345); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage log4php: Configuration failed. Unsupported configuration file extension: yml + */ + public function testYAMLFile() { + Logger::configure(__DIR__ .'/../ressources/configs/config.yml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Invalid configuration provided for appender + */ + public function testAppenderConfigNotArray() { + $hierachyMock = $this->getMock('LoggerHierarchy', array(), array(), '', false); + + $config = array( + 'appenders' => array( + 'default', + ), + ); + + $configurator = new LoggerConfigurator(); + $configurator->configure($hierachyMock, $config); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage No class given for appender + */ + public function testNoAppenderClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/appenders/config_no_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Invalid class [unknownClass] given for appender [foo]. Class does not exist. Skipping appender definition. + */ + public function testNotExistingAppenderClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/appenders/config_not_existing_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Invalid class [stdClass] given for appender [foo]. Not a valid LoggerAppender class. Skipping appender definition. + */ + public function testInvalidAppenderClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/appenders/config_invalid_appender_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Nonexistant filter class [Foo] specified on appender [foo]. Skipping filter definition. + */ + public function testNotExistingAppenderFilterClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/appenders/config_not_existing_filter_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Nonexistant option [fooParameter] specified on [LoggerFilterStringMatch]. Skipping. + */ + public function testInvalidAppenderFilterParamter() { + Logger::configure(__DIR__ .'/../ressources/configs/appenders/config_invalid_filter_parameters.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Invalid filter class [stdClass] sepcified on appender [foo]. Skipping filter definition. + */ + public function testInvalidAppenderFilterClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/appenders/config_invalid_filter_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Nonexistant layout class [Foo] specified for appender [foo]. Reverting to default layout. + */ + public function testNotExistingAppenderLayoutClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/appenders/config_not_existing_layout_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Invalid layout class [stdClass] sepcified for appender [foo]. Reverting to default layout. + */ + public function testInvalidAppenderLayoutClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/appenders/config_invalid_layout_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Layout class not specified for appender [foo]. Reverting to default layout. + */ + public function testNoAppenderLayoutClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/appenders/config_no_layout_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Invalid class [stdClass] given. Not a valid LoggerRenderer class. Skipping renderers definition. + */ + public function testInvalidRenderingClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/renderers/config_invalid_rendering_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Rendering class not specified. Skipping renderers definition. + */ + public function testNoRenderingClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/renderers/config_no_rendering_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Rendered class not specified for rendering Class [LoggerRendererDefault]. Skipping renderers definition. + */ + public function testNoRenderedClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/renderers/config_no_rendered_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Nonexistant rendered class [RenderFooClass] specified for renderer [LoggerRendererDefault]. Skipping renderers definition. + */ + public function testNotExistingRenderedClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/renderers/config_not_existing_rendered_class.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Nonexistant rendering class [FooRenderer] specified. Skipping renderers definition. + */ + public function testNotExistingRenderingClassSet() { + Logger::configure(__DIR__ .'/../ressources/configs/renderers/config_not_existing_rendering_class.xml'); + } + +//---------------------- + + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Invalid additivity value [4711] specified for logger [myLogger]. + */ + public function testInvalidLoggerAddivity() { + Logger::configure(__DIR__ .'/../ressources/configs/loggers/config_invalid_additivity.xml'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Nonexistnant appender [unknownAppender] linked to logger [myLogger]. + */ + public function testNotExistingLoggerAppendersClass() { + Logger::configure(__DIR__ .'/../ressources/configs/loggers/config_not_existing_appenders.xml'); + } + + +//---------------------- + /** * Test that an error is reported when config file is not found. * @expectedException PHPUnit_Framework_Error * @expectedExceptionMessage log4php: Configuration failed. File not found @@ -63,15 +229,27 @@ } public function testAppendersWithLayout() { - Logger::configure(array( + $config = Logger::configure(array( 'rootLogger' => array( 'appenders' => array('app1', 'app2') ), + 'loggers' => array( + 'myLogger' => array( + 'appenders' => array('app1'), + 'additivity'=> true + ) + ), + 'renderers' => array( + array('renderedClass' => 'stdClass', 'renderingClass' => 'LoggerRendererDefault') + ), 'appenders' => array( 'app1' => array( 'class' => 'LoggerAppenderEcho', 'layout' => array( 'class' => 'LoggerLayoutSimple' + ), + 'params' => array( + 'htmlLineBreaks' => false ) ), 'app2' => array( @@ -81,6 +259,15 @@ 'params' => array( 'conversionPattern' => 'message: %m%n' ) + ), + 'filters' => array( + array( + 'class' => 'LoggerFilterStringMatch', + 'params'=> array( + 'stringToMatch' => 'foo', + 'acceptOnMatch' => false + ) + ) ) ), ) Index: src/test/ressources/configs/appenders/config_no_layout_class.xml =================================================================== --- src/test/ressources/configs/appenders/config_no_layout_class.xml (revision 0) +++ src/test/ressources/configs/appenders/config_no_layout_class.xml (revision 0) @@ -0,0 +1,11 @@ + + + + + + + + + + + Index: src/test/ressources/configs/appenders/config_no_class.xml =================================================================== --- src/test/ressources/configs/appenders/config_no_class.xml (revision 0) +++ src/test/ressources/configs/appenders/config_no_class.xml (revision 0) @@ -0,0 +1,10 @@ + + + + + + + + + + Index: src/test/ressources/configs/appenders/config_invalid_appender_class.xml =================================================================== --- src/test/ressources/configs/appenders/config_invalid_appender_class.xml (revision 0) +++ src/test/ressources/configs/appenders/config_invalid_appender_class.xml (revision 0) @@ -0,0 +1,9 @@ + + + + + + + + + Index: src/test/ressources/configs/appenders/config_invalid_layout_class.xml =================================================================== --- src/test/ressources/configs/appenders/config_invalid_layout_class.xml (revision 0) +++ src/test/ressources/configs/appenders/config_invalid_layout_class.xml (revision 0) @@ -0,0 +1,11 @@ + + + + + + + + + + + Index: src/test/ressources/configs/appenders/config_invalid_filter_class.xml =================================================================== --- src/test/ressources/configs/appenders/config_invalid_filter_class.xml (revision 0) +++ src/test/ressources/configs/appenders/config_invalid_filter_class.xml (revision 0) @@ -0,0 +1,11 @@ + + + + + + + + + + + Index: src/test/ressources/configs/appenders/config_invalid_filter_parameters.xml =================================================================== --- src/test/ressources/configs/appenders/config_invalid_filter_parameters.xml (revision 0) +++ src/test/ressources/configs/appenders/config_invalid_filter_parameters.xml (revision 0) @@ -0,0 +1,13 @@ + + + + + + + + + + + + + Index: src/test/ressources/configs/appenders/config_not_existing_filter_class.xml =================================================================== --- src/test/ressources/configs/appenders/config_not_existing_filter_class.xml (revision 0) +++ src/test/ressources/configs/appenders/config_not_existing_filter_class.xml (revision 0) @@ -0,0 +1,11 @@ + + + + + + + + + + + Index: src/test/ressources/configs/appenders/config_not_existing_class.xml =================================================================== --- src/test/ressources/configs/appenders/config_not_existing_class.xml (revision 0) +++ src/test/ressources/configs/appenders/config_not_existing_class.xml (revision 0) @@ -0,0 +1,9 @@ + + + + + + + + + Index: src/test/ressources/configs/appenders/config_not_existing_layout_class.xml =================================================================== --- src/test/ressources/configs/appenders/config_not_existing_layout_class.xml (revision 0) +++ src/test/ressources/configs/appenders/config_not_existing_layout_class.xml (revision 0) @@ -0,0 +1,11 @@ + + + + + + + + + + + Index: src/test/ressources/configs/loggers/config_invalid_additivity.xml =================================================================== --- src/test/ressources/configs/loggers/config_invalid_additivity.xml (revision 0) +++ src/test/ressources/configs/loggers/config_invalid_additivity.xml (revision 0) @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + Index: src/test/ressources/configs/loggers/config_not_existing_appenders.xml =================================================================== --- src/test/ressources/configs/loggers/config_not_existing_appenders.xml (revision 0) +++ src/test/ressources/configs/loggers/config_not_existing_appenders.xml (revision 0) @@ -0,0 +1,7 @@ + + + + + + + Index: src/test/ressources/configs/config.yml =================================================================== Index: src/test/ressources/configs/config1.xml =================================================================== --- src/test/ressources/configs/config1.xml (revision 0) +++ src/test/ressources/configs/config1.xml (revision 0) @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: src/test/ressources/configs/renderers/config_invalid_rendering_class.xml =================================================================== --- src/test/ressources/configs/renderers/config_invalid_rendering_class.xml (revision 0) +++ src/test/ressources/configs/renderers/config_invalid_rendering_class.xml (revision 0) @@ -0,0 +1,13 @@ + + + + + + + + + + + + + Index: src/test/ressources/configs/renderers/config_no_rendered_class.xml =================================================================== --- src/test/ressources/configs/renderers/config_no_rendered_class.xml (revision 0) +++ src/test/ressources/configs/renderers/config_no_rendered_class.xml (revision 0) @@ -0,0 +1,13 @@ + + + + + + + + + + + + + Index: src/test/ressources/configs/renderers/config_not_existing_rendered_class.xml =================================================================== --- src/test/ressources/configs/renderers/config_not_existing_rendered_class.xml (revision 0) +++ src/test/ressources/configs/renderers/config_not_existing_rendered_class.xml (revision 0) @@ -0,0 +1,13 @@ + + + + + + + + + + + + + Index: src/test/ressources/configs/renderers/config_not_existing_rendering_class.xml =================================================================== --- src/test/ressources/configs/renderers/config_not_existing_rendering_class.xml (revision 0) +++ src/test/ressources/configs/renderers/config_not_existing_rendering_class.xml (revision 0) @@ -0,0 +1,13 @@ + + + + + + + + + + + + + Index: src/test/ressources/configs/renderers/config_no_rendering_class.xml =================================================================== --- src/test/ressources/configs/renderers/config_no_rendering_class.xml (revision 0) +++ src/test/ressources/configs/renderers/config_no_rendering_class.xml (revision 0) @@ -0,0 +1,13 @@ + + + + + + + + + + + + +