<?php
namespace Symfony\Component\HttpKernel\Tests\EventListener;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\EventListener\ExceptionListener;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Tests\Logger;
class ExceptionListenerTest extends \PHPUnit_Framework_TestCase {
protected function setUp() {
if (!class_exists('Symfony\\Component\\EventDispatcher\\EventDispatcher')) {
$this
->markTestSkipped('The "EventDispatcher" component is not available');
}
if (!class_exists('Symfony\\Component\\HttpFoundation\\Request')) {
$this
->markTestSkipped('The "HttpFoundation" component is not available');
}
}
public function testConstruct() {
$logger = new TestLogger();
$l = new ExceptionListener('foo', $logger);
$_logger = new \ReflectionProperty(get_class($l), 'logger');
$_logger
->setAccessible(true);
$_controller = new \ReflectionProperty(get_class($l), 'controller');
$_controller
->setAccessible(true);
$this
->assertSame($logger, $_logger
->getValue($l));
$this
->assertSame('foo', $_controller
->getValue($l));
}
public function testHandleWithoutLogger($event, $event2) {
$errorLog = ini_set('error_log', file_exists('/dev/null') ? '/dev/null' : 'nul');
$l = new ExceptionListener('foo');
$l
->onKernelException($event);
$this
->assertEquals(new Response('foo'), $event
->getResponse());
try {
$l
->onKernelException($event2);
} catch (\Exception $e) {
$this
->assertSame('foo', $e
->getMessage());
}
ini_set('error_log', $errorLog);
}
public function testHandleWithLogger($event, $event2) {
$logger = new TestLogger();
$l = new ExceptionListener('foo', $logger);
$l
->onKernelException($event);
$this
->assertEquals(new Response('foo'), $event
->getResponse());
try {
$l
->onKernelException($event2);
} catch (\Exception $e) {
$this
->assertSame('foo', $e
->getMessage());
}
$this
->assertEquals(3, $logger
->countErrors());
$this
->assertCount(3, $logger
->getLogs('critical'));
}
public function provider() {
if (!class_exists('Symfony\\Component\\HttpFoundation\\Request')) {
return array(
array(
null,
null,
),
);
}
$request = new Request();
$exception = new \Exception('foo');
$event = new GetResponseForExceptionEvent(new TestKernel(), $request, 'foo', $exception);
$event2 = new GetResponseForExceptionEvent(new TestKernelThatThrowsException(), $request, 'foo', $exception);
return array(
array(
$event,
$event2,
),
);
}
}
class TestLogger extends Logger implements DebugLoggerInterface {
public function countErrors() {
return count($this->logs['critical']);
}
}
class TestKernel implements HttpKernelInterface {
public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true) {
return new Response('foo');
}
}
class TestKernelThatThrowsException implements HttpKernelInterface {
public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true) {
throw new \Exception('bar');
}
}