Ingen beskrivning

LoggerTest.php 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. <?php
  2. /*
  3. * This file is part of the Monolog package.
  4. *
  5. * (c) Jordi Boggiano <j.boggiano@seld.be>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Monolog;
  11. use Monolog\Processor\WebProcessor;
  12. use Monolog\Handler\TestHandler;
  13. class LoggerTest extends \PHPUnit_Framework_TestCase
  14. {
  15. /**
  16. * @covers Monolog\Logger::getName
  17. */
  18. public function testGetName()
  19. {
  20. $logger = new Logger('foo');
  21. $this->assertEquals('foo', $logger->getName());
  22. }
  23. /**
  24. * @covers Monolog\Logger::getLevelName
  25. */
  26. public function testGetLevelName()
  27. {
  28. $this->assertEquals('ERROR', Logger::getLevelName(Logger::ERROR));
  29. }
  30. /**
  31. * @covers Monolog\Logger::withName
  32. */
  33. public function testWithName()
  34. {
  35. $first = new Logger('first', array($handler = new TestHandler()));
  36. $second = $first->withName('second');
  37. $this->assertSame('first', $first->getName());
  38. $this->assertSame('second', $second->getName());
  39. $this->assertSame($handler, $second->popHandler());
  40. }
  41. /**
  42. * @covers Monolog\Logger::toMonologLevel
  43. */
  44. public function testConvertPSR3ToMonologLevel()
  45. {
  46. $this->assertEquals(Logger::toMonologLevel('debug'), 100);
  47. $this->assertEquals(Logger::toMonologLevel('info'), 200);
  48. $this->assertEquals(Logger::toMonologLevel('notice'), 250);
  49. $this->assertEquals(Logger::toMonologLevel('warning'), 300);
  50. $this->assertEquals(Logger::toMonologLevel('error'), 400);
  51. $this->assertEquals(Logger::toMonologLevel('critical'), 500);
  52. $this->assertEquals(Logger::toMonologLevel('alert'), 550);
  53. $this->assertEquals(Logger::toMonologLevel('emergency'), 600);
  54. }
  55. /**
  56. * @covers Monolog\Logger::getLevelName
  57. * @expectedException InvalidArgumentException
  58. */
  59. public function testGetLevelNameThrows()
  60. {
  61. Logger::getLevelName(5);
  62. }
  63. /**
  64. * @covers Monolog\Logger::__construct
  65. */
  66. public function testChannel()
  67. {
  68. $logger = new Logger('foo');
  69. $handler = new TestHandler;
  70. $logger->pushHandler($handler);
  71. $logger->addWarning('test');
  72. list($record) = $handler->getRecords();
  73. $this->assertEquals('foo', $record['channel']);
  74. }
  75. /**
  76. * @covers Monolog\Logger::addRecord
  77. */
  78. public function testLog()
  79. {
  80. $logger = new Logger(__METHOD__);
  81. $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'));
  82. $handler->expects($this->once())
  83. ->method('handle');
  84. $logger->pushHandler($handler);
  85. $this->assertTrue($logger->addWarning('test'));
  86. }
  87. /**
  88. * @covers Monolog\Logger::addRecord
  89. */
  90. public function testLogNotHandled()
  91. {
  92. $logger = new Logger(__METHOD__);
  93. $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'), array(Logger::ERROR));
  94. $handler->expects($this->never())
  95. ->method('handle');
  96. $logger->pushHandler($handler);
  97. $this->assertFalse($logger->addWarning('test'));
  98. }
  99. public function testHandlersInCtor()
  100. {
  101. $handler1 = new TestHandler;
  102. $handler2 = new TestHandler;
  103. $logger = new Logger(__METHOD__, array($handler1, $handler2));
  104. $this->assertEquals($handler1, $logger->popHandler());
  105. $this->assertEquals($handler2, $logger->popHandler());
  106. }
  107. public function testProcessorsInCtor()
  108. {
  109. $processor1 = new WebProcessor;
  110. $processor2 = new WebProcessor;
  111. $logger = new Logger(__METHOD__, array(), array($processor1, $processor2));
  112. $this->assertEquals($processor1, $logger->popProcessor());
  113. $this->assertEquals($processor2, $logger->popProcessor());
  114. }
  115. /**
  116. * @covers Monolog\Logger::pushHandler
  117. * @covers Monolog\Logger::popHandler
  118. * @expectedException LogicException
  119. */
  120. public function testPushPopHandler()
  121. {
  122. $logger = new Logger(__METHOD__);
  123. $handler1 = new TestHandler;
  124. $handler2 = new TestHandler;
  125. $logger->pushHandler($handler1);
  126. $logger->pushHandler($handler2);
  127. $this->assertEquals($handler2, $logger->popHandler());
  128. $this->assertEquals($handler1, $logger->popHandler());
  129. $logger->popHandler();
  130. }
  131. /**
  132. * @covers Monolog\Logger::setHandlers
  133. */
  134. public function testSetHandlers()
  135. {
  136. $logger = new Logger(__METHOD__);
  137. $handler1 = new TestHandler;
  138. $handler2 = new TestHandler;
  139. $logger->pushHandler($handler1);
  140. $logger->setHandlers(array($handler2));
  141. // handler1 has been removed
  142. $this->assertEquals(array($handler2), $logger->getHandlers());
  143. $logger->setHandlers(array(
  144. "AMapKey" => $handler1,
  145. "Woop" => $handler2,
  146. ));
  147. // Keys have been scrubbed
  148. $this->assertEquals(array($handler1, $handler2), $logger->getHandlers());
  149. }
  150. /**
  151. * @covers Monolog\Logger::pushProcessor
  152. * @covers Monolog\Logger::popProcessor
  153. * @expectedException LogicException
  154. */
  155. public function testPushPopProcessor()
  156. {
  157. $logger = new Logger(__METHOD__);
  158. $processor1 = new WebProcessor;
  159. $processor2 = new WebProcessor;
  160. $logger->pushProcessor($processor1);
  161. $logger->pushProcessor($processor2);
  162. $this->assertEquals($processor2, $logger->popProcessor());
  163. $this->assertEquals($processor1, $logger->popProcessor());
  164. $logger->popProcessor();
  165. }
  166. /**
  167. * @covers Monolog\Logger::pushProcessor
  168. * @expectedException InvalidArgumentException
  169. */
  170. public function testPushProcessorWithNonCallable()
  171. {
  172. $logger = new Logger(__METHOD__);
  173. $logger->pushProcessor(new \stdClass());
  174. }
  175. /**
  176. * @covers Monolog\Logger::addRecord
  177. */
  178. public function testProcessorsAreExecuted()
  179. {
  180. $logger = new Logger(__METHOD__);
  181. $handler = new TestHandler;
  182. $logger->pushHandler($handler);
  183. $logger->pushProcessor(function ($record) {
  184. $record['extra']['win'] = true;
  185. return $record;
  186. });
  187. $logger->addError('test');
  188. list($record) = $handler->getRecords();
  189. $this->assertTrue($record['extra']['win']);
  190. }
  191. /**
  192. * @covers Monolog\Logger::addRecord
  193. */
  194. public function testProcessorsAreCalledOnlyOnce()
  195. {
  196. $logger = new Logger(__METHOD__);
  197. $handler = $this->getMock('Monolog\Handler\HandlerInterface');
  198. $handler->expects($this->any())
  199. ->method('isHandling')
  200. ->will($this->returnValue(true))
  201. ;
  202. $handler->expects($this->any())
  203. ->method('handle')
  204. ->will($this->returnValue(true))
  205. ;
  206. $logger->pushHandler($handler);
  207. $processor = $this->getMockBuilder('Monolog\Processor\WebProcessor')
  208. ->disableOriginalConstructor()
  209. ->setMethods(array('__invoke'))
  210. ->getMock()
  211. ;
  212. $processor->expects($this->once())
  213. ->method('__invoke')
  214. ->will($this->returnArgument(0))
  215. ;
  216. $logger->pushProcessor($processor);
  217. $logger->addError('test');
  218. }
  219. /**
  220. * @covers Monolog\Logger::addRecord
  221. */
  222. public function testProcessorsNotCalledWhenNotHandled()
  223. {
  224. $logger = new Logger(__METHOD__);
  225. $handler = $this->getMock('Monolog\Handler\HandlerInterface');
  226. $handler->expects($this->once())
  227. ->method('isHandling')
  228. ->will($this->returnValue(false))
  229. ;
  230. $logger->pushHandler($handler);
  231. $that = $this;
  232. $logger->pushProcessor(function ($record) use ($that) {
  233. $that->fail('The processor should not be called');
  234. });
  235. $logger->addAlert('test');
  236. }
  237. /**
  238. * @covers Monolog\Logger::addRecord
  239. */
  240. public function testHandlersNotCalledBeforeFirstHandling()
  241. {
  242. $logger = new Logger(__METHOD__);
  243. $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
  244. $handler1->expects($this->never())
  245. ->method('isHandling')
  246. ->will($this->returnValue(false))
  247. ;
  248. $handler1->expects($this->once())
  249. ->method('handle')
  250. ->will($this->returnValue(false))
  251. ;
  252. $logger->pushHandler($handler1);
  253. $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
  254. $handler2->expects($this->once())
  255. ->method('isHandling')
  256. ->will($this->returnValue(true))
  257. ;
  258. $handler2->expects($this->once())
  259. ->method('handle')
  260. ->will($this->returnValue(false))
  261. ;
  262. $logger->pushHandler($handler2);
  263. $handler3 = $this->getMock('Monolog\Handler\HandlerInterface');
  264. $handler3->expects($this->once())
  265. ->method('isHandling')
  266. ->will($this->returnValue(false))
  267. ;
  268. $handler3->expects($this->never())
  269. ->method('handle')
  270. ;
  271. $logger->pushHandler($handler3);
  272. $logger->debug('test');
  273. }
  274. /**
  275. * @covers Monolog\Logger::addRecord
  276. */
  277. public function testHandlersNotCalledBeforeFirstHandlingWithAssocArray()
  278. {
  279. $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
  280. $handler1->expects($this->never())
  281. ->method('isHandling')
  282. ->will($this->returnValue(false))
  283. ;
  284. $handler1->expects($this->once())
  285. ->method('handle')
  286. ->will($this->returnValue(false))
  287. ;
  288. $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
  289. $handler2->expects($this->once())
  290. ->method('isHandling')
  291. ->will($this->returnValue(true))
  292. ;
  293. $handler2->expects($this->once())
  294. ->method('handle')
  295. ->will($this->returnValue(false))
  296. ;
  297. $handler3 = $this->getMock('Monolog\Handler\HandlerInterface');
  298. $handler3->expects($this->once())
  299. ->method('isHandling')
  300. ->will($this->returnValue(false))
  301. ;
  302. $handler3->expects($this->never())
  303. ->method('handle')
  304. ;
  305. $logger = new Logger(__METHOD__, array('last' => $handler3, 'second' => $handler2, 'first' => $handler1));
  306. $logger->debug('test');
  307. }
  308. /**
  309. * @covers Monolog\Logger::addRecord
  310. */
  311. public function testBubblingWhenTheHandlerReturnsFalse()
  312. {
  313. $logger = new Logger(__METHOD__);
  314. $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
  315. $handler1->expects($this->any())
  316. ->method('isHandling')
  317. ->will($this->returnValue(true))
  318. ;
  319. $handler1->expects($this->once())
  320. ->method('handle')
  321. ->will($this->returnValue(false))
  322. ;
  323. $logger->pushHandler($handler1);
  324. $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
  325. $handler2->expects($this->any())
  326. ->method('isHandling')
  327. ->will($this->returnValue(true))
  328. ;
  329. $handler2->expects($this->once())
  330. ->method('handle')
  331. ->will($this->returnValue(false))
  332. ;
  333. $logger->pushHandler($handler2);
  334. $logger->debug('test');
  335. }
  336. /**
  337. * @covers Monolog\Logger::addRecord
  338. */
  339. public function testNotBubblingWhenTheHandlerReturnsTrue()
  340. {
  341. $logger = new Logger(__METHOD__);
  342. $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
  343. $handler1->expects($this->any())
  344. ->method('isHandling')
  345. ->will($this->returnValue(true))
  346. ;
  347. $handler1->expects($this->never())
  348. ->method('handle')
  349. ;
  350. $logger->pushHandler($handler1);
  351. $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
  352. $handler2->expects($this->any())
  353. ->method('isHandling')
  354. ->will($this->returnValue(true))
  355. ;
  356. $handler2->expects($this->once())
  357. ->method('handle')
  358. ->will($this->returnValue(true))
  359. ;
  360. $logger->pushHandler($handler2);
  361. $logger->debug('test');
  362. }
  363. /**
  364. * @covers Monolog\Logger::isHandling
  365. */
  366. public function testIsHandling()
  367. {
  368. $logger = new Logger(__METHOD__);
  369. $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
  370. $handler1->expects($this->any())
  371. ->method('isHandling')
  372. ->will($this->returnValue(false))
  373. ;
  374. $logger->pushHandler($handler1);
  375. $this->assertFalse($logger->isHandling(Logger::DEBUG));
  376. $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
  377. $handler2->expects($this->any())
  378. ->method('isHandling')
  379. ->will($this->returnValue(true))
  380. ;
  381. $logger->pushHandler($handler2);
  382. $this->assertTrue($logger->isHandling(Logger::DEBUG));
  383. }
  384. /**
  385. * @dataProvider logMethodProvider
  386. * @covers Monolog\Logger::addDebug
  387. * @covers Monolog\Logger::addInfo
  388. * @covers Monolog\Logger::addNotice
  389. * @covers Monolog\Logger::addWarning
  390. * @covers Monolog\Logger::addError
  391. * @covers Monolog\Logger::addCritical
  392. * @covers Monolog\Logger::addAlert
  393. * @covers Monolog\Logger::addEmergency
  394. * @covers Monolog\Logger::debug
  395. * @covers Monolog\Logger::info
  396. * @covers Monolog\Logger::notice
  397. * @covers Monolog\Logger::warn
  398. * @covers Monolog\Logger::err
  399. * @covers Monolog\Logger::crit
  400. * @covers Monolog\Logger::alert
  401. * @covers Monolog\Logger::emerg
  402. */
  403. public function testLogMethods($method, $expectedLevel)
  404. {
  405. $logger = new Logger('foo');
  406. $handler = new TestHandler;
  407. $logger->pushHandler($handler);
  408. $logger->{$method}('test');
  409. list($record) = $handler->getRecords();
  410. $this->assertEquals($expectedLevel, $record['level']);
  411. }
  412. public function logMethodProvider()
  413. {
  414. return array(
  415. // monolog methods
  416. array('addDebug', Logger::DEBUG),
  417. array('addInfo', Logger::INFO),
  418. array('addNotice', Logger::NOTICE),
  419. array('addWarning', Logger::WARNING),
  420. array('addError', Logger::ERROR),
  421. array('addCritical', Logger::CRITICAL),
  422. array('addAlert', Logger::ALERT),
  423. array('addEmergency', Logger::EMERGENCY),
  424. // ZF/Sf2 compat methods
  425. array('debug', Logger::DEBUG),
  426. array('info', Logger::INFO),
  427. array('notice', Logger::NOTICE),
  428. array('warn', Logger::WARNING),
  429. array('err', Logger::ERROR),
  430. array('crit', Logger::CRITICAL),
  431. array('alert', Logger::ALERT),
  432. array('emerg', Logger::EMERGENCY),
  433. );
  434. }
  435. /**
  436. * @dataProvider setTimezoneProvider
  437. * @covers Monolog\Logger::setTimezone
  438. */
  439. public function testSetTimezone($tz)
  440. {
  441. Logger::setTimezone($tz);
  442. $logger = new Logger('foo');
  443. $handler = new TestHandler;
  444. $logger->pushHandler($handler);
  445. $logger->info('test');
  446. list($record) = $handler->getRecords();
  447. $this->assertEquals($tz, $record['datetime']->getTimezone());
  448. }
  449. public function setTimezoneProvider()
  450. {
  451. return array_map(
  452. function ($tz) { return array(new \DateTimeZone($tz)); },
  453. \DateTimeZone::listIdentifiers()
  454. );
  455. }
  456. /**
  457. * @dataProvider useMicrosecondTimestampsProvider
  458. * @covers Monolog\Logger::useMicrosecondTimestamps
  459. * @covers Monolog\Logger::addRecord
  460. */
  461. public function testUseMicrosecondTimestamps($micro, $assert)
  462. {
  463. $logger = new Logger('foo');
  464. $logger->useMicrosecondTimestamps($micro);
  465. $handler = new TestHandler;
  466. $logger->pushHandler($handler);
  467. $logger->info('test');
  468. list($record) = $handler->getRecords();
  469. $this->{$assert}('000000', $record['datetime']->format('u'));
  470. }
  471. public function useMicrosecondTimestampsProvider()
  472. {
  473. return array(
  474. // this has a very small chance of a false negative (1/10^6)
  475. 'with microseconds' => array(true, 'assertNotSame'),
  476. 'without microseconds' => array(false, PHP_VERSION_ID >= 70100 ? 'assertNotSame' : 'assertSame'),
  477. );
  478. }
  479. }