PageRenderTime 53ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/Zend/Log/LogTest.php

https://bitbucket.org/ksekar/campus
PHP | 556 lines | 386 code | 81 blank | 89 comment | 5 complexity | f129aceef6e7dad1be1dc38d46560f2a MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.0, MIT
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Log
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id: LogTest.php 24594 2012-01-05 21:27:01Z matthew $
  21. */
  22. if (!defined('PHPUnit_MAIN_METHOD')) {
  23. define('PHPUnit_MAIN_METHOD', 'Zend_Log_LogTest::main');
  24. }
  25. /** Zend_Log */
  26. require_once 'Zend/Log.php';
  27. /** Zend_Log_Writer_Mock */
  28. require_once 'Zend/Log/Writer/Mock.php';
  29. /** Zend_Log_Writer_Stream */
  30. require_once 'Zend/Log/Writer/Stream.php';
  31. /** Zend_Log_FactoryInterface */
  32. require_once 'Zend/Log/FactoryInterface.php';
  33. /**
  34. * @category Zend
  35. * @package Zend_Log
  36. * @subpackage UnitTests
  37. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  38. * @license http://framework.zend.com/license/new-bsd New BSD License
  39. * @group Zend_Log
  40. */
  41. class Zend_Log_LogTest extends PHPUnit_Framework_TestCase
  42. {
  43. public static function main()
  44. {
  45. $suite = new PHPUnit_Framework_TestSuite(__CLASS__);
  46. $result = PHPUnit_TextUI_TestRunner::run($suite);
  47. }
  48. public function setUp()
  49. {
  50. $this->log = fopen('php://memory', 'w+');
  51. $this->writer = new Zend_Log_Writer_Stream($this->log);
  52. }
  53. // Writers
  54. public function testWriterCanBeAddedWithConstructor()
  55. {
  56. $logger = new Zend_Log($this->writer);
  57. $logger->log($message = 'message-to-log', Zend_Log::INFO);
  58. rewind($this->log);
  59. $this->assertContains($message, stream_get_contents($this->log));
  60. }
  61. public function testAddWriter()
  62. {
  63. $logger = new Zend_Log();
  64. $logger->addWriter($this->writer);
  65. $logger->log($message = 'message-to-log', Zend_Log::INFO);
  66. rewind($this->log);
  67. $this->assertContains($message, stream_get_contents($this->log));
  68. }
  69. public function testAddWriterAddsMultipleWriters()
  70. {
  71. $logger = new Zend_Log();
  72. // create writers for two separate streams of temporary memory
  73. $log1 = fopen('php://memory', 'w+');
  74. $writer1 = new Zend_Log_Writer_Stream($log1);
  75. $log2 = fopen('php://memory', 'w+');
  76. $writer2 = new Zend_Log_Writer_Stream($log2);
  77. // add the writers
  78. $logger->addWriter($writer1);
  79. $logger->addWriter($writer2);
  80. // log to both writers
  81. $logger->log($message = 'message-sent-to-both-logs', Zend_Log::INFO);
  82. // verify both writers were called by the logger
  83. rewind($log1);
  84. $this->assertContains($message, stream_get_contents($log1));
  85. rewind($log2);
  86. $this->assertContains($message, stream_get_contents($log2));
  87. // prove the two memory streams are different
  88. // and both writers were indeed called
  89. fwrite($log1, 'foo');
  90. $this->assertNotEquals(ftell($log1), ftell($log2));
  91. }
  92. public function testLoggerThrowsWhenNoWriters()
  93. {
  94. $logger = new Zend_Log();
  95. try {
  96. $logger->log('message', Zend_Log::INFO);
  97. $this->fail();
  98. } catch (Zend_Log_Exception $e) {
  99. $this->assertRegexp('/no writer/i', $e->getMessage());
  100. }
  101. }
  102. public function testDestructorCallsShutdownOnEachWriter()
  103. {
  104. $writer1 = new Zend_Log_Writer_Mock();
  105. $writer2 = new Zend_Log_Writer_Mock();
  106. $logger = new Zend_Log();
  107. $logger->addWriter($writer1);
  108. $logger->addWriter($writer2);
  109. $this->assertFalse($writer1->shutdown);
  110. $this->assertFalse($writer2->shutdown);
  111. $logger = null;
  112. $this->assertTrue($writer1->shutdown);
  113. $this->assertTrue($writer2->shutdown);
  114. }
  115. // Priorities
  116. public function testLogThrowsOnBadLogPriority()
  117. {
  118. $logger = new Zend_Log($this->writer);
  119. try {
  120. $logger->log('foo', 42);
  121. $this->fail();
  122. } catch (Exception $e) {
  123. $this->assertType('Zend_Log_Exception', $e);
  124. $this->assertRegExp('/bad log priority/i', $e->getMessage());
  125. }
  126. }
  127. public function testLogThrough__callThrowsOnBadLogPriority()
  128. {
  129. $logger = new Zend_Log($this->writer);
  130. try {
  131. $logger->nonexistantPriority('');
  132. $this->fail();
  133. } catch (Exception $e) {
  134. $this->assertType('Zend_Log_Exception', $e);
  135. $this->assertRegExp('/bad log priority/i', $e->getMessage());
  136. }
  137. }
  138. public function testAddingPriorityThrowsWhenOverridingBuiltinLogPriority()
  139. {
  140. try {
  141. $logger = new Zend_Log($this->writer);
  142. $logger->addPriority('BOB', 0);
  143. $this->fail();
  144. } catch (Exception $e) {
  145. $this->assertType('Zend_Log_Exception', $e);
  146. $this->assertRegExp('/existing priorities/i', $e->getMessage());
  147. }
  148. }
  149. public function testAddLogPriority()
  150. {
  151. $logger = new Zend_Log($this->writer);
  152. $logger->addPriority('EIGHT', $priority = 8);
  153. $logger->eight($message = 'eight message');
  154. rewind($this->log);
  155. $logdata = stream_get_contents($this->log);
  156. $this->assertContains((string)$priority, $logdata);
  157. $this->assertContains($message, $logdata);
  158. }
  159. // Fields
  160. public function testLogWritesStandardFields() {
  161. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  162. $logger->info('foo');
  163. $this->assertEquals(1, count($mock->events));
  164. $event = array_shift($mock->events);
  165. $standardFields = array_flip(array('timestamp', 'priority', 'priorityName', 'message'));
  166. $this->assertEquals(array(), array_diff_key($event, $standardFields));
  167. }
  168. public function testLogWritesAndOverwritesExtraFields() {
  169. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  170. $logger->setEventItem('foo', 42);
  171. $logger->setEventItem($field = 'bar', $value = 43);
  172. $logger->info('foo');
  173. $this->assertEquals(1, count($mock->events));
  174. $event = array_shift($mock->events);
  175. $this->assertTrue(array_key_exists($field, $event));
  176. $this->assertEquals($value, $event[$field]);
  177. }
  178. /**
  179. * @group ZF-8491
  180. */
  181. public function testLogAcceptsExtrasParameterAsArrayAndPushesIntoEvent()
  182. {
  183. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  184. $logger->info('foo', array('content' => 'nonesuch'));
  185. $event = array_shift($mock->events);
  186. $this->assertContains('content', array_keys($event));
  187. $this->assertEquals('nonesuch', $event['content']);
  188. }
  189. /**
  190. * @group ZF-8491
  191. */
  192. public function testLogNumericKeysInExtrasArrayArePassedToInfoKeyOfEvent()
  193. {
  194. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  195. $logger->info('foo', array('content' => 'nonesuch', 'bar'));
  196. $event = array_shift($mock->events);
  197. $this->assertContains('content', array_keys($event));
  198. $this->assertContains('info', array_keys($event));
  199. $this->assertContains('bar', $event['info']);
  200. }
  201. /**
  202. * @group ZF-8491
  203. */
  204. public function testLogAcceptsExtrasParameterAsScalarAndAddsAsInfoKeyToEvent()
  205. {
  206. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  207. $logger->info('foo', 'nonesuch');
  208. $event = array_shift($mock->events);
  209. $this->assertContains('info', array_keys($event));
  210. $info = $event['info'];
  211. $this->assertContains('nonesuch', $info);
  212. }
  213. // Factory
  214. public function testLogConstructFromConfigStream()
  215. {
  216. $cfg = array('log' => array('memory' => array(
  217. 'writerName' => "Stream",
  218. 'writerNamespace' => "Zend_Log_Writer",
  219. 'writerParams' => array(
  220. 'stream' => "php://memory"
  221. )
  222. )));
  223. $logger = Zend_Log::factory($cfg['log']);
  224. $this->assertTrue($logger instanceof Zend_Log);
  225. }
  226. public function testLogConstructFromConfigStreamAndFilter()
  227. {
  228. $cfg = array('log' => array('memory' => array(
  229. 'writerName' => "Stream",
  230. 'writerNamespace' => "Zend_Log_Writer",
  231. 'writerParams' => array(
  232. 'stream' => "php://memory"
  233. ),
  234. 'filterName' => "Priority",
  235. 'filterParams' => array(
  236. 'priority' => "Zend_Log::CRIT",
  237. 'operator' => "<="
  238. ),
  239. )));
  240. $logger = Zend_Log::factory($cfg['log']);
  241. $this->assertTrue($logger instanceof Zend_Log);
  242. }
  243. public function testFactoryUsesNameAndNamespaceWithoutModifications()
  244. {
  245. $cfg = array('log' => array('memory' => array(
  246. 'writerName' => "ZendMonitor",
  247. 'writerNamespace' => "Zend_Log_Writer",
  248. )));
  249. $logger = Zend_Log::factory($cfg['log']);
  250. $this->assertTrue($logger instanceof Zend_Log);
  251. }
  252. /**
  253. * @group ZF-9192
  254. */
  255. public function testUsingWithErrorHandler()
  256. {
  257. $writer = new Zend_Log_Writer_Mock();
  258. $logger = new Zend_Log();
  259. $logger->addWriter($writer);
  260. $this->errWriter = $writer;
  261. $oldErrorLevel = error_reporting();
  262. $this->expectingLogging = true;
  263. error_reporting(E_ALL | E_STRICT);
  264. $oldHandler = set_error_handler(array($this, 'verifyHandlerData'));
  265. $logger->registerErrorHandler();
  266. trigger_error("Testing notice shows up in logs", E_USER_NOTICE);
  267. trigger_error("Testing warning shows up in logs", E_USER_WARNING);
  268. trigger_error("Testing error shows up in logs", E_USER_ERROR);
  269. $this->expectingLogging = false;
  270. error_reporting(0);
  271. trigger_error("Testing notice misses logs", E_USER_NOTICE);
  272. trigger_error("Testing warning misses logs", E_USER_WARNING);
  273. trigger_error("Testing error misses logs", E_USER_ERROR);
  274. restore_error_handler(); // Pop off the Logger
  275. restore_error_handler(); // Pop off the verifyHandlerData
  276. error_reporting($oldErrorLevel); // Restore original reporting level
  277. unset($this->errWriter);
  278. }
  279. /**
  280. * @group ZF-9192
  281. * Used by testUsingWithErrorHandler -
  282. * verifies that the data written to the original logger is the same as the data written in Zend_Log
  283. */
  284. public function verifyHandlerData($errno, $errstr, $errfile, $errline, $errcontext)
  285. {
  286. if ($this->expectingLogging) {
  287. $this->assertFalse(empty($this->errWriter->events));
  288. $event = array_shift($this->errWriter->events);
  289. $this->assertEquals($errstr, $event['message']);
  290. $this->assertEquals($errno, $event['errno']);
  291. $this->assertEquals($errfile, $event['file']);
  292. $this->assertEquals($errline, $event['line']);
  293. } else {
  294. $this->assertTrue(empty($this->errWriter->events));
  295. }
  296. }
  297. /**
  298. * @group ZF-9870
  299. */
  300. public function testSetAndGetTimestampFormat()
  301. {
  302. $logger = new Zend_Log($this->writer);
  303. $this->assertEquals('c', $logger->getTimestampFormat());
  304. $this->assertSame($logger, $logger->setTimestampFormat('Y-m-d H:i:s'));
  305. $this->assertEquals('Y-m-d H:i:s', $logger->getTimestampFormat());
  306. }
  307. /**
  308. * @group ZF-9870
  309. */
  310. public function testLogWritesWithModifiedTimestampFormat()
  311. {
  312. $logger = new Zend_Log($this->writer);
  313. $logger->setTimestampFormat('Y-m-d');
  314. $logger->debug('ZF-9870');
  315. rewind($this->log);
  316. $message = stream_get_contents($this->log);
  317. $this->assertEquals(date('Y-m-d'), substr($message, 0, 10));
  318. }
  319. /**
  320. * @group ZF-9955
  321. */
  322. public function testExceptionConstructWriterFromConfig()
  323. {
  324. try {
  325. $logger = new Zend_Log();
  326. $writer = array('writerName' => 'NotExtendedWriterAbstract');
  327. $logger->addWriter($writer);
  328. } catch (Exception $e) {
  329. $this->assertType('Zend_Log_Exception', $e);
  330. $this->assertRegExp('#^(Zend_Log_Writer_NotExtendedWriterAbstract|The\sspecified\swriter)#', $e->getMessage());
  331. }
  332. }
  333. /**
  334. * @group ZF-9956
  335. */
  336. public function testExceptionConstructFilterFromConfig()
  337. {
  338. try {
  339. $logger = new Zend_Log();
  340. $filter = array('filterName' => 'NotImplementsFilterInterface');
  341. $logger->addFilter($filter);
  342. } catch (Exception $e) {
  343. $this->assertType('Zend_Log_Exception', $e);
  344. $this->assertRegExp('#^(Zend_Log_Filter_NotImplementsFilterInterface|The\sspecified\sfilter)#', $e->getMessage());
  345. }
  346. }
  347. /**
  348. * @group ZF-8953
  349. */
  350. public function testFluentInterface()
  351. {
  352. $logger = new Zend_Log();
  353. $instance = $logger->addPriority('all', 8)
  354. ->addFilter(1)
  355. ->addWriter(array('writerName' => 'Null'))
  356. ->setEventItem('os', PHP_OS);
  357. $this->assertTrue($instance instanceof Zend_Log);
  358. }
  359. /**
  360. * @group ZF-10170
  361. */
  362. public function testPriorityDuplicates()
  363. {
  364. $logger = new Zend_Log();
  365. $mock = new Zend_Log_Writer_Mock();
  366. $logger->addWriter($mock);
  367. try {
  368. $logger->addPriority('emerg', 8);
  369. $this->fail();
  370. } catch(Exception $e) {
  371. $this->assertType('Zend_Log_Exception', $e);
  372. $this->assertEquals('Existing priorities cannot be overwritten', $e->getMessage());
  373. }
  374. try {
  375. $logger->log('zf10170', 0);
  376. $logger->log('clone zf10170', 8);
  377. $this->fail();
  378. } catch (Exception $e) {
  379. $this->assertType('Zend_Log_Exception', $e);
  380. $this->assertEquals('Bad log priority', $e->getMessage());
  381. }
  382. $this->assertEquals(0, $mock->events[0]['priority']);
  383. $this->assertEquals('EMERG', $mock->events[0]['priorityName']);
  384. $this->assertFalse(array_key_exists(1, $mock->events));
  385. }
  386. /**
  387. * @group ZF-9176
  388. */
  389. public function testLogConstructFromConfigFormatter()
  390. {
  391. $config = array(
  392. 'log' => array(
  393. 'test' => array(
  394. 'writerName' => 'Mock',
  395. 'formatterName' => 'Simple',
  396. 'formatterParams' => array(
  397. 'format' => '%timestamp% (%priorityName%): %message%'
  398. )
  399. )
  400. )
  401. );
  402. $logger = Zend_Log::factory($config['log']);
  403. $logger->log('custom message', Zend_Log::INFO);
  404. }
  405. /**
  406. * @group ZF-9176
  407. */
  408. public function testLogConstructFromConfigCustomFormatter()
  409. {
  410. $config = array(
  411. 'log' => array(
  412. 'test' => array(
  413. 'writerName' => 'Mock',
  414. 'formatterName' => 'Mock',
  415. 'formatterNamespace' => 'Custom_Formatter'
  416. )
  417. )
  418. );
  419. $logger = Zend_Log::factory($config['log']);
  420. $logger->log('custom message', Zend_Log::INFO);
  421. }
  422. /**
  423. * @group ZF-10990
  424. */
  425. public function testFactoryShouldSetTimestampFormat()
  426. {
  427. $config = array(
  428. 'timestampFormat' => 'Y-m-d',
  429. 'mock' => array(
  430. 'writerName' => 'Mock'
  431. )
  432. );
  433. $logger = Zend_Log::factory($config);
  434. $this->assertEquals('Y-m-d', $logger->getTimestampFormat());
  435. }
  436. /**
  437. * @group ZF-10990
  438. */
  439. public function testFactoryShouldKeepDefaultTimestampFormat()
  440. {
  441. $config = array(
  442. 'timestampFormat' => '',
  443. 'mock' => array(
  444. 'writerName' => 'Mock'
  445. )
  446. );
  447. $logger = Zend_Log::factory($config);
  448. $this->assertEquals('c', $logger->getTimestampFormat());
  449. }
  450. }
  451. class Zend_Log_Writer_NotExtendedWriterAbstract implements Zend_Log_FactoryInterface
  452. {
  453. public static function factory($config)
  454. {
  455. }
  456. }
  457. class Zend_Log_Filter_NotImplementsFilterInterface implements Zend_Log_FactoryInterface
  458. {
  459. public static function factory($config)
  460. {
  461. }
  462. }
  463. class Custom_Formatter_Mock extends Zend_Log_Formatter_Abstract
  464. {
  465. public static function factory($config)
  466. {
  467. return new self;
  468. }
  469. public function format($event)
  470. {
  471. }
  472. }
  473. if (PHPUnit_MAIN_METHOD == 'Zend_Log_LogTest::main') {
  474. Zend_Log_LogTest::main();
  475. }