Completed
Pull Request — master (#128)
by Alessandro
04:58 queued 02:19
created

CoverageFetcher   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 93.33%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 6
dl 0
loc 75
ccs 28
cts 30
cp 0.9333
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A fetch() 0 18 3
A coverageFileIsValid() 0 17 3
A overrideCoverageClassDefinition() 0 18 2
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 7
    private function overrideCoverageClassDefinition(string $tempFilename): void
75
    {
76 7
        $originalCoverageData = file_get_contents($tempFilename);
77 7
        if ($originalCoverageData) {
78 7
            $fileContent = str_replace(
79
                [
80 7
                    'new SebastianBergmann\CodeCoverage\CodeCoverage;',
81
                    'new SebastianBergmann\CodeCoverage\CodeCoverage();',
82
                    'new CodeCoverage;',
83
                    'new CodeCoverage();',
84
                ],
85 7
                'new SebastianBergmann\CodeCoverage\CodeCoverage(new ' . FakeDriver::class . ');',
86 7
                $originalCoverageData
87
            );
88
        }
89
90 7
        file_put_contents($tempFilename, $fileContent ?? '');
91
    }
92
}
93