Skip to content

Commit b6b90a8

Browse files
Refactor code coverage static analysis cache warming
1 parent f8a83b0 commit b6b90a8

File tree

4 files changed

+126
-45
lines changed

4 files changed

+126
-45
lines changed

.psalm/baseline.xml

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,7 +1542,7 @@
15421542
<LessSpecificReturnStatement occurrences="1">
15431543
<code>$class-&gt;newInstance($outputStream)</code>
15441544
</LessSpecificReturnStatement>
1545-
<MissingThrowsDocblock occurrences="19">
1545+
<MissingThrowsDocblock occurrences="21">
15461546
<code>run</code>
15471547
<code>handleListSuites</code>
15481548
<code>getTest</code>
@@ -1560,6 +1560,8 @@
15601560
<code>printerClass</code>
15611561
<code>testSuiteLoaderClass</code>
15621562
<code>defaultTestSuite</code>
1563+
<code>cacheDirectory</code>
1564+
<code>stop</code>
15631565
</MissingThrowsDocblock>
15641566
<MoreSpecificReturnType occurrences="1">
15651567
<code>null|Printer|string</code>
@@ -1681,11 +1683,8 @@
16811683
</UnusedParam>
16821684
</file>
16831685
<file src="src/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.php">
1684-
<PossiblyUnusedMethod occurrences="10">
1685-
<code>cacheDirectory</code>
1686+
<PossiblyUnusedMethod occurrences="7">
16861687
<code>pathCoverage</code>
1687-
<code>ignoreDeprecatedCodeUnits</code>
1688-
<code>disableCodeCoverageIgnore</code>
16891688
<code>clover</code>
16901689
<code>crap4j</code>
16911690
<code>html</code>
@@ -1704,6 +1703,14 @@
17041703
<code>$position</code>
17051704
</PropertyNotSetInConstructor>
17061705
</file>
1706+
<file src="src/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php">
1707+
<UnusedMethodCall occurrences="4">
1708+
<code>$configuration-&gt;directories()</code>
1709+
<code>$configuration-&gt;files()</code>
1710+
<code>$configuration-&gt;excludeDirectories()</code>
1711+
<code>$configuration-&gt;excludeFiles()</code>
1712+
</UnusedMethodCall>
1713+
</file>
17071714
<file src="src/TextUI/XmlConfiguration/CodeCoverage/Report/Clover.php">
17081715
<PossiblyUnusedMethod occurrences="1">
17091716
<code>target</code>

src/TextUI/Command.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
use PHPUnit\TextUI\CliArguments\Configuration;
4747
use PHPUnit\TextUI\CliArguments\Exception as ArgumentsException;
4848
use PHPUnit\TextUI\CliArguments\Mapper;
49+
use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\FilterMapper;
4950
use PHPUnit\TextUI\XmlConfiguration\Generator;
5051
use PHPUnit\TextUI\XmlConfiguration\Loader;
5152
use PHPUnit\TextUI\XmlConfiguration\Migrator;
@@ -58,7 +59,10 @@
5859
use PHPUnit\Util\XmlTestListRenderer;
5960
use ReflectionClass;
6061
use ReflectionException;
62+
use SebastianBergmann\CodeCoverage\Filter;
63+
use SebastianBergmann\CodeCoverage\StaticAnalysis\CacheWarmer;
6164
use SebastianBergmann\FileIterator\Facade as FileIteratorFacade;
65+
use SebastianBergmann\Timer\Timer;
6266
use Throwable;
6367

6468
/**
@@ -392,6 +396,10 @@ protected function handleArguments(array $argv): void
392396
$this->arguments['printer'] = $this->handlePrinter($this->arguments['printer']);
393397
}
394398

399+
if (isset($configuration, $this->arguments['warmCoverageCache'])) {
400+
$this->handleWarmCoverageCache($configuration);
401+
}
402+
395403
if (!isset($this->arguments['test'])) {
396404
$this->showHelp();
397405

@@ -821,4 +829,58 @@ private function handleCustomOptions(array $unrecognizedOptions): void
821829
}
822830
}
823831
}
832+
833+
private function handleWarmCoverageCache(XmlConfiguration\Configuration $configuration): void
834+
{
835+
$this->printVersionString();
836+
837+
if (isset($this->arguments['coverageCacheDirectory'])) {
838+
$cacheDirectory = $this->arguments['coverageCacheDirectory'];
839+
} elseif ($configuration->codeCoverage()->hasCacheDirectory()) {
840+
$cacheDirectory = $configuration->codeCoverage()->cacheDirectory();
841+
} else {
842+
print 'Cache for static analysis has not been configured' . PHP_EOL;
843+
844+
exit(TestRunner::EXCEPTION_EXIT);
845+
}
846+
847+
$filter = new Filter;
848+
849+
if ($configuration->codeCoverage()->hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()) {
850+
(new FilterMapper)->map(
851+
$filter,
852+
$configuration->codeCoverage()
853+
);
854+
} elseif (isset($this->arguments['coverageFilter'])) {
855+
if (!is_array($this->arguments['coverageFilter'])) {
856+
$coverageFilterDirectories = [$this->arguments['coverageFilter']];
857+
} else {
858+
$coverageFilterDirectories = $this->arguments['coverageFilter'];
859+
}
860+
861+
foreach ($coverageFilterDirectories as $coverageFilterDirectory) {
862+
$filter->includeDirectory($coverageFilterDirectory);
863+
}
864+
} else {
865+
print 'Filter for code coverage has not been configured' . PHP_EOL;
866+
867+
exit(TestRunner::EXCEPTION_EXIT);
868+
}
869+
870+
$timer = new Timer;
871+
$timer->start();
872+
873+
print 'Warming cache for static analysis ... ';
874+
875+
(new CacheWarmer)->warmCache(
876+
$cacheDirectory,
877+
!$configuration->codeCoverage()->disableCodeCoverageIgnore(),
878+
$configuration->codeCoverage()->ignoreDeprecatedCodeUnits(),
879+
$filter
880+
);
881+
882+
print 'done [' . $timer->stop()->asString() . ']' . PHP_EOL;
883+
884+
exit(TestRunner::SUCCESS_EXIT);
885+
}
824886
}

src/TextUI/TestRunner.php

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
use PHPUnit\Runner\TestSuiteLoader;
4848
use PHPUnit\Runner\TestSuiteSorter;
4949
use PHPUnit\Runner\Version;
50+
use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\FilterMapper;
5051
use PHPUnit\TextUI\XmlConfiguration\Configuration;
5152
use PHPUnit\TextUI\XmlConfiguration\ExtensionHandler;
5253
use PHPUnit\TextUI\XmlConfiguration\Loader;
@@ -63,7 +64,6 @@
6364
use PHPUnit\Util\Xml\SchemaDetector;
6465
use ReflectionClass;
6566
use ReflectionException;
66-
use SebastianBergmann\CodeCoverage\CacheNotConfiguredException;
6767
use SebastianBergmann\CodeCoverage\CodeCoverage;
6868
use SebastianBergmann\CodeCoverage\Driver\Driver;
6969
use SebastianBergmann\CodeCoverage\Exception as CodeCoverageException;
@@ -414,7 +414,7 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [
414414
$codeCoverageReports = 0;
415415
}
416416

417-
if ($codeCoverageReports > 0 || isset($arguments['xdebugFilterFile']) || isset($arguments['warmCoverageCache'])) {
417+
if ($codeCoverageReports > 0 || isset($arguments['xdebugFilterFile'])) {
418418
if (isset($arguments['coverageFilter'])) {
419419
if (!is_array($arguments['coverageFilter'])) {
420420
$coverageFilterDirectories = [$arguments['coverageFilter']];
@@ -437,34 +437,15 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [
437437
if ($codeCoverageConfiguration->hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()) {
438438
$coverageFilterFromConfigurationFile = true;
439439

440-
foreach ($codeCoverageConfiguration->directories() as $directory) {
441-
$this->codeCoverageFilter->includeDirectory(
442-
$directory->path(),
443-
$directory->suffix(),
444-
$directory->prefix()
445-
);
446-
}
447-
448-
foreach ($codeCoverageConfiguration->files() as $file) {
449-
$this->codeCoverageFilter->includeFile($file->path());
450-
}
451-
452-
foreach ($codeCoverageConfiguration->excludeDirectories() as $directory) {
453-
$this->codeCoverageFilter->excludeDirectory(
454-
$directory->path(),
455-
$directory->suffix(),
456-
$directory->prefix()
457-
);
458-
}
459-
460-
foreach ($codeCoverageConfiguration->excludeFiles() as $file) {
461-
$this->codeCoverageFilter->excludeFile($file->path());
462-
}
440+
(new FilterMapper)->map(
441+
$this->codeCoverageFilter,
442+
$codeCoverageConfiguration
443+
);
463444
}
464445
}
465446
}
466447

467-
if ($codeCoverageReports > 0 || isset($arguments['warmCoverageCache'])) {
448+
if ($codeCoverageReports > 0) {
468449
try {
469450
if (isset($codeCoverageConfiguration) &&
470451
($codeCoverageConfiguration->pathCoverage() || (isset($arguments['pathCoverage']) && $arguments['pathCoverage'] === true))) {
@@ -625,20 +606,6 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [
625606
}
626607
}
627608

628-
if (isset($arguments['warmCoverageCache'], $codeCoverage)) {
629-
try {
630-
$codeCoverage->warmCache();
631-
} catch (CacheNotConfiguredException $e) {
632-
$this->write(PHP_EOL . 'Cache for static analysis has not been configured' . PHP_EOL);
633-
634-
exit(self::EXCEPTION_EXIT);
635-
}
636-
637-
$this->write(PHP_EOL . 'Cache for static analysis has been warmed' . PHP_EOL);
638-
639-
exit(self::SUCCESS_EXIT);
640-
}
641-
642609
if (isset($arguments['xdebugFilterFile'], $codeCoverageConfiguration)) {
643610
$this->write(PHP_EOL . 'Please note that --dump-xdebug-filter and --prepend are deprecated and will be removed in PHPUnit 10.' . PHP_EOL);
644611

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php declare(strict_types=1);
2+
/*
3+
* This file is part of PHPUnit.
4+
*
5+
* (c) Sebastian Bergmann <[email protected]>
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage;
11+
12+
use SebastianBergmann\CodeCoverage\Filter;
13+
14+
/**
15+
* @internal This class is not covered by the backward compatibility promise for PHPUnit
16+
*/
17+
final class FilterMapper
18+
{
19+
public function map(Filter $filter, CodeCoverage $configuration): void
20+
{
21+
foreach ($configuration->directories() as $directory) {
22+
$filter->includeDirectory(
23+
$directory->path(),
24+
$directory->suffix(),
25+
$directory->prefix()
26+
);
27+
}
28+
29+
foreach ($configuration->files() as $file) {
30+
$filter->includeFile($file->path());
31+
}
32+
33+
foreach ($configuration->excludeDirectories() as $directory) {
34+
$filter->excludeDirectory(
35+
$directory->path(),
36+
$directory->suffix(),
37+
$directory->prefix()
38+
);
39+
}
40+
41+
foreach ($configuration->excludeFiles() as $file) {
42+
$filter->excludeFile($file->path());
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)