<?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
 * @subpackage appenders
 * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @link       http://logging.apache.org/log4php
 */

/**
 * Tests the syslog appender.
 * 
 * Many of these tests rely on reflection features introduced in 5.3 and 
 * will be skipped if run on a lower version. 
 * 
 * This test will only write a single entry to the syslog.
 * 
 * @group appenders
 */
class LoggerAppenderSyslogTest extends PHPUnit_Framework_TestCase {

	public function testSettersGetters() {
		
		// Setters should accept any value, without validation 
		$expected = "Random string value";
		
		$appender = new LoggerAppenderSyslog();
		$appender->setIdent($expected);
		$appender->setFacility($expected);
		$appender->setOverridePriority($expected);
		$appender->setPriority($expected);
		$appender->setOption($expected);
		
		$actuals = array(
			$appender->getIdent(),
			$appender->getFacility(),
			$appender->getOverridePriority(),
			$appender->getPriority(),
			$appender->getOption()
		);
		
		foreach($actuals as $actual) {
			$this->assertSame($expected, $actual);
		}
	}
	
	public function testRequiresLayout() {
		$appender = new LoggerAppenderSyslog();
		$this->assertTrue($appender->requiresLayout());
	}
	
	public function testLogging() {
		$appender = new LoggerAppenderSyslog("myname");
		$appender->setLayout(new LoggerLayoutSimple());
		$appender->activateOptions();
		
		$event = new LoggerLoggingEvent(__CLASS__, new Logger("TestLogger"), LoggerLevel::getLevelError(), "testmessage");
		$appender->append($event);
	}

	/** Tests parsing of "option" parameter. */
	public function testOption() {
		if(!method_exists('ReflectionProperty', 'setAccessible')) {
			$this->markTestSkipped("ReflectionProperty::setAccessible() required to perform this test (available in PHP 5.3.2+).");
		}
		
		$options = array(
			'CONS' => LOG_CONS,
			'NDELAY' => LOG_NDELAY,
			'ODELAY' => LOG_ODELAY,
			'PERROR' => LOG_PERROR,
			'PID' => LOG_PID,
			
			// test some combinations
			'CONS|NDELAY' => LOG_CONS | LOG_NDELAY,
			'PID|PERROR' => LOG_PID | LOG_PERROR,
			'CONS|PID|NDELAY' => LOG_CONS | LOG_PID | LOG_NDELAY
		);

		// Defaults
		$defaultStr = "PID|CONS";
		$default = LOG_PID | LOG_CONS;
		
		// This makes reading of a private property possible
		$property = new ReflectionProperty('LoggerAppenderSyslog', 'intOption');
		$property->setAccessible(true);
		
		// Check default value first
		$appender = new LoggerAppenderSyslog();
		$appender->activateOptions();
		$actual = $property->getValue($appender);
		$this->assertSame($default, $actual, "Failed setting default option [$defaultStr]");
		
		foreach($options as $option => $expected) {
			$appender = new LoggerAppenderSyslog();
			$appender->setOption($option);
			$appender->activateOptions();
			
			$actual = $property->getValue($appender);
			$this->assertSame($expected, $actual, "Failed setting option [$option].");
		}
	}
	
	/** Tests parsing of "priority" parameter. */
	public function testPriority() {
		if(!method_exists('ReflectionProperty', 'setAccessible')) {
			$this->markTestSkipped("ReflectionProperty::setAccessible() required to perform this test (available in PHP 5.3.2+).");
		}
	
		$default = null;
		$defaultStr = 'null';
	
		$priorities = array(
			'EMERG' => LOG_EMERG,
			'ALERT' => LOG_ALERT,
			'CRIT' => LOG_CRIT,
			'ERR' => LOG_ERR,
			'WARNING' => LOG_WARNING,
			'NOTICE' => LOG_NOTICE,
			'INFO' => LOG_INFO,
			'DEBUG' => LOG_DEBUG
		);
	
		// This makes reading of a private property possible
		$property = new ReflectionProperty('LoggerAppenderSyslog', 'intPriority');
		$property->setAccessible(true);
	
		// Check default value first
		$appender = new LoggerAppenderSyslog();
		$appender->activateOptions();
		$actual = $property->getValue($appender);
		$this->assertSame($default, $actual, "Failed setting default priority [$defaultStr].");
	
		foreach($priorities as $priority => $expected) {
			$appender = new LoggerAppenderSyslog();
			$appender->setPriority($priority);
			$appender->activateOptions();
				
			$actual = $property->getValue($appender);
			$this->assertSame($expected, $actual, "Failed setting priority [$priority].");
		}
	}
	
	/** Tests parsing of "facility" parameter. */
	public function testFacility() {
		if(!method_exists('ReflectionProperty', 'setAccessible')) {
			$this->markTestSkipped("ReflectionProperty::setAccessible() required to perform this test (available in PHP 5.3.2+).");
		}
	
		// Default value is the same on all OSs
		$default = LOG_USER;
		$defaultStr = 'USER';

		// All possible facility strings (some of which might not exist depending on the OS)
		$strings = array(
			'KERN', 'USER', 'MAIL', 'DAEMON', 'AUTH',
			'SYSLOG', 'LPR', 'NEWS', 'UUCP', 'CRON', 'AUTHPRIV',
			'LOCAL0', 'LOCAL1', 'LOCAL2', 'LOCAL3', 'LOCAL4',
			'LOCAL5', 'LOCAL6', 'LOCAL7',
		);
		
		// Only test facilities which exist on this OS
		$facilities = array();
		foreach($strings as $string) {
			$const = "LOG_$string";
			if (defined($const)) {
				$facilities[$string] = constant($const); 
			}
		}
		
		// This makes reading of a private property possible
		$property = new ReflectionProperty('LoggerAppenderSyslog', 'intFacility');
		$property->setAccessible(true);
	
		// Check default value first
		$appender = new LoggerAppenderSyslog();
		$appender->activateOptions();
		$actual = $property->getValue($appender);
		$this->assertSame($default, $default, "Failed setting default facility [$defaultStr].");
	
		foreach($facilities as $facility => $expected) {
			$appender = new LoggerAppenderSyslog();
			$appender->setFacility($facility);
			$appender->activateOptions();
	
			$actual = $property->getValue($appender);
			$this->assertSame($expected, $actual, "Failed setting priority [$facility].");
		}
	}
	
	/**
	 * @expectedException PHPUnit_Framework_Error
	 */
	public function testInvalidOption() {
		$appender = new LoggerAppenderSyslog();
		$appender->setOption('CONS|XYZ');
		$appender->activateOptions();
	}
	
	/**
	 * @expectedException PHPUnit_Framework_Error
	 */
	public function testInvalidPriority() {
		$appender = new LoggerAppenderSyslog();
		$appender->setPriority('XYZ');
		$appender->activateOptions();
	}
	
	/**
	 * @expectedException PHPUnit_Framework_Error
	 */
	public function testInvalidFacility() {
		$appender = new LoggerAppenderSyslog();
		$appender->setFacility('XYZ');
		$appender->activateOptions();
	}
	
	
	public function testPriorityOverride() {
		if(!method_exists('ReflectionProperty', 'setAccessible')) {
			$this->markTestSkipped("ReflectionProperty::setAccessible() required to perform this test (available in PHP 5.3.2+).");
		}
		
		$appender = new LoggerAppenderSyslog();
		$appender->setPriority('EMERG');
		$appender->setOverridePriority(true);
		$appender->activateOptions();
		
		$levels = array(
			LoggerLevel::getLevelTrace(),
			LoggerLevel::getLevelDebug(),
			LoggerLevel::getLevelInfo(),
			LoggerLevel::getLevelWarn(),
			LoggerLevel::getLevelError(),
			LoggerLevel::getLevelFatal(),
		);
		
		$expected = LOG_EMERG;
		
		$method = new ReflectionMethod('LoggerAppenderSyslog', 'getSyslogPriority');
		$method->setAccessible(true);
		
		foreach($levels as $level) {
			$actual = $method->invoke($appender, $level);
			$this->assertSame($expected, $actual);		
		}
	}
}
