diff --git a/PHP/CodeCoverage/Driver/Xdebug.php b/PHP/CodeCoverage/Driver/Xdebug.php index a0a88cf30..2c3f1ff1d 100644 --- a/PHP/CodeCoverage/Driver/Xdebug.php +++ b/PHP/CodeCoverage/Driver/Xdebug.php @@ -92,7 +92,41 @@ public function stop() { $codeCoverage = xdebug_get_code_coverage(); xdebug_stop_code_coverage(); + $codeCoverage = self::cleanFilenames($codeCoverage); return $codeCoverage; } + + /** + * By-pass http://bugs.xdebug.org/bug_view_page.php?bug_id=0000331 + * + * This Xdebug bug causes some filenames to be corrupted in the form + * "[..]/wrongreturn.php(19) : assert code" + * instead of + * "[..]/wrongreturn.php" + * The goal of this function is to by-pass the bug until it is fixed in Xdebug + * by cleaning corrupted filenames + * + * @return array + */ + protected static function cleanFilenames($data) + { + foreach ($data as $file => $lines) { + // check the existence of the wrong pattern in filename + $correct_file = preg_replace('/\(\d+\) :.+/', '', $file); + if ($file != $correct_file) { + // if wrong filename found, we merge code coverage data + // with correct filename + if (!array_key_exists($correct_file, $data)) { + $data[$correct_file] = array(); + } + $data[$correct_file] += $lines; + ksort($data[$correct_file]); + // and unset wrong filename data + unset($data[$file]); + } + } + + return $data; + } } diff --git a/Tests/PHP/CodeCoverage/Driver/XdebugTest.php b/Tests/PHP/CodeCoverage/Driver/XdebugTest.php new file mode 100644 index 000000000..9e06672cb --- /dev/null +++ b/Tests/PHP/CodeCoverage/Driver/XdebugTest.php @@ -0,0 +1,34 @@ + + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://github.com/sebastianbergmann/php-code-coverage + */ +class PHP_CodeCoverage_Driver_XdebugTest extends PHPUnit_Framework_TestCase +{ + /** + * Tests that the Xdebug driver by-passed Xdebug bug #331 + * http://bugs.xdebug.org/bug_view_page.php?bug_id=0000331 + * + * @covers PHP_CodeCoverage_Driver_Xdebug::cleanFilenames + * @covers PHP_CodeCoverage_Driver_Xdebug::stop + * + */ + public function testCoveredFiles() + { + $driver = new PHP_CodeCoverage_Driver_Xdebug; + $driver->start(); + assert('2 >= 0'); + $data = $driver->stop(); + foreach ($data as $file => $lines) { + $this->assertNotcontains(' : assert code', $file); + } + } +}