blob: 7d62fe53eacc2e88b5ea05ccd1f86ff6c66b1aea [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
* @version $Revision$
* @link http://logging.apache.org/log4php
*/
/**
* Testclass for the MongoDB appender.
*
* This class has been originally contributed from Vladimir Gorej
* (http://github.com/log4mongo/log4mongo-php).
*
* @group appenders
*/
class LoggerAppenderMongoDBTest extends PHPUnit_Framework_TestCase {
protected $appender;
protected $event;
protected function setUp() {
if (!extension_loaded('mongo')) {
$this->markTestSkipped(
'The Mongo extension is not available.'
);
} else {
$this->appender = new LoggerAppenderMongoDB('mongo_appender');
$this->event = LoggerTestHelper::getErrorEvent('mongo logging event', 'test_mongo');
}
}
protected function tearDown() {
unset($this->appender);
}
public function testHost() {
$expected = 'mongodb://localhost';
$this->appender->setHost($expected);
$result = $this->appender->getHost();
$this->assertEquals($expected, $result);
}
public function testPort() {
$expected = 27017;
$this->appender->setPort($expected);
$result = $this->appender->getPort();
$this->assertEquals($expected, $result);
}
public function testDatabaseName() {
$expected = 'log4php_mongodb';
$this->appender->setDatabaseName($expected);
$result = $this->appender->getDatabaseName();
$this->assertEquals($expected, $result);
}
public function testCollectionName() {
$expected = 'logs';
$this->appender->setCollectionName($expected);
$result = $this->appender->getCollectionName();
$this->assertEquals($expected, $result);
}
public function testUserName() {
$expected = 'char0n';
$this->appender->setUserName($expected);
$result = $this->appender->getUserName();
$this->assertEquals($expected, $result);
}
public function testPassword() {
$expected = 'secret pass';
$this->appender->setPassword($expected);
$result = $this->appender->getPassword();
$this->assertEquals($expected, $result);
}
public function testTimeout() {
$expected = 4000;
$this->appender->setTimeout($expected);
$result = $this->appender->getTimeout();
$this->assertEquals($expected, $result);
}
public function testActivateOptions() {
$this->appender->activateOptions();
$this->assertInstanceOf('Mongo', $this->appender->getConnection());
$this->assertInstanceOf('MongoCollection', $this->appender->getCollection());
}
public function testActivateOptionsNoCredentials() {
$this->appender->setUserName(null);
$this->appender->setPassword(null);
$this->appender->activateOptions();
$this->assertInstanceOf('Mongo', $this->appender->getConnection());
$this->assertInstanceOf('MongoCollection', $this->appender->getCollection());
}
public function testFormat() {
$this->appender->activateOptions();
$record = $this->logOne($this->event);
$this->assertEquals('ERROR', $record['level']);
$this->assertEquals('mongo logging event', $record['message']);
$this->assertEquals('test_mongo', $record['loggerName']);
$this->assertEquals('NA', $record['fileName']);
$this->assertEquals('getLocationInformation', $record['method']);
$this->assertEquals('NA', $record['lineNumber']);
$this->assertEquals('LoggerLoggingEvent', $record['className']);
$this->assertTrue(is_int($record['thread']));
$this->assertSame(getmypid(), $record['thread']);
$this->assertTrue(is_int($record['lineNumber']) || $record['lineNumber'] == 'NA');
}
public function testFormatThrowableInfo() {
$this->appender->activateOptions();
$event = new LoggerLoggingEvent(
'testFqcn',
new Logger('test.Logger'),
LoggerLevel::getLevelWarn(),
'test message',
microtime(true),
new Exception('test exception', 1)
);
$record = $this->logOne($event);
$this->assertArrayHasKey('exception', $record);
$this->assertEquals(1, $record['exception']['code']);
$this->assertEquals('test exception', $record['exception']['message']);
$this->assertContains('[internal function]: LoggerAppenderMongoDBTest', $record['exception']['stackTrace']);
}
public function testFormatThrowableInfoWithInnerException() {
// Skip test if PHP version is lower than 5.3.0 (no inner exception support)
if (version_compare(PHP_VERSION, '5.3.0') < 0) {
$this->markTestSkipped();
}
$this->appender->activateOptions();
$event = new LoggerLoggingEvent(
'testFqcn',
new Logger('test.Logger'),
LoggerLevel::getLevelWarn(),
'test message',
microtime(true),
new Exception('test exception', 1, new Exception('test exception inner', 2))
);
$record = $this->logOne($event);
$this->assertArrayHasKey('exception', $record);
$this->assertEquals(1, $record['exception']['code']);
$this->assertEquals('test exception', $record['exception']['message']);
$this->assertContains('[internal function]: LoggerAppenderMongoDBTest', $record['exception']['stackTrace']);
$this->assertArrayHasKey('innerException', $record['exception']);
$this->assertEquals(2, $record['exception']['innerException']['code']);
$this->assertEquals('test exception inner', $record['exception']['innerException']['message']);
}
public function testClose() {
$this->appender->activateOptions();
$this->assertInstanceOf('Mongo', $this->appender->getConnection());
$this->assertInstanceOf('MongoCollection', $this->appender->getCollection());
$this->appender->close();
$this->assertNull($this->appender->getConnection());
$this->assertNull($this->appender->getCollection());
}
/**
* Logs the event and returns the record from the database.
* @param LoggerLoggingEvent $event
* @return array
*/
private function logOne($event)
{
$collection = $this->appender->getCollection();
$collection->drop();
$this->appender->append($event);
$record = $collection->findOne();
$this->assertNotNull($record, 'Could not read the record from the database.');
return $record;
}
}