mirror of
https://github.com/symfony/debug.git
synced 2026-03-28 03:02:09 +01:00
* 2.8: (65 commits) [VarDumper] Fix tests for HHVM Update DateTimeToArrayTransformer.php Mock microtime() and time() in transient tests Azerbaijani language pluralization rule Move HHVM tests out of the allowed failures Fix merge [2.6] Towards 100% HHVM compat [Security/Http] Fix test [Stopwatch] Fix test Minor fixes [Validator] Added missing error codes and turned codes into UUIDs Towards 100% HHVM compat Warmup twig templates in non-standard paths (closes #12507) [Bridge/PhpUnit] Enforce a consistent locale Fix param order of assertEquals (expected, actual) in test for Finder\Glob Fix choice translation domain for expanded choice widget unify default AccessDeniedExeption message trigger event with right user (add test) [Security] Initialize SwitchUserEvent::targetUser on attemptExitUser fixed CS ... Conflicts: UPGRADE-2.8.md src/Symfony/Bridge/ProxyManager/composer.json src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php src/Symfony/Bundle/FrameworkBundle/Resources/config/old_assets.xml src/Symfony/Bundle/FrameworkBundle/Resources/config/test.xml src/Symfony/Bundle/FrameworkBundle/Resources/config/validator.xml src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_public.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_public.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_public.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_services.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_services.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_services.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tag1.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tag1.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tag1.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tags.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tags.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tags.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_1.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_1.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_1.txt src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_1.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.txt src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_1.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_1.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_1.txt src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_1.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_2.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_2.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_2.txt src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_2.xml src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/CsrfFormLoginBundle/Form/UserLoginFormType.php src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/CsrfFormLogin/config.yml src/Symfony/Bundle/SecurityBundle/composer.json src/Symfony/Component/Debug/ErrorHandler.php src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php src/Symfony/Component/DependencyInjection/Definition.php src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php src/Symfony/Component/DependencyInjection/Tests/ContainerTest.php src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/legacy-container9.php src/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/legacy-services9.dot src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/legacy-services6.xml src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/legacy-services9.xml src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/legacy-services6.yml src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/legacy-services9.yml src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php src/Symfony/Component/Form/ResolvedFormType.php src/Symfony/Component/Form/Tests/CompoundFormTest.php src/Symfony/Component/Process/Tests/AbstractProcessTest.php src/Symfony/Component/VarDumper/Tests/CliDumperTest.php src/Symfony/Component/VarDumper/Tests/HtmlDumperTest.php
462 lines
15 KiB
PHP
462 lines
15 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\Debug\Tests;
|
|
|
|
use Psr\Log\LogLevel;
|
|
use Symfony\Component\Debug\ErrorHandler;
|
|
use Symfony\Component\Debug\Exception\ContextErrorException;
|
|
|
|
/**
|
|
* ErrorHandlerTest.
|
|
*
|
|
* @author Robert Schönthal <seroscho@googlemail.com>
|
|
* @author Nicolas Grekas <p@tchwork.com>
|
|
*/
|
|
class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
|
|
{
|
|
public function testRegister()
|
|
{
|
|
$handler = ErrorHandler::register();
|
|
|
|
try {
|
|
$this->assertInstanceOf('Symfony\Component\Debug\ErrorHandler', $handler);
|
|
$this->assertSame($handler, ErrorHandler::register());
|
|
|
|
$newHandler = new ErrorHandler();
|
|
|
|
$this->assertSame($newHandler, ErrorHandler::register($newHandler, false));
|
|
$h = set_error_handler('var_dump');
|
|
restore_error_handler();
|
|
$this->assertSame(array($handler, 'handleError'), $h);
|
|
|
|
try {
|
|
$this->assertSame($newHandler, ErrorHandler::register($newHandler, true));
|
|
$h = set_error_handler('var_dump');
|
|
restore_error_handler();
|
|
$this->assertSame(array($newHandler, 'handleError'), $h);
|
|
} catch (\Exception $e) {
|
|
}
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
if (isset($e)) {
|
|
throw $e;
|
|
}
|
|
} catch (\Exception $e) {
|
|
}
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
if (isset($e)) {
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function testNotice()
|
|
{
|
|
ErrorHandler::register();
|
|
|
|
try {
|
|
self::triggerNotice($this);
|
|
$this->fail('ContextErrorException expected');
|
|
} catch (ContextErrorException $exception) {
|
|
// if an exception is thrown, the test passed
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
$this->assertEquals(E_NOTICE, $exception->getSeverity());
|
|
$this->assertEquals(__FILE__, $exception->getFile());
|
|
$this->assertRegexp('/^Notice: Undefined variable: (foo|bar)/', $exception->getMessage());
|
|
$this->assertArrayHasKey('foobar', $exception->getContext());
|
|
|
|
$trace = $exception->getTrace();
|
|
$this->assertEquals(__FILE__, $trace[0]['file']);
|
|
$this->assertEquals('Symfony\Component\Debug\ErrorHandler', $trace[0]['class']);
|
|
$this->assertEquals('handleError', $trace[0]['function']);
|
|
$this->assertEquals('->', $trace[0]['type']);
|
|
|
|
$this->assertEquals(__FILE__, $trace[1]['file']);
|
|
$this->assertEquals(__CLASS__, $trace[1]['class']);
|
|
$this->assertEquals('triggerNotice', $trace[1]['function']);
|
|
$this->assertEquals('::', $trace[1]['type']);
|
|
|
|
$this->assertEquals(__FILE__, $trace[1]['file']);
|
|
$this->assertEquals(__CLASS__, $trace[2]['class']);
|
|
$this->assertEquals(__FUNCTION__, $trace[2]['function']);
|
|
$this->assertEquals('->', $trace[2]['type']);
|
|
} catch (\Exception $e) {
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
// dummy function to test trace in error handler.
|
|
private static function triggerNotice($that)
|
|
{
|
|
// dummy variable to check for in error handler.
|
|
$foobar = 123;
|
|
$that->assertSame('', $foo.$foo.$bar);
|
|
}
|
|
|
|
public function testConstruct()
|
|
{
|
|
try {
|
|
$handler = ErrorHandler::register();
|
|
$handler->throwAt(3, true);
|
|
$this->assertEquals(3 | E_RECOVERABLE_ERROR | E_USER_ERROR, $handler->throwAt(0));
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
} catch (\Exception $e) {
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function testDefaultLogger()
|
|
{
|
|
try {
|
|
$handler = ErrorHandler::register();
|
|
|
|
$logger = $this->getMock('Psr\Log\LoggerInterface');
|
|
|
|
$handler->setDefaultLogger($logger, E_NOTICE);
|
|
$handler->setDefaultLogger($logger, array(E_USER_NOTICE => LogLevel::CRITICAL));
|
|
|
|
$loggers = array(
|
|
E_DEPRECATED => array(null, LogLevel::INFO),
|
|
E_USER_DEPRECATED => array(null, LogLevel::INFO),
|
|
E_NOTICE => array($logger, LogLevel::WARNING),
|
|
E_USER_NOTICE => array($logger, LogLevel::CRITICAL),
|
|
E_STRICT => array(null, LogLevel::WARNING),
|
|
E_WARNING => array(null, LogLevel::WARNING),
|
|
E_USER_WARNING => array(null, LogLevel::WARNING),
|
|
E_COMPILE_WARNING => array(null, LogLevel::WARNING),
|
|
E_CORE_WARNING => array(null, LogLevel::WARNING),
|
|
E_USER_ERROR => array(null, LogLevel::CRITICAL),
|
|
E_RECOVERABLE_ERROR => array(null, LogLevel::CRITICAL),
|
|
E_COMPILE_ERROR => array(null, LogLevel::CRITICAL),
|
|
E_PARSE => array(null, LogLevel::CRITICAL),
|
|
E_ERROR => array(null, LogLevel::CRITICAL),
|
|
E_CORE_ERROR => array(null, LogLevel::CRITICAL),
|
|
);
|
|
$this->assertSame($loggers, $handler->setLoggers(array()));
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
} catch (\Exception $e) {
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function testHandleError()
|
|
{
|
|
try {
|
|
$handler = ErrorHandler::register();
|
|
$handler->throwAt(0, true);
|
|
$this->assertFalse($handler->handleError(0, 'foo', 'foo.php', 12, array()));
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
$handler = ErrorHandler::register();
|
|
$handler->throwAt(3, true);
|
|
$this->assertFalse($handler->handleError(4, 'foo', 'foo.php', 12, array()));
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
$handler = ErrorHandler::register();
|
|
$handler->throwAt(3, true);
|
|
try {
|
|
$handler->handleError(4, 'foo', 'foo.php', 12, array());
|
|
} catch (\ErrorException $e) {
|
|
$this->assertSame('Parse Error: foo', $e->getMessage());
|
|
$this->assertSame(4, $e->getSeverity());
|
|
$this->assertSame('foo.php', $e->getFile());
|
|
$this->assertSame(12, $e->getLine());
|
|
}
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
$handler = ErrorHandler::register();
|
|
$handler->throwAt(E_USER_DEPRECATED, true);
|
|
$this->assertFalse($handler->handleError(E_USER_DEPRECATED, 'foo', 'foo.php', 12, array()));
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
$handler = ErrorHandler::register();
|
|
$handler->throwAt(E_DEPRECATED, true);
|
|
$this->assertFalse($handler->handleError(E_DEPRECATED, 'foo', 'foo.php', 12, array()));
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
$logger = $this->getMock('Psr\Log\LoggerInterface');
|
|
|
|
$warnArgCheck = function ($logLevel, $message, $context) {
|
|
$this->assertEquals('info', $logLevel);
|
|
$this->assertEquals('foo', $message);
|
|
$this->assertArrayHasKey('type', $context);
|
|
$this->assertEquals($context['type'], E_USER_DEPRECATED);
|
|
$this->assertArrayHasKey('stack', $context);
|
|
$this->assertInternalType('array', $context['stack']);
|
|
};
|
|
|
|
$logger
|
|
->expects($this->once())
|
|
->method('log')
|
|
->will($this->returnCallback($warnArgCheck))
|
|
;
|
|
|
|
$handler = ErrorHandler::register();
|
|
$handler->setDefaultLogger($logger, E_USER_DEPRECATED);
|
|
$this->assertTrue($handler->handleError(E_USER_DEPRECATED, 'foo', 'foo.php', 12, array()));
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
$logger = $this->getMock('Psr\Log\LoggerInterface');
|
|
|
|
$logArgCheck = function ($level, $message, $context) {
|
|
$this->assertEquals('Undefined variable: undefVar', $message);
|
|
$this->assertArrayHasKey('type', $context);
|
|
$this->assertEquals($context['type'], E_NOTICE);
|
|
};
|
|
|
|
$logger
|
|
->expects($this->once())
|
|
->method('log')
|
|
->will($this->returnCallback($logArgCheck))
|
|
;
|
|
|
|
$handler = ErrorHandler::register();
|
|
$handler->setDefaultLogger($logger, E_NOTICE);
|
|
$handler->screamAt(E_NOTICE);
|
|
unset($undefVar);
|
|
@$undefVar++;
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
} catch (\Exception $e) {
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function testHandleUserError()
|
|
{
|
|
try {
|
|
$handler = ErrorHandler::register();
|
|
$handler->throwAt(0, true);
|
|
|
|
$e = null;
|
|
$x = new \Exception('Foo');
|
|
|
|
try {
|
|
$f = new Fixtures\ToStringThrower($x);
|
|
$f .= ''; // Trigger $f->__toString()
|
|
} catch (\Exception $e) {
|
|
}
|
|
|
|
$this->assertSame($x, $e);
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
} catch (\Exception $e) {
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function testHandleException()
|
|
{
|
|
try {
|
|
$handler = ErrorHandler::register();
|
|
|
|
$exception = new \Exception('foo');
|
|
|
|
$logger = $this->getMock('Psr\Log\LoggerInterface');
|
|
|
|
$logArgCheck = function ($level, $message, $context) {
|
|
$this->assertEquals('Uncaught Exception: foo', $message);
|
|
$this->assertArrayHasKey('type', $context);
|
|
$this->assertEquals($context['type'], E_ERROR);
|
|
};
|
|
|
|
$logger
|
|
->expects($this->exactly(2))
|
|
->method('log')
|
|
->will($this->returnCallback($logArgCheck))
|
|
;
|
|
|
|
$handler->setDefaultLogger($logger, E_ERROR);
|
|
|
|
try {
|
|
$handler->handleException($exception);
|
|
$this->fail('Exception expected');
|
|
} catch (\Exception $e) {
|
|
$this->assertSame($exception, $e);
|
|
}
|
|
|
|
$handler->setExceptionHandler(function ($e) use ($exception) {
|
|
$this->assertSame($exception, $e);
|
|
});
|
|
|
|
$handler->handleException($exception);
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
} catch (\Exception $e) {
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function testErrorStacking()
|
|
{
|
|
try {
|
|
$handler = ErrorHandler::register();
|
|
$handler->screamAt(E_USER_WARNING);
|
|
|
|
$logger = $this->getMock('Psr\Log\LoggerInterface');
|
|
|
|
$logger
|
|
->expects($this->exactly(2))
|
|
->method('log')
|
|
->withConsecutive(
|
|
array($this->equalTo(LogLevel::WARNING), $this->equalTo('Dummy log')),
|
|
array($this->equalTo(LogLevel::DEBUG), $this->equalTo('Silenced warning'))
|
|
)
|
|
;
|
|
|
|
$handler->setDefaultLogger($logger, array(E_USER_WARNING => LogLevel::WARNING));
|
|
|
|
ErrorHandler::stackErrors();
|
|
@trigger_error('Silenced warning', E_USER_WARNING);
|
|
$logger->log(LogLevel::WARNING, 'Dummy log');
|
|
ErrorHandler::unstackErrors();
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
} catch (\Exception $e) {
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function testHandleFatalError()
|
|
{
|
|
try {
|
|
$handler = ErrorHandler::register();
|
|
|
|
$error = array(
|
|
'type' => E_PARSE,
|
|
'message' => 'foo',
|
|
'file' => 'bar',
|
|
'line' => 123,
|
|
);
|
|
|
|
$logger = $this->getMock('Psr\Log\LoggerInterface');
|
|
|
|
$logArgCheck = function ($level, $message, $context) {
|
|
$this->assertEquals('Fatal Parse Error: foo', $message);
|
|
$this->assertArrayHasKey('type', $context);
|
|
$this->assertEquals($context['type'], E_PARSE);
|
|
};
|
|
|
|
$logger
|
|
->expects($this->once())
|
|
->method('log')
|
|
->will($this->returnCallback($logArgCheck))
|
|
;
|
|
|
|
$handler->setDefaultLogger($logger, E_PARSE);
|
|
|
|
$handler->handleFatalError($error);
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
} catch (\Exception $e) {
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function testHandleFatalErrorOnHHVM()
|
|
{
|
|
try {
|
|
$handler = ErrorHandler::register();
|
|
|
|
$logger = $this->getMock('Psr\Log\LoggerInterface');
|
|
$logger
|
|
->expects($this->once())
|
|
->method('log')
|
|
->with(
|
|
$this->equalTo(LogLevel::CRITICAL),
|
|
$this->equalTo('Fatal Error: foo'),
|
|
$this->equalTo(array(
|
|
'type' => 1,
|
|
'file' => 'bar',
|
|
'line' => 123,
|
|
'level' => -1,
|
|
'stack' => array(456),
|
|
))
|
|
)
|
|
;
|
|
|
|
$handler->setDefaultLogger($logger, E_ERROR);
|
|
|
|
$error = array(
|
|
'type' => E_ERROR + 0x1000000, // This error level is used by HHVM for fatal errors
|
|
'message' => 'foo',
|
|
'file' => 'bar',
|
|
'line' => 123,
|
|
'context' => array(123),
|
|
'backtrace' => array(456),
|
|
);
|
|
|
|
call_user_func_array(array($handler, 'handleError'), $error);
|
|
$handler->handleFatalError($error);
|
|
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
} catch (\Exception $e) {
|
|
restore_error_handler();
|
|
restore_exception_handler();
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
}
|