diff --git a/composer.json b/composer.json index fd0a3a4b..bea3fa44 100644 --- a/composer.json +++ b/composer.json @@ -24,15 +24,17 @@ ], "require": { "php": "^7.1", + "ext-dom": "*", + "ext-json": "*", "jean85/pretty-package-versions": "^1.0.3", - "phpunit/php-code-coverage": "^4.0||^5.0||^6.0||^7.0.2", + "phpunit/php-code-coverage": "^6.0||^7.0.2", "phpunit/php-file-iterator": "^1.0||^2.0", - "phpunit/phpunit": "^6.0.9||^7.0||^8.0", - "symfony/console": "^2.8||^3.0||^4.0", - "symfony/dependency-injection": "^2.8||^3.0||^4.0", - "symfony/event-dispatcher": "^2.8||^3.0||^4.0", - "symfony/process": "^3.3||^4.0", - "symfony/stopwatch": "^2.8||^3.0||^4.0" + "phpunit/phpunit": "^7.0||^8.0", + "symfony/console": "^3.4||^4.0", + "symfony/dependency-injection": "^3.4||^4.0", + "symfony/event-dispatcher": "^3.4||^4.0", + "symfony/process": "^3.4||^4.0", + "symfony/stopwatch": "^3.4||^4.0" }, "require-dev": { "facile-it/facile-coding-standard": "^0.3.1", @@ -41,8 +43,8 @@ "phpstan/phpstan-phpunit": "^0.11", "phpunit/php-invoker": "^1.1", "php-coveralls/php-coveralls": "^2.0", - "symfony/expression-language": "^2.8||^3.0||^4.0", - "symfony/phpunit-bridge": "^4.1.3" + "symfony/expression-language": "^3.4||^4.0", + "symfony/phpunit-bridge": "^4.2" }, "bin": [ "src/Paraunit/Bin/paraunit" diff --git a/composer.lock b/composer.lock index 885be29c..f1e57721 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e19719428d61713f5756222cc43da0cd", + "content-hash": "35bdc3f5b292dad3488b38c46baf0951", "packages": [ { "name": "doctrine/instantiator", @@ -4460,7 +4460,9 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.1" + "php": "^7.1", + "ext-dom": "*", + "ext-json": "*" }, "platform-dev": [] } diff --git a/phpstan.neon b/phpstan.neon index 26aecbdc..5cc3fa2f 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,14 +1,8 @@ parameters: ignoreErrors: - '/does not call parent constructor from PHPUnit\\Util\\Printer/' - # needed with Symfony <3.3 - - '/Call to function is_array\(\) with string will always evaluate to false./' - - '/Class Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher not found/' - '/Call to function method_exists.. with .Tests..BaseTestCase. and .assertStringContain.... will always evaluate to false./' excludes_analyse: - # needed with PHPUnit 6 - - src/Paraunit/Parser/JSON/LogPrinterV6.php - - src/Paraunit/Process/ProcessBuilderFactory.php - tests/Stub/ParseErrorTestStub.php includes: - vendor/phpstan/phpstan-phpunit/extension.neon diff --git a/src/Paraunit/Configuration/DependencyInjection/CoverageContainerDefinition.php b/src/Paraunit/Configuration/DependencyInjection/CoverageContainerDefinition.php index e20cca78..2c9b558d 100644 --- a/src/Paraunit/Configuration/DependencyInjection/CoverageContainerDefinition.php +++ b/src/Paraunit/Configuration/DependencyInjection/CoverageContainerDefinition.php @@ -33,13 +33,13 @@ public function configure(ContainerBuilder $container): ContainerBuilder return $container; } - private function configureCoverageConfiguration(ContainerBuilder $container) + private function configureCoverageConfiguration(ContainerBuilder $container): void { $container->setDefinition(PHPDbgBinFile::class, new Definition(PHPDbgBinFile::class)); $container->setDefinition(XDebugProxy::class, new Definition(XDebugProxy::class)); } - private function configureProcessWithCoverage(ContainerBuilder $container) + private function configureProcessWithCoverage(ContainerBuilder $container): void { $container->setDefinition(CommandLineWithCoverage::class, new Definition(CommandLineWithCoverage::class, [ new Reference(PHPUnitBinFile::class), @@ -54,7 +54,7 @@ private function configureProcessWithCoverage(ContainerBuilder $container) ]); } - private function configureCoverage(ContainerBuilder $container) + private function configureCoverage(ContainerBuilder $container): void { $container->setDefinition(CoverageFetcher::class, new Definition(CoverageFetcher::class, [ new Reference(TempFilenameFactory::class), diff --git a/src/Paraunit/Configuration/DependencyInjection/ParallelContainerDefinition.php b/src/Paraunit/Configuration/DependencyInjection/ParallelContainerDefinition.php index 5d51b5a8..ae5a165e 100644 --- a/src/Paraunit/Configuration/DependencyInjection/ParallelContainerDefinition.php +++ b/src/Paraunit/Configuration/DependencyInjection/ParallelContainerDefinition.php @@ -19,7 +19,6 @@ use Paraunit\Printer\SharkPrinter; use Paraunit\Printer\SingleResultFormatter; use Paraunit\Process\CommandLine; -use Paraunit\Process\ProcessBuilderFactory; use Paraunit\Process\ProcessFactory; use Paraunit\Process\ProcessFactoryInterface; use Paraunit\Proxy\PHPUnitUtilXMLProxy; @@ -32,11 +31,9 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher; use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\Process\Process; class ParallelContainerDefinition { @@ -69,7 +66,7 @@ public function configure(ContainerBuilder $container): ContainerBuilder return $container; } - private function configureConfiguration(ContainerBuilder $container) + private function configureConfiguration(ContainerBuilder $container): void { $container->setDefinition(PHPUnitBinFile::class, new Definition(PHPUnitBinFile::class)); $container->setDefinition(PHPUnitConfig::class, new Definition(PHPUnitConfig::class, [ @@ -81,16 +78,9 @@ private function configureConfiguration(ContainerBuilder $container) ])); } - private function configureEventDispatcher(ContainerBuilder $container) + private function configureEventDispatcher(ContainerBuilder $container): void { - if (class_exists('Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument')) { - $container->setDefinition(EventDispatcherInterface::class, new Definition(EventDispatcher::class)); - } else { - $container->setDefinition( - EventDispatcherInterface::class, - new Definition(ContainerAwareEventDispatcher::class, [new Reference('service_container')]) - ); - } + $container->setDefinition(EventDispatcherInterface::class, new Definition(EventDispatcher::class)); $container->addCompilerPass( new RegisterListenersPass( @@ -101,7 +91,7 @@ private function configureEventDispatcher(ContainerBuilder $container) ); } - private function configureFile(ContainerBuilder $container) + private function configureFile(ContainerBuilder $container): void { $container->setDefinition(TempDirectory::class, new Definition(TempDirectory::class)); $container->setDefinition(Cleaner::class, new Definition(Cleaner::class, [ @@ -109,7 +99,7 @@ private function configureFile(ContainerBuilder $container) ])); } - private function configurePrinter(ContainerBuilder $container) + private function configurePrinter(ContainerBuilder $container): void { $output = new Reference(OutputInterface::class); @@ -136,20 +126,20 @@ private function configurePrinter(ContainerBuilder $container) ])); } - private function configureProcess(ContainerBuilder $container) + private function configureProcess(ContainerBuilder $container): void { $container->setDefinition(CommandLine::class, new Definition(CommandLine::class, [ new Reference(PHPUnitBinFile::class), ])); - $container->setDefinition(ProcessFactoryInterface::class, new Definition($this->getProcessFactoryClass(), [ + $container->setDefinition(ProcessFactoryInterface::class, new Definition(ProcessFactory::class, [ new Reference(CommandLine::class), new Reference(PHPUnitConfig::class), new Reference(TempFilenameFactory::class), ])); } - private function configureRunner(ContainerBuilder $container) + private function configureRunner(ContainerBuilder $container): void { $container->setDefinition(PipelineFactory::class, new Definition(PipelineFactory::class, [ new Reference(EventDispatcherInterface::class), @@ -167,7 +157,7 @@ private function configureRunner(ContainerBuilder $container) ->setPublic(true); } - private function configureServices(ContainerBuilder $container) + private function configureServices(ContainerBuilder $container): void { if (! class_exists('SebastianBergmann\FileIterator\Facade')) { \class_alias('\File_Iterator_Facade', 'SebastianBergmann\FileIterator\Facade'); @@ -186,16 +176,4 @@ private function configureServices(ContainerBuilder $container) '%paraunit.string_filter%', ])); } - - private function getProcessFactoryClass(): string - { - // only reliable way to detect symfony/process 3.3+: CLI parsing - $process = new Process(['cmd as array']); - if (\is_array($process->getCommandLine())) { - // Commandline not parsed, we have Symfony < 3.3 - return ProcessBuilderFactory::class; - } - - return ProcessFactory::class; - } } diff --git a/src/Paraunit/Configuration/DependencyInjection/TestResultDefinition.php b/src/Paraunit/Configuration/DependencyInjection/TestResultDefinition.php index 520a264d..53e83850 100644 --- a/src/Paraunit/Configuration/DependencyInjection/TestResultDefinition.php +++ b/src/Paraunit/Configuration/DependencyInjection/TestResultDefinition.php @@ -15,13 +15,13 @@ class TestResultDefinition { - public function configure(ContainerBuilder $container) + public function configure(ContainerBuilder $container): void { $container->setDefinition(TestResultFactory::class, new Definition(TestResultFactory::class)); $this->configureTestResultContainer($container); } - private function configureTestResultContainer(ContainerBuilder $container) + private function configureTestResultContainer(ContainerBuilder $container): void { $testResultList = new Definition(TestResultList::class); diff --git a/src/Paraunit/Configuration/PHPUnitConfig.php b/src/Paraunit/Configuration/PHPUnitConfig.php index 548dbad6..5d0d11f9 100644 --- a/src/Paraunit/Configuration/PHPUnitConfig.php +++ b/src/Paraunit/Configuration/PHPUnitConfig.php @@ -39,7 +39,7 @@ public function getBaseDirectory(): string return dirname($this->configFilename); } - public function addPhpunitOption(PHPUnitOption $option) + public function addPhpunitOption(PHPUnitOption $option): void { $this->phpunitOptions[] = $option; } diff --git a/src/Paraunit/Configuration/PHPUnitOption.php b/src/Paraunit/Configuration/PHPUnitOption.php index e0416b50..5368deb1 100644 --- a/src/Paraunit/Configuration/PHPUnitOption.php +++ b/src/Paraunit/Configuration/PHPUnitOption.php @@ -33,10 +33,7 @@ public function getName(): string return $this->name; } - /** - * @return string|null - */ - public function getShortName() + public function getShortName(): ?string { return $this->shortName; } @@ -44,15 +41,12 @@ public function getShortName() /** * @param string $value */ - public function setValue(string $value = null) + public function setValue(string $value = null): void { $this->value = $value; } - /** - * @return string|null - */ - public function getValue() + public function getValue(): ?string { return $this->value; } diff --git a/src/Paraunit/Configuration/ParallelConfiguration.php b/src/Paraunit/Configuration/ParallelConfiguration.php index 28a990e7..e5b1aeb8 100644 --- a/src/Paraunit/Configuration/ParallelConfiguration.php +++ b/src/Paraunit/Configuration/ParallelConfiguration.php @@ -78,7 +78,7 @@ protected function loadCommandLineOptions(ContainerBuilder $containerBuilder, In } } - private function enableDebugMode(ContainerBuilder $containerBuilder) + private function enableDebugMode(ContainerBuilder $containerBuilder): void { $definition = new Definition(DebugPrinter::class, [new Reference(OutputInterface::class)]); $definition->addTag(self::TAG_EVENT_SUBSCRIBER); @@ -86,7 +86,7 @@ private function enableDebugMode(ContainerBuilder $containerBuilder) $containerBuilder->setDefinition(DebugPrinter::class, $definition); } - private function createPublicAliases(ContainerBuilder $containerBuilder) + private function createPublicAliases(ContainerBuilder $containerBuilder): void { if (! $this->createPublicServiceAliases) { return; @@ -96,11 +96,6 @@ private function createPublicAliases(ContainerBuilder $containerBuilder) // the synthetic service isn't listed $services[] = OutputInterface::class; foreach ($services as $serviceName) { - if ($serviceName === 'service_container') { - // needed with SF 3.x - continue; - } - $containerBuilder->setAlias( sprintf(self::PUBLIC_ALIAS_FORMAT, $serviceName), new Alias($serviceName, true) diff --git a/src/Paraunit/Coverage/CoverageMerger.php b/src/Paraunit/Coverage/CoverageMerger.php index b57c3fd2..9111fb5f 100644 --- a/src/Paraunit/Coverage/CoverageMerger.php +++ b/src/Paraunit/Coverage/CoverageMerger.php @@ -29,7 +29,7 @@ public static function getSubscribedEvents(): array ]; } - public function onProcessParsingCompleted(ProcessEvent $processEvent) + public function onProcessParsingCompleted(ProcessEvent $processEvent): void { $process = $processEvent->getProcess(); if ($process->isToBeRetried()) { @@ -39,7 +39,7 @@ public function onProcessParsingCompleted(ProcessEvent $processEvent) $this->merge($process); } - private function merge(AbstractParaunitProcess $process) + private function merge(AbstractParaunitProcess $process): void { $newCoverageData = $this->coverageFetcher->fetch($process); diff --git a/src/Paraunit/Coverage/CoverageResult.php b/src/Paraunit/Coverage/CoverageResult.php index 3c4b54f8..7abcab5f 100644 --- a/src/Paraunit/Coverage/CoverageResult.php +++ b/src/Paraunit/Coverage/CoverageResult.php @@ -29,12 +29,12 @@ public static function getSubscribedEvents(): array ]; } - public function addCoverageProcessor(CoverageProcessorInterface $processor) + public function addCoverageProcessor(CoverageProcessorInterface $processor): void { $this->coverageProcessors[] = $processor; } - public function generateResults() + public function generateResults(): void { $coverageData = $this->coverageMerger->getCoverageData(); diff --git a/src/Paraunit/Coverage/Processor/AbstractText.php b/src/Paraunit/Coverage/Processor/AbstractText.php index dd0ea3f7..5cfa32aa 100644 --- a/src/Paraunit/Coverage/Processor/AbstractText.php +++ b/src/Paraunit/Coverage/Processor/AbstractText.php @@ -34,7 +34,7 @@ public function __construct(OutputInterface $output, bool $showColors, bool $onl /** * @throws \RuntimeException */ - public function process(CodeCoverage $coverage) + public function process(CodeCoverage $coverage): void { $coverageResults = $this->text->process($coverage, $this->showColors); diff --git a/src/Paraunit/Coverage/Processor/Clover.php b/src/Paraunit/Coverage/Processor/Clover.php index 18cc0b50..aa0906b9 100644 --- a/src/Paraunit/Coverage/Processor/Clover.php +++ b/src/Paraunit/Coverage/Processor/Clover.php @@ -25,7 +25,7 @@ public function __construct(OutputFile $targetFile) /** * @throws \RuntimeException */ - public function process(CodeCoverage $codeCoverage) + public function process(CodeCoverage $codeCoverage): void { $this->clover->process($codeCoverage, $this->targetFile->getFilePath()); } diff --git a/src/Paraunit/Coverage/Processor/CoverageProcessorInterface.php b/src/Paraunit/Coverage/Processor/CoverageProcessorInterface.php index 6408f63a..7c50c3d4 100644 --- a/src/Paraunit/Coverage/Processor/CoverageProcessorInterface.php +++ b/src/Paraunit/Coverage/Processor/CoverageProcessorInterface.php @@ -10,10 +10,8 @@ interface CoverageProcessorInterface { /** * @throws \RuntimeException If the processor is missing a needed info, like the target dir/filename - * - * @return void */ - public function process(CodeCoverage $codeCoverage); + public function process(CodeCoverage $codeCoverage): void; public static function getConsoleOptionName(): string; } diff --git a/src/Paraunit/Coverage/Processor/Crap4j.php b/src/Paraunit/Coverage/Processor/Crap4j.php index 38190f19..acd8bb2b 100644 --- a/src/Paraunit/Coverage/Processor/Crap4j.php +++ b/src/Paraunit/Coverage/Processor/Crap4j.php @@ -25,7 +25,7 @@ public function __construct(OutputFile $targetFile) /** * @throws \RuntimeException */ - public function process(CodeCoverage $codeCoverage) + public function process(CodeCoverage $codeCoverage): void { $this->crap4j->process($codeCoverage, $this->targetFile->getFilePath()); } diff --git a/src/Paraunit/Coverage/Processor/Html.php b/src/Paraunit/Coverage/Processor/Html.php index 49ca6d75..acf7c9e7 100644 --- a/src/Paraunit/Coverage/Processor/Html.php +++ b/src/Paraunit/Coverage/Processor/Html.php @@ -25,7 +25,7 @@ public function __construct(OutputPath $targetPath) /** * @throws \RuntimeException */ - public function process(CodeCoverage $codeCoverage) + public function process(CodeCoverage $codeCoverage): void { $this->html->process($codeCoverage, $this->targetPath->getPath()); } diff --git a/src/Paraunit/Coverage/Processor/Php.php b/src/Paraunit/Coverage/Processor/Php.php index 486e4393..267ff036 100644 --- a/src/Paraunit/Coverage/Processor/Php.php +++ b/src/Paraunit/Coverage/Processor/Php.php @@ -25,7 +25,7 @@ public function __construct(OutputFile $targetFile) /** * @throws \RuntimeException */ - public function process(CodeCoverage $codeCoverage) + public function process(CodeCoverage $codeCoverage): void { $this->php->process($codeCoverage, $this->targetFile->getFilePath()); } diff --git a/src/Paraunit/Coverage/Processor/Xml.php b/src/Paraunit/Coverage/Processor/Xml.php index f7a7b741..53735feb 100644 --- a/src/Paraunit/Coverage/Processor/Xml.php +++ b/src/Paraunit/Coverage/Processor/Xml.php @@ -26,7 +26,7 @@ public function __construct(OutputPath $targetPath) /** * @throws \RuntimeException */ - public function process(CodeCoverage $codeCoverage) + public function process(CodeCoverage $codeCoverage): void { $this->xml->process($codeCoverage, $this->targetPath->getPath()); } diff --git a/src/Paraunit/File/Cleaner.php b/src/Paraunit/File/Cleaner.php index 263666f1..22fadcd7 100644 --- a/src/Paraunit/File/Cleaner.php +++ b/src/Paraunit/File/Cleaner.php @@ -25,7 +25,7 @@ public static function getSubscribedEvents(): array ]; } - public function purgeCurrentTempDir() + public function purgeCurrentTempDir(): void { self::cleanUpDir($this->tempDirectory->getTempDirForThisExecution()); } diff --git a/src/Paraunit/File/TempDirectory.php b/src/Paraunit/File/TempDirectory.php index 0c4ad4d2..cdc5b1da 100644 --- a/src/Paraunit/File/TempDirectory.php +++ b/src/Paraunit/File/TempDirectory.php @@ -62,7 +62,7 @@ public static function getTempBaseDir(): string /** * @throws \RuntimeException If the dir cannot be created */ - public static function mkdirIfNotExists(string $path) + public static function mkdirIfNotExists(string $path): void { if (file_exists($path)) { return; diff --git a/src/Paraunit/Parser/DeprecationParser.php b/src/Paraunit/Parser/DeprecationParser.php index 959970e1..85e455e4 100644 --- a/src/Paraunit/Parser/DeprecationParser.php +++ b/src/Paraunit/Parser/DeprecationParser.php @@ -27,7 +27,7 @@ public static function getSubscribedEvents(): array ]; } - public function handleDeprecations(ProcessEvent $event) + public function handleDeprecations(ProcessEvent $event): void { $process = $event->getProcess(); diff --git a/src/Paraunit/Parser/JSON/GenericParser.php b/src/Paraunit/Parser/JSON/GenericParser.php index 58115eac..ebc96e09 100644 --- a/src/Paraunit/Parser/JSON/GenericParser.php +++ b/src/Paraunit/Parser/JSON/GenericParser.php @@ -6,6 +6,7 @@ use Paraunit\Process\AbstractParaunitProcess; use Paraunit\TestResult\Interfaces\TestResultHandlerInterface; +use Paraunit\TestResult\Interfaces\TestResultInterface; use Paraunit\TestResult\TestResultFactory; class GenericParser implements ParserChainElementInterface @@ -41,7 +42,7 @@ public function __construct( /** * {@inheritdoc} */ - public function handleLogItem(AbstractParaunitProcess $process, \stdClass $logItem) + public function handleLogItem(AbstractParaunitProcess $process, \stdClass $logItem): ?TestResultInterface { if ($this->logMatches($logItem)) { $testResult = $this->testResultFactory->createFromLog($logItem); diff --git a/src/Paraunit/Parser/JSON/LogParser.php b/src/Paraunit/Parser/JSON/LogParser.php index b74ee7bd..3d2c065a 100644 --- a/src/Paraunit/Parser/JSON/LogParser.php +++ b/src/Paraunit/Parser/JSON/LogParser.php @@ -48,7 +48,7 @@ public static function getSubscribedEvents(): array ]; } - public function addParser(ParserChainElementInterface $container) + public function addParser(ParserChainElementInterface $container): void { $this->parsers[] = $container; } @@ -61,7 +61,7 @@ public function getParsers(): array return $this->parsers; } - public function onProcessTerminated(ProcessEvent $processEvent) + public function onProcessTerminated(ProcessEvent $processEvent): void { $process = $processEvent->getProcess(); $logs = $this->logLocator->fetch($process); @@ -85,7 +85,7 @@ public function onProcessTerminated(ProcessEvent $processEvent) $this->eventDispatcher->dispatch(ProcessEvent::PROCESS_PARSING_COMPLETED, new ProcessEvent($process)); } - private function processLog(AbstractParaunitProcess $process, \stdClass $logItem) + private function processLog(AbstractParaunitProcess $process, \stdClass $logItem): void { /** @var ParserChainElementInterface $resultContainer */ foreach ($this->parsers as $resultContainer) { diff --git a/src/Paraunit/Parser/JSON/LogPrinter.php b/src/Paraunit/Parser/JSON/LogPrinter.php index 64d081ba..ecf73b06 100644 --- a/src/Paraunit/Parser/JSON/LogPrinter.php +++ b/src/Paraunit/Parser/JSON/LogPrinter.php @@ -13,294 +13,287 @@ use PHPUnit\Framework\TestListener; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\Warning; -use PHPUnit\Runner\Version; use PHPUnit\Util; -if (version_compare(Version::id(), '7.0.0', '<')) { - class_alias('Paraunit\Parser\JSON\LogPrinterV6', 'Paraunit\Parser\JSON\LogPrinter'); -// Using an early return instead of a else does not work when using the PHPUnit phar due to some weird PHP behavior -// (the class gets defined without executing the code before it and so the definition is not properly conditional) -} else { - /** - * This class comes from Util\Log_JSON. - * It's copied and refactored here because it's deprecated in PHPUnit 5.7 and it will be dropped in PHPUnit 6 - * - * Class LogPrinter - */ - class LogPrinter extends Util\Printer implements TestListener - { - const STATUS_ERROR = 'error'; +/** + * This class comes from Util\Log_JSON. + * It's copied and refactored here because it's deprecated in PHPUnit 5.7 and it will be dropped in PHPUnit 6 + * + * Class LogPrinter + */ +class LogPrinter extends Util\Printer implements TestListener +{ + const STATUS_ERROR = 'error'; - const STATUS_WARNING = 'warning'; + const STATUS_WARNING = 'warning'; - const STATUS_FAIL = 'fail'; + const STATUS_FAIL = 'fail'; - const STATUS_PASS = 'pass'; + const STATUS_PASS = 'pass'; - const MESSAGE_INCOMPLETE_TEST = 'Incomplete Test: '; + const MESSAGE_INCOMPLETE_TEST = 'Incomplete Test: '; - const MESSAGE_RISKY_TEST = 'Risky Test: '; + const MESSAGE_RISKY_TEST = 'Risky Test: '; - const MESSAGE_SKIPPED_TEST = 'Skipped Test: '; + const MESSAGE_SKIPPED_TEST = 'Skipped Test: '; - /** @var resource */ - private $logFile; + /** @var resource */ + private $logFile; - /** @var string */ - private $currentTestSuiteName; + /** @var string */ + private $currentTestSuiteName; - /** @var string */ - private $currentTestName; + /** @var string */ + private $currentTestName; - /** @var bool */ - private $currentTestPass; + /** @var bool */ + private $currentTestPass; - public function __construct() - { - $file = fopen($this->getLogFilename(), 'wt'); - if (! \is_resource($file)) { - throw new \RuntimeException('Unable to create log file'); - } - $this->logFile = $file; - $this->autoFlush = true; + public function __construct() + { + $file = fopen($this->getLogFilename(), 'wt'); + if (! \is_resource($file)) { + throw new \RuntimeException('Unable to create log file'); } + $this->logFile = $file; + $this->autoFlush = true; + } - /** - * An error occurred. - */ - public function addError(Test $test, \Throwable $exception, float $time): void - { - $this->writeCase( - self::STATUS_ERROR, - $time, - $this->getStackTrace($exception), - TestFailure::exceptionToString($exception), - $test - ); - - $this->currentTestPass = false; - } + /** + * An error occurred. + */ + public function addError(Test $test, \Throwable $exception, float $time): void + { + $this->writeCase( + self::STATUS_ERROR, + $time, + $this->getStackTrace($exception), + TestFailure::exceptionToString($exception), + $test + ); + + $this->currentTestPass = false; + } - /** - * A warning occurred. - */ - public function addWarning(Test $test, Warning $warning, float $time): void - { - $this->writeCase( - self::STATUS_WARNING, - $time, - $this->getStackTrace($warning), - TestFailure::exceptionToString($warning), - $test - ); - - $this->currentTestPass = false; - } + /** + * A warning occurred. + */ + public function addWarning(Test $test, Warning $warning, float $time): void + { + $this->writeCase( + self::STATUS_WARNING, + $time, + $this->getStackTrace($warning), + TestFailure::exceptionToString($warning), + $test + ); + + $this->currentTestPass = false; + } - /** - * A failure occurred. - */ - public function addFailure(Test $test, AssertionFailedError $error, float $time): void - { - $this->writeCase( - self::STATUS_FAIL, - $time, - $this->getStackTrace($error), - TestFailure::exceptionToString($error), - $test - ); - - $this->currentTestPass = false; - } + /** + * A failure occurred. + */ + public function addFailure(Test $test, AssertionFailedError $error, float $time): void + { + $this->writeCase( + self::STATUS_FAIL, + $time, + $this->getStackTrace($error), + TestFailure::exceptionToString($error), + $test + ); + + $this->currentTestPass = false; + } - /** - * Incomplete test. - */ - public function addIncompleteTest(Test $test, \Throwable $error, float $time): void - { - $this->writeCase( - self::STATUS_ERROR, - $time, - $this->getStackTrace($error), - self::MESSAGE_INCOMPLETE_TEST . $error->getMessage(), - $test - ); - - $this->currentTestPass = false; - } + /** + * Incomplete test. + */ + public function addIncompleteTest(Test $test, \Throwable $error, float $time): void + { + $this->writeCase( + self::STATUS_ERROR, + $time, + $this->getStackTrace($error), + self::MESSAGE_INCOMPLETE_TEST . $error->getMessage(), + $test + ); + + $this->currentTestPass = false; + } - /** - * Risky test. - */ - public function addRiskyTest(Test $test, \Throwable $exception, float $time): void - { - $this->writeCase( - self::STATUS_ERROR, - $time, - $this->getStackTrace($exception), - self::MESSAGE_RISKY_TEST . $exception->getMessage(), - $test - ); - - $this->currentTestPass = false; - } + /** + * Risky test. + */ + public function addRiskyTest(Test $test, \Throwable $exception, float $time): void + { + $this->writeCase( + self::STATUS_ERROR, + $time, + $this->getStackTrace($exception), + self::MESSAGE_RISKY_TEST . $exception->getMessage(), + $test + ); + + $this->currentTestPass = false; + } - /** - * Skipped test. - */ - public function addSkippedTest(Test $test, \Throwable $exception, float $time): void - { - $this->writeCase( - self::STATUS_ERROR, - $time, - $this->getStackTrace($exception), - self::MESSAGE_SKIPPED_TEST . $exception->getMessage(), - $test - ); - - $this->currentTestPass = false; - } + /** + * Skipped test. + */ + public function addSkippedTest(Test $test, \Throwable $exception, float $time): void + { + $this->writeCase( + self::STATUS_ERROR, + $time, + $this->getStackTrace($exception), + self::MESSAGE_SKIPPED_TEST . $exception->getMessage(), + $test + ); + + $this->currentTestPass = false; + } - /** - * A testsuite started. - * - * @throws \RuntimeException - */ - public function startTestSuite(TestSuite $suite): void - { - $this->currentTestSuiteName = $suite->getName(); - $this->currentTestName = ''; - - $this->writeArray([ - 'event' => 'suiteStart', - 'suite' => $this->currentTestSuiteName, - 'tests' => count($suite), - ]); - } + /** + * A testsuite started. + * + * @throws \RuntimeException + */ + public function startTestSuite(TestSuite $suite): void + { + $this->currentTestSuiteName = $suite->getName(); + $this->currentTestName = ''; + + $this->writeArray([ + 'event' => 'suiteStart', + 'suite' => $this->currentTestSuiteName, + 'tests' => count($suite), + ]); + } - public function endTestSuite(TestSuite $suite): void - { - $this->currentTestSuiteName = ''; - $this->currentTestName = ''; - } + public function endTestSuite(TestSuite $suite): void + { + $this->currentTestSuiteName = ''; + $this->currentTestName = ''; + } - public function startTest(Test $test): void - { - $this->currentTestName = $test instanceof SelfDescribing ? $test->toString() : \get_class($test); - $this->currentTestPass = true; + public function startTest(Test $test): void + { + $this->currentTestName = $test instanceof SelfDescribing ? $test->toString() : \get_class($test); + $this->currentTestPass = true; + + $this->writeArray([ + 'event' => 'testStart', + 'suite' => $this->currentTestSuiteName, + 'test' => $this->currentTestName, + ]); + } - $this->writeArray([ - 'event' => 'testStart', - 'suite' => $this->currentTestSuiteName, - 'test' => $this->currentTestName, - ]); + /** + * A test ended. + */ + public function endTest(Test $test, float $time): void + { + if ($this->currentTestPass) { + $this->writeCase(self::STATUS_PASS, $time, '', '', $test); } + } - /** - * A test ended. - */ - public function endTest(Test $test, float $time): void - { - if ($this->currentTestPass) { - $this->writeCase(self::STATUS_PASS, $time, '', '', $test); - } + /** + * @param string $message + * @param Test|TestCase|null $test + */ + private function writeCase(string $status, float $time, string $trace, $message = '', $test = null) + { + $output = ''; + if ($test instanceof TestCase) { + $output = $test->getActualOutput(); } - /** - * @param string $message - * @param Test|TestCase|null $test - */ - private function writeCase(string $status, float $time, string $trace, $message = '', $test = null) - { - $output = ''; - if ($test instanceof TestCase) { - $output = $test->getActualOutput(); + $this->writeArray([ + 'event' => 'test', + 'suite' => $this->currentTestSuiteName, + 'test' => $this->currentTestName, + 'status' => $status, + 'time' => $time, + 'trace' => $trace, + 'message' => $this->convertToUtf8($message), + 'output' => $output, + ]); + } + + /** + * @param array $buffer + */ + private function writeArray($buffer) + { + array_walk_recursive($buffer, function (&$input) { + if (is_string($input)) { + $input = $this->convertToUtf8($input); } + }); - $this->writeArray([ - 'event' => 'test', - 'suite' => $this->currentTestSuiteName, - 'test' => $this->currentTestName, - 'status' => $status, - 'time' => $time, - 'trace' => $trace, - 'message' => $this->convertToUtf8($message), - 'output' => $output, - ]); - } + $this->writeToLog(json_encode($buffer, JSON_PRETTY_PRINT)); + } - /** - * @param array $buffer - */ - private function writeArray($buffer) - { - array_walk_recursive($buffer, function (&$input) { - if (is_string($input)) { - $input = $this->convertToUtf8($input); - } - }); - - $this->writeToLog(json_encode($buffer, JSON_PRETTY_PRINT)); + private function writeToLog($buffer) + { + // ignore everything that is not a JSON object + if ($buffer != '' && $buffer[0] === '{') { + \fwrite($this->logFile, $buffer); + \fflush($this->logFile); } + } - private function writeToLog($buffer) - { - // ignore everything that is not a JSON object - if ($buffer != '' && $buffer[0] === '{') { - \fwrite($this->logFile, $buffer); - \fflush($this->logFile); - } + /** + * @throws \RuntimeException + * @throws \InvalidArgumentException + */ + private function getLogFilename(): string + { + $logDir = $this->getLogDirectory(); + if (! @mkdir($logDir, 0777, true) && ! is_dir($logDir)) { + throw new \RuntimeException('Cannot create folder for JSON logs'); } - /** - * @throws \RuntimeException - * @throws \InvalidArgumentException - */ - private function getLogFilename(): string - { - $logDir = $this->getLogDirectory(); - if (! @mkdir($logDir, 0777, true) && ! is_dir($logDir)) { - throw new \RuntimeException('Cannot create folder for JSON logs'); - } - - $logFilename = getenv(EnvVariables::PROCESS_UNIQUE_ID); - if ($logFilename === false) { - throw new \InvalidArgumentException('Log filename not received: environment variable not set'); - } - - return $logDir . $logFilename . '.json.log'; + $logFilename = getenv(EnvVariables::PROCESS_UNIQUE_ID); + if ($logFilename === false) { + throw new \InvalidArgumentException('Log filename not received: environment variable not set'); } - /** - * @throws \InvalidArgumentException - */ - private function getLogDirectory(): string - { - $logDirectory = getenv(EnvVariables::LOG_DIR); + return $logDir . $logFilename . '.json.log'; + } - if ($logDirectory === false) { - throw new \InvalidArgumentException('Log directory not received: environment variable not set'); - } + /** + * @throws \InvalidArgumentException + */ + private function getLogDirectory(): string + { + $logDirectory = getenv(EnvVariables::LOG_DIR); - if (substr($logDirectory, -1) !== DIRECTORY_SEPARATOR) { - $logDirectory .= DIRECTORY_SEPARATOR; - } + if ($logDirectory === false) { + throw new \InvalidArgumentException('Log directory not received: environment variable not set'); + } - return $logDirectory; + if (substr($logDirectory, -1) !== DIRECTORY_SEPARATOR) { + $logDirectory .= DIRECTORY_SEPARATOR; } - private function convertToUtf8($string): string - { - if (! \mb_detect_encoding($string, 'UTF-8', true)) { - return \mb_convert_encoding($string, 'UTF-8'); - } + return $logDirectory; + } - return $string; + private function convertToUtf8($string): string + { + if (! \mb_detect_encoding($string, 'UTF-8', true)) { + return \mb_convert_encoding($string, 'UTF-8'); } - private function getStackTrace($error): string - { - return Util\Filter::getFilteredStacktrace($error); - } + return $string; + } + + private function getStackTrace($error): string + { + return Util\Filter::getFilteredStacktrace($error); } } diff --git a/src/Paraunit/Parser/JSON/LogPrinterV6.php b/src/Paraunit/Parser/JSON/LogPrinterV6.php deleted file mode 100644 index e0b667f1..00000000 --- a/src/Paraunit/Parser/JSON/LogPrinterV6.php +++ /dev/null @@ -1,303 +0,0 @@ -logFile = fopen($this->getLogFilename(), 'wt'); - $this->autoFlush = true; - } - - /** - * An error occurred. - * - * @param float $time - */ - public function addError(Test $test, \Exception $exception, $time) - { - $this->writeCase( - self::STATUS_ERROR, - $time, - $this->getStackTrace($exception), - TestFailure::exceptionToString($exception), - $test - ); - - $this->currentTestPass = false; - } - - /** - * A warning occurred. - * - * @param float $time - */ - public function addWarning(Test $test, Warning $warning, $time) - { - $this->writeCase( - self::STATUS_WARNING, - $time, - $this->getStackTrace($warning), - TestFailure::exceptionToString($warning), - $test - ); - - $this->currentTestPass = false; - } - - /** - * A failure occurred. - * - * @param float $time - */ - public function addFailure(Test $test, AssertionFailedError $error, $time) - { - $this->writeCase( - self::STATUS_FAIL, - $time, - $this->getStackTrace($error), - TestFailure::exceptionToString($error), - $test - ); - - $this->currentTestPass = false; - } - - /** - * Incomplete test. - * - * @param float $time - */ - public function addIncompleteTest(Test $test, \Exception $error, $time) - { - $this->writeCase( - self::STATUS_ERROR, - $time, - $this->getStackTrace($error), - self::MESSAGE_INCOMPLETE_TEST . $error->getMessage(), - $test - ); - - $this->currentTestPass = false; - } - - /** - * Risky test. - * - * @param float $time - */ - public function addRiskyTest(Test $test, \Exception $exception, $time) - { - $this->writeCase( - self::STATUS_ERROR, - $time, - $this->getStackTrace($exception), - self::MESSAGE_RISKY_TEST . $exception->getMessage(), - $test - ); - - $this->currentTestPass = false; - } - - /** - * Skipped test. - * - * @param float $time - */ - public function addSkippedTest(Test $test, \Exception $exception, $time) - { - $this->writeCase( - self::STATUS_ERROR, - $time, - $this->getStackTrace($exception), - self::MESSAGE_SKIPPED_TEST . $exception->getMessage(), - $test - ); - - $this->currentTestPass = false; - } - - /** - * A testsuite started. - * - * @throws \RuntimeException - */ - public function startTestSuite(TestSuite $suite) - { - $this->currentTestSuiteName = $suite->getName(); - $this->currentTestName = ''; - - $this->writeArray([ - 'event' => 'suiteStart', - 'suite' => $this->currentTestSuiteName, - 'tests' => count($suite), - ]); - } - - public function endTestSuite(TestSuite $suite) - { - $this->currentTestSuiteName = ''; - $this->currentTestName = ''; - } - - public function startTest(Test $test) - { - $this->currentTestName = $test instanceof SelfDescribing ? $test->toString() : \get_class($test); - $this->currentTestPass = true; - - $this->writeArray([ - 'event' => 'testStart', - 'suite' => $this->currentTestSuiteName, - 'test' => $this->currentTestName, - ]); - } - - /** - * A test ended. - * - * @param float $time - */ - public function endTest(Test $test, $time) - { - if ($this->currentTestPass) { - $this->writeCase(self::STATUS_PASS, $time, '', '', $test); - } - } - - /** - * @param string $message - * @param Test|TestCase|null $test - */ - private function writeCase(string $status, float $time, string $trace, $message = '', $test = null) - { - $output = ''; - if ($test instanceof TestCase) { - $output = $test->getActualOutput(); - } - - $this->writeArray([ - 'event' => 'test', - 'suite' => $this->currentTestSuiteName, - 'test' => $this->currentTestName, - 'status' => $status, - 'time' => $time, - 'trace' => $trace, - 'message' => $this->convertToUtf8($message), - 'output' => $output, - ]); - } - - /** - * @param array $buffer - */ - private function writeArray($buffer) - { - array_walk_recursive($buffer, function (&$input) { - if (is_string($input)) { - $input = $this->convertToUtf8($input); - } - }); - - $this->writeToLog(json_encode($buffer, JSON_PRETTY_PRINT)); - } - - private function writeToLog($buffer) - { - // ignore everything that is not a JSON object - if ($buffer != '' && $buffer[0] === '{') { - \fwrite($this->logFile, $buffer); - \fflush($this->logFile); - } - } - - /** - * @throws \RuntimeException - * @throws \InvalidArgumentException - */ - private function getLogFilename(): string - { - $logDir = $this->getLogDirectory(); - if (! @mkdir($logDir, 0777, true) && ! is_dir($logDir)) { - throw new \RuntimeException('Cannot create folder for JSON logs'); - } - - $logFilename = getenv(EnvVariables::PROCESS_UNIQUE_ID); - if ($logFilename === false) { - throw new \InvalidArgumentException('Log filename not received: environment variable not set'); - } - - return $logDir . $logFilename . '.json.log'; - } - - /** - * @throws \InvalidArgumentException - */ - private function getLogDirectory(): string - { - $logDirectory = getenv(EnvVariables::LOG_DIR); - - if ($logDirectory === false) { - throw new \InvalidArgumentException('Log directory not received: environment variable not set'); - } - - if (substr($logDirectory, -1) !== DIRECTORY_SEPARATOR) { - $logDirectory .= DIRECTORY_SEPARATOR; - } - - return $logDirectory; - } - - private function convertToUtf8($string): string - { - if (! \mb_detect_encoding($string, 'UTF-8', true)) { - return \mb_convert_encoding($string, 'UTF-8'); - } - - return $string; - } - - private function getStackTrace($error): string - { - return Util\Filter::getFilteredStacktrace($error); - } -} diff --git a/src/Paraunit/Parser/JSON/ParserChainElementInterface.php b/src/Paraunit/Parser/JSON/ParserChainElementInterface.php index 01fc0270..dedc3e83 100644 --- a/src/Paraunit/Parser/JSON/ParserChainElementInterface.php +++ b/src/Paraunit/Parser/JSON/ParserChainElementInterface.php @@ -12,5 +12,5 @@ interface ParserChainElementInterface /** * @return null|TestResultInterface Returned when the chain needs to stop */ - public function handleLogItem(AbstractParaunitProcess $process, \stdClass $logItem); + public function handleLogItem(AbstractParaunitProcess $process, \stdClass $logItem): ?TestResultInterface; } diff --git a/src/Paraunit/Parser/JSON/TestStartParser.php b/src/Paraunit/Parser/JSON/TestStartParser.php index 31f03a29..5a10cd72 100644 --- a/src/Paraunit/Parser/JSON/TestStartParser.php +++ b/src/Paraunit/Parser/JSON/TestStartParser.php @@ -5,6 +5,7 @@ namespace Paraunit\Parser\JSON; use Paraunit\Process\AbstractParaunitProcess; +use Paraunit\TestResult\Interfaces\TestResultInterface; use Paraunit\TestResult\NullTestResult; class TestStartParser implements ParserChainElementInterface @@ -17,7 +18,7 @@ class TestStartParser implements ParserChainElementInterface /** @var string */ private $lastFunction; - public function handleLogItem(AbstractParaunitProcess $process, \stdClass $logItem) + public function handleLogItem(AbstractParaunitProcess $process, \stdClass $logItem): ?TestResultInterface { if (property_exists($logItem, 'status') && $logItem->status === LogFetcher::LOG_ENDING_STATUS) { return $this->handleLogTermination($process, $logItem); diff --git a/src/Paraunit/Printer/AbstractFinalPrinter.php b/src/Paraunit/Printer/AbstractFinalPrinter.php index 9ea4b956..6c3043b7 100644 --- a/src/Paraunit/Printer/AbstractFinalPrinter.php +++ b/src/Paraunit/Printer/AbstractFinalPrinter.php @@ -18,5 +18,5 @@ public function __construct(TestResultList $testResultList, OutputInterface $out $this->testResultList = $testResultList; } - abstract public function onEngineEnd(); + abstract public function onEngineEnd(): void; } diff --git a/src/Paraunit/Printer/AbstractPrinter.php b/src/Paraunit/Printer/AbstractPrinter.php index 31cd2f24..31c161cc 100644 --- a/src/Paraunit/Printer/AbstractPrinter.php +++ b/src/Paraunit/Printer/AbstractPrinter.php @@ -16,10 +16,7 @@ public function __construct(OutputInterface $output) $this->output = $output; } - /** - * @return OutputInterface - */ - public function getOutput() + public function getOutput(): OutputInterface { return $this->output; } diff --git a/src/Paraunit/Printer/ConsoleFormatter.php b/src/Paraunit/Printer/ConsoleFormatter.php index 228e75c7..0ed23e99 100644 --- a/src/Paraunit/Printer/ConsoleFormatter.php +++ b/src/Paraunit/Printer/ConsoleFormatter.php @@ -17,7 +17,7 @@ public static function getSubscribedEvents(): array ]; } - public function onEngineBeforeStart() + public function onEngineBeforeStart(): void { $formatter = $this->getOutput()->getFormatter(); $formatter->setStyle('ok', $this->createNewStyle('green')); diff --git a/src/Paraunit/Printer/CoveragePrinter.php b/src/Paraunit/Printer/CoveragePrinter.php index aef2cb9f..039d4e2f 100644 --- a/src/Paraunit/Printer/CoveragePrinter.php +++ b/src/Paraunit/Printer/CoveragePrinter.php @@ -35,7 +35,7 @@ public static function getSubscribedEvents(): array ]; } - public function onEngineBeforeStart() + public function onEngineBeforeStart(): void { $this->output->write('Coverage driver in use: '); diff --git a/src/Paraunit/Printer/DebugPrinter.php b/src/Paraunit/Printer/DebugPrinter.php index 5382502f..8a75eb85 100644 --- a/src/Paraunit/Printer/DebugPrinter.php +++ b/src/Paraunit/Printer/DebugPrinter.php @@ -19,7 +19,7 @@ public static function getSubscribedEvents(): array ]; } - public function onProcessStarted(ProcessEvent $event) + public function onProcessStarted(ProcessEvent $event): void { $process = $event->getProcess(); @@ -28,7 +28,7 @@ public function onProcessStarted(ProcessEvent $event) $this->getOutput()->writeln(''); } - public function onProcessTerminated(ProcessEvent $event) + public function onProcessTerminated(ProcessEvent $event): void { $process = $event->getProcess(); @@ -38,12 +38,12 @@ public function onProcessTerminated(ProcessEvent $event) $this->getOutput()->writeln(''); } - public function onProcessParsingCompleted() + public function onProcessParsingCompleted(): void { $this->getOutput()->write('PROCESS PARSING COMPLETED -- RESULTS: '); } - public function onProcessToBeRetried(ProcessEvent $event) + public function onProcessToBeRetried(ProcessEvent $event): void { $process = $event->getProcess(); diff --git a/src/Paraunit/Printer/FailuresPrinter.php b/src/Paraunit/Printer/FailuresPrinter.php index 30131a67..e5c4ef57 100644 --- a/src/Paraunit/Printer/FailuresPrinter.php +++ b/src/Paraunit/Printer/FailuresPrinter.php @@ -13,14 +13,14 @@ class FailuresPrinter extends AbstractFinalPrinter implements EventSubscriberInterface { - public static function getSubscribedEvents() + public static function getSubscribedEvents(): array { return [ EngineEvent::END => ['onEngineEnd', 200], ]; } - public function onEngineEnd() + public function onEngineEnd(): void { foreach ($this->testResultList->getTestResultContainers() as $parser) { if ($parser->getTestResultFormat()->shouldPrintTestOutput()) { @@ -29,7 +29,7 @@ public function onEngineEnd() } } - private function printFailuresOutput(TestResultContainer $testResultContainer) + private function printFailuresOutput(TestResultContainer $testResultContainer): void { if (empty($testResultContainer->getTestResults())) { return; @@ -38,26 +38,27 @@ private function printFailuresOutput(TestResultContainer $testResultContainer) $tag = $testResultContainer->getTestResultFormat()->getTag(); $title = $testResultContainer->getTestResultFormat()->getTitle(); - $this->getOutput()->writeln(''); - $this->getOutput()->writeln(sprintf('<%s>%s output:', $tag, ucwords($title), $tag)); + $output = $this->getOutput(); + $output->writeln(''); + $output->writeln(sprintf('<%s>%s output:', $tag, ucwords($title), $tag)); $i = 1; foreach ($testResultContainer->getTestResults() as $testResult) { - $this->getOutput()->writeln(''); - $this->getOutput()->write(sprintf('<%s>%d) ', $tag, $i++)); + $output->writeln(''); + $output->write(sprintf('<%s>%d) ', $tag, $i++)); if ($testResult instanceof FunctionNameInterface) { - $this->getOutput()->writeln($testResult->getFunctionName()); + $output->writeln($testResult->getFunctionName()); } - $this->getOutput()->write(sprintf('', $tag)); + $output->write(sprintf('', $tag)); if ($testResult instanceof FailureMessageInterface) { - $this->getOutput()->writeln($testResult->getFailureMessage()); + $output->writeln($testResult->getFailureMessage()); } if ($testResult instanceof StackTraceInterface) { - $this->getOutput()->writeln($testResult->getTrace()); + $output->writeln($testResult->getTrace()); } } } diff --git a/src/Paraunit/Printer/FilesRecapPrinter.php b/src/Paraunit/Printer/FilesRecapPrinter.php index 4e152158..1d1e0c99 100644 --- a/src/Paraunit/Printer/FilesRecapPrinter.php +++ b/src/Paraunit/Printer/FilesRecapPrinter.php @@ -17,14 +17,14 @@ public static function getSubscribedEvents(): array ]; } - public function onEngineEnd() + public function onEngineEnd(): void { foreach ($this->testResultList->getTestResultContainers() as $parser) { $this->printFileRecap($parser); } } - private function printFileRecap(TestResultContainerInterface $testResultContainer) + private function printFileRecap(TestResultContainerInterface $testResultContainer): void { if (! $testResultContainer->getTestResultFormat()->shouldPrintFilesRecap()) { return; diff --git a/src/Paraunit/Printer/FinalPrinter.php b/src/Paraunit/Printer/FinalPrinter.php index 1c8cdbc8..2ff67213 100644 --- a/src/Paraunit/Printer/FinalPrinter.php +++ b/src/Paraunit/Printer/FinalPrinter.php @@ -45,12 +45,12 @@ public static function getSubscribedEvents(): array ]; } - public function onEngineStart() + public function onEngineStart(): void { $this->stopWatch->start(self::STOPWATCH_NAME); } - public function onEngineEnd() + public function onEngineEnd(): void { $stopEvent = $this->stopWatch->stop(self::STOPWATCH_NAME); @@ -58,24 +58,24 @@ public function onEngineEnd() $this->printTestCounters(); } - public function onProcessTerminated() + public function onProcessTerminated(): void { ++$this->processCompleted; } - public function onProcessToBeRetried() + public function onProcessToBeRetried(): void { ++$this->processRetried; } - private function printExecutionTime(StopwatchEvent $stopEvent) + private function printExecutionTime(StopwatchEvent $stopEvent): void { $this->getOutput()->writeln(''); $this->getOutput()->writeln(''); $this->getOutput()->writeln('Execution time -- ' . gmdate('H:i:s', (int) ($stopEvent->getDuration() / 1000))); } - private function printTestCounters() + private function printTestCounters(): void { $testsCount = 0; foreach ($this->testResultList->getTestResultContainers() as $container) { diff --git a/src/Paraunit/Printer/ProcessPrinter.php b/src/Paraunit/Printer/ProcessPrinter.php index e29d432a..cfd78bc5 100644 --- a/src/Paraunit/Printer/ProcessPrinter.php +++ b/src/Paraunit/Printer/ProcessPrinter.php @@ -48,7 +48,7 @@ public static function getSubscribedEvents(): array /** * @throws \BadMethodCallException */ - public function onProcessCompleted(ProcessEvent $processEvent) + public function onProcessCompleted(ProcessEvent $processEvent): void { $process = $processEvent->getProcess(); @@ -57,7 +57,7 @@ public function onProcessCompleted(ProcessEvent $processEvent) } } - public function onEngineEnd() + public function onEngineEnd(): void { while (! $this->isRowFull()) { $this->output->write(' '); @@ -67,7 +67,7 @@ public function onEngineEnd() $this->printCounter(); } - private function printFormattedWithCounter(PrintableTestResultInterface $testResult) + private function printFormattedWithCounter(PrintableTestResultInterface $testResult): void { if ($this->isRowFull()) { $this->printCounter(); @@ -81,7 +81,7 @@ private function printFormattedWithCounter(PrintableTestResultInterface $testRes ); } - private function printCounter() + private function printCounter(): void { $this->output->writeln(sprintf('%6d', $this->counter)); $this->singleRowCounter = 0; diff --git a/src/Paraunit/Printer/SharkPrinter.php b/src/Paraunit/Printer/SharkPrinter.php index 448d17c8..d6ecedc8 100644 --- a/src/Paraunit/Printer/SharkPrinter.php +++ b/src/Paraunit/Printer/SharkPrinter.php @@ -28,7 +28,7 @@ public static function getSubscribedEvents(): array ]; } - public function onEngineBeforeStart() + public function onEngineBeforeStart(): void { $output = $this->getOutput(); diff --git a/src/Paraunit/Printer/SingleResultFormatter.php b/src/Paraunit/Printer/SingleResultFormatter.php index b9b48453..bbd8e00d 100644 --- a/src/Paraunit/Printer/SingleResultFormatter.php +++ b/src/Paraunit/Printer/SingleResultFormatter.php @@ -39,7 +39,7 @@ public function formatSingleResult(PrintableTestResultInterface $singleResult): return sprintf('<%s>%s', $tag, $resultSymbol, $tag); } - private function addToMap(TestResultWithSymbolFormat $format) + private function addToMap(TestResultWithSymbolFormat $format): void { $this->tagMap[$format->getTestResultSymbol()] = $format->getTag(); } diff --git a/src/Paraunit/Process/AbstractParaunitProcess.php b/src/Paraunit/Process/AbstractParaunitProcess.php index 92274a71..cc497b8b 100644 --- a/src/Paraunit/Process/AbstractParaunitProcess.php +++ b/src/Paraunit/Process/AbstractParaunitProcess.php @@ -48,10 +48,7 @@ abstract public function isTerminated(): bool; abstract public function getCommandLine(): string; - /** - * @return int|null - */ - abstract public function getExitCode(); + abstract public function getExitCode(): ?int; abstract public function start(int $pipelineNumber); @@ -65,12 +62,12 @@ public function getRetryCount(): int return $this->retryCount; } - public function increaseRetryCount() + public function increaseRetryCount(): void { ++$this->retryCount; } - public function markAsToBeRetried() + public function markAsToBeRetried(): void { $this->reset(); $this->increaseRetryCount(); @@ -82,7 +79,7 @@ public function isToBeRetried(): bool return $this->shouldBeRetried; } - public function reset() + public function reset(): void { $this->shouldBeRetried = false; $this->testResults = []; @@ -93,15 +90,12 @@ public function getFilename(): string return $this->filename; } - /** - * @return string|null - */ - public function getTestClassName() + public function getTestClassName(): ?string { return $this->testClassName; } - public function setTestClassName(string $testClassName) + public function setTestClassName(string $testClassName): void { $this->testClassName = $testClassName; } @@ -114,7 +108,7 @@ public function getTestResults(): array return $this->testResults; } - public function addTestResult(PrintableTestResultInterface $testResult) + public function addTestResult(PrintableTestResultInterface $testResult): void { $this->testResults[] = $testResult; $this->waitingForTestResult = false; @@ -130,7 +124,7 @@ public function isWaitingForTestResult(): bool return $this->waitingForTestResult; } - public function setWaitingForTestResult(bool $waitingForTestResult) + public function setWaitingForTestResult(bool $waitingForTestResult): void { $this->waitingForTestResult = $waitingForTestResult; } diff --git a/src/Paraunit/Process/ProcessBuilderFactory.php b/src/Paraunit/Process/ProcessBuilderFactory.php deleted file mode 100644 index f5b7a668..00000000 --- a/src/Paraunit/Process/ProcessBuilderFactory.php +++ /dev/null @@ -1,51 +0,0 @@ -cliCommand = $cliCommand; - $this->builderPrototype = new ProcessBuilder(); - - $this->builderPrototype->addEnvironmentVariables([ - EnvVariables::LOG_DIR => $tempFilenameFactory->getPathForLog(), - ]); - - foreach ($this->cliCommand->getExecutable() as $item) { - $this->builderPrototype->add($item); - } - - foreach ($this->cliCommand->getOptions($phpunitConfig) as $option) { - $this->builderPrototype->add($option); - } - } - - public function create(string $testFilePath): AbstractParaunitProcess - { - $builder = clone $this->builderPrototype; - $builder->add($testFilePath); - foreach ($this->cliCommand->getSpecificOptions($testFilePath) as $specificOption) { - $builder->add($specificOption); - } - - return new SymfonyProcessWrapper($builder->getProcess(), $testFilePath); - } -} diff --git a/src/Paraunit/Process/ProcessFactory.php b/src/Paraunit/Process/ProcessFactory.php index f45f516e..639cb287 100644 --- a/src/Paraunit/Process/ProcessFactory.php +++ b/src/Paraunit/Process/ProcessFactory.php @@ -40,10 +40,7 @@ public function create(string $testFilePath): AbstractParaunitProcess $this->environmentVariables ); - if (method_exists($process, 'inheritEnvironmentVariables')) { - // method added in 3.0 - $process->inheritEnvironmentVariables(); - } + $process->inheritEnvironmentVariables(); return new SymfonyProcessWrapper($process, $testFilePath); } diff --git a/src/Paraunit/Process/SymfonyProcessWrapper.php b/src/Paraunit/Process/SymfonyProcessWrapper.php index 00b4577f..98ad3323 100644 --- a/src/Paraunit/Process/SymfonyProcessWrapper.php +++ b/src/Paraunit/Process/SymfonyProcessWrapper.php @@ -50,10 +50,8 @@ public function getOutput(): string /** * @throws \Symfony\Component\Process\Exception\RuntimeException - * - * @return int|null */ - public function getExitCode() + public function getExitCode(): ?int { return $this->process->getExitCode(); } diff --git a/src/Paraunit/Proxy/Coverage/FakeDriver.php b/src/Paraunit/Proxy/Coverage/FakeDriver.php index a86ad7e0..f5ef3a92 100644 --- a/src/Paraunit/Proxy/Coverage/FakeDriver.php +++ b/src/Paraunit/Proxy/Coverage/FakeDriver.php @@ -4,33 +4,17 @@ namespace Paraunit\Proxy\Coverage; -use PHPUnit\Runner\Version; use SebastianBergmann\CodeCoverage\Driver\Driver; -if (version_compare(Version::id(), '7.0.0', '<')) { - class FakeDriver implements Driver +class FakeDriver implements Driver +{ + public function start(bool $determineUnusedAndDead = true): void { - public function start($determineUnusedAndDead = true) - { - throw new \RuntimeException('This is a fake implementation, it shouldn\'t be used!'); - } - - public function stop() - { - throw new \RuntimeException('This is a fake implementation, it shouldn\'t be used!'); - } + throw new \RuntimeException('This is a fake implementation, it shouldn\'t be used!'); } -} else { - class FakeDriver implements Driver - { - public function start(bool $determineUnusedAndDead = true): void - { - throw new \RuntimeException('This is a fake implementation, it shouldn\'t be used!'); - } - public function stop(): array - { - throw new \RuntimeException('This is a fake implementation, it shouldn\'t be used!'); - } + public function stop(): array + { + throw new \RuntimeException('This is a fake implementation, it shouldn\'t be used!'); } } diff --git a/src/Paraunit/Runner/PipelineCollection.php b/src/Paraunit/Runner/PipelineCollection.php index 27933927..9fe8fbd1 100644 --- a/src/Paraunit/Runner/PipelineCollection.php +++ b/src/Paraunit/Runner/PipelineCollection.php @@ -58,7 +58,7 @@ public function isEmpty(): bool return true; } - public function triggerProcessTermination() + public function triggerProcessTermination(): void { foreach ($this->pipelines as $pipeline) { $pipeline->triggerTermination(); diff --git a/src/Paraunit/Runner/Runner.php b/src/Paraunit/Runner/Runner.php index 6b88daca..93ad62c5 100644 --- a/src/Paraunit/Runner/Runner.php +++ b/src/Paraunit/Runner/Runner.php @@ -76,19 +76,19 @@ public function run(): int return $this->exitCode; } - public function onProcessParsingCompleted(ProcessEvent $processEvent) + public function onProcessParsingCompleted(ProcessEvent $processEvent): void { if ($processEvent->getProcess()->getExitCode() !== 0) { $this->exitCode = 10; } } - public function onProcessToBeRetried(ProcessEvent $processEvent) + public function onProcessToBeRetried(ProcessEvent $processEvent): void { $this->queuedProcesses->enqueue($processEvent->getProcess()); } - private function createProcessQueue() + private function createProcessQueue(): void { foreach ($this->filter->filterTestFiles() as $file) { $this->queuedProcesses->enqueue( @@ -97,7 +97,7 @@ private function createProcessQueue() } } - public function pushToPipeline() + public function pushToPipeline(): void { while (! $this->queuedProcesses->isEmpty() && $this->pipelineCollection->hasEmptySlots()) { $this->pipelineCollection->push($this->queuedProcesses->dequeue()); diff --git a/src/Paraunit/TestResult/Interfaces/PrintableTestResultInterface.php b/src/Paraunit/TestResult/Interfaces/PrintableTestResultInterface.php index b5012083..d22835e0 100644 --- a/src/Paraunit/TestResult/Interfaces/PrintableTestResultInterface.php +++ b/src/Paraunit/TestResult/Interfaces/PrintableTestResultInterface.php @@ -10,5 +10,5 @@ interface PrintableTestResultInterface extends TestResultInterface { public function getTestResultFormat(): TestResultFormat; - public function setTestResultFormat(TestResultFormat $testResultFormat); + public function setTestResultFormat(TestResultFormat $testResultFormat): void; } diff --git a/src/Paraunit/TestResult/Interfaces/TestResultHandlerInterface.php b/src/Paraunit/TestResult/Interfaces/TestResultHandlerInterface.php index 90f8d9f5..1163b90c 100644 --- a/src/Paraunit/TestResult/Interfaces/TestResultHandlerInterface.php +++ b/src/Paraunit/TestResult/Interfaces/TestResultHandlerInterface.php @@ -8,7 +8,7 @@ interface TestResultHandlerInterface { - public function handleTestResult(AbstractParaunitProcess $process, TestResultInterface $testResult); + public function handleTestResult(AbstractParaunitProcess $process, TestResultInterface $testResult): void; - public function addProcessToFilenames(AbstractParaunitProcess $process); + public function addProcessToFilenames(AbstractParaunitProcess $process): void; } diff --git a/src/Paraunit/TestResult/MuteTestResult.php b/src/Paraunit/TestResult/MuteTestResult.php index c1a2dfa2..b06a7681 100644 --- a/src/Paraunit/TestResult/MuteTestResult.php +++ b/src/Paraunit/TestResult/MuteTestResult.php @@ -16,7 +16,7 @@ public function __construct() $this->testResultFormat = new TestResultFormat('null', ''); } - public function setTestResultFormat(TestResultFormat $testResultFormat) + public function setTestResultFormat(TestResultFormat $testResultFormat): void { $this->testResultFormat = $testResultFormat; } diff --git a/src/Paraunit/TestResult/TestResultContainer.php b/src/Paraunit/TestResult/TestResultContainer.php index 3aa52f3d..38475930 100644 --- a/src/Paraunit/TestResult/TestResultContainer.php +++ b/src/Paraunit/TestResult/TestResultContainer.php @@ -28,7 +28,7 @@ public function __construct(TestResultFormat $testResultFormat) $this->testResults = []; } - public function handleTestResult(AbstractParaunitProcess $process, TestResultInterface $testResult) + public function handleTestResult(AbstractParaunitProcess $process, TestResultInterface $testResult): void { $this->addProcessToFilenames($process); @@ -44,7 +44,7 @@ public function handleTestResult(AbstractParaunitProcess $process, TestResultInt } } - public function addProcessToFilenames(AbstractParaunitProcess $process) + public function addProcessToFilenames(AbstractParaunitProcess $process): void { // trick for unique $this->filenames[$process->getUniqueId()] = $process->getTestClassName() ?: $process->getFilename(); diff --git a/src/Paraunit/TestResult/TestResultList.php b/src/Paraunit/TestResult/TestResultList.php index 2c964339..73f5e7f6 100644 --- a/src/Paraunit/TestResult/TestResultList.php +++ b/src/Paraunit/TestResult/TestResultList.php @@ -14,7 +14,7 @@ public function __construct() $this->testResultContainers = []; } - public function addContainer(TestResultContainer $container) + public function addContainer(TestResultContainer $container): void { $this->testResultContainers[] = $container; } diff --git a/src/Paraunit/TestResult/TestResultWithAbnormalTermination.php b/src/Paraunit/TestResult/TestResultWithAbnormalTermination.php index 84f6f15f..133a0237 100644 --- a/src/Paraunit/TestResult/TestResultWithAbnormalTermination.php +++ b/src/Paraunit/TestResult/TestResultWithAbnormalTermination.php @@ -19,7 +19,7 @@ public function getTestOutput(): string return $this->testOutput; } - public function setTestOutput(string $testOutput) + public function setTestOutput(string $testOutput): void { $this->testOutput = $testOutput; } diff --git a/tests/Stub/StubbedParaunitProcess.php b/tests/Stub/StubbedParaunitProcess.php index e30f5c13..dc97b2d9 100644 --- a/tests/Stub/StubbedParaunitProcess.php +++ b/tests/Stub/StubbedParaunitProcess.php @@ -77,7 +77,7 @@ public function start(int $pipeline) $this->reset(); } - public function getExitCode(): int + public function getExitCode(): ?int { return $this->exitCode; } diff --git a/tests/Unit/Process/ProcessBuilderFactoryTest.php b/tests/Unit/Process/ProcessBuilderFactoryTest.php deleted file mode 100644 index e4602bfe..00000000 --- a/tests/Unit/Process/ProcessBuilderFactoryTest.php +++ /dev/null @@ -1,71 +0,0 @@ -markTestSkipped('This test is legacy, will not work under Symfony 4'); - } - - parent::setUp(); // TODO: Change the autogenerated stub - } - - /** - * @group legacy - * @expectedDeprecation The Symfony\Component\Process\ProcessBuilder class is deprecated since version 3.4 and will be removed in 4.0. Use the Process class instead - */ - public function testCreateProcess() - { - $phpUnitConfig = $this->prophesize(PHPUnitConfig::class); - $cliCommand = $this->prophesize(CommandLine::class); - $cliCommand->getExecutable()->willReturn(['sapi', 'executable']); - $cliCommand - ->getOptions($phpUnitConfig->reveal()) - ->shouldBeCalled() - ->willReturn(['--configuration=config.xml']); - $cliCommand - ->getSpecificOptions('TestTest.php') - ->shouldBeCalled() - ->willReturn(['--specific=value-for-TestTest.php']); - $cliCommand - ->getSpecificOptions('TestTest2.php') - ->shouldBeCalled() - ->willReturn(['--specific=value-for-TestTest2.php']); - - $tempFilenameFactory = $this->prophesize(TempFilenameFactory::class); - $tempFilenameFactory->getPathForLog() - ->willReturn('/path/for/log/'); - - $factory = new ProcessBuilderFactory( - $cliCommand->reveal(), - $phpUnitConfig->reveal(), - $tempFilenameFactory->reveal() - ); - - $processBuilder = $factory->create('TestTest.php'); - - $this->assertInstanceOf(AbstractParaunitProcess::class, $processBuilder); - $commandLine = $processBuilder->getCommandLine(); - $this->assertContains('TestTest.php', $commandLine); - $this->assertContains('--specific=value-for-TestTest.php', $commandLine); - - $processBuilder = $factory->create('TestTest2.php'); - - $this->assertInstanceOf(AbstractParaunitProcess::class, $processBuilder); - $commandLine = $processBuilder->getCommandLine(); - $this->assertContains('TestTest2.php', $commandLine); - $this->assertContains('--specific=value-for-TestTest2.php', $commandLine); - } -} diff --git a/tests/Unit/Process/ProcessFactoryTest.php b/tests/Unit/Process/ProcessFactoryTest.php index 2484afae..f7e0c119 100644 --- a/tests/Unit/Process/ProcessFactoryTest.php +++ b/tests/Unit/Process/ProcessFactoryTest.php @@ -9,21 +9,10 @@ use Paraunit\Process\AbstractParaunitProcess; use Paraunit\Process\CommandLine; use Paraunit\Process\ProcessFactory; -use Symfony\Component\Process\Process; use Tests\BaseUnitTestCase; class ProcessFactoryTest extends BaseUnitTestCase { - protected function setup(): void - { - $process = new Process(['cmd as array']); - if (\is_array($process->getCommandLine())) { - $this->markTestSkipped('CommandLine not parsed, we have symfony/process < 3.3'); - } - - parent::setUp(); - } - public function testCreateProcess() { $phpUnitConfig = $this->prophesize(PHPUnitConfig::class);