* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Behat\Behat\Output\Node\EventListener\Statistics; use Behat\Behat\Output\Statistics\HookStat; use Behat\Behat\Output\Statistics\Statistics; use Behat\Testwork\Call\CallResult; use Behat\Testwork\EventDispatcher\Event\AfterSetup; use Behat\Testwork\EventDispatcher\Event\AfterTested; use Behat\Testwork\Exception\ExceptionPresenter; use Behat\Testwork\Hook\Tester\Setup\HookedSetup; use Behat\Testwork\Hook\Tester\Setup\HookedTeardown; use Behat\Testwork\Output\Formatter; use Behat\Testwork\Output\Node\EventListener\EventListener; use Symfony\Component\EventDispatcher\Event; /** * Listens and records hook stats. * * @author Konstantin Kudryashov */ final class HookStatsListener implements EventListener { /** * @var Statistics */ private $statistics; /** * @var ExceptionPresenter */ private $exceptionPresenter; /** * Initializes listener. * * @param Statistics $statistics * @param ExceptionPresenter $exceptionPresenter */ public function __construct(Statistics $statistics, ExceptionPresenter $exceptionPresenter) { $this->statistics = $statistics; $this->exceptionPresenter = $exceptionPresenter; } /** * {@inheritdoc} */ public function listenEvent(Formatter $formatter, Event $event, $eventName) { $this->captureHookStatsOnEvent($event); } /** * Captures hook stats on hooked event. * * @param Event $event */ private function captureHookStatsOnEvent(Event $event) { if ($event instanceof AfterSetup && $event->getSetup() instanceof HookedSetup) { $this->captureBeforeHookStats($event->getSetup()); } if ($event instanceof AfterTested && $event->getTeardown() instanceof HookedTeardown) { $this->captureAfterHookStats($event->getTeardown()); } } /** * Captures before hook stats. * * @param HookedSetup $setup */ private function captureBeforeHookStats(HookedSetup $setup) { $hookCallResults = $setup->getHookCallResults(); foreach ($hookCallResults as $hookCallResult) { $this->captureHookStat($hookCallResult); } } /** * Captures before hook stats. * * @param HookedTeardown $teardown */ private function captureAfterHookStats(HookedTeardown $teardown) { $hookCallResults = $teardown->getHookCallResults(); foreach ($hookCallResults as $hookCallResult) { $this->captureHookStat($hookCallResult); } } /** * Captures hook call result. * * @param CallResult $hookCallResult */ private function captureHookStat(CallResult $hookCallResult) { $callee = $hookCallResult->getCall()->getCallee(); $hook = (string) $callee; $path = $callee->getPath(); $stdOut = $hookCallResult->getStdOut(); $error = $hookCallResult->getException() ? $this->exceptionPresenter->presentException($hookCallResult->getException()) : null; $stat = new HookStat($hook, $path, $error, $stdOut); $this->statistics->registerHookStat($stat); } }