Вход Регистрация
Файл: vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php
Строк: 138
<?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 PHPUnitRunner;

use const 
DIRECTORY_SEPARATOR;
use const 
LOCK_EX;
use function 
assert;
use function 
dirname;
use function 
file_get_contents;
use function 
file_put_contents;
use function 
in_array;
use function 
is_array;
use function 
is_dir;
use function 
is_file;
use function 
json_decode;
use function 
json_encode;
use function 
sprintf;
use 
PHPUnitUtilFilesystem;

/**
 * @internal This class is not covered by the backward compatibility promise for PHPUnit
 */
final class DefaultTestResultCache implements TestResultCache
{
    
/**
     * @var int
     */
    
private const VERSION 1;

    
/**
     * @psalm-var list<int>
     */
    
private const ALLOWED_TEST_STATUSES = [
        
BaseTestRunner::STATUS_SKIPPED,
        
BaseTestRunner::STATUS_INCOMPLETE,
        
BaseTestRunner::STATUS_FAILURE,
        
BaseTestRunner::STATUS_ERROR,
        
BaseTestRunner::STATUS_RISKY,
        
BaseTestRunner::STATUS_WARNING,
    ];

    
/**
     * @var string
     */
    
private const DEFAULT_RESULT_CACHE_FILENAME '.phpunit.result.cache';

    
/**
     * @var string
     */
    
private $cacheFilename;

    
/**
     * @psalm-var array<string, int>
     */
    
private $defects = [];

    
/**
     * @psalm-var array<string, float>
     */
    
private $times = [];

    public function 
__construct(?string $filepath null)
    {
        if (
$filepath !== null && is_dir($filepath)) {
            
$filepath .= DIRECTORY_SEPARATOR self::DEFAULT_RESULT_CACHE_FILENAME;
        }

        
$this->cacheFilename $filepath ?? $_ENV['PHPUNIT_RESULT_CACHE'] ?? self::DEFAULT_RESULT_CACHE_FILENAME;
    }

    public function 
setState(string $testNameint $state): void
    
{
        if (!
in_array($stateself::ALLOWED_TEST_STATUSEStrue)) {
            return;
        }

        
$this->defects[$testName] = $state;
    }

    public function 
getState(string $testName): int
    
{
        return 
$this->defects[$testName] ?? BaseTestRunner::STATUS_UNKNOWN;
    }

    public function 
setTime(string $testNamefloat $time): void
    
{
        
$this->times[$testName] = $time;
    }

    public function 
getTime(string $testName): float
    
{
        return 
$this->times[$testName] ?? 0.0;
    }

    public function 
load(): void
    
{
        if (!
is_file($this->cacheFilename)) {
            return;
        }

        
$data json_decode(
            
file_get_contents($this->cacheFilename),
            
true
        
);

        if (
$data === null) {
            return;
        }

        if (!isset(
$data['version'])) {
            return;
        }

        if (
$data['version'] !== self::VERSION) {
            return;
        }

        
assert(isset($data['defects']) && is_array($data['defects']));
        
assert(isset($data['times']) && is_array($data['times']));

        
$this->defects $data['defects'];
        
$this->times   $data['times'];
    }

    
/**
     * @throws Exception
     */
    
public function persist(): void
    
{
        if (!
Filesystem::createDirectory(dirname($this->cacheFilename))) {
            throw new 
Exception(
                
sprintf(
                    
'Cannot create directory "%s" for result cache file',
                    
$this->cacheFilename
                
)
            );
        }

        
file_put_contents(
            
$this->cacheFilename,
            
json_encode(
                [
                    
'version' => self::VERSION,
                    
'defects' => $this->defects,
                    
'times'   => $this->times,
                ]
            ),
            
LOCK_EX
        
);
    }
}
Онлайн: 0
Реклама