agent/extension_phpt_test/scripts/processResults.php (160 lines of code) (raw):
#!/usr/bin/env php
<?php
function getUnexpectedFailures($allowed, $failures)
{
if (!$allowed) {
return $failures;
}
$unexpectedFailures = array();
foreach ($failures as $failure) {
if (!in_array($failure, $allowed)) {
$unexpectedFailures[] = $failure;
}
}
return $unexpectedFailures;
}
function printSummary($testsAllowedToFail, $testsFailedWithoutAgent, $testsFailedWithAgent, $unexpectedFailuresWithoutAgent, $unexpectedFailuresWithAgent)
{
$width = 70;
echo str_repeat("=", $width) . PHP_EOL;
echo "Tests allowed to fail: " . count($testsAllowedToFail) . PHP_EOL;
echo str_repeat("=", $width) . PHP_EOL;
echo "Tests failed without agent: " . count($testsFailedWithoutAgent) . PHP_EOL;
echo str_repeat("=", $width) . PHP_EOL;
echo "Unexpected failures:" . PHP_EOL;
print_r($unexpectedFailuresWithoutAgent);
echo str_repeat("=", $width) . PHP_EOL;
echo "Tests failed with agent: " . count($testsFailedWithAgent) . PHP_EOL;
echo str_repeat("=", $width) . PHP_EOL;
echo "Unexpected failures:" . PHP_EOL;
print_r($unexpectedFailuresWithAgent);
echo str_repeat("=", $width) . PHP_EOL;
}
function getStatistics($results)
{
$stats = array();
foreach ($results as $result) {
$res = explode("\t", $result, 2);
if (count($res) != 2) {
continue;
}
if (!array_key_exists($res[0], $stats)) {
$stats[$res[0]] = 0;
}
$stats[$res[0]]++;
}
return $stats;
}
// returns true on success or false on failure
function writeResultsPerTest($output, $stats, $testsAllowedToFail, $unexpectedFailures, $segfaults, $baseline)
{
fwrite($output, "| Status | Test result | count |" . PHP_EOL);
fwrite($output, "| --- | --- | --- |" . PHP_EOL);
foreach ($stats as $res => $cnt) {
fwrite($output, "| | " . $res . " | " . $cnt . " |" . PHP_EOL);
}
fwrite($output, "| " . (count($segfaults) > 0 ? ":x:" : ":heavy_check_mark:") . " | Segmentation faults | " . count($segfaults) . " |" . PHP_EOL);
fwrite($output, "| | Tests allowed to fail | " . count($testsAllowedToFail) . " |" . PHP_EOL);
fwrite($output, "| " . (count($unexpectedFailures) > 0 ? ":warning:" : ":heavy_check_mark:") . " | Unexpected test failures (without baseline) | " . count($unexpectedFailures) . " |" . PHP_EOL);
$afterBaselineFailures = [];
$afterBaselineFailures = getUnexpectedFailures($baseline, $unexpectedFailures);
fwrite($output, "| | Size of baseline list | " . count($baseline) . " |" . PHP_EOL);
fwrite($output, "| " . (count($afterBaselineFailures) > 0 ? ":x:" : ":heavy_check_mark:") . " | Unexpected test failures (above baseline) | " . count($afterBaselineFailures) . " |" . PHP_EOL);
fwrite($output, PHP_EOL);
if (count($segfaults) > 0) {
fwrite($output, "#### Tests with segmentation faults" . PHP_EOL);
fwrite($output, "```" . PHP_EOL);
foreach ($segfaults as $res) {
fwrite($output, $res . PHP_EOL);
}
fwrite($output, "```" . PHP_EOL);
}
$retval = [];
if (count($afterBaselineFailures) > 0) {
fwrite($output, "#### Tests which failed and was above baseline and allowed to fail list" . PHP_EOL);
fwrite($output, "```" . PHP_EOL);
foreach ($afterBaselineFailures as $res) {
fwrite($output, $res . PHP_EOL);
}
fwrite($output, "```" . PHP_EOL);
$retval[] = "unexpected test failures even after supression";
}
if (count($segfaults) > 0) {
$retval[] = count($segfaults) . " segmentation faults occurred";
}
fwrite($output, PHP_EOL);
if (count($retval) > 0) {
fwrite($output, "### :x: Test failed because " . implode(" and ", $retval) . PHP_EOL);
} else {
fwrite($output, "### :white_check_mark: Test passed" . PHP_EOL);
}
return count($retval) == 0;
}
function generateMarkdownResults($outputFileName, $statsWithAgent, $statsWithoutAgent, $unexpectedFailuresWithAgent, $unexpectedFailuresWithoutAgent, $testsAllowedToFail, $baselineList, $segfaultsWithAgent, $segfaultsWithoutAgent)
{
$output = fopen($outputFileName, "w");
if (!$output) {
echo "Unable to open markdown output file " . $outputFileName . PHP_EOL;
return false;
}
fwrite($output, "# phpt tests execution summary" . PHP_EOL);
fwrite($output, "***".PHP_EOL);
fwrite($output, "## Tests executed without agent. " . PHP_EOL);
fwrite($output, PHP_EOL);
$results[] = writeResultsPerTest($output, $statsWithoutAgent, $testsAllowedToFail, $unexpectedFailuresWithoutAgent, $segfaultsWithoutAgent, array());
fwrite($output, PHP_EOL);
fwrite($output, "***".PHP_EOL);
fwrite($output, PHP_EOL);
fwrite($output, "## Tests executed with agent. " . PHP_EOL);
$results[] = writeResultsPerTest($output, $statsWithAgent, $testsAllowedToFail, $unexpectedFailuresWithAgent, $segfaultsWithAgent, $baselineList);
fwrite($output, "***".PHP_EOL);
fwrite($output, PHP_EOL . "# Summary status: " . (($results[0] && $results[1]) ? ":heavy_check_mark: PASSED" : ":x: FAILED") . PHP_EOL);
fclose($output);
return $results[0] && $results[1];
}
// done in bash, lets keep it for future
// function scanForSegFaults($pathToTests) {
// $segfaults = array();
// $it = new RecursiveDirectoryIterator($pathToTests);
// foreach(new RecursiveIteratorIterator($it) as $file) {
// if ($file->getExtension() != 'log') {
// continue;
// }
// $fileobj = $file->openFile('r');
// while (!$fileobj->eof()) {
// if (str_contains($fileobj->current(), "Segmentation fault (core dumped)")) {
// $phptFileName = $fileobj->getPath()."/".$fileobj->getBasename('.'.$fileobj->getExtension()).".phpt";
// if (file_exists($phptFileName)) {
// $segfaults[] = $phptFileName;
// }
// }
// $fileobj->next();
// }
// $fileobj = null;
// }
// return $segfaults;
// }
function printHelp($argc, $argv)
{
echo "Usage: " . $argv[0] . " ... " . PHP_EOL . PHP_EOL;
echo " --allowed fileName - file with set of tests allowed to fail. Mostly flaky tests failing with pure PHP. Required" . PHP_EOL;
echo " --baseline fileName - file with set of tests which will suppress failures (like test we're working on). Required" . PHP_EOL;
echo " --failed_with_agent fileName - file with set of tests failed with agent injected. Required" . PHP_EOL;
echo " --failed_without_agent fileName - file with set of tests failed without agent injected. Required" . PHP_EOL;
echo " --results_with_agent fileName - set of full tests results with agent injected. Required" . PHP_EOL;
echo " --results_without_agent fileName - set of full tests results without agent injected. Required" . PHP_EOL;
echo " --segfaults_with_agent fileName - set of tests caused segmentation fault with agent injected. Required" . PHP_EOL;
echo " --segfaults_without_agent fileName - set of tests caused segmentation fault without agent injected. Required" . PHP_EOL;
echo " --markdown fileName - name of the output file to generate results in markdown format. Required" . PHP_EOL;
echo " --help - display this help" . PHP_EOL;
}
$optTemplateRequired = ["allowed:", "baseline:", "failed_with_agent:", "failed_without_agent:", "results_with_agent:", "results_without_agent:", "markdown:", "segfaults_with_agent:", "segfaults_without_agent:"];
$optTemplate = ["help"];
$options = getopt("h", array_merge($optTemplate, $optTemplateRequired));
$missingOptions = "";
foreach ($optTemplateRequired as $opt) {
if (!array_key_exists(substr($opt, 0, -1), $options)) {
$missingOptions .= substr($opt, 0, -1) . " ";
}
}
if (strlen($missingOptions) > 0) {
echo PHP_EOL . "Error, missing required parameters: " . $missingOptions . PHP_EOL . PHP_EOL;
printHelp($argc, $argv);
exit(1);
}
if (array_key_exists("help", $options)) {
printHelp($argc, $argv);
exit(0);
}
$testsAllowedToFail = file($options["allowed"], FILE_IGNORE_NEW_LINES);
$testsFailedWithAgent = file($options["failed_with_agent"], FILE_IGNORE_NEW_LINES);
$testsFailedWithoutAgent = file($options["failed_without_agent"], FILE_IGNORE_NEW_LINES);
$testsResultsWithAgent = file($options["results_with_agent"], FILE_IGNORE_NEW_LINES);
$testsResultsWithoutAgent = file($options["results_without_agent"], FILE_IGNORE_NEW_LINES);
$segfaultsWithAgent = file($options["segfaults_with_agent"], FILE_IGNORE_NEW_LINES);
$segfaultsWithoutAgent = file($options["segfaults_without_agent"], FILE_IGNORE_NEW_LINES);
$baselineList = file($options["baseline"], FILE_IGNORE_NEW_LINES);
$unexpectedFailuresWithoutAgent = getUnexpectedFailures($testsAllowedToFail, $testsFailedWithoutAgent);
$unexpectedFailuresWithAgent = getUnexpectedFailures($testsAllowedToFail, $testsFailedWithAgent);
printSummary($testsAllowedToFail, $testsFailedWithoutAgent, $testsFailedWithAgent, $unexpectedFailuresWithoutAgent, $unexpectedFailuresWithAgent);
$statsWithoutAgent = getStatistics($testsResultsWithoutAgent);
$statsWithAgent = getStatistics($testsResultsWithAgent);
$result = generateMarkdownResults($options["markdown"], $statsWithAgent, $statsWithoutAgent, $unexpectedFailuresWithAgent, $unexpectedFailuresWithoutAgent, $testsAllowedToFail, $baselineList, $segfaultsWithAgent, $segfaultsWithoutAgent);
exit($result ? 0 : 1);
?>