LoggerTest.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  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. use Monolog\Test\TestCase;
  14. class LoggerTest extends TestCase
  15. {
  16. /**
  17. * @covers Logger::getName
  18. */
  19. public function testGetName()
  20. {
  21. $logger = new Logger('foo');
  22. $this->assertEquals('foo', $logger->getName());
  23. }
  24. /**
  25. * @covers Logger::withName
  26. */
  27. public function testWithName()
  28. {
  29. $first = new Logger('first', [$handler = new TestHandler()]);
  30. $second = $first->withName('second');
  31. $this->assertSame('first', $first->getName());
  32. $this->assertSame('second', $second->getName());
  33. $this->assertSame($handler, $second->popHandler());
  34. }
  35. /**
  36. * @covers Logger::toMonologLevel
  37. */
  38. public function testConvertPSR3ToMonologLevel()
  39. {
  40. $this->assertEquals(Logger::toMonologLevel('debug'), Level::Debug);
  41. $this->assertEquals(Logger::toMonologLevel('info'), Level::Info);
  42. $this->assertEquals(Logger::toMonologLevel('notice'), Level::Notice);
  43. $this->assertEquals(Logger::toMonologLevel('warning'), Level::Warning);
  44. $this->assertEquals(Logger::toMonologLevel('error'), Level::Error);
  45. $this->assertEquals(Logger::toMonologLevel('critical'), Level::Critical);
  46. $this->assertEquals(Logger::toMonologLevel('alert'), Level::Alert);
  47. $this->assertEquals(Logger::toMonologLevel('emergency'), Level::Emergency);
  48. }
  49. /**
  50. * @covers Logger::__construct
  51. */
  52. public function testChannel()
  53. {
  54. $logger = new Logger('foo');
  55. $handler = new TestHandler;
  56. $logger->pushHandler($handler);
  57. $logger->warning('test');
  58. list($record) = $handler->getRecords();
  59. $this->assertEquals('foo', $record->channel);
  60. }
  61. /**
  62. * @covers Logger::addRecord
  63. */
  64. public function testLog()
  65. {
  66. $logger = new Logger(__METHOD__);
  67. $handler = $this->getMockBuilder('Monolog\Handler\HandlerInterface')->getMock();
  68. $handler->expects($this->never())->method('isHandling');
  69. $handler->expects($this->once())->method('handle');
  70. $logger->pushHandler($handler);
  71. $this->assertTrue($logger->addRecord(Level::Warning, 'test'));
  72. }
  73. /**
  74. * @covers Logger::addRecord
  75. */
  76. public function testLogAlwaysHandledIfNoProcessorsArePresent()
  77. {
  78. $logger = new Logger(__METHOD__);
  79. $handler = $this->getMockBuilder('Monolog\Handler\HandlerInterface')->getMock();
  80. $handler->expects($this->never())->method('isHandling');
  81. $handler->expects($this->once())->method('handle');
  82. $logger->pushHandler($handler);
  83. $this->assertTrue($logger->addRecord(Level::Warning, 'test'));
  84. }
  85. /**
  86. * @covers Logger::addRecord
  87. */
  88. public function testLogNotHandledIfProcessorsArePresent()
  89. {
  90. $logger = new Logger(__METHOD__);
  91. $handler = $this->getMockBuilder('Monolog\Handler\HandlerInterface')->getMock();
  92. $handler->expects($this->once())->method('isHandling')->will($this->returnValue(false));
  93. $handler->expects($this->never())->method('handle');
  94. $logger->pushProcessor(fn (LogRecord $record) => $record);
  95. $logger->pushHandler($handler);
  96. $this->assertFalse($logger->addRecord(Level::Warning, 'test'));
  97. }
  98. public function testHandlersInCtor()
  99. {
  100. $handler1 = new TestHandler;
  101. $handler2 = new TestHandler;
  102. $logger = new Logger(__METHOD__, [$handler1, $handler2]);
  103. $this->assertEquals($handler1, $logger->popHandler());
  104. $this->assertEquals($handler2, $logger->popHandler());
  105. }
  106. public function testProcessorsInCtor()
  107. {
  108. $processor1 = new WebProcessor;
  109. $processor2 = new WebProcessor;
  110. $logger = new Logger(__METHOD__, [], [$processor1, $processor2]);
  111. $this->assertEquals($processor1, $logger->popProcessor());
  112. $this->assertEquals($processor2, $logger->popProcessor());
  113. }
  114. /**
  115. * @covers Logger::pushHandler
  116. * @covers Logger::popHandler
  117. */
  118. public function testPushPopHandler()
  119. {
  120. $logger = new Logger(__METHOD__);
  121. $handler1 = new TestHandler;
  122. $handler2 = new TestHandler;
  123. $logger->pushHandler($handler1);
  124. $logger->pushHandler($handler2);
  125. $this->assertEquals($handler2, $logger->popHandler());
  126. $this->assertEquals($handler1, $logger->popHandler());
  127. $this->expectException(\LogicException::class);
  128. $logger->popHandler();
  129. }
  130. /**
  131. * @covers Logger::setHandlers
  132. */
  133. public function testSetHandlers()
  134. {
  135. $logger = new Logger(__METHOD__);
  136. $handler1 = new TestHandler;
  137. $handler2 = new TestHandler;
  138. $logger->pushHandler($handler1);
  139. $logger->setHandlers([$handler2]);
  140. // handler1 has been removed
  141. $this->assertEquals([$handler2], $logger->getHandlers());
  142. $logger->setHandlers([
  143. "AMapKey" => $handler1,
  144. "Woop" => $handler2,
  145. ]);
  146. // Keys have been scrubbed
  147. $this->assertEquals([$handler1, $handler2], $logger->getHandlers());
  148. }
  149. /**
  150. * @covers Logger::pushProcessor
  151. * @covers Logger::popProcessor
  152. */
  153. public function testPushPopProcessor()
  154. {
  155. $logger = new Logger(__METHOD__);
  156. $processor1 = new WebProcessor;
  157. $processor2 = new WebProcessor;
  158. $logger->pushProcessor($processor1);
  159. $logger->pushProcessor($processor2);
  160. $this->assertEquals($processor2, $logger->popProcessor());
  161. $this->assertEquals($processor1, $logger->popProcessor());
  162. $this->expectException(\LogicException::class);
  163. $logger->popProcessor();
  164. }
  165. /**
  166. * @covers Logger::addRecord
  167. */
  168. public function testProcessorsAreExecuted()
  169. {
  170. $logger = new Logger(__METHOD__);
  171. $handler = new TestHandler;
  172. $logger->pushHandler($handler);
  173. $logger->pushProcessor(function ($record) {
  174. $record->extra['win'] = true;
  175. return $record;
  176. });
  177. $logger->error('test');
  178. list($record) = $handler->getRecords();
  179. $this->assertTrue($record->extra['win']);
  180. }
  181. /**
  182. * @covers Logger::addRecord
  183. */
  184. public function testProcessorsAreCalledOnlyOnce()
  185. {
  186. $logger = new Logger(__METHOD__);
  187. $handler = $this->createMock('Monolog\Handler\HandlerInterface');
  188. $handler->expects($this->any())
  189. ->method('isHandling')
  190. ->will($this->returnValue(true))
  191. ;
  192. $handler->expects($this->any())
  193. ->method('handle')
  194. ->will($this->returnValue(true))
  195. ;
  196. $logger->pushHandler($handler);
  197. $processor = $this->getMockBuilder('Monolog\Processor\WebProcessor')
  198. ->disableOriginalConstructor()
  199. ->onlyMethods(['__invoke'])
  200. ->getMock()
  201. ;
  202. $processor->expects($this->once())
  203. ->method('__invoke')
  204. ->will($this->returnArgument(0))
  205. ;
  206. $logger->pushProcessor($processor);
  207. $logger->error('test');
  208. }
  209. /**
  210. * @covers Logger::addRecord
  211. */
  212. public function testProcessorsNotCalledWhenNotHandled()
  213. {
  214. $logger = new Logger(__METHOD__);
  215. $handler = $this->createMock('Monolog\Handler\HandlerInterface');
  216. $handler->expects($this->once())
  217. ->method('isHandling')
  218. ->will($this->returnValue(false))
  219. ;
  220. $logger->pushHandler($handler);
  221. $that = $this;
  222. $logger->pushProcessor(function ($record) use ($that) {
  223. $that->fail('The processor should not be called');
  224. });
  225. $logger->alert('test');
  226. }
  227. /**
  228. * @covers Logger::addRecord
  229. */
  230. public function testHandlersNotCalledBeforeFirstHandlingWhenProcessorsPresent()
  231. {
  232. $logger = new Logger(__METHOD__);
  233. $logger->pushProcessor(fn($record) => $record);
  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 Logger::addRecord
  267. */
  268. public function testHandlersNotCalledBeforeFirstHandlingWhenProcessorsPresentWithAssocArray()
  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->pushProcessor(fn($record) => $record);
  298. $logger->debug('test');
  299. }
  300. /**
  301. * @covers Logger::addRecord
  302. */
  303. public function testBubblingWhenTheHandlerReturnsFalse()
  304. {
  305. $logger = new Logger(__METHOD__);
  306. $handler1 = $this->createMock('Monolog\Handler\HandlerInterface');
  307. $handler1->expects($this->any())
  308. ->method('isHandling')
  309. ->will($this->returnValue(true))
  310. ;
  311. $handler1->expects($this->once())
  312. ->method('handle')
  313. ->will($this->returnValue(false))
  314. ;
  315. $logger->pushHandler($handler1);
  316. $handler2 = $this->createMock('Monolog\Handler\HandlerInterface');
  317. $handler2->expects($this->any())
  318. ->method('isHandling')
  319. ->will($this->returnValue(true))
  320. ;
  321. $handler2->expects($this->once())
  322. ->method('handle')
  323. ->will($this->returnValue(false))
  324. ;
  325. $logger->pushHandler($handler2);
  326. $logger->debug('test');
  327. }
  328. /**
  329. * @covers Logger::addRecord
  330. */
  331. public function testNotBubblingWhenTheHandlerReturnsTrue()
  332. {
  333. $logger = new Logger(__METHOD__);
  334. $handler1 = $this->createMock('Monolog\Handler\HandlerInterface');
  335. $handler1->expects($this->any())
  336. ->method('isHandling')
  337. ->will($this->returnValue(true))
  338. ;
  339. $handler1->expects($this->never())
  340. ->method('handle')
  341. ;
  342. $logger->pushHandler($handler1);
  343. $handler2 = $this->createMock('Monolog\Handler\HandlerInterface');
  344. $handler2->expects($this->any())
  345. ->method('isHandling')
  346. ->will($this->returnValue(true))
  347. ;
  348. $handler2->expects($this->once())
  349. ->method('handle')
  350. ->will($this->returnValue(true))
  351. ;
  352. $logger->pushHandler($handler2);
  353. $logger->debug('test');
  354. }
  355. /**
  356. * @covers Logger::isHandling
  357. */
  358. public function testIsHandling()
  359. {
  360. $logger = new Logger(__METHOD__);
  361. $handler1 = $this->createMock('Monolog\Handler\HandlerInterface');
  362. $handler1->expects($this->any())
  363. ->method('isHandling')
  364. ->will($this->returnValue(false))
  365. ;
  366. $logger->pushHandler($handler1);
  367. $this->assertFalse($logger->isHandling(Level::Debug));
  368. $handler2 = $this->createMock('Monolog\Handler\HandlerInterface');
  369. $handler2->expects($this->any())
  370. ->method('isHandling')
  371. ->will($this->returnValue(true))
  372. ;
  373. $logger->pushHandler($handler2);
  374. $this->assertTrue($logger->isHandling(Level::Debug));
  375. }
  376. /**
  377. * @dataProvider logMethodProvider
  378. * @covers Level::Debug
  379. * @covers Level::Info
  380. * @covers Level::Notice
  381. * @covers Level::Warning
  382. * @covers Level::Error
  383. * @covers Level::Critical
  384. * @covers Level::Alert
  385. * @covers Level::Emergency
  386. */
  387. public function testLogMethods(string $method, Level $expectedLevel)
  388. {
  389. $logger = new Logger('foo');
  390. $handler = new TestHandler;
  391. $logger->pushHandler($handler);
  392. $logger->{$method}('test');
  393. list($record) = $handler->getRecords();
  394. $this->assertEquals($expectedLevel, $record->level);
  395. }
  396. public function logMethodProvider()
  397. {
  398. return [
  399. // PSR-3 methods
  400. ['debug', Level::Debug],
  401. ['info', Level::Info],
  402. ['notice', Level::Notice],
  403. ['warning', Level::Warning],
  404. ['error', Level::Error],
  405. ['critical', Level::Critical],
  406. ['alert', Level::Alert],
  407. ['emergency', Level::Emergency],
  408. ];
  409. }
  410. /**
  411. * @dataProvider setTimezoneProvider
  412. * @covers Logger::setTimezone
  413. */
  414. public function testSetTimezone($tz)
  415. {
  416. $logger = new Logger('foo');
  417. $logger->setTimezone($tz);
  418. $handler = new TestHandler;
  419. $logger->pushHandler($handler);
  420. $logger->info('test');
  421. list($record) = $handler->getRecords();
  422. $this->assertEquals($tz, $record->datetime->getTimezone());
  423. }
  424. public function setTimezoneProvider()
  425. {
  426. return array_map(
  427. function ($tz) {
  428. return [new \DateTimeZone($tz)];
  429. },
  430. \DateTimeZone::listIdentifiers()
  431. );
  432. }
  433. /**
  434. * @covers Logger::setTimezone
  435. * @covers DateTimeImmutable::__construct
  436. */
  437. public function testTimezoneIsRespectedInUTC()
  438. {
  439. foreach ([true, false] as $microseconds) {
  440. $logger = new Logger('foo');
  441. $logger->useMicrosecondTimestamps($microseconds);
  442. $tz = new \DateTimeZone('America/New_York');
  443. $logger->setTimezone($tz);
  444. $handler = new TestHandler;
  445. $logger->pushHandler($handler);
  446. $dt = new \DateTime('now', $tz);
  447. $logger->info('test');
  448. list($record) = $handler->getRecords();
  449. $this->assertEquals($tz, $record->datetime->getTimezone());
  450. $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));
  451. }
  452. }
  453. /**
  454. * @covers Logger::setTimezone
  455. * @covers DateTimeImmutable::__construct
  456. */
  457. public function testTimezoneIsRespectedInOtherTimezone()
  458. {
  459. date_default_timezone_set('CET');
  460. foreach ([true, false] as $microseconds) {
  461. $logger = new Logger('foo');
  462. $logger->useMicrosecondTimestamps($microseconds);
  463. $tz = new \DateTimeZone('America/New_York');
  464. $logger->setTimezone($tz);
  465. $handler = new TestHandler;
  466. $logger->pushHandler($handler);
  467. $dt = new \DateTime('now', $tz);
  468. $logger->info('test');
  469. list($record) = $handler->getRecords();
  470. $this->assertEquals($tz, $record->datetime->getTimezone());
  471. $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));
  472. }
  473. }
  474. public function tearDown(): void
  475. {
  476. date_default_timezone_set('UTC');
  477. }
  478. /**
  479. * @dataProvider useMicrosecondTimestampsProvider
  480. * @covers Logger::useMicrosecondTimestamps
  481. * @covers Logger::addRecord
  482. */
  483. public function testUseMicrosecondTimestamps($micro, $assert, $assertFormat)
  484. {
  485. if (PHP_VERSION_ID === 70103) {
  486. $this->markTestSkipped();
  487. }
  488. $logger = new Logger('foo');
  489. $logger->useMicrosecondTimestamps($micro);
  490. $handler = new TestHandler;
  491. $logger->pushHandler($handler);
  492. $logger->info('test');
  493. list($record) = $handler->getRecords();
  494. $this->{$assert}('000000', $record->datetime->format('u'));
  495. $this->assertSame($record->datetime->format($assertFormat), (string) $record->datetime);
  496. }
  497. public function useMicrosecondTimestampsProvider()
  498. {
  499. return [
  500. // this has a very small chance of a false negative (1/10^6)
  501. 'with microseconds' => [true, 'assertNotSame', 'Y-m-d\TH:i:s.uP'],
  502. // php 7.1 always includes microseconds, so we keep them in, but we format the datetime without
  503. 'without microseconds' => [false, 'assertNotSame', 'Y-m-d\TH:i:sP'],
  504. ];
  505. }
  506. /**
  507. * @covers Logger::setExceptionHandler
  508. */
  509. public function testSetExceptionHandler()
  510. {
  511. $logger = new Logger(__METHOD__);
  512. $this->assertNull($logger->getExceptionHandler());
  513. $callback = function ($ex) {
  514. };
  515. $logger->setExceptionHandler($callback);
  516. $this->assertEquals($callback, $logger->getExceptionHandler());
  517. }
  518. /**
  519. * @covers Logger::handleException
  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. $this->expectException(\Exception::class);
  534. $logger->pushHandler($handler);
  535. $logger->info('test');
  536. }
  537. /**
  538. * @covers Logger::handleException
  539. * @covers Logger::addRecord
  540. */
  541. public function testCustomHandleException()
  542. {
  543. $logger = new Logger(__METHOD__);
  544. $that = $this;
  545. $logger->setExceptionHandler(function ($e, $record) use ($that) {
  546. $that->assertEquals($e->getMessage(), 'Some handler exception');
  547. $that->assertInstanceOf(LogRecord::class, $record);
  548. $that->assertEquals($record->message, 'test');
  549. });
  550. $handler = $this->getMockBuilder('Monolog\Handler\HandlerInterface')->getMock();
  551. $handler->expects($this->any())
  552. ->method('isHandling')
  553. ->will($this->returnValue(true))
  554. ;
  555. $handler->expects($this->any())
  556. ->method('handle')
  557. ->will($this->throwException(new \Exception('Some handler exception')))
  558. ;
  559. $logger->pushHandler($handler);
  560. $logger->info('test');
  561. }
  562. public function testReset()
  563. {
  564. $logger = new Logger('app');
  565. $testHandler = new Handler\TestHandler();
  566. $testHandler->setSkipReset(true);
  567. $bufferHandler = new Handler\BufferHandler($testHandler);
  568. $groupHandler = new Handler\GroupHandler(array($bufferHandler));
  569. $fingersCrossedHandler = new Handler\FingersCrossedHandler($groupHandler);
  570. $logger->pushHandler($fingersCrossedHandler);
  571. $processorUid1 = new Processor\UidProcessor(10);
  572. $uid1 = $processorUid1->getUid();
  573. $groupHandler->pushProcessor($processorUid1);
  574. $processorUid2 = new Processor\UidProcessor(5);
  575. $uid2 = $processorUid2->getUid();
  576. $logger->pushProcessor($processorUid2);
  577. $getProperty = function ($object, $property) {
  578. $reflectionProperty = new \ReflectionProperty(get_class($object), $property);
  579. $reflectionProperty->setAccessible(true);
  580. return $reflectionProperty->getValue($object);
  581. };
  582. $assertBufferOfBufferHandlerEmpty = function () use ($getProperty, $bufferHandler) {
  583. self::assertEmpty($getProperty($bufferHandler, 'buffer'));
  584. };
  585. $assertBuffersEmpty = function () use ($assertBufferOfBufferHandlerEmpty, $getProperty, $fingersCrossedHandler) {
  586. $assertBufferOfBufferHandlerEmpty();
  587. self::assertEmpty($getProperty($fingersCrossedHandler, 'buffer'));
  588. };
  589. $logger->debug('debug1');
  590. $logger->reset();
  591. $assertBuffersEmpty();
  592. $this->assertFalse($testHandler->hasDebugRecords());
  593. $this->assertFalse($testHandler->hasErrorRecords());
  594. $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
  595. $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
  596. $logger->debug('debug2');
  597. $logger->error('error2');
  598. $logger->reset();
  599. $assertBuffersEmpty();
  600. $this->assertTrue($testHandler->hasRecordThatContains('debug2', Level::Debug));
  601. $this->assertTrue($testHandler->hasRecordThatContains('error2', Level::Error));
  602. $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
  603. $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
  604. $logger->info('info3');
  605. $this->assertNotEmpty($getProperty($fingersCrossedHandler, 'buffer'));
  606. $assertBufferOfBufferHandlerEmpty();
  607. $this->assertFalse($testHandler->hasInfoRecords());
  608. $logger->reset();
  609. $assertBuffersEmpty();
  610. $this->assertFalse($testHandler->hasInfoRecords());
  611. $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
  612. $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
  613. $logger->notice('notice4');
  614. $logger->emergency('emergency4');
  615. $logger->reset();
  616. $assertBuffersEmpty();
  617. $this->assertFalse($testHandler->hasInfoRecords());
  618. $this->assertTrue($testHandler->hasRecordThatContains('notice4', Level::Notice));
  619. $this->assertTrue($testHandler->hasRecordThatContains('emergency4', Level::Emergency));
  620. $this->assertNotSame($uid1, $processorUid1->getUid());
  621. $this->assertNotSame($uid2, $processorUid2->getUid());
  622. }
  623. }