CoverageFetcher::coverageFileIsValid()   A
last analyzed

Complexity

Conditions 3
Paths 6

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3.0987

Importance

Changes 0
Metric Value
dl 0
loc 17
ccs 7
cts 9
cp 0.7778
rs 9.7
c 0
b 0
f 0
cc 3
nc 6
nop 1
crap 3.0987
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Paraunit\Coverage;
6
7
use Paraunit\Configuration\TempFilenameFactory;
8
use Paraunit\Process\AbstractParaunitProcess;
9
use Paraunit\Proxy\Coverage\FakeDriver;
10
use Paraunit\TestResult\Interfaces\TestResultHandlerInterface;
11
use SebastianBergmann\CodeCoverage\CodeCoverage;
12
use Symfony\Component\Process\Process;
13
14
/**
15
 * Class CoverageFetcher
16
 * @package Paraunit\Coverage
17
 */
18
class CoverageFetcher
19
{
20
    /** @var TempFilenameFactory */
21
    private $tempFilenameFactory;
22
23
    /** @var TestResultHandlerInterface */
24
    private $resultHandler;
25
26
    /**
27
     * CoverageFetcher constructor.
28
     * @param TempFilenameFactory $tempFilenameFactory
29
     * @param TestResultHandlerInterface $failureHandler
30
     */
31 17
    public function __construct(TempFilenameFactory $tempFilenameFactory, TestResultHandlerInterface $failureHandler)
32
    {
33 17
        $this->tempFilenameFactory = $tempFilenameFactory;
34 17
        $this->resultHandler = $failureHandler;
35
    }
36
37 8
    public function fetch(AbstractParaunitProcess $process): CodeCoverage
38
    {
39 8
        $tempFilename = $this->tempFilenameFactory->getFilenameForCoverage($process->getUniqueId());
40 8
        $codeCoverage = null;
41
42 8
        if ($this->coverageFileIsValid($tempFilename)) {
43 7
            $codeCoverage = require $tempFilename;
44 7
            unlink($tempFilename);
45
        }
46
47 8
        if ($codeCoverage instanceof CodeCoverage) {
48 6
            return $codeCoverage;
49
        }
50
51 2
        $this->resultHandler->addProcessToFilenames($process);
52
53 2
        return new CodeCoverage(new FakeDriver());
54
    }
55
56 8
    private function coverageFileIsValid(string $tempFilename): bool
57
    {
58 8
        if (! file_exists($tempFilename)) {
59 1
            return false;
60
        }
61
62
        try {
63 7
            $this->overrideCoverageClassDefinition($tempFilename);
64
65 7
            $verificationProcess = new Process(['php', '--syntax-check ' . $tempFilename]);
66 7
            $verificationProcess->run();
67
68 7
            return $verificationProcess->getExitCode() === 0;
69
        } catch (\Exception $e) {
70
            return false;
71
        }
72
    }
73
74
    private function overrideCoverageClassDefinition(string $tempFilename): void
75
    {
76
        $originalCoverageData = file_get_contents($tempFilename);
77 7
        if ($originalCoverageData) {
78
            $fileContent = str_replace(
79 7
                [
80
                    'new SebastianBergmann\CodeCoverage\CodeCoverage;',
81 7
                    'new SebastianBergmann\CodeCoverage\CodeCoverage();',
82
                    'new CodeCoverage;',
83
                    'new CodeCoverage();',
84
                ],
85
                'new SebastianBergmann\CodeCoverage\CodeCoverage(new ' . FakeDriver::class . ');',
86 7
                $originalCoverageData
87 7
            );
88
        }
89
90 7
        file_put_contents($tempFilename, $fileContent ?? '');
91
    }
92
}
93