/** * Method was finished. * * @param TestMeta $test * @param MethodEvent $event * @param int $status * @param \Exception $exception */ private function finish(TestMeta $test, MethodEvent $event, $status, \Exception $exception = null) { $event->setStatus($status); $event->setTime(floatval(microtime(true) - $this->started)); $event->setAsserts(Assert::getAssertsCount() - $this->asserts); $this->asserts = Assert::getAssertsCount(); if ($status === MethodEvent::METHOD_OK) { $test->setStatus(TestMeta::TEST_DONE); $this->dispatcher->dispatch(EventStorage::EV_METHOD_DONE, clone $event); $this->precondition->dispatch(EventStorage::EV_METHOD_DONE, clone $event); } else { $event->parseException($exception); $context = ['pid' => getmypid(), 'method' => $event->getMethod(), 'exception' => get_class($exception), 'message' => $exception->getMessage()]; /** @var LoggerInterface $logger */ $logger = $this->container->get('logger'); switch ($status) { case MethodEvent::METHOD_SKIPPED: $test->setStatus(TestMeta::TEST_SKIPPED); $event->setTime(0); $logger->debug('The test was skipped.', $context); $this->dispatcher->dispatch(EventStorage::EV_METHOD_SKIPPED, clone $event); $this->precondition->dispatch(EventStorage::EV_METHOD_SKIPPED, clone $event); break; case MethodEvent::METHOD_FAILED: $test->setStatus(TestMeta::TEST_FAILED); $logger->debug('Assert fail.', $context); $this->dispatcher->dispatch(EventStorage::EV_METHOD_FAILED, clone $event); $this->precondition->dispatch(EventStorage::EV_METHOD_FAILED, clone $event); break; case MethodEvent::METHOD_INCOMPLETE: $test->setStatus(TestMeta::TEST_INCOMPLETE); $logger->debug('Test incomplete.', $context); $this->dispatcher->dispatch(EventStorage::EV_METHOD_INCOMPLETE, clone $event); $this->precondition->dispatch(EventStorage::EV_METHOD_INCOMPLETE, clone $event); break; default: $test->setStatus(TestMeta::TEST_FAILED); $logger->critical('Unexpected exception.', $context); $this->dispatcher->dispatch(EventStorage::EV_METHOD_FAILED, clone $event); $this->precondition->dispatch(EventStorage::EV_METHOD_FAILED, clone $event); } } }
/** * Check specified depends and run test if necessary. * * @param TestMeta $test * * @throws \LogicException If found infinitive depends loop */ public function resolveDependencies(TestMeta $test) { $depends = $test->getDependencies(); if (empty($depends)) { return; } $test->setStatus(TestMeta::TEST_MARKED); foreach ($depends as $depend) { $test = $this->getTestMethod($depend); if ($test->getStatus() === TestMeta::TEST_NEW) { if ($this->testMethod($test)) { /** @var SkipOnce $controller */ $controller = $this->controller->switchTo(ControllerParentInterface::CONTROLLER_SKIP_ONCE); $controller->setDepends(null); } } elseif ($test->getStatus() === TestMeta::TEST_MARKED) { throw new \LogicException(sprintf('Found infinitive loop in depends for test method "%s::%s()"', $this->reflectionClass->getName(), $depend)); } elseif ($test->getStatus() !== TestMeta::TEST_DONE) { /** @var SkipOnce $controller */ $controller = $this->controller->switchTo(ControllerParentInterface::CONTROLLER_SKIP_ONCE); $controller->setDepends(null); } } }
/** * Run test method. * * @param TestMeta $test Meta information about test method * @param MethodEvent $event Configured method event * @param array $dataSet Arguments for test * * @return int Status code */ public function test(TestMeta $test, MethodEvent $event, array $dataSet) { $test->setStatus(TestMeta::TEST_SKIPPED); $event->setStatus(MethodEvent::METHOD_SKIPPED); if ($this->depends !== null) { $event->addDepend($this->depends); } $this->dispatcher->dispatch(EventStorage::EV_METHOD_SKIPPED, clone $event); return 1; }