You've already forked phpmyadmin
mirror of
https://github.com/phpmyadmin/phpmyadmin.git
synced 2026-10-29 21:24:44 +03:00
Surprisingly PHP stack frames are passed as references to the error handling code, thus changing value there leads to changing value in the executed code. With MySQL issuing warning about incompatible version (different runtime library than compile time), handling this warning rewrites current stack frame and the mysql_real_connect later sees parameters as processed by Error class for display. We now create copy of the stacktrace to avoid this. Fixes #12279 Signed-off-by: Michal Čihař <michal@cihar.com>
191 lines
4.2 KiB
PHP
191 lines
4.2 KiB
PHP
<?php
|
|
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
|
/**
|
|
* Tests for Error.php
|
|
*
|
|
* @package PhpMyAdmin-test
|
|
*/
|
|
|
|
/*
|
|
* Include to test.
|
|
*/
|
|
|
|
use PMA\libraries\Theme;
|
|
|
|
require_once 'libraries/sanitizing.lib.php';
|
|
require_once 'test/PMATestCase.php';
|
|
|
|
/**
|
|
* Error class testing.
|
|
*
|
|
* @package PhpMyAdmin-test
|
|
*/
|
|
class ErrorTest extends PMATestCase
|
|
{
|
|
/**
|
|
* @access protected
|
|
*/
|
|
protected $object;
|
|
|
|
/**
|
|
* Sets up the fixture, for example, opens a network connection.
|
|
* This method is called before a test is executed.
|
|
*
|
|
* @access protected
|
|
* @return void
|
|
*/
|
|
protected function setUp()
|
|
{
|
|
$this->object = new PMA\libraries\Error('2', 'Compile Error', 'error.txt', 15);
|
|
|
|
$GLOBALS['pmaThemeImage'] = 'image';
|
|
$_SESSION['PMA_Theme'] = Theme::load('./themes/pmahomme');
|
|
$_SESSION['PMA_Theme'] = new Theme();
|
|
}
|
|
|
|
/**
|
|
* Tears down the fixture, for example, closes a network connection.
|
|
* This method is called after a test is executed.
|
|
*
|
|
* @access protected
|
|
* @return void
|
|
*/
|
|
protected function tearDown()
|
|
{
|
|
unset($this->object);
|
|
}
|
|
|
|
/**
|
|
* Test for setBacktrace
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testSetBacktrace()
|
|
{
|
|
$bt = array(array('file'=>'bt1','line'=>2, 'function'=>'bar', 'args'=>array('foo'=>$this)));
|
|
$this->object->setBacktrace($bt);
|
|
$bt[0]['args']['foo'] = 'object';
|
|
$this->assertEquals($bt, $this->object->getBacktrace());
|
|
}
|
|
|
|
/**
|
|
* Test for setLine
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testSetLine()
|
|
{
|
|
$this->object->setLine(15);
|
|
$this->assertEquals(15, $this->object->getLine());
|
|
}
|
|
|
|
/**
|
|
* Test for setFile
|
|
*
|
|
* @return void
|
|
*
|
|
* @dataProvider filePathProvider
|
|
*/
|
|
public function testSetFile($file, $expected)
|
|
{
|
|
$this->object->setFile($file);
|
|
$this->assertEquals($expected, $this->object->getFile());
|
|
}
|
|
|
|
/**
|
|
* Data provider for setFile
|
|
*
|
|
* @return array
|
|
*/
|
|
public function filePathProvider()
|
|
{
|
|
return array(
|
|
array('./ChangeLog', './ChangeLog'),
|
|
array(__FILE__, './test/classes/ErrorTest.php'),
|
|
array('./NONEXISTING', './NONEXISTING'),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Test for getHash
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetHash()
|
|
{
|
|
$this->assertEquals(
|
|
1,
|
|
preg_match('/^([a-z0-9]*)$/', $this->object->getHash())
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Test for getBacktraceDisplay
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetBacktraceDisplay()
|
|
{
|
|
$this->assertContains(
|
|
'PHPUnit_Framework_TestResult->run(object)<br />',
|
|
$this->object->getBacktraceDisplay()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Test for getDisplay
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetDisplay()
|
|
{
|
|
$this->assertContains(
|
|
'<div class="error"><strong>Warning</strong>',
|
|
$this->object->getDisplay()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Test for getHtmlTitle
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetHtmlTitle()
|
|
{
|
|
$this->assertEquals('Warning: Compile Error', $this->object->getHtmlTitle());
|
|
}
|
|
|
|
/**
|
|
* Test for getTitle
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetTitle()
|
|
{
|
|
$this->assertEquals('Warning: Compile Error', $this->object->getTitle());
|
|
}
|
|
|
|
/**
|
|
* Test for getBacktrace
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetBacktrace()
|
|
{
|
|
$bt = array(
|
|
array('file'=>'bt1','line'=>2, 'function'=>'bar', 'args'=>array('foo'=>1)),
|
|
array('file'=>'bt2','line'=>2, 'function'=>'bar', 'args'=>array('foo'=>2)),
|
|
array('file'=>'bt3','line'=>2, 'function'=>'bar', 'args'=>array('foo'=>3)),
|
|
array('file'=>'bt4','line'=>2, 'function'=>'bar', 'args'=>array('foo'=>4)),
|
|
);
|
|
|
|
$this->object->setBacktrace($bt);
|
|
|
|
// case: full backtrace
|
|
$this->assertEquals(4, count($this->object->getBacktrace()));
|
|
|
|
// case: first 2 frames
|
|
$this->assertEquals(2, count($this->object->getBacktrace(2)));
|
|
}
|
|
}
|