/** * Filters stack frames from PHPUnit classes. * * @param Exception $e * @param boolean $filterTests * @param boolean $asString * @return string */ public static function getFilteredStacktrace(Exception $e, $filterTests = TRUE, $asString = TRUE) { if ($asString === TRUE) { $filteredStacktrace = ''; } else { $filteredStacktrace = array(); } $groups = array('DEFAULT'); if (!defined('PHPUNIT_TESTSUITE')) { $groups[] = 'PHPUNIT'; } if ($filterTests) { $groups[] = 'TESTS'; } if ($e instanceof PHPUnit_Framework_SyntheticError) { $eTrace = $e->getSyntheticTrace(); } else { $eTrace = $e->getTrace(); } if (!self::frameExists($eTrace, $e->getFile(), $e->getLine())) { array_unshift($eTrace, array('file' => $e->getFile(), 'line' => $e->getLine())); } foreach ($eTrace as $frame) { if (isset($frame['file']) && is_file($frame['file']) && !PHP_CodeCoverage::getInstance()->filter()->isFiltered($frame['file'], $groups, TRUE)) { if ($asString === TRUE) { $filteredStacktrace .= sprintf("%s:%s\n", $frame['file'], isset($frame['line']) ? $frame['line'] : '?'); } else { $filteredStacktrace[] = $frame; } } } return $filteredStacktrace; }
/** * Filters stack frames from PHPUnit classes. * * @param Exception $e * @param boolean $asString * @return string */ public static function getFilteredStacktrace(Exception $e, $asString = TRUE) { if (!defined('PHPUNIT_TESTSUITE')) { $blacklist = PHPUnit_Util_GlobalState::phpunitFiles(); } else { $blacklist = array(); } if ($asString === TRUE) { $filteredStacktrace = ''; } else { $filteredStacktrace = array(); } if ($e instanceof PHPUnit_Framework_SyntheticError) { $eTrace = $e->getSyntheticTrace(); $eFile = $e->getSyntheticFile(); $eLine = $e->getSyntheticLine(); } else { $eTrace = $e->getTrace(); $eFile = $e->getFile(); $eLine = $e->getLine(); } if (!self::frameExists($eTrace, $eFile, $eLine)) { array_unshift($eTrace, array('file' => $eFile, 'line' => $eLine)); } foreach ($eTrace as $frame) { if (isset($frame['file']) && is_file($frame['file']) && !isset($blacklist[$frame['file']])) { if ($asString === TRUE) { $filteredStacktrace .= sprintf("%s:%s\n", $frame['file'], isset($frame['line']) ? $frame['line'] : '?'); } else { $filteredStacktrace[] = $frame; } } } return $filteredStacktrace; }
/** * Filters stack frames from PHPUnit classes. * * @param Exception $e * @param boolean $asString * @return string */ public static function getFilteredStacktrace(Exception $e, $asString = TRUE) { $prefix = FALSE; $script = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']); if (defined('__PHPUNIT_PHAR__')) { $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/'; } if (!defined('PHPUNIT_TESTSUITE')) { $blacklist = PHPUnit_Util_GlobalState::phpunitFiles(); } else { $blacklist = array(); } if ($asString === TRUE) { $filteredStacktrace = ''; } else { $filteredStacktrace = array(); } if ($e instanceof PHPUnit_Framework_SyntheticError) { $eTrace = $e->getSyntheticTrace(); $eFile = $e->getSyntheticFile(); $eLine = $e->getSyntheticLine(); } else { if ($e->getPrevious()) { $eTrace = $e->getPrevious()->getTrace(); } else { $eTrace = $e->getTrace(); } $eFile = $e->getFile(); $eLine = $e->getLine(); } if (!self::frameExists($eTrace, $eFile, $eLine)) { array_unshift($eTrace, array('file' => $eFile, 'line' => $eLine)); } foreach ($eTrace as $frame) { if (isset($frame['file']) && is_file($frame['file']) && !isset($blacklist[$frame['file']]) && ($prefix === FALSE || strpos($frame['file'], $prefix) !== 0) && $frame['file'] !== $script) { if ($asString === TRUE) { $filteredStacktrace .= sprintf("%s:%s\n", $frame['file'], isset($frame['line']) ? $frame['line'] : '?'); } else { $filteredStacktrace[] = $frame; } } } return $filteredStacktrace; }
/** * Filters stack frames from PHPUnit classes. * * @param Exception $e * @param bool $asString * @return string */ public static function getFilteredStacktrace(Exception $e, $asString = true) { $prefix = false; $script = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']); if (defined('__PHPUNIT_PHAR_ROOT__')) { $prefix = __PHPUNIT_PHAR_ROOT__; } if ($asString === true) { $filteredStacktrace = ''; } else { $filteredStacktrace = array(); } if ($e instanceof PHPUnit_Framework_SyntheticError) { $eTrace = $e->getSyntheticTrace(); $eFile = $e->getSyntheticFile(); $eLine = $e->getSyntheticLine(); } elseif ($e instanceof PHPUnit_Framework_Exception) { $eTrace = $e->getSerializableTrace(); $eFile = $e->getFile(); $eLine = $e->getLine(); } else { if ($e->getPrevious()) { $e = $e->getPrevious(); } $eTrace = $e->getTrace(); $eFile = $e->getFile(); $eLine = $e->getLine(); } if (!self::frameExists($eTrace, $eFile, $eLine)) { array_unshift($eTrace, array('file' => $eFile, 'line' => $eLine)); } $blacklist = new PHPUnit_Util_Blacklist(); foreach ($eTrace as $frame) { if (isset($frame['file']) && is_file($frame['file']) && !$blacklist->isBlacklisted($frame['file']) && ($prefix === false || strpos($frame['file'], $prefix) !== 0) && $frame['file'] !== $script) { if ($asString === true) { $filteredStacktrace .= sprintf("%s:%s\n", $frame['file'], isset($frame['line']) ? $frame['line'] : '?'); } else { $filteredStacktrace[] = $frame; } } } return $filteredStacktrace; }
protected function printException($idx, $title, \Exception $ex) { $indent = str_repeat(' ', strlen(" {$idx}) ")); if ($ex instanceof \PHPUnit_Framework_SyntheticError) { $trace = $ex->getSyntheticTrace(); } else { $trace = $ex->getTrace(); } // Insert exception as first element of the trace array_unshift($trace, array('file' => $ex->getFile(), 'line' => $ex->getLine())); // Process and filter stack trace $last = null; $offending = null; $stacktrace = array(); $groups = $this->debug ? array() : array('DEFAULT', 'PHPUNIT'); $filter = \PHP_CodeCoverage_Filter::getInstance(); foreach ($trace as $frame) { if (isset($frame['file']) && isset($frame['line']) && !$filter->isFiltered($frame['file'], $groups, TRUE)) { // Skip duplicated frames if (!$this->debug && $last && $last['file'] === $frame['file'] && $last['line'] === $frame['line']) { continue; } $last = $frame; // Skip blacklisted eval frames: /path/to/file(line) : eval()'d code:line if (preg_match('/^(.+?)\\([0-9]+\\)\\s:\\seval/', $frame['file'], $m)) { if ($filter->isFiltered($m[1], $groups, TRUE)) { continue; } } // Check spec files if (0 === strpos($frame['file'], Spec::SCHEME . '://')) { $frame['file'] = substr($frame['file'], strlen(Spec::SCHEME . '://')); if (0 !== strpos($frame['file'], '/')) { $frame['file'] = '.' . DIRECTORY_SEPARATOR . $frame['file']; } $lines = file($frame['file']); $offending = trim($lines[$frame['line'] - 1]); } $stacktrace[] = $frame['file'] . ':' . $frame['line']; } } // Print title $this->write(" {$idx}) {$title}" . PHP_EOL); // Print exception message $msg = str_replace(PHP_EOL, PHP_EOL . $indent, $ex->getMessage()); $this->write($indent . "[31m{$msg}[0m" . PHP_EOL); // Print offending spec line if found if ($offending) { $ch = $this->colors ? '❯' : '>'; $this->write($indent . "[33;1m{$ch} {$offending}[0m" . PHP_EOL); } $ch = '#'; foreach ($stacktrace as $frame) { $this->write("{$indent}[30;1m{$ch} {$frame}[0m" . PHP_EOL); if (!$this->verbose && !$this->debug) { break; } } $this->write(PHP_EOL); }