allow MDC have callable param - unit tests
diff --git a/src/main/php/pattern/LoggerPatternConverter.php b/src/main/php/pattern/LoggerPatternConverter.php
index f4d868e..0e236ad 100644
--- a/src/main/php/pattern/LoggerPatternConverter.php
+++ b/src/main/php/pattern/LoggerPatternConverter.php
@@ -101,8 +101,10 @@
return;
}
- if ($string instanceof Closure) {
- $string = ($string)();
+ if (version_compare(phpversion(), '5.3.0', '>=')) {
+ if ($string instanceof Closure) {
+ $string = $string();
+ }
}
$len = strlen($string);
diff --git a/src/test/php/LoggerIdGenerator.php b/src/test/php/LoggerIdGenerator.php
new file mode 100644
index 0000000..2587422
--- /dev/null
+++ b/src/test/php/LoggerIdGenerator.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * That's a singletone class
+ */
+
+class LoggerIdGenerator
+{
+ private static $instance;
+ private $requestId;
+ private $sequence = 1;
+
+ protected function __construct() {/* you can't create me */
+ }
+
+ public function getId() {
+ if($this->requestId == null) {
+ $dateTime = new DateTime();
+ $this->requestId = $dateTime->getTimestamp() . rand(1000, 9999);
+ }
+ return $this->requestId;
+ }
+
+ public function getSeq() {
+ return $this->sequence++;
+ }
+
+ public static function me() {
+ return self::getInstance();
+ }
+
+ final public static function getInstance() {
+
+ if(!isset(self::$instance)) {
+ self::$instance = new self;
+ }
+
+ return self::$instance;
+ }
+
+ final private function __clone() {/* do not clone me */
+ }
+}
diff --git a/src/test/php/LoggerMDCTest.php b/src/test/php/LoggerMDCTest.php
index 8d2b610..f2aebc5 100644
--- a/src/test/php/LoggerMDCTest.php
+++ b/src/test/php/LoggerMDCTest.php
@@ -42,7 +42,10 @@
/** A pattern without a key. */
private $pattern5 = "%-5p %c: %X %m";
-
+
+ /** Pattern for closure */
+ private $pattern6 = "%m - sequence: %X{requestSequence}";
+
protected function setUp() {
LoggerMDC::clear();
}
@@ -50,7 +53,38 @@
protected function tearDown() {
LoggerMDC::clear();
}
-
+
+ public function testClosure() {
+ if (version_compare(phpversion(), '5.3.0', '>=')) {
+ LoggerMDC::put("requestSequence",
+ function() {
+ return sprintf("%02d", LoggerIdGenerator::me()->getSeq());
+ }
+ );
+ // Test in a cycle
+ for($i=1; $i <= 10; $i++) {
+ $event = LoggerTestHelper::getInfoEvent(sprintf('Iteration %02d', $i));
+ $actual = $this->formatEvent($event, $this->pattern6);
+ $expected = sprintf("Iteration %02d - sequence: %02d", $i, $i);
+ self::assertEquals($expected, $actual);
+ }
+ // Increment outside of MDC
+ self::assertEquals($i, LoggerIdGenerator::me()->getSeq());
+ $i++;
+
+ // Recheck MDC has correct sequence
+ $event = LoggerTestHelper::getDebugEvent(sprintf('Debug %02d', $i));
+ $actual = $this->formatEvent($event, $this->pattern6);
+ $expected = sprintf("Debug %02d - sequence: %02d", $i, $i);
+
+ self::assertEquals($expected, $actual);
+
+ } else {
+ // Closures available Since 5.3.0
+ self::assertSame(1, 1);
+ }
+ }
+
public function testPatterns() {
// Create some data to test with