Files
barometer-server/tests/check-coverage.php
tom.hempel f1caa9e681
Some checks failed
PHPUnit / test (push) Has been cancelled
initial prototype based on nat-as-server
2026-06-29 12:39:55 +02:00

61 lines
1.5 KiB
PHP

#!/usr/bin/env php
<?php
declare(strict_types=1);
/**
* Fail CI when line coverage falls below the configured floor.
* Usage: php tests/check-coverage.php [minPercent]
*/
$min = isset($argv[1]) ? (float)$argv[1] : 40.0;
$root = dirname(__DIR__);
$envPrefix = '';
if (extension_loaded('xdebug') && !extension_loaded('pcov')) {
// Xdebug 3 defaults to develop mode; PHPUnit needs coverage mode.
$envPrefix = 'XDEBUG_MODE=coverage ';
}
$cmd = sprintf(
'%s%s %s/vendor/bin/phpunit --coverage-text --colors=never 2>&1',
$envPrefix,
escapeshellarg(PHP_BINARY),
escapeshellarg($root)
);
$output = [];
exec($cmd, $output, $exitCode);
echo implode("\n", $output) . "\n";
if ($exitCode !== 0) {
exit($exitCode);
}
$linesPct = null;
foreach ($output as $line) {
// PHPUnit 11 / Xdebug: "Lines: 25.33% (1484/5859)"
if (preg_match('/^\s*Lines:\s+([\d.]+)%\s+\(/', $line, $m)) {
$linesPct = (float)$m[1];
break;
}
// PCOV / older format: "Lines: 1484/5859 (25.33%)"
if (preg_match('/^\s*Lines:\s+[\d.]+\/\d+\s+\(\s*([\d.]+)%/', $line, $m)) {
$linesPct = (float)$m[1];
break;
}
}
if ($linesPct === null) {
fwrite(STDERR, "Could not parse coverage summary. Is PCOV or Xdebug enabled?\n");
exit(1);
}
if ($linesPct < $min) {
fwrite(STDERR, sprintf("Line coverage %.2f%% is below minimum %.2f%%\n", $linesPct, $min));
exit(1);
}
fwrite(STDERR, sprintf("Line coverage %.2f%% meets minimum %.2f%%\n", $linesPct, $min));
exit(0);