Skip to content

Commit

Permalink
Separate code coverage handling from TestResult object
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianbergmann committed Dec 28, 2020
1 parent debf7c2 commit 049a5e8
Show file tree
Hide file tree
Showing 10 changed files with 245 additions and 220 deletions.
50 changes: 35 additions & 15 deletions .psalm/baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -666,21 +666,19 @@
</RedundantCondition>
</file>
<file src="src/Framework/TestRunner.php">
<MissingThrowsDocblock occurrences="8">
<MissingThrowsDocblock occurrences="14">
<code>CodeCoverage::instance()</code>
<code>CodeCoverage::instance()</code>
<code>CodeCoverage::instance()</code>
<code>CodeCoverage::instance()</code>
<code>CodeCoverage::start($test)</code>
<code>GlobalState::getIncludedFilesAsString()</code>
<code>cacheDirectory</code>
<code>getName</code>
<code>getName</code>
<code>runTestJob</code>
<code>stop</code>
</MissingThrowsDocblock>
<PossiblyInvalidArgument occurrences="1">
<code>$linesToBeCovered</code>
</PossiblyInvalidArgument>
<PossiblyNullReference occurrences="2">
<code>start</code>
<code>stop</code>
</PossiblyNullReference>
<PossiblyUndefinedVariable occurrences="5">
<code>$_timeout</code>
<code>$_timeout</code>
Expand Down Expand Up @@ -722,6 +720,27 @@
<code>include_once $filename</code>
</UnresolvableInclude>
</file>
<file src="src/Runner/CodeCoverage.php">
<InvalidNullableReturnType occurrences="2">
<code>Driver</code>
<code>\SebastianBergmann\CodeCoverage\CodeCoverage</code>
</InvalidNullableReturnType>
<MissingParamType occurrences="1">
<code>$linesToBeCovered</code>
</MissingParamType>
<MissingThrowsDocblock occurrences="2">
<code>forLineAndPathCoverage</code>
<code>forLineCoverage</code>
</MissingThrowsDocblock>
<NullableReturnStatement occurrences="2">
<code>self::$driver</code>
<code>self::$instance</code>
</NullableReturnStatement>
<PossiblyNullReference occurrences="2">
<code>start</code>
<code>stop</code>
</PossiblyNullReference>
</file>
<file src="src/Runner/DefaultTestResultCache.php">
<MissingClosureReturnType occurrences="1">
<code>static function () use ($cacheData) {</code>
Expand All @@ -746,7 +765,8 @@
<code>RawCodeCoverageData::fromXdebugWithoutPathCoverage([])</code>
<code>RawCodeCoverageData::fromXdebugWithoutPathCoverage([])</code>
</InternalMethod>
<MissingThrowsDocblock occurrences="3">
<MissingThrowsDocblock occurrences="4">
<code>append</code>
<code>cacheDirectory</code>
<code>stop</code>
</MissingThrowsDocblock>
Expand Down Expand Up @@ -854,6 +874,9 @@
<code>addListener</code>
<code>flushListeners</code>
</DeprecatedMethod>
<InternalMethod occurrences="1">
<code>nameAndVersion</code>
</InternalMethod>
<InvalidArgument occurrences="6">
<code>$e</code>
<code>$e</code>
Expand Down Expand Up @@ -1252,18 +1275,15 @@
<code>$errno</code>
<code>$errstr</code>
</MissingClosureParamType>
<MissingThrowsDocblock occurrences="1">
<code>CodeCoverage::instance()</code>
</MissingThrowsDocblock>
<MoreSpecificReturnType occurrences="1">
<code>Exception</code>
</MoreSpecificReturnType>
<PossiblyFalseOperand occurrences="1">
<code>strrpos($key, "\0")</code>
</PossiblyFalseOperand>
<PossiblyNullArgument occurrences="1">
<code>$childResult-&gt;codeCoverage()</code>
</PossiblyNullArgument>
<PossiblyNullReference occurrences="1">
<code>merge</code>
</PossiblyNullReference>
<UndefinedInterfaceMethod occurrences="2">
<code>addToAssertionCount</code>
<code>setResult</code>
Expand Down
18 changes: 0 additions & 18 deletions src/Framework/TestResult.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Countable;
use Error;
use PHPUnit\Util\Printer;
use SebastianBergmann\CodeCoverage\CodeCoverage;
use Throwable;

/**
Expand Down Expand Up @@ -73,8 +72,6 @@ final class TestResult implements Countable

private float $time = 0;

private ?CodeCoverage $codeCoverage = null;

private bool $convertDeprecationsToExceptions = true;

private bool $convertErrorsToExceptions = true;
Expand Down Expand Up @@ -395,11 +392,6 @@ public function passedClasses(): array
return $this->passedTestClasses;
}

public function collectsCodeCoverageInformation(): bool
{
return $this->codeCoverage !== null;
}

public function count(): int
{
return $this->runTests;
Expand All @@ -415,16 +407,6 @@ public function stop(): void
$this->stop = true;
}

public function codeCoverage(): ?CodeCoverage
{
return $this->codeCoverage;
}

public function setCodeCoverage(CodeCoverage $codeCoverage): void
{
$this->codeCoverage = $codeCoverage;
}

public function convertDeprecationsToExceptions(bool $flag): void
{
$this->convertDeprecationsToExceptions = $flag;
Expand Down
26 changes: 13 additions & 13 deletions src/Framework/TestRunner.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use function sprintf;
use function var_export;
use AssertionError;
use PHPUnit\Runner\CodeCoverage;
use PHPUnit\Util\Error\Handler;
use PHPUnit\Util\ExcludeList;
use PHPUnit\Util\GlobalState;
Expand Down Expand Up @@ -76,13 +77,13 @@ public function run(TestCase $test, TestResult $result): void
$errorHandler->register();
}

$collectCodeCoverage = $result->collectsCodeCoverageInformation() &&
$collectCodeCoverage = CodeCoverage::isActive() &&
!$test instanceof ErrorTestCase &&
!$test instanceof WarningTestCase &&
$isAnyCoverageRequired;

if ($collectCodeCoverage) {
$result->codeCoverage()->start($test);
CodeCoverage::start($test);
}

$monitorFunctions = $result->isStrictAboutResourceUsageDuringSmallTests() &&
Expand Down Expand Up @@ -262,7 +263,7 @@ function_exists('xdebug_start_function_monitor');
}

try {
$result->codeCoverage()->stop(
CodeCoverage::stop(
$append,
$linesToBeCovered,
$linesToBeUsed
Expand Down Expand Up @@ -394,7 +395,7 @@ public function runInSeparateProcess(TestCase $test, TestResult $result, bool $r
$iniSettings = '';
}

$coverage = $result->collectsCodeCoverageInformation() ? 'true' : 'false';
$coverage = CodeCoverage::isActive() ? 'true' : 'false';
$isStrictAboutTestsThatDoNotTestAnything = $result->isStrictAboutTestsThatDoNotTestAnything() ? 'true' : 'false';
$isStrictAboutOutputDuringTests = $result->isStrictAboutOutputDuringTests() ? 'true' : 'false';
$enforcesTimeLimit = $result->enforcesTimeLimit() ? 'true' : 'false';
Expand All @@ -413,22 +414,21 @@ public function runInSeparateProcess(TestCase $test, TestResult $result, bool $r
$phar = '\'\'';
}

$codeCoverage = $result->codeCoverage();
$codeCoverageFilter = null;
$cachesStaticAnalysis = 'false';
$codeCoverageCacheDirectory = null;
$driverMethod = 'forLineCoverage';
$pathCoverage = 'false';

if ($codeCoverage) {
$codeCoverageFilter = $codeCoverage->filter();
if (CodeCoverage::isActive()) {
$codeCoverageFilter = CodeCoverage::instance()->filter();

if ($codeCoverage->collectsBranchAndPathCoverage()) {
$driverMethod = 'forLineAndPathCoverage';
if (CodeCoverage::instance()->collectsBranchAndPathCoverage()) {
$pathCoverage = 'true';
}

if ($codeCoverage->cachesStaticAnalysis()) {
if (CodeCoverage::instance()->cachesStaticAnalysis()) {
$cachesStaticAnalysis = 'true';
$codeCoverageCacheDirectory = $codeCoverage->cacheDirectory();
$codeCoverageCacheDirectory = CodeCoverage::instance()->cacheDirectory();
}
}

Expand Down Expand Up @@ -457,7 +457,7 @@ public function runInSeparateProcess(TestCase $test, TestResult $result, bool $r
'collectCodeCoverageInformation' => $coverage,
'cachesStaticAnalysis' => $cachesStaticAnalysis,
'codeCoverageCacheDirectory' => $codeCoverageCacheDirectory,
'driverMethod' => $driverMethod,
'pathCoverage' => $pathCoverage,
'data' => $data,
'dataName' => $dataName,
'dependencyInput' => $dependencyInput,
Expand Down
134 changes: 134 additions & 0 deletions src/Runner/CodeCoverage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<?php declare(strict_types=1);
/*
* This file is part of PHPUnit.
*
* (c) Sebastian Bergmann <sebastian@phpunit.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PHPUnit\Runner;

use PHPUnit\Framework\TestCase;
use SebastianBergmann\CodeCoverage\Driver\Driver;
use SebastianBergmann\CodeCoverage\Driver\Selector;
use SebastianBergmann\CodeCoverage\Filter;

/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*/
final class CodeCoverage
{
private static ?\SebastianBergmann\CodeCoverage\CodeCoverage $instance = null;

private static ?Driver $driver = null;

private static bool $collecting = false;

/**
* @throws Exception
*/
public static function activate(Filter $filter, bool $pathCoverage): void
{
self::ensureIsNotActive();

if ($pathCoverage) {
self::$driver = (new Selector)->forLineAndPathCoverage($filter);
} else {
self::$driver = (new Selector)->forLineCoverage($filter);
}

self::$instance = new \SebastianBergmann\CodeCoverage\CodeCoverage(
self::$driver,
$filter
);
}

/**
* @throws Exception
*/
public static function instance(): \SebastianBergmann\CodeCoverage\CodeCoverage
{
self::ensureIsActive();

return self::$instance;
}

/**
* @throws Exception
*/
public static function driver(): Driver
{
self::ensureIsActive();

return self::$driver;
}

/**
* @throws Exception
*/
public static function start(TestCase $test): void
{
self::ensureIsActive();

if (self::$collecting) {
return;
}

self::$collecting = true;

self::$instance->start($test);
}

/**
* @throws Exception
*/
public static function stop(bool $append = true, $linesToBeCovered = [], array $linesToBeUsed = []): void
{
self::ensureIsActive();

if (!self::$collecting) {
return;
}

/* @noinspection UnusedFunctionResultInspection */
self::$instance->stop($append, $linesToBeCovered, $linesToBeUsed);

self::$collecting = false;
}

public static function deactivate(): void
{
self::$driver = null;
self::$instance = null;
}

public static function isActive(): bool
{
return self::$instance !== null;
}

/**
* @throws Exception
*/
private static function ensureIsActive(): void
{
if (self::$instance === null) {
throw new Exception(
'Code Coverage has not been set up'
);
}
}

/**
* @throws Exception
*/
private static function ensureIsNotActive(): void
{
if (self::$instance !== null) {
throw new Exception(
'Code Coverage has not been set up'
);
}
}
}
Loading

0 comments on commit 049a5e8

Please sign in to comment.