Remove the need for wmf-config to perform dynamic 'calls'. It currently uses this to make createLogger() call setTimezone(). The reasons for this are not WMF-specific, and thus can be done here. In addition, Monolog\Logger supports a timezome argument so that we don't need to construct two objects for every logger (one in Monolog\Logger::__construct, and then another to replace it when calling setTimezone), and also remove the setTimezone call and skip the dynamic call for it. The same call overhead can also be removed for the processors and handlers array. Instead of calling push on each item, we can pass these to the constructor directly. This does mean the order will now be reversed but this is imho less surprising than before (i.e. call from first to last, instead of reversed), and to my knowledge none of our processors or handlers depend on side-effect from previous ones. Bug: T99581 Bug: T116550 Change-Id: Ib300c01c886dc8916413db65078a8356fd40a5c1
213 lines
5.6 KiB
PHP
213 lines
5.6 KiB
PHP
<?php
|
|
/**
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @file
|
|
*/
|
|
|
|
namespace MediaWiki\Logger;
|
|
|
|
use Wikimedia\TestingAccessWrapper;
|
|
|
|
/**
|
|
* @covers \MediaWiki\Logger\MonologSpi
|
|
*/
|
|
class MonologSpiTest extends \MediaWikiUnitTestCase {
|
|
|
|
public function testMergeConfig() {
|
|
$base = [
|
|
'loggers' => [
|
|
'@default' => [
|
|
'processors' => [ 'constructor' ],
|
|
'handlers' => [ 'constructor' ],
|
|
],
|
|
],
|
|
'processors' => [
|
|
'constructor' => [
|
|
'class' => 'constructor',
|
|
],
|
|
],
|
|
'handlers' => [
|
|
'constructor' => [
|
|
'class' => 'constructor',
|
|
'formatter' => 'constructor',
|
|
],
|
|
],
|
|
'formatters' => [
|
|
'constructor' => [
|
|
'class' => 'constructor',
|
|
],
|
|
],
|
|
];
|
|
|
|
$fixture = new MonologSpi( $base );
|
|
$this->assertSame(
|
|
$base,
|
|
TestingAccessWrapper::newFromObject( $fixture )->config
|
|
);
|
|
|
|
$fixture->mergeConfig( [
|
|
'loggers' => [
|
|
'merged' => [
|
|
'processors' => [ 'merged' ],
|
|
'handlers' => [ 'merged' ],
|
|
],
|
|
],
|
|
'processors' => [
|
|
'merged' => [
|
|
'class' => 'merged',
|
|
],
|
|
],
|
|
'magic' => [
|
|
'idkfa' => [ 'xyzzy' ],
|
|
],
|
|
'handlers' => [
|
|
'merged' => [
|
|
'class' => 'merged',
|
|
'formatter' => 'merged',
|
|
],
|
|
],
|
|
'formatters' => [
|
|
'merged' => [
|
|
'class' => 'merged',
|
|
],
|
|
],
|
|
] );
|
|
$this->assertSame(
|
|
[
|
|
'loggers' => [
|
|
'@default' => [
|
|
'processors' => [ 'constructor' ],
|
|
'handlers' => [ 'constructor' ],
|
|
],
|
|
'merged' => [
|
|
'processors' => [ 'merged' ],
|
|
'handlers' => [ 'merged' ],
|
|
],
|
|
],
|
|
'processors' => [
|
|
'constructor' => [
|
|
'class' => 'constructor',
|
|
],
|
|
'merged' => [
|
|
'class' => 'merged',
|
|
],
|
|
],
|
|
'handlers' => [
|
|
'constructor' => [
|
|
'class' => 'constructor',
|
|
'formatter' => 'constructor',
|
|
],
|
|
'merged' => [
|
|
'class' => 'merged',
|
|
'formatter' => 'merged',
|
|
],
|
|
],
|
|
'formatters' => [
|
|
'constructor' => [
|
|
'class' => 'constructor',
|
|
],
|
|
'merged' => [
|
|
'class' => 'merged',
|
|
],
|
|
],
|
|
'magic' => [
|
|
'idkfa' => [ 'xyzzy' ],
|
|
],
|
|
],
|
|
TestingAccessWrapper::newFromObject( $fixture )->config
|
|
);
|
|
}
|
|
|
|
public function testDefaultChannel() {
|
|
$base = [
|
|
'loggers' => [
|
|
'@default' => [
|
|
'processors' => [ 'myprocessor' ],
|
|
'handlers' => [ 'myhandler' ],
|
|
],
|
|
],
|
|
'processors' => [
|
|
'myprocessor' => [
|
|
'class' => Monolog\WikiProcessor::class,
|
|
],
|
|
],
|
|
'handlers' => [
|
|
'myhandler' => [
|
|
'class' => \Monolog\Handler\NullHandler::class,
|
|
],
|
|
],
|
|
'formatters' => [
|
|
],
|
|
];
|
|
$monologSpi = new MonologSpi( $base );
|
|
$logger = $monologSpi->getLogger( 'mychannel' );
|
|
$wrapperMonologSpi = TestingAccessWrapper::newFromObject( $monologSpi );
|
|
$this->assertInstanceOf( \Psr\Log\LoggerInterface::class, $logger );
|
|
$this->assertCount( 1, $wrapperMonologSpi->singletons['loggers'] );
|
|
$this->assertArrayHasKey( 'mychannel', $wrapperMonologSpi->singletons['loggers'] );
|
|
|
|
$actualProcessors = $logger->getProcessors();
|
|
$this->assertArrayHasKey( 0, $actualProcessors );
|
|
$this->assertInstanceOf( Monolog\WikiProcessor::class, $actualProcessors[0] );
|
|
$this->assertCount( 1, $wrapperMonologSpi->singletons['processors'] );
|
|
$this->assertArrayHasKey( 'myprocessor', $wrapperMonologSpi->singletons['processors'] );
|
|
|
|
$actualHandlers = $logger->getHandlers();
|
|
$this->assertArrayHasKey( 0, $actualHandlers );
|
|
$firstActualHandler = $actualHandlers[0];
|
|
$this->assertInstanceOf( \Monolog\Handler\NullHandler::class, $firstActualHandler );
|
|
$this->assertCount( 1, $wrapperMonologSpi->singletons['handlers'] );
|
|
$this->assertArrayHasKey( 'myhandler', $wrapperMonologSpi->singletons['handlers'] );
|
|
|
|
$this->assertCount( 0, $wrapperMonologSpi->singletons['formatters'] );
|
|
}
|
|
|
|
public function testEmptyChannel() {
|
|
$base = [
|
|
'loggers' => [
|
|
'@default' => [
|
|
'handlers' => [ 'myhandler' ],
|
|
],
|
|
'emptychannel' => [],
|
|
],
|
|
'handlers' => [
|
|
'myhandler' => [
|
|
'class' => \Monolog\Handler\NullHandler::class,
|
|
'buffer' => true,
|
|
'formatter' => 'myformatter',
|
|
],
|
|
],
|
|
'formatters' => [
|
|
'myformatter' => [
|
|
'class' => \Monolog\Formatter\LineFormatter::class,
|
|
],
|
|
],
|
|
];
|
|
$monologSpi = new MonologSpi( $base );
|
|
$logger = $monologSpi->getLogger( 'emptychannel' );
|
|
$wrapperMonologSpi = TestingAccessWrapper::newFromObject( $monologSpi );
|
|
$this->assertInstanceOf( \Psr\Log\LoggerInterface::class, $logger );
|
|
$this->assertCount( 1, $wrapperMonologSpi->singletons['loggers'] );
|
|
$this->assertArrayHasKey( 'emptychannel', $wrapperMonologSpi->singletons['loggers'] );
|
|
$actualHandlers = $logger->getHandlers();
|
|
$this->assertCount( 0, $actualHandlers );
|
|
$this->assertCount( 0, $wrapperMonologSpi->singletons['handlers'] );
|
|
$this->assertCount( 0, $wrapperMonologSpi->singletons['formatters'] );
|
|
$this->assertCount( 0, $wrapperMonologSpi->singletons['processors'] );
|
|
}
|
|
|
|
}
|