View source
<?php
namespace Drupal\Tests\Core\Logger;
use Drupal\Core\Logger\LoggerChannel;
use Drupal\Core\Session\AccountInterface;
use Drupal\Tests\UnitTestCase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Psr\Log\LoggerInterface;
use Psr\Log\LoggerTrait;
class LoggerChannelTest extends UnitTestCase {
public function testLog(callable $expected, Request $request = NULL, AccountInterface $current_user = NULL) {
$channel = new LoggerChannel('test');
$message = $this
->randomMachineName();
$logger = $this
->createMock('Psr\\Log\\LoggerInterface');
$logger
->expects($this
->once())
->method('log')
->with($this
->anything(), $message, $this
->callback($expected));
$channel
->addLogger($logger);
if ($request) {
$requestStack = new RequestStack();
$requestStack
->push($request);
$channel
->setRequestStack($requestStack);
}
if ($current_user) {
$channel
->setCurrentUser($current_user);
}
$channel
->log(rand(0, 7), $message);
}
public function testLogRecursionProtection() {
$channel = new LoggerChannel('test');
$logger = $this
->createMock('Psr\\Log\\LoggerInterface');
$logger
->expects($this
->exactly(LoggerChannel::MAX_CALL_DEPTH))
->method('log');
$channel
->addLogger($logger);
$channel
->addLogger(new NaughtyRecursiveLogger($channel));
$channel
->log(rand(0, 7), $this
->randomMachineName());
}
public function testSortLoggers() {
$channel = new LoggerChannel($this
->randomMachineName());
$index_order = '';
for ($i = 0; $i < 4; $i++) {
$logger = $this
->createMock('Psr\\Log\\LoggerInterface');
$logger
->expects($this
->once())
->method('log')
->willReturnCallback(function () use ($i, &$index_order) {
$index_order .= $i;
});
$channel
->addLogger($logger, $i);
}
$channel
->log(rand(0, 7), $this
->randomMachineName());
$this
->assertEquals('3210', $index_order);
}
public function providerTestLog() {
$account_mock = $this
->createMock('Drupal\\Core\\Session\\AccountInterface');
$account_mock
->expects($this
->any())
->method('id')
->will($this
->returnValue(1));
$request_mock = $this
->getMockBuilder('Symfony\\Component\\HttpFoundation\\Request')
->setMethods([
'getClientIp',
])
->getMock();
$request_mock
->expects($this
->any())
->method('getClientIp')
->will($this
->returnValue('127.0.0.1'));
$request_mock->headers = $this
->createMock('Symfony\\Component\\HttpFoundation\\ParameterBag');
$cases[] = [
function ($context) {
return $context['channel'] == 'test' && empty($context['uid']) && empty($context['ip']);
},
];
$cases[] = [
function ($context) {
return $context['uid'] === 0 && empty($context['ip']);
},
NULL,
$account_mock,
];
$cases[] = [
function ($context) {
return $context['ip'] === '127.0.0.1' && empty($context['uid']);
},
$request_mock,
];
$cases[] = [
function ($context) {
return $context['ip'] === '127.0.0.1' && $context['uid'] === 1;
},
$request_mock,
$account_mock,
];
return $cases;
}
}
class NaughtyRecursiveLogger implements LoggerInterface {
use LoggerTrait;
protected $channel;
protected $message;
public function __construct(LoggerChannel $channel) {
$this->channel = $channel;
}
public function log($level, $message, array $context = []) {
$this->channel
->log(rand(0, 7), $message, $context);
}
}