File: CodeCoverage.php

package info (click to toggle)
matomo 5.5.1%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 73,596 kB
  • sloc: php: 231,041; javascript: 102,286; python: 202; xml: 189; sh: 172; makefile: 20; sql: 10
file content (88 lines) | stat: -rw-r--r-- 3,128 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php

/**
 * Matomo - free/libre analytics platform
 *
 * @link    https://matomo.org
 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 */

namespace Piwik\Plugins\TestRunner\Commands;

use Piwik\Plugin\ConsoleCommand;

/**
 */
class CodeCoverage extends ConsoleCommand
{
    protected function configure()
    {
        $this->setName('tests:coverage');
        $this->setDescription('Run all phpunit tests and generate a combined code coverage');
        $this->addRequiredValueOption('testsuite', null, 'Run only a specific test suite, for instance UnitTests, IntegrationTests or SystemTests.');
        $this->addOptionalArgument('group', 'Run only a specific test group. Separate multiple groups by comma, for instance core,plugins', '');
    }

    protected function doExecute(): int
    {
        $input = $this->getInput();
        $output = $this->getOutput();
        $phpCovPath = trim(shell_exec('which phpcov') ?? '');

        if (empty($phpCovPath)) {
            $output->writeln('phpcov not installed. please install pear.phpunit.de/phpcov.');
            return self::FAILURE;
        }

        $arguments = array(
            '--options' => sprintf('--coverage-php %s/tests/results/logs/%%suite%%%%group%%.cov', PIWIK_DOCUMENT_ROOT),
        );

        $suite = $input->getOption('testsuite');
        if (!empty($suite)) {
            $arguments['--testsuite'] = $suite;
        }

        $groups = $input->getArgument('group');
        if (!empty($groups)) {
            $arguments['group'] = $groups;
        } else {
            shell_exec(sprintf('rm %s/tests/results/logs/*.cov', PIWIK_DOCUMENT_ROOT));
        }

        $this->runCommand('tests:run', $arguments);

        $command = 'phpcov';

        // force xdebug usage for coverage options
        if (!extension_loaded('xdebug')) {
            $output->writeln('<info>xdebug extension required for code coverage.</info>');

            $output->writeln('<info>searching for xdebug extension...</info>');

            $extensionDir = shell_exec('php-config --extension-dir');
            $xdebugFile   = trim($extensionDir) . DIRECTORY_SEPARATOR . 'xdebug.so';

            if (!file_exists($xdebugFile)) {
                $xdebugFile = $this->askAndValidate(
                    'xdebug not found. Please provide path to xdebug.so',
                    function ($xdebugFile) {
                        return file_exists($xdebugFile);
                    }
                );
            } else {
                $output->writeln('<info>xdebug extension found in extension path.</info>');
            }

            $output->writeln("<info>using $xdebugFile as xdebug extension.</info>");

            $command = sprintf('php -d zend_extension=%s %s', $xdebugFile, $phpCovPath);
        }

        shell_exec(sprintf('rm -rf %s/tests/results/coverage/*', PIWIK_DOCUMENT_ROOT));

        passthru(sprintf('cd %1$s && %2$s --merge --html tests/results/coverage/ --whitelist ./core/ --whitelist ./plugins/ --add-uncovered %1$s/tests/results/logs/', PIWIK_DOCUMENT_ROOT, $command));

        return self::SUCCESS;
    }
}