4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\HttpKernel\Tests\Debug;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\EventDispatcher\EventDispatcher;
16 use Symfony\Component\HttpFoundation\Request;
17 use Symfony\Component\HttpFoundation\RequestStack;
18 use Symfony\Component\HttpFoundation\Response;
19 use Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher;
20 use Symfony\Component\HttpKernel\HttpKernel;
21 use Symfony\Component\Stopwatch\Stopwatch;
23 class TraceableEventDispatcherTest extends TestCase
25 public function testStopwatchSections()
27 $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch = new Stopwatch());
28 $kernel = $this->getHttpKernel($dispatcher, function () { return new Response(); });
29 $request = Request::create('/');
30 $response = $kernel->handle($request);
31 $kernel->terminate($request, $response);
33 $events = $stopwatch->getSectionEvents($response->headers->get('X-Debug-Token'));
34 $this->assertEquals(array(
38 'kernel.controller_arguments',
42 ), array_keys($events));
45 public function testStopwatchCheckControllerOnRequestEvent()
47 $stopwatch = $this->getMockBuilder('Symfony\Component\Stopwatch\Stopwatch')
48 ->setMethods(array('isStarted'))
50 $stopwatch->expects($this->once())
52 ->will($this->returnValue(false));
54 $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch);
56 $kernel = $this->getHttpKernel($dispatcher, function () { return new Response(); });
57 $request = Request::create('/');
58 $kernel->handle($request);
61 public function testStopwatchStopControllerOnRequestEvent()
63 $stopwatch = $this->getMockBuilder('Symfony\Component\Stopwatch\Stopwatch')
64 ->setMethods(array('isStarted', 'stop', 'stopSection'))
66 $stopwatch->expects($this->once())
68 ->will($this->returnValue(true));
69 $stopwatch->expects($this->once())
71 $stopwatch->expects($this->once())
72 ->method('stopSection');
74 $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch);
76 $kernel = $this->getHttpKernel($dispatcher, function () { return new Response(); });
77 $request = Request::create('/');
78 $kernel->handle($request);
81 public function testAddListenerNested()
85 $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch());
86 $dispatcher->addListener('my-event', function () use ($dispatcher, &$called1, &$called2) {
88 $dispatcher->addListener('my-event', function () use (&$called2) {
92 $dispatcher->dispatch('my-event');
93 $this->assertTrue($called1);
94 $this->assertFalse($called2);
95 $dispatcher->dispatch('my-event');
96 $this->assertTrue($called2);
99 public function testListenerCanRemoveItselfWhenExecuted()
101 $eventDispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch());
102 $listener1 = function () use ($eventDispatcher, &$listener1) {
103 $eventDispatcher->removeListener('foo', $listener1);
105 $eventDispatcher->addListener('foo', $listener1);
106 $eventDispatcher->addListener('foo', function () {});
107 $eventDispatcher->dispatch('foo');
109 $this->assertCount(1, $eventDispatcher->getListeners('foo'), 'expected listener1 to be removed');
112 protected function getHttpKernel($dispatcher, $controller)
114 $controllerResolver = $this->getMockBuilder('Symfony\Component\HttpKernel\Controller\ControllerResolverInterface')->getMock();
115 $controllerResolver->expects($this->once())->method('getController')->will($this->returnValue($controller));
116 $argumentResolver = $this->getMockBuilder('Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface')->getMock();
117 $argumentResolver->expects($this->once())->method('getArguments')->will($this->returnValue(array()));
119 return new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);