mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2024-11-16 03:48:24 +00:00
6bf9363217
add blacklisting for logging exceptions add test for skipping exception logging, and fix typo and cs add example to docblock in core.php for skipLog remove app_error.php skips, those are no longer used in 2.x use assertContains instead of assertRegExp check for instanceof, instead of matching names
325 lines
8.4 KiB
PHP
325 lines
8.4 KiB
PHP
<?php
|
|
/**
|
|
* ErrorHandlerTest file
|
|
*
|
|
* PHP 5
|
|
*
|
|
* CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
|
|
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
|
*
|
|
* Licensed under The MIT License
|
|
* For full copyright and license information, please see the LICENSE.txt
|
|
* Redistributions of files must retain the above copyright notice
|
|
*
|
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
|
* @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
|
|
* @package Cake.Test.Case.Error
|
|
* @since CakePHP(tm) v 1.2.0.5432
|
|
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
|
|
*/
|
|
|
|
App::uses('ErrorHandler', 'Error');
|
|
App::uses('Controller', 'Controller');
|
|
App::uses('Router', 'Routing');
|
|
|
|
/**
|
|
* ErrorHandlerTest class
|
|
*
|
|
* @package Cake.Test.Case.Error
|
|
*/
|
|
class ErrorHandlerTest extends CakeTestCase {
|
|
|
|
protected $_restoreError = false;
|
|
|
|
/**
|
|
* setup create a request object to get out of router later.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function setUp() {
|
|
parent::setUp();
|
|
App::build(array(
|
|
'View' => array(
|
|
CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS
|
|
)
|
|
), App::RESET);
|
|
Router::reload();
|
|
|
|
$request = new CakeRequest(null, false);
|
|
$request->base = '';
|
|
Router::setRequestInfo($request);
|
|
Configure::write('debug', 2);
|
|
|
|
CakeLog::disable('stdout');
|
|
CakeLog::disable('stderr');
|
|
}
|
|
|
|
/**
|
|
* tearDown
|
|
*
|
|
* @return void
|
|
*/
|
|
public function tearDown() {
|
|
parent::tearDown();
|
|
if ($this->_restoreError) {
|
|
restore_error_handler();
|
|
}
|
|
CakeLog::enable('stdout');
|
|
CakeLog::enable('stderr');
|
|
}
|
|
|
|
/**
|
|
* test error handling when debug is on, an error should be printed from Debugger.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHandleErrorDebugOn() {
|
|
set_error_handler('ErrorHandler::handleError');
|
|
$this->_restoreError = true;
|
|
|
|
ob_start();
|
|
$wrong .= '';
|
|
$result = ob_get_clean();
|
|
|
|
$this->assertRegExp('/<pre class="cake-error">/', $result);
|
|
$this->assertRegExp('/<b>Notice<\/b>/', $result);
|
|
$this->assertRegExp('/variable:\s+wrong/', $result);
|
|
}
|
|
|
|
/**
|
|
* provides errors for mapping tests.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function errorProvider() {
|
|
return array(
|
|
array(E_USER_NOTICE, 'Notice'),
|
|
array(E_USER_WARNING, 'Warning'),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* test error mappings
|
|
*
|
|
* @dataProvider errorProvider
|
|
* @return void
|
|
*/
|
|
public function testErrorMapping($error, $expected) {
|
|
set_error_handler('ErrorHandler::handleError');
|
|
$this->_restoreError = true;
|
|
|
|
ob_start();
|
|
trigger_error('Test error', $error);
|
|
|
|
$result = ob_get_clean();
|
|
$this->assertRegExp('/<b>' . $expected . '<\/b>/', $result);
|
|
}
|
|
|
|
/**
|
|
* test error prepended by @
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testErrorSuppressed() {
|
|
set_error_handler('ErrorHandler::handleError');
|
|
$this->_restoreError = true;
|
|
|
|
ob_start();
|
|
//@codingStandardsIgnoreStart
|
|
@include 'invalid.file';
|
|
//@codingStandardsIgnoreEnd
|
|
$result = ob_get_clean();
|
|
$this->assertTrue(empty($result));
|
|
}
|
|
|
|
/**
|
|
* Test that errors go into CakeLog when debug = 0.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHandleErrorDebugOff() {
|
|
Configure::write('debug', 0);
|
|
Configure::write('Error.trace', false);
|
|
if (file_exists(LOGS . 'debug.log')) {
|
|
unlink(LOGS . 'debug.log');
|
|
}
|
|
|
|
set_error_handler('ErrorHandler::handleError');
|
|
$this->_restoreError = true;
|
|
|
|
$out .= '';
|
|
|
|
$result = file(LOGS . 'debug.log');
|
|
$this->assertEquals(1, count($result));
|
|
$this->assertRegExp(
|
|
'/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} (Notice|Debug): Notice \(8\): Undefined variable:\s+out in \[.+ line \d+\]$/',
|
|
$result[0]
|
|
);
|
|
if (file_exists(LOGS . 'debug.log')) {
|
|
unlink(LOGS . 'debug.log');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test that errors going into CakeLog include traces.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHandleErrorLoggingTrace() {
|
|
Configure::write('debug', 0);
|
|
Configure::write('Error.trace', true);
|
|
if (file_exists(LOGS . 'debug.log')) {
|
|
unlink(LOGS . 'debug.log');
|
|
}
|
|
|
|
set_error_handler('ErrorHandler::handleError');
|
|
$this->_restoreError = true;
|
|
|
|
$out .= '';
|
|
|
|
$result = file(LOGS . 'debug.log');
|
|
$this->assertRegExp(
|
|
'/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} (Notice|Debug): Notice \(8\): Undefined variable:\s+out in \[.+ line \d+\]$/',
|
|
$result[0]
|
|
);
|
|
$this->assertRegExp('/^Trace:/', $result[1]);
|
|
$this->assertRegExp('/^ErrorHandlerTest\:\:testHandleErrorLoggingTrace\(\)/', $result[2]);
|
|
if (file_exists(LOGS . 'debug.log')) {
|
|
unlink(LOGS . 'debug.log');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* test handleException generating a page.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHandleException() {
|
|
$error = new NotFoundException('Kaboom!');
|
|
ob_start();
|
|
ErrorHandler::handleException($error);
|
|
$result = ob_get_clean();
|
|
$this->assertRegExp('/Kaboom!/', $result, 'message missing.');
|
|
}
|
|
|
|
/**
|
|
* test handleException generating log.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHandleExceptionLog() {
|
|
if (file_exists(LOGS . 'error.log')) {
|
|
unlink(LOGS . 'error.log');
|
|
}
|
|
Configure::write('Exception.log', true);
|
|
$error = new NotFoundException('Kaboom!');
|
|
|
|
ob_start();
|
|
ErrorHandler::handleException($error);
|
|
$result = ob_get_clean();
|
|
$this->assertRegExp('/Kaboom!/', $result, 'message missing.');
|
|
|
|
$log = file(LOGS . 'error.log');
|
|
$this->assertContains('[NotFoundException] Kaboom!', $log[0], 'message missing.');
|
|
$this->assertContains('ErrorHandlerTest->testHandleExceptionLog', $log[2], 'Stack trace missing.');
|
|
}
|
|
|
|
/**
|
|
* test handleException generating log.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHandleExceptionLogSkipping() {
|
|
if (file_exists(LOGS . 'error.log')) {
|
|
unlink(LOGS . 'error.log');
|
|
}
|
|
Configure::write('Exception.log', true);
|
|
Configure::write('Exception.skipLog', array('NotFoundException'));
|
|
$notFound = new NotFoundException('Kaboom!');
|
|
$forbidden = new ForbiddenException('Fooled you!');
|
|
|
|
ob_start();
|
|
ErrorHandler::handleException($notFound);
|
|
$result = ob_get_clean();
|
|
$this->assertRegExp('/Kaboom!/', $result, 'message missing.');
|
|
|
|
ob_start();
|
|
ErrorHandler::handleException($forbidden);
|
|
$result = ob_get_clean();
|
|
$this->assertRegExp('/Fooled you!/', $result, 'message missing.');
|
|
|
|
$log = file(LOGS . 'error.log');
|
|
$this->assertNotContains('[NotFoundException] Kaboom!', $log[0], 'message should not be logged.');
|
|
$this->assertContains('[ForbiddenException] Fooled you!', $log[0], 'message missing.');
|
|
}
|
|
|
|
/**
|
|
* tests it is possible to load a plugin exception renderer
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testLoadPluginHandler() {
|
|
App::build(array(
|
|
'Plugin' => array(
|
|
CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS
|
|
)
|
|
), App::RESET);
|
|
CakePlugin::load('TestPlugin');
|
|
Configure::write('Exception.renderer', 'TestPlugin.TestPluginExceptionRenderer');
|
|
$error = new NotFoundException('Kaboom!');
|
|
ob_start();
|
|
ErrorHandler::handleException($error);
|
|
$result = ob_get_clean();
|
|
$this->assertEquals('Rendered by test plugin', $result);
|
|
CakePlugin::unload();
|
|
}
|
|
|
|
/**
|
|
* test handleFatalError generating a page.
|
|
*
|
|
* These tests start two buffers as handleFatalError blows the outer one up.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHandleFatalErrorPage() {
|
|
$line = __LINE__;
|
|
|
|
ob_start();
|
|
ob_start();
|
|
Configure::write('debug', 1);
|
|
ErrorHandler::handleFatalError(E_ERROR, 'Something wrong', __FILE__, $line);
|
|
$result = ob_get_clean();
|
|
$this->assertContains('Something wrong', $result, 'message missing.');
|
|
$this->assertContains(__FILE__, $result, 'filename missing.');
|
|
$this->assertContains((string)$line, $result, 'line missing.');
|
|
|
|
ob_start();
|
|
ob_start();
|
|
Configure::write('debug', 0);
|
|
ErrorHandler::handleFatalError(E_ERROR, 'Something wrong', __FILE__, $line);
|
|
$result = ob_get_clean();
|
|
$this->assertNotContains('Something wrong', $result, 'message must not appear.');
|
|
$this->assertNotContains(__FILE__, $result, 'filename must not appear.');
|
|
$this->assertContains('An Internal Error Has Occurred', $result);
|
|
}
|
|
|
|
/**
|
|
* test handleException generating log.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHandleFatalErrorLog() {
|
|
if (file_exists(LOGS . 'error.log')) {
|
|
unlink(LOGS . 'error.log');
|
|
}
|
|
|
|
ob_start();
|
|
ErrorHandler::handleFatalError(E_ERROR, 'Something wrong', __FILE__, __LINE__);
|
|
ob_clean();
|
|
|
|
$log = file(LOGS . 'error.log');
|
|
$this->assertContains(__FILE__, $log[0], 'missing filename');
|
|
$this->assertContains('[FatalErrorException] Something wrong', $log[1], 'message missing.');
|
|
}
|
|
|
|
}
|