wiki.techinc.nl/tests/phpunit/unit/includes/debug/logger/MonologSpiTest.php
Timo Tijhof 19b97fd575 debug: Optimize createLogger() and set UTC timezone by default
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
2023-10-05 14:16:52 +00:00

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'] );
}
}