Subversion Repositories cheapmusic

Rev

Details | Last modification | View Log | RSS feed

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