4 * This file is part of the Monolog package.
6 * (c) Jordi Boggiano <j.boggiano@seld.be>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
14 use Monolog\Processor\WebProcessor;
15 use Monolog\Handler\TestHandler;
17 class LoggerTest extends \PHPUnit_Framework_TestCase
20 * @covers Monolog\Logger::getName
22 public function testGetName()
24 $logger = new Logger('foo');
25 $this->assertEquals('foo', $logger->getName());
29 * @covers Monolog\Logger::getLevelName
31 public function testGetLevelName()
33 $this->assertEquals('ERROR', Logger::getLevelName(Logger::ERROR));
37 * @covers Monolog\Logger::withName
39 public function testWithName()
41 $first = new Logger('first', array($handler = new TestHandler()));
42 $second = $first->withName('second');
44 $this->assertSame('first', $first->getName());
45 $this->assertSame('second', $second->getName());
46 $this->assertSame($handler, $second->popHandler());
50 * @covers Monolog\Logger::toMonologLevel
52 public function testConvertPSR3ToMonologLevel()
54 $this->assertEquals(Logger::toMonologLevel('debug'), 100);
55 $this->assertEquals(Logger::toMonologLevel('info'), 200);
56 $this->assertEquals(Logger::toMonologLevel('notice'), 250);
57 $this->assertEquals(Logger::toMonologLevel('warning'), 300);
58 $this->assertEquals(Logger::toMonologLevel('error'), 400);
59 $this->assertEquals(Logger::toMonologLevel('critical'), 500);
60 $this->assertEquals(Logger::toMonologLevel('alert'), 550);
61 $this->assertEquals(Logger::toMonologLevel('emergency'), 600);
65 * @covers Monolog\Logger::getLevelName
66 * @expectedException InvalidArgumentException
68 public function testGetLevelNameThrows()
70 Logger::getLevelName(5);
74 * @covers Monolog\Logger::__construct
76 public function testChannel()
78 $logger = new Logger('foo');
79 $handler = new TestHandler;
80 $logger->pushHandler($handler);
81 $logger->addWarning('test');
82 list($record) = $handler->getRecords();
83 $this->assertEquals('foo', $record['channel']);
87 * @covers Monolog\Logger::addRecord
89 public function testLog()
91 $logger = new Logger(__METHOD__);
93 $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'));
94 $handler->expects($this->once())
96 $logger->pushHandler($handler);
98 $this->assertTrue($logger->addWarning('test'));
102 * @covers Monolog\Logger::addRecord
104 public function testLogNotHandled()
106 $logger = new Logger(__METHOD__);
108 $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'), array(Logger::ERROR));
109 $handler->expects($this->never())
111 $logger->pushHandler($handler);
113 $this->assertFalse($logger->addWarning('test'));
116 public function testHandlersInCtor()
118 $handler1 = new TestHandler;
119 $handler2 = new TestHandler;
120 $logger = new Logger(__METHOD__, array($handler1, $handler2));
122 $this->assertEquals($handler1, $logger->popHandler());
123 $this->assertEquals($handler2, $logger->popHandler());
126 public function testProcessorsInCtor()
128 $processor1 = new WebProcessor;
129 $processor2 = new WebProcessor;
130 $logger = new Logger(__METHOD__, array(), array($processor1, $processor2));
132 $this->assertEquals($processor1, $logger->popProcessor());
133 $this->assertEquals($processor2, $logger->popProcessor());
137 * @covers Monolog\Logger::pushHandler
138 * @covers Monolog\Logger::popHandler
139 * @expectedException LogicException
141 public function testPushPopHandler()
143 $logger = new Logger(__METHOD__);
144 $handler1 = new TestHandler;
145 $handler2 = new TestHandler;
147 $logger->pushHandler($handler1);
148 $logger->pushHandler($handler2);
150 $this->assertEquals($handler2, $logger->popHandler());
151 $this->assertEquals($handler1, $logger->popHandler());
152 $logger->popHandler();
156 * @covers Monolog\Logger::setHandlers
158 public function testSetHandlers()
160 $logger = new Logger(__METHOD__);
161 $handler1 = new TestHandler;
162 $handler2 = new TestHandler;
164 $logger->pushHandler($handler1);
165 $logger->setHandlers(array($handler2));
167 // handler1 has been removed
168 $this->assertEquals(array($handler2), $logger->getHandlers());
170 $logger->setHandlers(array(
171 "AMapKey" => $handler1,
175 // Keys have been scrubbed
176 $this->assertEquals(array($handler1, $handler2), $logger->getHandlers());
180 * @covers Monolog\Logger::pushProcessor
181 * @covers Monolog\Logger::popProcessor
182 * @expectedException LogicException
184 public function testPushPopProcessor()
186 $logger = new Logger(__METHOD__);
187 $processor1 = new WebProcessor;
188 $processor2 = new WebProcessor;
190 $logger->pushProcessor($processor1);
191 $logger->pushProcessor($processor2);
193 $this->assertEquals($processor2, $logger->popProcessor());
194 $this->assertEquals($processor1, $logger->popProcessor());
195 $logger->popProcessor();
199 * @covers Monolog\Logger::pushProcessor
200 * @expectedException InvalidArgumentException
202 public function testPushProcessorWithNonCallable()
204 $logger = new Logger(__METHOD__);
206 $logger->pushProcessor(new \stdClass());
210 * @covers Monolog\Logger::addRecord
212 public function testProcessorsAreExecuted()
214 $logger = new Logger(__METHOD__);
215 $handler = new TestHandler;
216 $logger->pushHandler($handler);
217 $logger->pushProcessor(function ($record) {
218 $record['extra']['win'] = true;
222 $logger->addError('test');
223 list($record) = $handler->getRecords();
224 $this->assertTrue($record['extra']['win']);
228 * @covers Monolog\Logger::addRecord
230 public function testProcessorsAreCalledOnlyOnce()
232 $logger = new Logger(__METHOD__);
233 $handler = $this->getMock('Monolog\Handler\HandlerInterface');
234 $handler->expects($this->any())
235 ->method('isHandling')
236 ->will($this->returnValue(true))
238 $handler->expects($this->any())
240 ->will($this->returnValue(true))
242 $logger->pushHandler($handler);
244 $processor = $this->getMockBuilder('Monolog\Processor\WebProcessor')
245 ->disableOriginalConstructor()
246 ->setMethods(array('__invoke'))
249 $processor->expects($this->once())
251 ->will($this->returnArgument(0))
253 $logger->pushProcessor($processor);
255 $logger->addError('test');
259 * @covers Monolog\Logger::addRecord
261 public function testProcessorsNotCalledWhenNotHandled()
263 $logger = new Logger(__METHOD__);
264 $handler = $this->getMock('Monolog\Handler\HandlerInterface');
265 $handler->expects($this->once())
266 ->method('isHandling')
267 ->will($this->returnValue(false))
269 $logger->pushHandler($handler);
271 $logger->pushProcessor(function ($record) use ($that) {
272 $that->fail('The processor should not be called');
274 $logger->addAlert('test');
278 * @covers Monolog\Logger::addRecord
280 public function testHandlersNotCalledBeforeFirstHandling()
282 $logger = new Logger(__METHOD__);
284 $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
285 $handler1->expects($this->never())
286 ->method('isHandling')
287 ->will($this->returnValue(false))
289 $handler1->expects($this->once())
291 ->will($this->returnValue(false))
293 $logger->pushHandler($handler1);
295 $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
296 $handler2->expects($this->once())
297 ->method('isHandling')
298 ->will($this->returnValue(true))
300 $handler2->expects($this->once())
302 ->will($this->returnValue(false))
304 $logger->pushHandler($handler2);
306 $handler3 = $this->getMock('Monolog\Handler\HandlerInterface');
307 $handler3->expects($this->once())
308 ->method('isHandling')
309 ->will($this->returnValue(false))
311 $handler3->expects($this->never())
314 $logger->pushHandler($handler3);
316 $logger->debug('test');
320 * @covers Monolog\Logger::addRecord
322 public function testHandlersNotCalledBeforeFirstHandlingWithAssocArray()
324 $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
325 $handler1->expects($this->never())
326 ->method('isHandling')
327 ->will($this->returnValue(false))
329 $handler1->expects($this->once())
331 ->will($this->returnValue(false))
334 $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
335 $handler2->expects($this->once())
336 ->method('isHandling')
337 ->will($this->returnValue(true))
339 $handler2->expects($this->once())
341 ->will($this->returnValue(false))
344 $handler3 = $this->getMock('Monolog\Handler\HandlerInterface');
345 $handler3->expects($this->once())
346 ->method('isHandling')
347 ->will($this->returnValue(false))
349 $handler3->expects($this->never())
353 $logger = new Logger(__METHOD__, array('last' => $handler3, 'second' => $handler2, 'first' => $handler1));
355 $logger->debug('test');
359 * @covers Monolog\Logger::addRecord
361 public function testBubblingWhenTheHandlerReturnsFalse()
363 $logger = new Logger(__METHOD__);
365 $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
366 $handler1->expects($this->any())
367 ->method('isHandling')
368 ->will($this->returnValue(true))
370 $handler1->expects($this->once())
372 ->will($this->returnValue(false))
374 $logger->pushHandler($handler1);
376 $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
377 $handler2->expects($this->any())
378 ->method('isHandling')
379 ->will($this->returnValue(true))
381 $handler2->expects($this->once())
383 ->will($this->returnValue(false))
385 $logger->pushHandler($handler2);
387 $logger->debug('test');
391 * @covers Monolog\Logger::addRecord
393 public function testNotBubblingWhenTheHandlerReturnsTrue()
395 $logger = new Logger(__METHOD__);
397 $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
398 $handler1->expects($this->any())
399 ->method('isHandling')
400 ->will($this->returnValue(true))
402 $handler1->expects($this->never())
405 $logger->pushHandler($handler1);
407 $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
408 $handler2->expects($this->any())
409 ->method('isHandling')
410 ->will($this->returnValue(true))
412 $handler2->expects($this->once())
414 ->will($this->returnValue(true))
416 $logger->pushHandler($handler2);
418 $logger->debug('test');
422 * @covers Monolog\Logger::isHandling
424 public function testIsHandling()
426 $logger = new Logger(__METHOD__);
428 $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
429 $handler1->expects($this->any())
430 ->method('isHandling')
431 ->will($this->returnValue(false))
434 $logger->pushHandler($handler1);
435 $this->assertFalse($logger->isHandling(Logger::DEBUG));
437 $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
438 $handler2->expects($this->any())
439 ->method('isHandling')
440 ->will($this->returnValue(true))
443 $logger->pushHandler($handler2);
444 $this->assertTrue($logger->isHandling(Logger::DEBUG));
448 * @dataProvider logMethodProvider
449 * @covers Monolog\Logger::addDebug
450 * @covers Monolog\Logger::addInfo
451 * @covers Monolog\Logger::addNotice
452 * @covers Monolog\Logger::addWarning
453 * @covers Monolog\Logger::addError
454 * @covers Monolog\Logger::addCritical
455 * @covers Monolog\Logger::addAlert
456 * @covers Monolog\Logger::addEmergency
457 * @covers Monolog\Logger::debug
458 * @covers Monolog\Logger::info
459 * @covers Monolog\Logger::notice
460 * @covers Monolog\Logger::warn
461 * @covers Monolog\Logger::err
462 * @covers Monolog\Logger::crit
463 * @covers Monolog\Logger::alert
464 * @covers Monolog\Logger::emerg
466 public function testLogMethods($method, $expectedLevel)
468 $logger = new Logger('foo');
469 $handler = new TestHandler;
470 $logger->pushHandler($handler);
471 $logger->{$method}('test');
472 list($record) = $handler->getRecords();
473 $this->assertEquals($expectedLevel, $record['level']);
476 public function logMethodProvider()
480 array('addDebug', Logger::DEBUG),
481 array('addInfo', Logger::INFO),
482 array('addNotice', Logger::NOTICE),
483 array('addWarning', Logger::WARNING),
484 array('addError', Logger::ERROR),
485 array('addCritical', Logger::CRITICAL),
486 array('addAlert', Logger::ALERT),
487 array('addEmergency', Logger::EMERGENCY),
489 // ZF/Sf2 compat methods
490 array('debug', Logger::DEBUG),
491 array('info', Logger::INFO),
492 array('notice', Logger::NOTICE),
493 array('warn', Logger::WARNING),
494 array('err', Logger::ERROR),
495 array('crit', Logger::CRITICAL),
496 array('alert', Logger::ALERT),
497 array('emerg', Logger::EMERGENCY),
502 * @dataProvider setTimezoneProvider
503 * @covers Monolog\Logger::setTimezone
505 public function testSetTimezone($tz)
507 Logger::setTimezone($tz);
508 $logger = new Logger('foo');
509 $handler = new TestHandler;
510 $logger->pushHandler($handler);
511 $logger->info('test');
512 list($record) = $handler->getRecords();
513 $this->assertEquals($tz, $record['datetime']->getTimezone());
516 public function setTimezoneProvider()
519 function ($tz) { return array(new \DateTimeZone($tz)); },
520 \DateTimeZone::listIdentifiers()
525 * @dataProvider useMicrosecondTimestampsProvider
526 * @covers Monolog\Logger::useMicrosecondTimestamps
527 * @covers Monolog\Logger::addRecord
529 public function testUseMicrosecondTimestamps($micro, $assert)
531 $logger = new Logger('foo');
532 $logger->useMicrosecondTimestamps($micro);
533 $handler = new TestHandler;
534 $logger->pushHandler($handler);
535 $logger->info('test');
536 list($record) = $handler->getRecords();
537 $this->{$assert}('000000', $record['datetime']->format('u'));
540 public function useMicrosecondTimestampsProvider()
543 // this has a very small chance of a false negative (1/10^6)
544 'with microseconds' => array(true, 'assertNotSame'),
545 'without microseconds' => array(false, PHP_VERSION_ID >= 70100 ? 'assertNotSame' : 'assertSame'),