You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4php-dev@logging.apache.org by ih...@apache.org on 2010/09/18 13:42:17 UTC

svn commit: r998444 - in /logging/log4php/trunk/src: changes/changes.xml main/php/LoggerMDC.php test/php/LoggerMDCTest.php

Author: ihabunek
Date: Sat Sep 18 11:42:17 2010
New Revision: 998444

URL: http://svn.apache.org/viewvc?rev=998444&view=rev
Log:
LOG4PHP-105: LoggerMDC needs refactoring; added tests

Added:
    logging/log4php/trunk/src/test/php/LoggerMDCTest.php
Modified:
    logging/log4php/trunk/src/changes/changes.xml
    logging/log4php/trunk/src/main/php/LoggerMDC.php

Modified: logging/log4php/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/changes/changes.xml?rev=998444&r1=998443&r2=998444&view=diff
==============================================================================
--- logging/log4php/trunk/src/changes/changes.xml (original)
+++ logging/log4php/trunk/src/changes/changes.xml Sat Sep 18 11:42:17 2010
@@ -24,6 +24,7 @@
   </properties>
   <body>
   	<release version="2.1" description="Stabilizing">
+  		<action type="fix" issue="LOG4PHP-105" by="Ivan Habunek">LoggerMDC needs refactoring + tests</action>
   		<action type="update" by="Ivan Habunek">Added __toString magic method to LoggerLevel.</action>
   		<action type="fix" issue="LOG4PHP-117" by="Maciej Mazur, Ivan Habunek">LoggerConfiguratorIni::configure() and unexptected results from error_get_last()</action>
   		<action type="fix" issue="LOG4PHP-113" by="Ivan Habunek">Milliseconds do not change when using LoggerLayoutPattern</action>

Modified: logging/log4php/trunk/src/main/php/LoggerMDC.php
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/LoggerMDC.php?rev=998444&r1=998443&r2=998444&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/LoggerMDC.php (original)
+++ logging/log4php/trunk/src/main/php/LoggerMDC.php Sat Sep 18 11:42:17 2010
@@ -19,11 +19,6 @@
  */
 
 /**
- * This is the global repository of user mappings
- */
-$GLOBALS['log4php.LoggerMDC.ht'] = array();
-
-/**
  * The LoggerMDC class provides <i>mapped diagnostic contexts</i>.
  * 
  * <p>A <i>Mapped Diagnostic Context</i>, or
@@ -55,6 +50,12 @@ $GLOBALS['log4php.LoggerMDC.ht'] = array
  * @package log4php
  */
 class LoggerMDC {
+	
+	/**
+	 * This is the repository of user mappings
+	 */
+	private static $map = array();
+		
 	/**
 	 * Put a context value as identified with the key parameter into the current thread's
 	 *	context map.
@@ -69,7 +70,7 @@ class LoggerMDC {
 	 * @static
 	 */
 	public static function put($key, $value) {
-		$GLOBALS['log4php.LoggerMDC.ht'][$key] = $value;
+		self::$map[$key] = $value;
 	}
   
 	/**
@@ -81,20 +82,22 @@ class LoggerMDC {
 	 *
 	 * <p>This method has no side effects.</p>
 	 *
-	 * @param string $key
-	 * @return string
+	 * @param string $key the key
+	 * @return string the context or an empty string if no context found
+	 * 	for given key
 	 * @static
 	 */
 	public static function get($key) {
 		if(!empty($key)) {
 			if(strpos($key, 'server.') === 0) {
 				$varName = substr($key, 7);
-				return @$_SERVER[$varName];
+				return isset($_SERVER[$varName]) ? $_SERVER[$varName] : '';
 			} else if(strpos($key, 'env.') === 0) {
 				$varName = substr($key, 4);
-				return @$_ENV[$varName];
-			} else if (isset($GLOBALS['log4php.LoggerMDC.ht'][$key])) {
-				return $GLOBALS['log4php.LoggerMDC.ht'][$key];
+				$value = getenv($varName);
+				return ($value !== false) ? $value : '';
+			} else {
+				return isset(self::$map[$key]) ? self::$map[$key] : '';
 			}
 		}
 		return '';
@@ -103,14 +106,12 @@ class LoggerMDC {
 	/**
 	 * Remove the the context identified by the key parameter. 
 	 *
-	 * It only affects user mappings.
+	 * It only affects user mappings, not $_ENV or $_SERVER.
 	 *
-	 * @param string $key
-	 * @return string
+	 * @param string $key the key to be removed
 	 * @static
 	 */
 	public static function remove($key) {
-		unset($GLOBALS['log4php.LoggerMDC.ht'][$key]);
+		unset(self::$map[$key]);
 	}
-
 }

Added: logging/log4php/trunk/src/test/php/LoggerMDCTest.php
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/test/php/LoggerMDCTest.php?rev=998444&view=auto
==============================================================================
--- logging/log4php/trunk/src/test/php/LoggerMDCTest.php (added)
+++ logging/log4php/trunk/src/test/php/LoggerMDCTest.php Sat Sep 18 11:42:17 2010
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * @category   tests
+ * @package    log4php
+ * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @version    SVN: $Id$
+ * @link       http://logging.apache.org/log4php
+ */
+class LoggerMDCTest extends PHPUnit_Framework_TestCase {
+	
+	/** A pattern with 1 key. */
+	private $pattern1 = "%-5p %c: %X{key1} %m";
+	
+	/** A pattern with 2 keys. */
+	private $pattern2 = "%-5p %c: %X{key1} %X{key2} %m";
+	
+	/** A pattern with 3 keys (one is numeric). */
+	private $pattern3 = "%-5p %c: %X{key1} %X{key2} %X{3} %m";
+	
+	/** A pattern with a non-existant key. */
+	private $pattern4 = "%-5p %c: %X{key_does_not_exist} %m";
+	
+	/** A pattern with an empty key. */
+	private $pattern5 = "%-5p %c: %X{} %m";
+	
+	/** A pattern for testing values from $_ENV. */
+	private $patternEnv = "%-5p %c: %X{env.TEST} %m";
+	
+	/**
+	 * A pattern for testing values from $_SERVER. PHP_SELF chosen because it
+	 * appears on both Linux and Windows systems. 
+	 */
+	private $patternServer = "%-5p %c: %X{server.PHP_SELF} %m";
+	
+
+	public function testPatterns() {
+
+		// Create some data to test with
+		LoggerMDC::put('key1', 'valueofkey1');
+		LoggerMDC::put('key2', 'valueofkey2');
+		LoggerMDC::put(3, 'valueofkey3');
+		
+		$event = new LoggerLoggingEvent("LoggerLayoutPattern", new Logger("TEST"), LoggerLevel::getLevelInfo(), "Test message");
+
+		// Pattern with 1 key
+		$actual = $this->formatEvent($event, $this->pattern1);
+		$expected = "INFO  TEST: valueofkey1 Test message";
+		self::assertEquals($expected, $actual);
+		
+		// Pattern with 2 keys
+		$actual = $this->formatEvent($event, $this->pattern2);
+		$expected = "INFO  TEST: valueofkey1 valueofkey2 Test message";
+		self::assertEquals($expected, $actual);
+		
+		// Pattern with 3 keys (one numeric)
+		$actual = $this->formatEvent($event, $this->pattern3);
+		$expected = "INFO  TEST: valueofkey1 valueofkey2 valueofkey3 Test message";
+		self::assertEquals($expected, $actual);
+		
+		// Pattern with non-existant key
+		$actual = $this->formatEvent($event, $this->pattern4);
+		$expected = "INFO  TEST:  Test message";
+		self::assertEquals($expected, $actual);
+		
+		// Pattern with an empty key
+    	$actual = $this->formatEvent($event, $this->pattern5);
+		$expected = "INFO  TEST:  Test message";
+		self::assertEquals($expected, $actual);
+		
+		// Test key removal
+		LoggerMDC::remove('key1');
+		$value = LoggerMDC::get('key1');
+		self::assertEquals('', $value);
+		
+		// Pattern with 1 key, now removed
+		$actual = $this->formatEvent($event, $this->pattern1);
+		$expected = "INFO  TEST:  Test message";
+		self::assertEquals($expected, $actual);
+    }
+    
+    public function testEnvKey() {
+    	
+    	// Set an environment variable for testing
+    	if (putenv('TEST=abc') === false) {
+    		self::markTestSkipped("Unable to set environment variable for testing.");
+    	}
+    	
+    	// Test reading of the set variable
+    	self::assertEquals('abc', LoggerMDC::get('env.TEST'));
+    	
+    	// Test env variable in a pattern
+    	$event = new LoggerLoggingEvent("LoggerLayoutPattern", new Logger("TEST"), LoggerLevel::getLevelInfo(), "Test message");
+    	$actual = $this->formatEvent($event, $this->patternEnv);
+		$expected = "INFO  TEST: abc Test message";
+		self::assertEquals($expected, $actual);
+		
+		// Test reading a non-existant env variable
+		self::assertEquals('', LoggerMDC::get('env.hopefully_this_variable_doesnt_exist'));
+		
+		// Test reading an empty env variable
+		self::assertEquals('', LoggerMDC::get('env.'));
+    }
+    
+    public function testServerKey() {
+    	
+    	// Test reading a server variable
+    	$value = $_SERVER['PHP_SELF'];
+    	self::assertEquals($value, LoggerMDC::get('server.PHP_SELF'));
+    	
+		// Test the server variable in a pattern
+    	$event = new LoggerLoggingEvent("LoggerLayoutPattern", new Logger("TEST"), LoggerLevel::getLevelInfo(), "Test message");
+    	$actual = $this->formatEvent($event, $this->patternServer);
+		$expected = "INFO  TEST: $value Test message";
+		self::assertEquals($expected, $actual);
+		
+		// Test reading a non-existant server variable
+		self::assertEquals('', LoggerMDC::get('server.hopefully_this_variable_doesnt_exist'));
+		
+		// Test reading an empty server variable
+		self::assertEquals('', LoggerMDC::get('server.'));
+    }
+    
+	private function formatEvent($event, $pattern) {
+		$layout = new LoggerLayoutPattern();
+		$layout->setConversionPattern($pattern);
+		return $layout->format($event);
+	}
+}
+
+?>