diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dd094a11..44dc84f3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ CHANGELOG ========= -1.0.x ------ +1.0.2 (2021-05-28) +------------------ Bug fix: diff --git a/lib/Benchmark/Runner.php b/lib/Benchmark/Runner.php index 669b21123..2cc75695a 100644 --- a/lib/Benchmark/Runner.php +++ b/lib/Benchmark/Runner.php @@ -43,7 +43,7 @@ final class Runner const DEFAULT_ASSERTER = 'comparator'; /** - * @var ConfigurableRegistry + * @var ConfigurableRegistry */ private $executorRegistry; @@ -138,12 +138,12 @@ private function runBenchmark( ): void { // determine the executor $executorConfig = $this->executorRegistry->getConfig($config->getExecutor()); - /** @var BenchmarkExecutorInterface $executor */ - $executor = $this->executorRegistry->getService( + $benchmarkExecutor = $this->executorRegistry->getService( $benchmarkMetadata->getExecutor() ? $benchmarkMetadata->getExecutor()->getName() : $executorConfig['executor'] ); + $executor = $benchmarkExecutor; - $this->executeBeforeMethods($benchmarkMetadata, $executor); + $this->executeBeforeMethods($benchmarkMetadata, $benchmarkExecutor); $subjectMetadatas = array_filter($benchmarkMetadata->getSubjects(), function ($subjectMetadata) { if ($subjectMetadata->getSkip()) { @@ -178,8 +178,6 @@ private function runBenchmark( $executorConfig = $this->executorRegistry->getConfig($config->getExecutor()); if ($executorMetadata = $subjectMetadata->getExecutor()) { - /** @var BenchmarkExecutorInterface $executor */ - $executor = $this->executorRegistry->getService($executorMetadata->getName()); $executorConfig = $this->executorRegistry->getConfig($executorMetadata->getRegistryConfig()); } $resolvedExecutor = ResolvedExecutor::fromNameAndConfig($executorConfig['executor'], $executorConfig); @@ -193,12 +191,13 @@ private function runBenchmark( $subjectMetadata = $subjectMetadatas[$index]; $this->logger->subjectStart($subject); + $executor = $this->executorRegistry->getService($subject->getExecutor()->getName()); $this->runSubject($executor, $config, $subject, $subjectMetadata); $this->logger->subjectEnd($subject); } $this->logger->benchmarkEnd($benchmark); - $this->executeAfterMethods($benchmarkMetadata, $executor); + $this->executeAfterMethods($benchmarkMetadata, $benchmarkExecutor); } private function executeBeforeMethods(BenchmarkMetadata $benchmarkMetadata, BenchmarkExecutorInterface $executor): void diff --git a/lib/PhpBench.php b/lib/PhpBench.php index 73b8b5639..a1ad59054 100644 --- a/lib/PhpBench.php +++ b/lib/PhpBench.php @@ -107,6 +107,10 @@ private static function loadConfig(InputInterface $input, string $cwd): array $configOverride[ConsoleExtension::PARAM_ANSI] = false; } + if ($input->hasParameterOption(['--ansi'])) { + $configOverride[ConsoleExtension::PARAM_ANSI] = true; + } + if ($value = $input->getParameterOption(['--extension'])) { $extensions[] = $value; } diff --git a/tests/Unit/Benchmark/RunnerTest.php b/tests/Unit/Benchmark/RunnerTest.php index e253223a9..c36a99097 100644 --- a/tests/Unit/Benchmark/RunnerTest.php +++ b/tests/Unit/Benchmark/RunnerTest.php @@ -18,6 +18,7 @@ use PhpBench\Assertion\AssertionProcessor; use PhpBench\Benchmark\Exception\RetryLimitReachedException; use PhpBench\Benchmark\Metadata\BenchmarkMetadata; +use PhpBench\Benchmark\Metadata\ExecutorMetadata; use PhpBench\Benchmark\Metadata\SubjectMetadata; use PhpBench\Benchmark\Runner; use PhpBench\Benchmark\RunnerConfig; @@ -336,10 +337,7 @@ public function testRetryThresholdMet(): void $this->addToAssertionCount(1); // no exception = retry limit not exceeded } - /** - * It should call the before and after class methods. - */ - public function testBeforeAndAfterClass(): void + public function testCallBeforeAndAfterClass(): void { TestUtil::configureBenchmarkMetadata($this->benchmark, [ 'beforeClassMethods' => ['afterClass'], @@ -354,6 +352,60 @@ public function testBeforeAndAfterClass(): void self::assertTrue($this->executor->hasMethodBeenExecuted('beforeClass')); } + public function testCallBeforeAndAfterClassWithBenchmarkExecutorWhenCustomSubjectExecutorUsed(): void + { + TestUtil::configureBenchmarkMetadata($this->benchmark, [ + 'beforeClassMethods' => ['beforeClass'], + 'afterClassMethods' => ['afterClass'], + ]); + + $subject = new SubjectMetadata($this->benchmark->reveal(), 'name'); + $subject->setExecutor(new ExecutorMetadata('debug', [])); + $this->benchmark->getSubjects()->willReturn([ + $subject + ]); + $subjectTestExecutor = new TestExecutor(); + $this->executorRegistry->getService('debug')->willReturn($subjectTestExecutor); + $this->executorRegistry->getConfig(['executor'=> 'debug'])->willReturn($this->resolveExecutorConfig([ + 'executor' => 'debug', + ])); + + $this->runner->run([ $this->benchmark->reveal() ], RunnerConfig::create()); + self::assertFalse($this->executor->hasHealthBeenChecked()); + self::assertTrue($this->executor->hasMethodBeenExecuted('beforeClass'), 'before'); + self::assertTrue($this->executor->hasMethodBeenExecuted('afterClass'), 'after'); + } + + public function testRunSubjectsWithDifferentExecutors(): void + { + TestUtil::configureBenchmarkMetadata($this->benchmark, []); + + $subject1 = new SubjectMetadata($this->benchmark->reveal(), 'name'); + $subject1->setExecutor(new ExecutorMetadata('executor_1', [])); + $subject2 = new SubjectMetadata($this->benchmark->reveal(), 'name'); + $subject2->setExecutor(new ExecutorMetadata('executor_2', [])); + $this->benchmark->getSubjects()->willReturn([ + $subject1, + $subject2, + ]); + + $executor1 = new TestExecutor(); + $executor2 = new TestExecutor(); + $this->executorRegistry->getService('executor_1')->willReturn($executor1); + $this->executorRegistry->getService('executor_2')->willReturn($executor2); + $this->executorRegistry->getConfig(['executor'=> 'executor_1'])->willReturn($this->resolveExecutorConfig([ + 'executor' => 'executor_1' + ])); + $this->executorRegistry->getConfig(['executor'=> 'executor_2'])->willReturn($this->resolveExecutorConfig([ + 'executor' => 'executor_2' + ])); + + $this->runner->run([ $this->benchmark->reveal() ], RunnerConfig::create()); + + self::assertEquals(1, $executor1->getExecutedContextCount()); + self::assertEquals(1, $executor2->getExecutedContextCount()); + } + /** * It should handle exceptions thrown by the executor. * It should handle nested exceptions. @@ -430,13 +482,18 @@ private function exampleResults(): ExecutionResults */ private function setUpExecutorConfig(array $config = []): void { - $this->executorConfig = new Config('remote', array_merge([ + $this->executorConfig = $this->resolveExecutorConfig($config); + $this->executorRegistry->getConfig($this->executorConfig['executor'])->willReturn( + $this->executorConfig + ); + } + + private function resolveExecutorConfig(array $config) + { + return new Config('remote', array_merge([ 'exception' => null, 'executor' => 'remote', 'results' => [TimeResult::fromArray(['net' => 1])] ], $config)); - $this->executorRegistry->getConfig('remote')->willReturn( - $this->executorConfig - ); } }