LogTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  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-2010 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. require_once dirname(__FILE__) . '/../../TestHelper.php';
  23. /** Zend_Log */
  24. require_once 'Zend/Log.php';
  25. /** Zend_Log_Writer_Mock */
  26. require_once 'Zend/Log/Writer/Mock.php';
  27. /** Zend_Log_Writer_Stream */
  28. require_once 'Zend/Log/Writer/Stream.php';
  29. /** Zend_Log_FactoryInterface */
  30. require_once 'Zend/Log/FactoryInterface.php';
  31. /**
  32. * @category Zend
  33. * @package Zend_Log
  34. * @subpackage UnitTests
  35. * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
  36. * @license http://framework.zend.com/license/new-bsd New BSD License
  37. * @group Zend_Log
  38. */
  39. class Zend_Log_LogTest extends PHPUnit_Framework_TestCase
  40. {
  41. public function setUp()
  42. {
  43. $this->log = fopen('php://memory', 'w+');
  44. $this->writer = new Zend_Log_Writer_Stream($this->log);
  45. }
  46. // Writers
  47. public function testWriterCanBeAddedWithConstructor()
  48. {
  49. $logger = new Zend_Log($this->writer);
  50. $logger->log($message = 'message-to-log', Zend_Log::INFO);
  51. rewind($this->log);
  52. $this->assertContains($message, stream_get_contents($this->log));
  53. }
  54. public function testAddWriter()
  55. {
  56. $logger = new Zend_Log();
  57. $logger->addWriter($this->writer);
  58. $logger->log($message = 'message-to-log', Zend_Log::INFO);
  59. rewind($this->log);
  60. $this->assertContains($message, stream_get_contents($this->log));
  61. }
  62. public function testAddWriterAddsMultipleWriters()
  63. {
  64. $logger = new Zend_Log();
  65. // create writers for two separate streams of temporary memory
  66. $log1 = fopen('php://memory', 'w+');
  67. $writer1 = new Zend_Log_Writer_Stream($log1);
  68. $log2 = fopen('php://memory', 'w+');
  69. $writer2 = new Zend_Log_Writer_Stream($log2);
  70. // add the writers
  71. $logger->addWriter($writer1);
  72. $logger->addWriter($writer2);
  73. // log to both writers
  74. $logger->log($message = 'message-sent-to-both-logs', Zend_Log::INFO);
  75. // verify both writers were called by the logger
  76. rewind($log1);
  77. $this->assertContains($message, stream_get_contents($log1));
  78. rewind($log2);
  79. $this->assertContains($message, stream_get_contents($log2));
  80. // prove the two memory streams are different
  81. // and both writers were indeed called
  82. fwrite($log1, 'foo');
  83. $this->assertNotEquals(ftell($log1), ftell($log2));
  84. }
  85. public function testLoggerThrowsWhenNoWriters()
  86. {
  87. $logger = new Zend_Log();
  88. try {
  89. $logger->log('message', Zend_Log::INFO);
  90. $this->fail();
  91. } catch (Zend_Log_Exception $e) {
  92. $this->assertRegexp('/no writer/i', $e->getMessage());
  93. }
  94. }
  95. public function testDestructorCallsShutdownOnEachWriter()
  96. {
  97. $writer1 = new Zend_Log_Writer_Mock();
  98. $writer2 = new Zend_Log_Writer_Mock();
  99. $logger = new Zend_Log();
  100. $logger->addWriter($writer1);
  101. $logger->addWriter($writer2);
  102. $this->assertFalse($writer1->shutdown);
  103. $this->assertFalse($writer2->shutdown);
  104. $logger = null;
  105. $this->assertTrue($writer1->shutdown);
  106. $this->assertTrue($writer2->shutdown);
  107. }
  108. // Priorities
  109. public function testLogThrowsOnBadLogPriority()
  110. {
  111. $logger = new Zend_Log($this->writer);
  112. try {
  113. $logger->log('foo', 42);
  114. $this->fail();
  115. } catch (Exception $e) {
  116. $this->assertType('Zend_Log_Exception', $e);
  117. $this->assertRegExp('/bad log priority/i', $e->getMessage());
  118. }
  119. }
  120. public function testLogThrough__callThrowsOnBadLogPriority()
  121. {
  122. $logger = new Zend_Log($this->writer);
  123. try {
  124. $logger->nonexistantPriority('');
  125. $this->fail();
  126. } catch (Exception $e) {
  127. $this->assertType('Zend_Log_Exception', $e);
  128. $this->assertRegExp('/bad log priority/i', $e->getMessage());
  129. }
  130. }
  131. public function testAddingPriorityThrowsWhenOverridingBuiltinLogPriority()
  132. {
  133. try {
  134. $logger = new Zend_Log($this->writer);
  135. $logger->addPriority('BOB', 0);
  136. $this->fail();
  137. } catch (Exception $e) {
  138. $this->assertType('Zend_Log_Exception', $e);
  139. $this->assertRegExp('/existing priorities/i', $e->getMessage());
  140. }
  141. }
  142. public function testAddLogPriority()
  143. {
  144. $logger = new Zend_Log($this->writer);
  145. $logger->addPriority('EIGHT', $priority = 8);
  146. $logger->eight($message = 'eight message');
  147. rewind($this->log);
  148. $logdata = stream_get_contents($this->log);
  149. $this->assertContains((string)$priority, $logdata);
  150. $this->assertContains($message, $logdata);
  151. }
  152. // Fields
  153. public function testLogWritesStandardFields() {
  154. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  155. $logger->info('foo');
  156. $this->assertEquals(1, count($mock->events));
  157. $event = array_shift($mock->events);
  158. $standardFields = array_flip(array('timestamp', 'priority', 'priorityName', 'message'));
  159. $this->assertEquals(array(), array_diff_key($event, $standardFields));
  160. }
  161. public function testLogWritesAndOverwritesExtraFields() {
  162. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  163. $logger->setEventItem('foo', 42);
  164. $logger->setEventItem($field = 'bar', $value = 43);
  165. $logger->info('foo');
  166. $this->assertEquals(1, count($mock->events));
  167. $event = array_shift($mock->events);
  168. $this->assertTrue(array_key_exists($field, $event));
  169. $this->assertEquals($value, $event[$field]);
  170. }
  171. /**
  172. * @group ZF-8491
  173. */
  174. public function testLogAcceptsExtrasParameterAsArrayAndPushesIntoEvent()
  175. {
  176. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  177. $logger->info('foo', array('content' => 'nonesuch'));
  178. $event = array_shift($mock->events);
  179. $this->assertContains('content', array_keys($event));
  180. $this->assertEquals('nonesuch', $event['content']);
  181. }
  182. /**
  183. * @group ZF-8491
  184. */
  185. public function testLogNumericKeysInExtrasArrayArePassedToInfoKeyOfEvent()
  186. {
  187. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  188. $logger->info('foo', array('content' => 'nonesuch', 'bar'));
  189. $event = array_shift($mock->events);
  190. $this->assertContains('content', array_keys($event));
  191. $this->assertContains('info', array_keys($event));
  192. $this->assertContains('bar', $event['info']);
  193. }
  194. /**
  195. * @group ZF-8491
  196. */
  197. public function testLogAcceptsExtrasParameterAsScalarAndAddsAsInfoKeyToEvent()
  198. {
  199. $logger = new Zend_Log($mock = new Zend_Log_Writer_Mock);
  200. $logger->info('foo', 'nonesuch');
  201. $event = array_shift($mock->events);
  202. $this->assertContains('info', array_keys($event));
  203. $info = $event['info'];
  204. $this->assertContains('nonesuch', $info);
  205. }
  206. // Factory
  207. public function testLogConstructFromConfigStream()
  208. {
  209. $cfg = array('log' => array('memory' => array(
  210. 'writerName' => "Stream",
  211. 'writerNamespace' => "Zend_Log_Writer",
  212. 'writerParams' => array(
  213. 'stream' => "php://memory"
  214. )
  215. )));
  216. $logger = Zend_Log::factory($cfg['log']);
  217. $this->assertTrue($logger instanceof Zend_Log);
  218. }
  219. public function testLogConstructFromConfigStreamAndFilter()
  220. {
  221. $cfg = array('log' => array('memory' => array(
  222. 'writerName' => "Stream",
  223. 'writerNamespace' => "Zend_Log_Writer",
  224. 'writerParams' => array(
  225. 'stream' => "php://memory"
  226. ),
  227. 'filterName' => "Priority",
  228. 'filterParams' => array(
  229. 'priority' => "Zend_Log::CRIT",
  230. 'operator' => "<="
  231. ),
  232. )));
  233. $logger = Zend_Log::factory($cfg['log']);
  234. $this->assertTrue($logger instanceof Zend_Log);
  235. }
  236. public function testFactoryUsesNameAndNamespaceWithoutModifications()
  237. {
  238. $cfg = array('log' => array('memory' => array(
  239. 'writerName' => "ZendMonitor",
  240. 'writerNamespace' => "Zend_Log_Writer",
  241. )));
  242. $logger = Zend_Log::factory($cfg['log']);
  243. $this->assertTrue($logger instanceof Zend_Log);
  244. }
  245. /**
  246. * @group ZF-9192
  247. */
  248. public function testUsingWithErrorHandler()
  249. {
  250. $writer = new Zend_Log_Writer_Mock();
  251. $logger = new Zend_Log();
  252. $logger->addWriter($writer);
  253. $this->errWriter = $writer;
  254. $oldErrorLevel = error_reporting();
  255. $this->expectingLogging = true;
  256. error_reporting(E_ALL | E_STRICT);
  257. $oldHandler = set_error_handler(array($this, 'verifyHandlerData'));
  258. $logger->registerErrorHandler();
  259. trigger_error("Testing notice shows up in logs", E_USER_NOTICE);
  260. trigger_error("Testing warning shows up in logs", E_USER_WARNING);
  261. trigger_error("Testing error shows up in logs", E_USER_ERROR);
  262. $this->expectingLogging = false;
  263. error_reporting(0);
  264. trigger_error("Testing notice misses logs", E_USER_NOTICE);
  265. trigger_error("Testing warning misses logs", E_USER_WARNING);
  266. trigger_error("Testing error misses logs", E_USER_ERROR);
  267. restore_error_handler(); // Pop off the Logger
  268. restore_error_handler(); // Pop off the verifyHandlerData
  269. error_reporting($oldErrorLevel); // Restore original reporting level
  270. unset($this->errWriter);
  271. }
  272. /**
  273. * @group ZF-9192
  274. * Used by testUsingWithErrorHandler -
  275. * verifies that the data written to the original logger is the same as the data written in Zend_Log
  276. */
  277. public function verifyHandlerData($errno, $errstr, $errfile, $errline, $errcontext)
  278. {
  279. if ($this->expectingLogging) {
  280. $this->assertFalse(empty($this->errWriter->events));
  281. $event = array_shift($this->errWriter->events);
  282. $this->assertEquals($errstr, $event['message']);
  283. $this->assertEquals($errno, $event['errno']);
  284. $this->assertEquals($errfile, $event['file']);
  285. $this->assertEquals($errline, $event['line']);
  286. } else {
  287. $this->assertTrue(empty($this->errWriter->events));
  288. }
  289. }
  290. /**
  291. * @group ZF-9870
  292. */
  293. public function testSetAndGetTimestampFormat()
  294. {
  295. $logger = new Zend_Log($this->writer);
  296. $this->assertEquals('c', $logger->getTimestampFormat());
  297. $this->assertSame($logger, $logger->setTimestampFormat('Y-m-d H:i:s'));
  298. $this->assertEquals('Y-m-d H:i:s', $logger->getTimestampFormat());
  299. }
  300. /**
  301. * @group ZF-9870
  302. */
  303. public function testLogWritesWithModifiedTimestampFormat()
  304. {
  305. $logger = new Zend_Log($this->writer);
  306. $logger->setTimestampFormat('Y-m-d');
  307. $logger->debug('ZF-9870');
  308. rewind($this->log);
  309. $message = stream_get_contents($this->log);
  310. $this->assertEquals(date('Y-m-d'), substr($message, 0, 10));
  311. }
  312. /**
  313. * @group ZF-9955
  314. */
  315. public function testExceptionConstructWriterFromConfig()
  316. {
  317. try {
  318. $logger = new Zend_Log();
  319. $writer = array('writerName' => 'NotExtendedWriterAbstract');
  320. $logger->addWriter($writer);
  321. } catch (Exception $e) {
  322. $this->assertType('Zend_Log_Exception', $e);
  323. $this->assertRegExp('#^(Zend_Log_Writer_NotExtendedWriterAbstract|The\sspecified\swriter)#', $e->getMessage());
  324. }
  325. }
  326. }
  327. class Zend_Log_Writer_NotExtendedWriterAbstract implements Zend_Log_FactoryInterface
  328. {
  329. public static function factory($config)
  330. {
  331. }
  332. }