1*d10b5556SXylle<?php 2*d10b5556SXylle 3*d10b5556SXyllenamespace Psr\Log\Test; 4*d10b5556SXylle 5*d10b5556SXylleuse Psr\Log\LoggerInterface; 6*d10b5556SXylleuse Psr\Log\LogLevel; 7*d10b5556SXylleuse PHPUnit\Framework\TestCase; 8*d10b5556SXylle 9*d10b5556SXylle/** 10*d10b5556SXylle * Provides a base test class for ensuring compliance with the LoggerInterface. 11*d10b5556SXylle * 12*d10b5556SXylle * Implementors can extend the class and implement abstract methods to run this 13*d10b5556SXylle * as part of their test suite. 14*d10b5556SXylle */ 15*d10b5556SXylleabstract class LoggerInterfaceTest extends TestCase 16*d10b5556SXylle{ 17*d10b5556SXylle /** 18*d10b5556SXylle * @return LoggerInterface 19*d10b5556SXylle */ 20*d10b5556SXylle abstract public function getLogger(); 21*d10b5556SXylle 22*d10b5556SXylle /** 23*d10b5556SXylle * This must return the log messages in order. 24*d10b5556SXylle * 25*d10b5556SXylle * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>". 26*d10b5556SXylle * 27*d10b5556SXylle * Example ->error('Foo') would yield "error Foo". 28*d10b5556SXylle * 29*d10b5556SXylle * @return string[] 30*d10b5556SXylle */ 31*d10b5556SXylle abstract public function getLogs(); 32*d10b5556SXylle 33*d10b5556SXylle public function testImplements() 34*d10b5556SXylle { 35*d10b5556SXylle $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); 36*d10b5556SXylle } 37*d10b5556SXylle 38*d10b5556SXylle /** 39*d10b5556SXylle * @dataProvider provideLevelsAndMessages 40*d10b5556SXylle */ 41*d10b5556SXylle public function testLogsAtAllLevels($level, $message) 42*d10b5556SXylle { 43*d10b5556SXylle $logger = $this->getLogger(); 44*d10b5556SXylle $logger->{$level}($message, array('user' => 'Bob')); 45*d10b5556SXylle $logger->log($level, $message, array('user' => 'Bob')); 46*d10b5556SXylle 47*d10b5556SXylle $expected = array( 48*d10b5556SXylle $level.' message of level '.$level.' with context: Bob', 49*d10b5556SXylle $level.' message of level '.$level.' with context: Bob', 50*d10b5556SXylle ); 51*d10b5556SXylle $this->assertEquals($expected, $this->getLogs()); 52*d10b5556SXylle } 53*d10b5556SXylle 54*d10b5556SXylle public function provideLevelsAndMessages() 55*d10b5556SXylle { 56*d10b5556SXylle return array( 57*d10b5556SXylle LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), 58*d10b5556SXylle LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), 59*d10b5556SXylle LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), 60*d10b5556SXylle LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), 61*d10b5556SXylle LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), 62*d10b5556SXylle LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), 63*d10b5556SXylle LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), 64*d10b5556SXylle LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), 65*d10b5556SXylle ); 66*d10b5556SXylle } 67*d10b5556SXylle 68*d10b5556SXylle /** 69*d10b5556SXylle * @expectedException \Psr\Log\InvalidArgumentException 70*d10b5556SXylle */ 71*d10b5556SXylle public function testThrowsOnInvalidLevel() 72*d10b5556SXylle { 73*d10b5556SXylle $logger = $this->getLogger(); 74*d10b5556SXylle $logger->log('invalid level', 'Foo'); 75*d10b5556SXylle } 76*d10b5556SXylle 77*d10b5556SXylle public function testContextReplacement() 78*d10b5556SXylle { 79*d10b5556SXylle $logger = $this->getLogger(); 80*d10b5556SXylle $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); 81*d10b5556SXylle 82*d10b5556SXylle $expected = array('info {Message {nothing} Bob Bar a}'); 83*d10b5556SXylle $this->assertEquals($expected, $this->getLogs()); 84*d10b5556SXylle } 85*d10b5556SXylle 86*d10b5556SXylle public function testObjectCastToString() 87*d10b5556SXylle { 88*d10b5556SXylle if (method_exists($this, 'createPartialMock')) { 89*d10b5556SXylle $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString')); 90*d10b5556SXylle } else { 91*d10b5556SXylle $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); 92*d10b5556SXylle } 93*d10b5556SXylle $dummy->expects($this->once()) 94*d10b5556SXylle ->method('__toString') 95*d10b5556SXylle ->will($this->returnValue('DUMMY')); 96*d10b5556SXylle 97*d10b5556SXylle $this->getLogger()->warning($dummy); 98*d10b5556SXylle 99*d10b5556SXylle $expected = array('warning DUMMY'); 100*d10b5556SXylle $this->assertEquals($expected, $this->getLogs()); 101*d10b5556SXylle } 102*d10b5556SXylle 103*d10b5556SXylle public function testContextCanContainAnything() 104*d10b5556SXylle { 105*d10b5556SXylle $closed = fopen('php://memory', 'r'); 106*d10b5556SXylle fclose($closed); 107*d10b5556SXylle 108*d10b5556SXylle $context = array( 109*d10b5556SXylle 'bool' => true, 110*d10b5556SXylle 'null' => null, 111*d10b5556SXylle 'string' => 'Foo', 112*d10b5556SXylle 'int' => 0, 113*d10b5556SXylle 'float' => 0.5, 114*d10b5556SXylle 'nested' => array('with object' => new DummyTest), 115*d10b5556SXylle 'object' => new \DateTime, 116*d10b5556SXylle 'resource' => fopen('php://memory', 'r'), 117*d10b5556SXylle 'closed' => $closed, 118*d10b5556SXylle ); 119*d10b5556SXylle 120*d10b5556SXylle $this->getLogger()->warning('Crazy context data', $context); 121*d10b5556SXylle 122*d10b5556SXylle $expected = array('warning Crazy context data'); 123*d10b5556SXylle $this->assertEquals($expected, $this->getLogs()); 124*d10b5556SXylle } 125*d10b5556SXylle 126*d10b5556SXylle public function testContextExceptionKeyCanBeExceptionOrOtherValues() 127*d10b5556SXylle { 128*d10b5556SXylle $logger = $this->getLogger(); 129*d10b5556SXylle $logger->warning('Random message', array('exception' => 'oops')); 130*d10b5556SXylle $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); 131*d10b5556SXylle 132*d10b5556SXylle $expected = array( 133*d10b5556SXylle 'warning Random message', 134*d10b5556SXylle 'critical Uncaught Exception!' 135*d10b5556SXylle ); 136*d10b5556SXylle $this->assertEquals($expected, $this->getLogs()); 137*d10b5556SXylle } 138*d10b5556SXylle} 139