<?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
 */

/**
 * @group appenders
 */
class LoggerAppenderPDOTest extends PHPUnit_Framework_TestCase {

	const FILENAME = 'pdotest.sqlite';
	private static $dsn;
	private static $file;
	
	public static function setUpBeforeClass() {

		self::$file = PHPUNIT_TEMP_DIR . '/' . self::FILENAME;
		self::$dsn = 'sqlite:' . self::$file;
		
		if(extension_loaded('pdo_sqlite')) {
			$drop = 'DROP TABLE IF EXISTS log4php_log;';
			$create = 'CREATE TABLE log4php_log (
				timestamp VARCHAR(256),
				logger VARCHAR(256),
				level VARCHAR(32),
				message VARCHAR(4000),
				thread INTEGER,
				file VARCHAR(255),
				line VARCHAR(10)
			);';
			
			$pdo = new PDO(self::$dsn);
			$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			$pdo->exec($drop);
			$pdo->exec($create);
		}
	}
	
	/** To start with an empty database for each single test. */
	public function setUp() {
		if(!extension_loaded('pdo_sqlite')) {
			self::markTestSkipped("Please install 'pdo_sqlite' in order to run this test");
		}
	}

	/** Clean up after the last test was run. */
	public static function tearDownAfterClass() {
		@unlink(self::$file);
	}
	
	public function testRequiresLayout() {
		$appender = new LoggerAppenderPDO();
		self::assertFalse($appender->requiresLayout());
	}

	/** Tests new-style logging using prepared statements and the default SQL definition. */
	public function testSimpleWithDefaults() {
		// Log event
		$event = new LoggerLoggingEvent("LoggerAppenderPDOTest", new Logger("TEST"), LoggerLevel::getLevelError(), "testmessage");
		$appender = new LoggerAppenderPDO("myname");
		$appender->setDSN(self::$dsn);
		$appender->activateOptions();
		$appender->append($event);
		$appender->close();

		// Test the default pattern
		$db = new PDO(self::$dsn);
		$query = "SELECT * FROM log4php_log";
		$sth = $db->query($query);
		$row = $sth->fetch(PDO::FETCH_NUM);
		
		self::assertTrue(is_array($row), "No rows found.");
		self::assertEquals(7, count($row));
		self::assertEquals(1, preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $row[0])); // datetime
		self::assertEquals('TEST', $row[1]); // logger name
		self::assertEquals('ERROR', $row[2]); // level
		self::assertEquals('testmessage', $row[3]); // message
		if (function_exists('posix_getpid')) {
			self::assertEquals(posix_getpid(), $row[4]); // process id
		}
		self::assertEquals('NA', $row[5]); // file, NA due to phpunit magic
		self::assertEquals('NA', $row[6]); // line, NA due to phpunit magic
	}


	/** Tests new style prepared statment logging with customized SQL. */
	public function testCustomizedSql() {
		
		$dateFormat = "Y-m-d H:i:s";
		
		// Prepare appender
		$appender = new LoggerAppenderPDO("myname");
		$appender->setDSN(self::$dsn);
		$appender->setInsertSql("INSERT INTO log4php_log (file, line, thread, timestamp, logger, level, message) VALUES (?,?,?,?,?,?,?)");
		$appender->setInsertPattern("%F,%L,%t,%d\{$dateFormat\},%c,%p,%m");
		$appender->activateOptions();

		// Action!
		$event = new LoggerLoggingEvent("LoggerAppenderPDOTest2", new Logger("TEST"), LoggerLevel::getLevelError(), "testmessage");
		$appender->append($event);
		
		// Check
		$db = new PDO(self::$dsn);
		$result = $db->query("SELECT * FROM log4php_log");
		$row = $result->fetch(PDO::FETCH_OBJ);
		self::assertTrue(is_object($row));
		self::assertEquals("NA", $row->file); // "NA" due to phpunit magic
		self::assertEquals("NA", $row->line); // "NA" due to phpunit magic
		if (function_exists('posix_getpid')) {
			self::assertEquals(posix_getpid(), $row->thread);
		}
		self::assertEquals(1, preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $row->timestamp));
		self::assertEquals('TEST', $row->logger);
		self::assertEquals('ERROR', $row->level);
		self::assertEquals('testmessage', $row->message);
	}
	
	/** 
	 * Tests a warning is shown when connecting to invalid dns. 
 	 * @expectedException PHPUnit_Framework_Error
 	 * @expectedExceptionMessage invalid data source name
	 */
	public function testException() {
		$dsn = 'doenotexist';
		$appender = new LoggerAppenderPDO("myname");
		$appender->setDSN($dsn);
		$appender->activateOptions();
	}
	
	/**
	 * Check whether close() actually closes the database connection. 
	 */
	public function testClose() {
		$event = new LoggerLoggingEvent("LoggerAppenderPDOTest", new Logger("TEST"), LoggerLevel::getLevelError(), "testmessage");
		
		$appender = new LoggerAppenderPDO("myname");
		$appender->setDSN(self::$dsn);
		$appender->activateOptions();
		$appender->append($event);
		$appender->close();
		
		self::assertNull($appender->getDatabaseHandle());
	}
}
