2011-03-05 19:23:35 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
2011-03-06 11:40:06 +00:00
* ( c ) Fabien Potencier < fabien @ symfony . com >
2011-03-05 19:23:35 +00:00
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
2013-03-20 17:09:46 +00:00
namespace Symfony\Component\Debug\Tests ;
2011-03-05 19:23:35 +00:00
2013-03-20 17:09:46 +00:00
use Symfony\Component\Debug\ErrorHandler ;
2011-03-05 19:23:35 +00:00
/**
* ErrorHandlerTest
*
* @ author Robert Schönthal < seroscho @ googlemail . com >
*/
class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
{
2013-08-07 14:15:14 +01:00
public function testCompileTimeError ()
{
// the ContextErrorException must not be loaded for this test to work
if ( class_exists ( 'Symfony\Component\Debug\Exception\ContextErrorException' , false )) {
$this -> markTestSkipped ( 'The ContextErrorException class is already loaded.' );
}
$handler = ErrorHandler :: register ( E_ALL | E_STRICT );
$displayErrors = ini_get ( 'display_errors' );
ini_set ( 'display_errors' , '1' );
try {
// trigger compile time error
eval ( <<< 'PHP'
class _BaseCompileTimeError { function foo () {} }
class _CompileTimeError extends _BaseCompileTimeError { function foo ( $invalid ) {} }
PHP
);
} catch ( \Exception $e ) {
// if an exception is thrown, the test passed
}
ini_set ( 'display_errors' , $displayErrors );
restore_error_handler ();
}
2011-04-15 20:12:02 +01:00
2011-03-05 19:23:35 +00:00
public function testConstruct ()
{
2011-05-05 07:46:20 +01:00
$handler = ErrorHandler :: register ( 3 );
2011-04-15 20:12:02 +01:00
2011-05-05 07:46:20 +01:00
$level = new \ReflectionProperty ( $handler , 'level' );
2011-03-05 19:23:35 +00:00
$level -> setAccessible ( true );
2011-04-15 20:12:02 +01:00
2011-05-05 07:46:20 +01:00
$this -> assertEquals ( 3 , $level -> getValue ( $handler ));
2011-04-15 20:12:02 +01:00
2011-05-05 07:46:20 +01:00
restore_error_handler ();
2011-03-05 19:23:35 +00:00
}
public function testHandle ()
{
2011-05-05 07:46:20 +01:00
$handler = ErrorHandler :: register ( 0 );
$this -> assertFalse ( $handler -> handle ( 0 , 'foo' , 'foo.php' , 12 , 'foo' ));
restore_error_handler ();
$handler = ErrorHandler :: register ( 3 );
$this -> assertFalse ( $handler -> handle ( 4 , 'foo' , 'foo.php' , 12 , 'foo' ));
2011-04-15 20:12:02 +01:00
2011-05-05 07:46:20 +01:00
restore_error_handler ();
2011-04-15 20:12:02 +01:00
2011-05-05 07:46:20 +01:00
$handler = ErrorHandler :: register ( 3 );
try {
2012-10-07 20:03:04 +01:00
$handler -> handle ( 111 , 'foo' , 'foo.php' , 12 , 'foo' );
2011-05-05 07:46:20 +01:00
} catch ( \ErrorException $e ) {
2012-10-07 20:03:04 +01:00
$this -> assertSame ( '111: foo in foo.php line 12' , $e -> getMessage ());
$this -> assertSame ( 111 , $e -> getSeverity ());
2012-06-25 21:04:54 +01:00
$this -> assertSame ( 'foo.php' , $e -> getFile ());
$this -> assertSame ( 12 , $e -> getLine ());
2011-03-05 19:23:35 +00:00
}
2011-05-05 07:46:20 +01:00
restore_error_handler ();
2012-12-01 11:25:00 +00:00
$handler = ErrorHandler :: register ( E_USER_DEPRECATED );
$this -> assertTrue ( $handler -> handle ( E_USER_DEPRECATED , 'foo' , 'foo.php' , 12 , 'foo' ));
restore_error_handler ();
$handler = ErrorHandler :: register ( E_DEPRECATED );
$this -> assertTrue ( $handler -> handle ( E_DEPRECATED , 'foo' , 'foo.php' , 12 , 'foo' ));
restore_error_handler ();
2013-01-09 09:41:17 +00:00
$logger = $this -> getMock ( 'Psr\Log\LoggerInterface' );
2012-12-07 11:47:14 +00:00
$that = $this ;
$warnArgCheck = function ( $message , $context ) use ( $that ) {
$that -> assertEquals ( 'foo' , $message );
$that -> assertArrayHasKey ( 'type' , $context );
$that -> assertEquals ( $context [ 'type' ], ErrorHandler :: TYPE_DEPRECATION );
$that -> assertArrayHasKey ( 'stack' , $context );
$that -> assertInternalType ( 'array' , $context [ 'stack' ]);
};
$logger
-> expects ( $this -> once ())
2013-01-09 09:41:17 +00:00
-> method ( 'warning' )
2012-12-07 11:47:14 +00:00
-> will ( $this -> returnCallback ( $warnArgCheck ))
;
2012-12-01 11:25:00 +00:00
$handler = ErrorHandler :: register ( E_USER_DEPRECATED );
$handler -> setLogger ( $logger );
$handler -> handle ( E_USER_DEPRECATED , 'foo' , 'foo.php' , 12 , 'foo' );
restore_error_handler ();
2011-05-05 07:46:20 +01:00
}
2013-05-28 18:12:41 +01:00
/**
2013-07-24 05:59:37 +01:00
* @ dataProvider provideFatalErrorHandlersData
2013-05-28 18:12:41 +01:00
*/
2013-07-24 05:59:37 +01:00
public function testFatalErrorHandlers ( $error , $class , $translatedMessage )
2013-05-28 18:12:41 +01:00
{
2013-07-24 05:59:37 +01:00
$handler = new ErrorHandler ();
$exceptionHandler = new MockExceptionHandler ();
2013-07-23 19:05:03 +01:00
$m = new \ReflectionMethod ( $handler , 'handleFatalError' );
$m -> setAccessible ( true );
2013-07-24 05:59:37 +01:00
$m -> invoke ( $handler , $exceptionHandler , $error );
2013-05-28 18:12:41 +01:00
2013-07-24 05:59:37 +01:00
$this -> assertInstanceof ( $class , $exceptionHandler -> e );
2013-05-28 18:12:41 +01:00
$this -> assertSame ( $translatedMessage , $exceptionHandler -> e -> getMessage ());
$this -> assertSame ( $error [ 'type' ], $exceptionHandler -> e -> getSeverity ());
$this -> assertSame ( $error [ 'file' ], $exceptionHandler -> e -> getFile ());
$this -> assertSame ( $error [ 'line' ], $exceptionHandler -> e -> getLine ());
}
2013-07-24 05:59:37 +01:00
public function provideFatalErrorHandlersData ()
2013-05-28 18:12:41 +01:00
{
return array (
2013-07-24 05:59:37 +01:00
// undefined function
2013-05-28 18:12:41 +01:00
array (
array (
'type' => 1 ,
'line' => 12 ,
'file' => 'foo.php' ,
2013-07-23 19:05:03 +01:00
'message' => 'Call to undefined function test_namespaced_function()' ,
2013-05-28 18:12:41 +01:00
),
2013-07-24 05:59:37 +01:00
'Symfony\Component\Debug\Exception\UndefinedFunctionException' ,
'Attempted to call function "test_namespaced_function" from the global namespace in foo.php line 12. Did you mean to call: "\\symfony\\component\\debug\\tests\\fatalerrorhandler\\test_namespaced_function"?' ,
2013-05-28 18:12:41 +01:00
),
2013-07-24 05:59:37 +01:00
// class not found
2013-05-28 18:12:41 +01:00
array (
array (
'type' => 1 ,
'line' => 12 ,
'file' => 'foo.php' ,
2013-07-24 05:59:37 +01:00
'message' => 'Class "WhizBangFactory" not found' ,
2013-05-28 18:12:41 +01:00
),
2013-07-24 05:59:37 +01:00
'Symfony\Component\Debug\Exception\ClassNotFoundException' ,
'Attempted to load class "WhizBangFactory" from the global namespace in foo.php line 12. Did you forget a use statement for this class?' ,
2013-05-28 18:12:41 +01:00
),
);
}
2011-03-05 19:23:35 +00:00
}