LoggerTest.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. <?php declare(strict_types=1);
  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', [$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->warning('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->prophesize('Monolog\Handler\NullHandler');
  82. $handler->handle(\Prophecy\Argument::any())->shouldBeCalled();
  83. $handler->isHandling(['level' => 300])->willReturn(true);
  84. $logger->pushHandler($handler->reveal());
  85. $this->assertTrue($logger->addRecord(Logger::WARNING, 'test'));
  86. }
  87. /**
  88. * @covers Monolog\Logger::addRecord
  89. */
  90. public function testLogNotHandled()
  91. {
  92. $logger = new Logger(__METHOD__);
  93. $handler = $this->prophesize('Monolog\Handler\NullHandler');
  94. $handler->handle()->shouldNotBeCalled();
  95. $handler->isHandling(['level' => 300])->willReturn(false);
  96. $logger->pushHandler($handler->reveal());
  97. $this->assertFalse($logger->addRecord(Logger::WARNING, 'test'));
  98. }
  99. public function testHandlersInCtor()
  100. {
  101. $handler1 = new TestHandler;
  102. $handler2 = new TestHandler;
  103. $logger = new Logger(__METHOD__, [$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__, [], [$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([$handler2]);
  141. // handler1 has been removed
  142. $this->assertEquals([$handler2], $logger->getHandlers());
  143. $logger->setHandlers([
  144. "AMapKey" => $handler1,
  145. "Woop" => $handler2,
  146. ]);
  147. // Keys have been scrubbed
  148. $this->assertEquals([$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::addRecord
  168. */
  169. public function testProcessorsAreExecuted()
  170. {
  171. $logger = new Logger(__METHOD__);
  172. $handler = new TestHandler;
  173. $logger->pushHandler($handler);
  174. $logger->pushProcessor(function ($record) {
  175. $record['extra']['win'] = true;
  176. return $record;
  177. });
  178. $logger->error('test');
  179. list($record) = $handler->getRecords();
  180. $this->assertTrue($record['extra']['win']);
  181. }
  182. /**
  183. * @covers Monolog\Logger::addRecord
  184. */
  185. public function testProcessorsAreCalledOnlyOnce()
  186. {
  187. $logger = new Logger(__METHOD__);
  188. $handler = $this->createMock('Monolog\Handler\HandlerInterface');
  189. $handler->expects($this->any())
  190. ->method('isHandling')
  191. ->will($this->returnValue(true))
  192. ;
  193. $handler->expects($this->any())
  194. ->method('handle')
  195. ->will($this->returnValue(true))
  196. ;
  197. $logger->pushHandler($handler);
  198. $processor = $this->getMockBuilder('Monolog\Processor\WebProcessor')
  199. ->disableOriginalConstructor()
  200. ->setMethods(['__invoke'])
  201. ->getMock()
  202. ;
  203. $processor->expects($this->once())
  204. ->method('__invoke')
  205. ->will($this->returnArgument(0))
  206. ;
  207. $logger->pushProcessor($processor);
  208. $logger->error('test');
  209. }
  210. /**
  211. * @covers Monolog\Logger::addRecord
  212. */
  213. public function testProcessorsNotCalledWhenNotHandled()
  214. {
  215. $logger = new Logger(__METHOD__);
  216. $handler = $this->createMock('Monolog\Handler\HandlerInterface');
  217. $handler->expects($this->once())
  218. ->method('isHandling')
  219. ->will($this->returnValue(false))
  220. ;
  221. $logger->pushHandler($handler);
  222. $that = $this;
  223. $logger->pushProcessor(function ($record) use ($that) {
  224. $that->fail('The processor should not be called');
  225. });
  226. $logger->alert('test');
  227. }
  228. /**
  229. * @covers Monolog\Logger::addRecord
  230. */
  231. public function testHandlersNotCalledBeforeFirstHandling()
  232. {
  233. $logger = new Logger(__METHOD__);
  234. $handler1 = $this->createMock('Monolog\Handler\HandlerInterface');
  235. $handler1->expects($this->never())
  236. ->method('isHandling')
  237. ->will($this->returnValue(false))
  238. ;
  239. $handler1->expects($this->once())
  240. ->method('handle')
  241. ->will($this->returnValue(false))
  242. ;
  243. $logger->pushHandler($handler1);
  244. $handler2 = $this->createMock('Monolog\Handler\HandlerInterface');
  245. $handler2->expects($this->once())
  246. ->method('isHandling')
  247. ->will($this->returnValue(true))
  248. ;
  249. $handler2->expects($this->once())
  250. ->method('handle')
  251. ->will($this->returnValue(false))
  252. ;
  253. $logger->pushHandler($handler2);
  254. $handler3 = $this->createMock('Monolog\Handler\HandlerInterface');
  255. $handler3->expects($this->once())
  256. ->method('isHandling')
  257. ->will($this->returnValue(false))
  258. ;
  259. $handler3->expects($this->never())
  260. ->method('handle')
  261. ;
  262. $logger->pushHandler($handler3);
  263. $logger->debug('test');
  264. }
  265. /**
  266. * @covers Monolog\Logger::addRecord
  267. */
  268. public function testHandlersNotCalledBeforeFirstHandlingWithAssocArray()
  269. {
  270. $handler1 = $this->createMock('Monolog\Handler\HandlerInterface');
  271. $handler1->expects($this->never())
  272. ->method('isHandling')
  273. ->will($this->returnValue(false))
  274. ;
  275. $handler1->expects($this->once())
  276. ->method('handle')
  277. ->will($this->returnValue(false))
  278. ;
  279. $handler2 = $this->createMock('Monolog\Handler\HandlerInterface');
  280. $handler2->expects($this->once())
  281. ->method('isHandling')
  282. ->will($this->returnValue(true))
  283. ;
  284. $handler2->expects($this->once())
  285. ->method('handle')
  286. ->will($this->returnValue(false))
  287. ;
  288. $handler3 = $this->createMock('Monolog\Handler\HandlerInterface');
  289. $handler3->expects($this->once())
  290. ->method('isHandling')
  291. ->will($this->returnValue(false))
  292. ;
  293. $handler3->expects($this->never())
  294. ->method('handle')
  295. ;
  296. $logger = new Logger(__METHOD__, ['last' => $handler3, 'second' => $handler2, 'first' => $handler1]);
  297. $logger->debug('test');
  298. }
  299. /**
  300. * @covers Monolog\Logger::addRecord
  301. */
  302. public function testBubblingWhenTheHandlerReturnsFalse()
  303. {
  304. $logger = new Logger(__METHOD__);
  305. $handler1 = $this->createMock('Monolog\Handler\HandlerInterface');
  306. $handler1->expects($this->any())
  307. ->method('isHandling')
  308. ->will($this->returnValue(true))
  309. ;
  310. $handler1->expects($this->once())
  311. ->method('handle')
  312. ->will($this->returnValue(false))
  313. ;
  314. $logger->pushHandler($handler1);
  315. $handler2 = $this->createMock('Monolog\Handler\HandlerInterface');
  316. $handler2->expects($this->any())
  317. ->method('isHandling')
  318. ->will($this->returnValue(true))
  319. ;
  320. $handler2->expects($this->once())
  321. ->method('handle')
  322. ->will($this->returnValue(false))
  323. ;
  324. $logger->pushHandler($handler2);
  325. $logger->debug('test');
  326. }
  327. /**
  328. * @covers Monolog\Logger::addRecord
  329. */
  330. public function testNotBubblingWhenTheHandlerReturnsTrue()
  331. {
  332. $logger = new Logger(__METHOD__);
  333. $handler1 = $this->createMock('Monolog\Handler\HandlerInterface');
  334. $handler1->expects($this->any())
  335. ->method('isHandling')
  336. ->will($this->returnValue(true))
  337. ;
  338. $handler1->expects($this->never())
  339. ->method('handle')
  340. ;
  341. $logger->pushHandler($handler1);
  342. $handler2 = $this->createMock('Monolog\Handler\HandlerInterface');
  343. $handler2->expects($this->any())
  344. ->method('isHandling')
  345. ->will($this->returnValue(true))
  346. ;
  347. $handler2->expects($this->once())
  348. ->method('handle')
  349. ->will($this->returnValue(true))
  350. ;
  351. $logger->pushHandler($handler2);
  352. $logger->debug('test');
  353. }
  354. /**
  355. * @covers Monolog\Logger::isHandling
  356. */
  357. public function testIsHandling()
  358. {
  359. $logger = new Logger(__METHOD__);
  360. $handler1 = $this->createMock('Monolog\Handler\HandlerInterface');
  361. $handler1->expects($this->any())
  362. ->method('isHandling')
  363. ->will($this->returnValue(false))
  364. ;
  365. $logger->pushHandler($handler1);
  366. $this->assertFalse($logger->isHandling(Logger::DEBUG));
  367. $handler2 = $this->createMock('Monolog\Handler\HandlerInterface');
  368. $handler2->expects($this->any())
  369. ->method('isHandling')
  370. ->will($this->returnValue(true))
  371. ;
  372. $logger->pushHandler($handler2);
  373. $this->assertTrue($logger->isHandling(Logger::DEBUG));
  374. }
  375. /**
  376. * @dataProvider logMethodProvider
  377. * @covers Monolog\Logger::debug
  378. * @covers Monolog\Logger::info
  379. * @covers Monolog\Logger::notice
  380. * @covers Monolog\Logger::warning
  381. * @covers Monolog\Logger::error
  382. * @covers Monolog\Logger::critical
  383. * @covers Monolog\Logger::alert
  384. * @covers Monolog\Logger::emergency
  385. */
  386. public function testLogMethods($method, $expectedLevel)
  387. {
  388. $logger = new Logger('foo');
  389. $handler = new TestHandler;
  390. $logger->pushHandler($handler);
  391. $logger->{$method}('test');
  392. list($record) = $handler->getRecords();
  393. $this->assertEquals($expectedLevel, $record['level']);
  394. }
  395. public function logMethodProvider()
  396. {
  397. return [
  398. // PSR-3 methods
  399. ['debug', Logger::DEBUG],
  400. ['info', Logger::INFO],
  401. ['notice', Logger::NOTICE],
  402. ['warning', Logger::WARNING],
  403. ['error', Logger::ERROR],
  404. ['critical', Logger::CRITICAL],
  405. ['alert', Logger::ALERT],
  406. ['emergency', Logger::EMERGENCY],
  407. ];
  408. }
  409. /**
  410. * @dataProvider setTimezoneProvider
  411. * @covers Monolog\Logger::setTimezone
  412. */
  413. public function testSetTimezone($tz)
  414. {
  415. $logger = new Logger('foo');
  416. $logger->setTimezone($tz);
  417. $handler = new TestHandler;
  418. $logger->pushHandler($handler);
  419. $logger->info('test');
  420. list($record) = $handler->getRecords();
  421. $this->assertEquals($tz, $record['datetime']->getTimezone());
  422. }
  423. public function setTimezoneProvider()
  424. {
  425. return array_map(
  426. function ($tz) {
  427. return [new \DateTimeZone($tz)];
  428. },
  429. \DateTimeZone::listIdentifiers()
  430. );
  431. }
  432. /**
  433. * @covers Monolog\Logger::setTimezone
  434. * @covers Monolog\DateTimeImmutable::__construct
  435. */
  436. public function testTimezoneIsRespectedInUTC()
  437. {
  438. foreach ([true, false] as $microseconds) {
  439. $logger = new Logger('foo');
  440. $logger->useMicrosecondTimestamps($microseconds);
  441. $tz = new \DateTimeZone('America/New_York');
  442. $logger->setTimezone($tz);
  443. $handler = new TestHandler;
  444. $logger->pushHandler($handler);
  445. $dt = new \DateTime('now', $tz);
  446. $logger->info('test');
  447. list($record) = $handler->getRecords();
  448. $this->assertEquals($tz, $record['datetime']->getTimezone());
  449. $this->assertEquals($dt->format('Y/m/d H:i'), $record['datetime']->format('Y/m/d H:i'), 'Time should match timezone with microseconds set to: '.var_export($microseconds, true));
  450. }
  451. }
  452. /**
  453. * @covers Monolog\Logger::setTimezone
  454. * @covers Monolog\DateTimeImmutable::__construct
  455. */
  456. public function testTimezoneIsRespectedInOtherTimezone()
  457. {
  458. date_default_timezone_set('CET');
  459. foreach ([true, false] as $microseconds) {
  460. $logger = new Logger('foo');
  461. $logger->useMicrosecondTimestamps($microseconds);
  462. $tz = new \DateTimeZone('America/New_York');
  463. $logger->setTimezone($tz);
  464. $handler = new TestHandler;
  465. $logger->pushHandler($handler);
  466. $dt = new \DateTime('now', $tz);
  467. $logger->info('test');
  468. list($record) = $handler->getRecords();
  469. $this->assertEquals($tz, $record['datetime']->getTimezone());
  470. $this->assertEquals($dt->format('Y/m/d H:i'), $record['datetime']->format('Y/m/d H:i'), 'Time should match timezone with microseconds set to: '.var_export($microseconds, true));
  471. }
  472. }
  473. public function tearDown()
  474. {
  475. date_default_timezone_set('UTC');
  476. }
  477. /**
  478. * @dataProvider useMicrosecondTimestampsProvider
  479. * @covers Monolog\Logger::useMicrosecondTimestamps
  480. * @covers Monolog\Logger::addRecord
  481. */
  482. public function testUseMicrosecondTimestamps($micro, $assert, $assertFormat)
  483. {
  484. if (PHP_VERSION_ID === 70103) {
  485. $this->markTestSkipped();
  486. }
  487. $logger = new Logger('foo');
  488. $logger->useMicrosecondTimestamps($micro);
  489. $handler = new TestHandler;
  490. $logger->pushHandler($handler);
  491. $logger->info('test');
  492. list($record) = $handler->getRecords();
  493. $this->{$assert}('000000', $record['datetime']->format('u'));
  494. $this->assertSame($record['datetime']->format($assertFormat), (string) $record['datetime']);
  495. }
  496. public function useMicrosecondTimestampsProvider()
  497. {
  498. return [
  499. // this has a very small chance of a false negative (1/10^6)
  500. 'with microseconds' => [true, 'assertNotSame', 'Y-m-d\TH:i:s.uP'],
  501. // php 7.1 always includes microseconds, so we keep them in, but we format the datetime without
  502. 'without microseconds' => [false, PHP_VERSION_ID >= 70100 ? 'assertNotSame' : 'assertSame', 'Y-m-d\TH:i:sP'],
  503. ];
  504. }
  505. /**
  506. * @covers Monolog\Logger::setExceptionHandler
  507. */
  508. public function testSetExceptionHandler()
  509. {
  510. $logger = new Logger(__METHOD__);
  511. $this->assertNull($logger->getExceptionHandler());
  512. $callback = function ($ex) {
  513. };
  514. $logger->setExceptionHandler($callback);
  515. $this->assertEquals($callback, $logger->getExceptionHandler());
  516. }
  517. /**
  518. * @covers Monolog\Logger::handleException
  519. * @expectedException Exception
  520. */
  521. public function testDefaultHandleException()
  522. {
  523. $logger = new Logger(__METHOD__);
  524. $handler = $this->getMockBuilder('Monolog\Handler\HandlerInterface')->getMock();
  525. $handler->expects($this->any())
  526. ->method('isHandling')
  527. ->will($this->returnValue(true))
  528. ;
  529. $handler->expects($this->any())
  530. ->method('handle')
  531. ->will($this->throwException(new \Exception('Some handler exception')))
  532. ;
  533. $logger->pushHandler($handler);
  534. $logger->info('test');
  535. }
  536. /**
  537. * @covers Monolog\Logger::handleException
  538. * @covers Monolog\Logger::addRecord
  539. */
  540. public function testCustomHandleException()
  541. {
  542. $logger = new Logger(__METHOD__);
  543. $that = $this;
  544. $logger->setExceptionHandler(function ($e, $record) use ($that) {
  545. $that->assertEquals($e->getMessage(), 'Some handler exception');
  546. $that->assertTrue(is_array($record));
  547. $that->assertEquals($record['message'], 'test');
  548. });
  549. $handler = $this->getMockBuilder('Monolog\Handler\HandlerInterface')->getMock();
  550. $handler->expects($this->any())
  551. ->method('isHandling')
  552. ->will($this->returnValue(true))
  553. ;
  554. $handler->expects($this->any())
  555. ->method('handle')
  556. ->will($this->throwException(new \Exception('Some handler exception')))
  557. ;
  558. $logger->pushHandler($handler);
  559. $logger->info('test');
  560. }
  561. public function testReset()
  562. {
  563. $logger = new Logger('app');
  564. $testHandler = new Handler\TestHandler();
  565. $bufferHandler = new Handler\BufferHandler($testHandler);
  566. $groupHandler = new Handler\GroupHandler(array($bufferHandler));
  567. $fingersCrossedHandler = new Handler\FingersCrossedHandler($groupHandler);
  568. $logger->pushHandler($fingersCrossedHandler);
  569. $processorUid1 = new Processor\UidProcessor(10);
  570. $uid1 = $processorUid1->getUid();
  571. $groupHandler->pushProcessor($processorUid1);
  572. $processorUid2 = new Processor\UidProcessor(5);
  573. $uid2 = $processorUid2->getUid();
  574. $logger->pushProcessor($processorUid2);
  575. $getProperty = function ($object, $property) {
  576. $reflectionProperty = new \ReflectionProperty(get_class($object), $property);
  577. $reflectionProperty->setAccessible(true);
  578. return $reflectionProperty->getValue($object);
  579. };
  580. $that = $this;
  581. $assertBufferOfBufferHandlerEmpty = function () use ($getProperty, $bufferHandler, $that) {
  582. $that->assertEmpty($getProperty($bufferHandler, 'buffer'));
  583. };
  584. $assertBuffersEmpty = function() use ($assertBufferOfBufferHandlerEmpty, $getProperty, $fingersCrossedHandler, $that) {
  585. $assertBufferOfBufferHandlerEmpty();
  586. $that->assertEmpty($getProperty($fingersCrossedHandler, 'buffer'));
  587. };
  588. $logger->debug('debug');
  589. $logger->reset();
  590. $assertBuffersEmpty();
  591. $this->assertFalse($testHandler->hasDebugRecords());
  592. $this->assertFalse($testHandler->hasErrorRecords());
  593. $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
  594. $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
  595. $logger->debug('debug');
  596. $logger->error('error');
  597. $logger->reset();
  598. $assertBuffersEmpty();
  599. $this->assertTrue($testHandler->hasDebugRecords());
  600. $this->assertTrue($testHandler->hasErrorRecords());
  601. $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
  602. $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
  603. $logger->info('info');
  604. $this->assertNotEmpty($getProperty($fingersCrossedHandler, 'buffer'));
  605. $assertBufferOfBufferHandlerEmpty();
  606. $this->assertFalse($testHandler->hasInfoRecords());
  607. $logger->reset();
  608. $assertBuffersEmpty();
  609. $this->assertFalse($testHandler->hasInfoRecords());
  610. $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
  611. $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
  612. $logger->notice('notice');
  613. $logger->emergency('emergency');
  614. $logger->reset();
  615. $assertBuffersEmpty();
  616. $this->assertFalse($testHandler->hasInfoRecords());
  617. $this->assertTrue($testHandler->hasNoticeRecords());
  618. $this->assertTrue($testHandler->hasEmergencyRecords());
  619. $this->assertNotSame($uid1, $processorUid1->getUid());
  620. $this->assertNotSame($uid2, $processorUid2->getUid());
  621. }
  622. }