blob: 65646fb27325a52d35d531d5175dfbed52a23ae2 [file] [log] [blame]
<?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());
}
}