Просмотр исходного кода

Added tests, fixed a bunch of bugs

Jordi Boggiano 15 лет назад
Родитель
Сommit
7239b5203b

+ 17 - 17
src/Monolog/Formatter/FormatterInterface.php

@@ -1,17 +1,17 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-interface FormatterInterface
-{
-    function format($log, $level, $message);
-}
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+interface FormatterInterface
+{
+    function format($log, $level, $message);
+}

+ 51 - 48
src/Monolog/Formatter/SimpleFormatter.php

@@ -1,48 +1,51 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Formatter;
-
-class SimpleFormatter implements FormatterInterface
-{
-    const SIMPLE_FORMAT = "[%date%] %log%.%level%: %message%\n";
-    const SIMPLE_DATE = "Y-m-d H:i:s";
-
-    protected $format;
-    protected $dateFormat;
-
-    public function __construct($format = null, $dateFormat = null)
-    {
-        $this->format = $format ?: self::SIMPLE_FORMAT;
-        $this->dateFormat = $dateFormat ?: self::SIMPLE_DATE;
-    }
-
-    public function format($log, $level, $message)
-    {
-        $defaults = array(
-            'log' => $log,
-            'level' => $level,
-            'date' => date($this->dateFormat),
-        );
-
-        if (is_array($message)) {
-            $vars = array_merge($defaults, $message);
-        } else {
-            $vars = $defaults;
-            $vars['message'] = $message;
-        }
-
-        foreach ($vars as $var => $val) {
-            $message = str_replace('%'.$var.'%', $val, $message);
-        }
-        return $message;
-    }
-}
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+
+class SimpleFormatter implements FormatterInterface
+{
+    const SIMPLE_FORMAT = "[%date%] %log%.%level%: %message%\n";
+    const SIMPLE_DATE = "Y-m-d H:i:s";
+
+    protected $format;
+    protected $dateFormat;
+
+    public function __construct($format = null, $dateFormat = null)
+    {
+        $this->format = $format ?: self::SIMPLE_FORMAT;
+        $this->dateFormat = $dateFormat ?: self::SIMPLE_DATE;
+    }
+
+    public function format($log, $level, $message)
+    {
+        $defaults = array(
+            'log' => $log,
+            'level' => Logger::getLevelName($level),
+            'date' => date($this->dateFormat),
+        );
+
+        if (is_array($message)) {
+            $vars = array_merge($defaults, $message);
+        } else {
+            $vars = $defaults;
+            $vars['message'] = $message;
+        }
+
+        $message = $this->format;
+        foreach ($vars as $var => $val) {
+            $message = str_replace('%'.$var.'%', $val, $message);
+        }
+        return $message;
+    }
+}

+ 5 - 3
src/Monolog/Log.php

@@ -15,13 +15,15 @@ use Monolog\Writer\WriterInterface;
 
 class Log
 {
+    protected $level;
     protected $name;
     protected $writers;
 
-    public function __construct($name, $writers = array())
+    public function __construct($name, $level = Logger::WARN, $writers = array())
     {
         $this->name = $name;
-        $this->writers = $writers;
+        $this->level = $level;
+        $this->writers = (array) $writers;
     }
 
     public function getName()
@@ -51,6 +53,6 @@ class Log
 
     public function getLevel()
     {
-        return $level;
+        return $this->level;
     }
 }

+ 82 - 69
src/Monolog/Logger.php

@@ -1,70 +1,83 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog;
-
-class Logger
-{
-    const DEBUG = 1;
-    const INFO = 5;
-    const WARN = 10;
-    const ERROR = 15;
-    const FATAL = 20;
-
-    protected $logs;
-
-    public function __construct($logs = array())
-    {
-        $this->logs = $logs;
-    }
-
-    public function addLog(Log $log)
-    {
-        $this->logs[$log->getName()] = $log;
-    }
-
-    public function log($level, $message, $log = null)
-    {
-        if (null === $log) {
-            $logs = $this->logs;
-        } else {
-            $logs = (array) $log;
-        }
-        foreach ($logs as $log => $dummy) {
-            $this->logs[$log]->log($level, $message);
-        }
-    }
-
-    public function debug($message, $log = null)
-    {
-        $this->log(self::DEBUG, $message, $log);
-    }
-
-    public function info($message, $log = null)
-    {
-        $this->log(self::INFO, $message, $log);
-    }
-
-    public function warn($message, $log = null)
-    {
-        $this->log(self::WARN, $message, $log);
-    }
-
-    public function error($message, $log = null)
-    {
-        $this->log(self::ERROR, $message, $log);
-    }
-
-    public function fatal($message, $log = null)
-    {
-        $this->log(self::FATAL, $message, $log);
-    }
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+class Logger
+{
+    const DEBUG = 1;
+    const INFO = 5;
+    const WARN = 10;
+    const ERROR = 15;
+    const FATAL = 20;
+
+    protected static $levels = array(
+        1 => 'DEBUG',
+        5 => 'INFO',
+        10 => 'WARN',
+        15 => 'ERROR',
+        20 => 'FATAL',
+    );
+
+    protected $logs;
+
+    public function __construct($logs = array())
+    {
+        $this->logs = (array) $logs;
+    }
+
+    public function addLog(Log $log)
+    {
+        $this->logs[$log->getName()] = $log;
+    }
+
+    public function log($level, $message, $log = null)
+    {
+        if (null === $log) {
+            $logs = $this->logs;
+        } else {
+            $logs = is_array($log) ? array_flip($log) : array($log => true);
+        }
+        foreach ($logs as $log => $dummy) {
+            $this->logs[$log]->log($level, $message);
+        }
+    }
+
+    public function debug($message, $log = null)
+    {
+        $this->log(self::DEBUG, $message, $log);
+    }
+
+    public function info($message, $log = null)
+    {
+        $this->log(self::INFO, $message, $log);
+    }
+
+    public function warn($message, $log = null)
+    {
+        $this->log(self::WARN, $message, $log);
+    }
+
+    public function error($message, $log = null)
+    {
+        $this->log(self::ERROR, $message, $log);
+    }
+
+    public function fatal($message, $log = null)
+    {
+        $this->log(self::FATAL, $message, $log);
+    }
+
+    public static function getLevelName($level)
+    {
+        return self::$levels[$level];
+    }
 }

+ 40 - 40
src/Monolog/Writer/FileWriter.php

@@ -1,41 +1,41 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Writer;
-
-class FileWriter extends StreamWriter
-{
-    protected $rotation;
-    protected $maxAge;
-
-    public function __construct($file, $rotation = null, $maxAge = null)
-    {
-        parent::__construct($file);
-        $this->rotation = $rotation;
-        $this->maxAge = $maxAge;
-    }
-
-    public function close()
-    {
-        parent::close();
-        // TODO rotation
-    }
-
-    public function setRotation($rotation)
-    {
-        $this->rotation = $rotation;
-    }
-
-    public function setMaxAge($maxAge)
-    {
-        $this->maxAge = $maxAge;
-    }
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Writer;
+
+class FileWriter extends StreamWriter
+{
+    protected $rotation;
+    protected $maxAge;
+
+    public function __construct($file, $rotation = null, $maxAge = null)
+    {
+        parent::__construct($file);
+        $this->rotation = $rotation;
+        $this->maxAge = $maxAge;
+    }
+
+    public function close()
+    {
+        parent::close();
+        // TODO rotation
+    }
+
+    public function setRotation($rotation)
+    {
+        $this->rotation = $rotation;
+    }
+
+    public function setMaxAge($maxAge)
+    {
+        $this->maxAge = $maxAge;
+    }
 }

+ 28 - 28
src/Monolog/Writer/NullWriter.php

@@ -1,29 +1,29 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Writer;
-
-use Monolog\Formatter\FormatterInterface;
-
-class NullWriter implements WriterInterface
-{
-    public function write($log, $level, $message)
-    {
-    }
-
-    public function close()
-    {
-    }
-
-    public function setFormatter(FormatterInterface $formatter)
-    {
-    }
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Writer;
+
+use Monolog\Formatter\FormatterInterface;
+
+class NullWriter implements WriterInterface
+{
+    public function write($log, $level, $message)
+    {
+    }
+
+    public function close()
+    {
+    }
+
+    public function setFormatter(FormatterInterface $formatter)
+    {
+    }
 }

+ 58 - 47
src/Monolog/Writer/StreamWriter.php

@@ -1,48 +1,59 @@
-<?php
-
-/*
- * This file is part of the Monolog package.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Monolog\Writer;
-
-use Monolog\Formatter\FormatterInterface;
-
-class StreamWriter implements WriterInterface
-{
-    protected $formatter;
-    protected $stream;
-    protected $url;
-
-    public function __construct($streamUrl)
-    {
-        if (is_resource($streamUrl)) {
-            $this->stream = $streamUrl;
-        } else {
-            $this->url = $streamUrl;
-        }
-    }
-
-    public function write($log, $level, $message)
-    {
-        if (null === $this->stream) {
-            $this->stream = fopen($this->url, 'a');
-        }
-        fwrite($this->stream, $this->formatter->format($log, $level, $message));
-    }
-
-    public function close()
-    {
-        fclose($this->stream);
-    }
-
-    public function setFormatter(FormatterInterface $formatter)
-    {
-        $this->formatter = $formatter;
-    }
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Writer;
+
+use Monolog\Formatter\FormatterInterface;
+
+class StreamWriter implements WriterInterface
+{
+    protected $formatter;
+    protected $stream;
+    protected $url;
+
+    public function __construct($streamUrl)
+    {
+        if (is_resource($streamUrl)) {
+            $this->stream = $streamUrl;
+        } else {
+            $this->url = $streamUrl;
+        }
+    }
+
+    public function write($log, $level, $message)
+    {
+        if (null === $this->stream) {
+            $this->stream = fopen($this->url, 'a');
+        }
+        if ($this->formatter) {
+            $message = $this->formatter->format($log, $level, $message);
+        }
+        fwrite($this->stream, (string) $message);
+    }
+
+    public function close()
+    {
+        fclose($this->stream);
+        $this->stream = null;
+    }
+
+    public function setFormatter(FormatterInterface $formatter)
+    {
+        $this->formatter = $formatter;
+    }
+
+    public function __destruct()
+    {
+        if (null !== $this->stream) {
+            $this->close();
+        }
+    }
 }

+ 35 - 0
tests/Monolog/Formatter/SimpleFormatterTest.php

@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+
+class SimpleFormatterTest extends \PHPUnit_Framework_TestCase
+{
+    public function testDefFormatWithString()
+    {
+        $formatter = new SimpleFormatter(null, 'Y-m-d');
+        $message = $formatter->format('log', Logger::WARN, 'foo');
+        $this->assertEquals('['.date('Y-m-d').'] log.WARN: foo'."\n", $message);
+    }
+
+    public function testDefFormatWithArray()
+    {
+        $formatter = new SimpleFormatter(null, 'Y-m-d');
+        $message = $formatter->format('xx', Logger::FATAL, array(
+            'log' => 'log',
+            'level' => 'WARN',
+            'message' => 'foo'
+        ));
+        $this->assertEquals('['.date('Y-m-d').'] log.WARN: foo'."\n", $message);
+    }
+}

+ 44 - 0
tests/Monolog/LogTest.php

@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+class LogTest extends \PHPUnit_Framework_TestCase
+{
+    public function testLog()
+    {
+        $logger = new Log('bob');
+        $writer1 = $this->getMock('Monolog\Writer\NullWriter', array('write'));
+        $writer1->expects($this->once())
+            ->method('write')
+            ->with('bob', Logger::WARN, 'test');
+        $writer2 = $this->getMock('Monolog\Writer\NullWriter', array('write'));
+        $writer2->expects($this->once())
+            ->method('write')
+            ->with('bob', Logger::WARN, 'test');
+        $logger->addWriter($writer1);
+        $logger->addWriter($writer2);
+        $logger->log(Logger::WARN, 'test');
+    }
+
+    public function testLogLowLevel()
+    {
+        $logger = new Log('bob');
+        $logger->setLevel(Logger::FATAL);
+        $this->assertEquals(Logger::FATAL, $logger->getLevel());
+
+        $writer1 = $this->getMock('Monolog\Writer\NullWriter', array('write'));
+        $writer1->expects($this->never())
+            ->method('write');
+        $logger->addWriter($writer1);
+        $logger->log(Logger::WARN, 'test');
+    }
+}

+ 45 - 0
tests/Monolog/LoggerTest.php

@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+class LoggerTest extends \PHPUnit_Framework_TestCase
+{
+    public function testLogAll()
+    {
+        $logger = new Logger();
+        $log1 = $this->getMock('Monolog\Log', array('log'), array('a'));
+        $log1->expects($this->once())
+            ->method('log');
+        $log2 = $this->getMock('Monolog\Log', array('log'), array('b'));
+        $log2->expects($this->once())
+            ->method('log');
+        $logger->addLog($log1);
+        $logger->addLog($log2);
+        $logger->warn('test');
+    }
+
+    public function testLogFiltered()
+    {
+        $logger = new Logger();
+        $log1 = $this->getMock('Monolog\Log', array('log'), array('a'));
+        $log1->expects($this->exactly(2))
+            ->method('log');
+        $log2 = $this->getMock('Monolog\Log', array('log'), array('b'));
+        $log2->expects($this->never())
+            ->method('log');
+        $logger->addLog($log1);
+        $logger->addLog($log2);
+
+        $logger->warn('test', 'a');
+        $logger->warn('test', array('a'));
+    }
+}

+ 37 - 0
tests/Monolog/Writer/StreamWriterTest.php

@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Writer;
+
+use Monolog\Logger;
+
+class StreamWritterTest extends \PHPUnit_Framework_TestCase
+{
+    public function testWrite()
+    {
+        $handle = fopen('php://memory', 'a+');
+        $writer = new StreamWriter($handle);
+        $writer->write('log', Logger::WARN, 'test');
+        $writer->write('log', Logger::WARN, 'test2');
+        $writer->write('log', Logger::WARN, 'test3');
+        fseek($handle, 0);
+        $this->assertEquals('testtest2test3', fread($handle, 100));
+    }
+
+    public function testClose()
+    {
+        $handle = fopen('php://memory', 'a+');
+        $writer = new StreamWriter($handle);
+        $this->assertTrue(is_resource($handle));
+        $writer->close();
+        $this->assertFalse(is_resource($handle));
+    }
+}