TraceableEventDispatcherTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\HttpKernel\Tests\Debug;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\EventDispatcher\EventDispatcher;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
  17. use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
  18. use Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher;
  19. use Symfony\Component\HttpKernel\HttpKernel;
  20. use Symfony\Component\Stopwatch\Stopwatch;
  21. use Symfony\Contracts\EventDispatcher\Event;
  22. class TraceableEventDispatcherTest extends TestCase
  23. {
  24. public function testStopwatchSections()
  25. {
  26. $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch = new Stopwatch());
  27. $kernel = $this->getHttpKernel($dispatcher);
  28. $request = Request::create('/');
  29. $response = $kernel->handle($request);
  30. $kernel->terminate($request, $response);
  31. $events = $stopwatch->getSectionEvents($request->attributes->get('_stopwatch_token'));
  32. $this->assertEquals([
  33. '__section__',
  34. 'kernel.request',
  35. 'kernel.controller',
  36. 'kernel.controller_arguments',
  37. 'controller',
  38. 'kernel.response',
  39. 'kernel.terminate',
  40. ], array_keys($events));
  41. }
  42. public function testStopwatchCheckControllerOnRequestEvent()
  43. {
  44. $stopwatch = $this->getMockBuilder(Stopwatch::class)
  45. ->onlyMethods(['isStarted'])
  46. ->getMock();
  47. $stopwatch->expects($this->once())
  48. ->method('isStarted')
  49. ->willReturn(false);
  50. $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch);
  51. $kernel = $this->getHttpKernel($dispatcher);
  52. $request = Request::create('/');
  53. $kernel->handle($request);
  54. }
  55. public function testStopwatchStopControllerOnRequestEvent()
  56. {
  57. $stopwatch = $this->getMockBuilder(Stopwatch::class)
  58. ->onlyMethods(['isStarted', 'stop'])
  59. ->getMock();
  60. $stopwatch->expects($this->once())
  61. ->method('isStarted')
  62. ->willReturn(true);
  63. $stopwatch->expects($this->exactly(3))
  64. ->method('stop');
  65. $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch);
  66. $kernel = $this->getHttpKernel($dispatcher);
  67. $request = Request::create('/');
  68. $kernel->handle($request);
  69. }
  70. public function testAddListenerNested()
  71. {
  72. $called1 = false;
  73. $called2 = false;
  74. $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch());
  75. $dispatcher->addListener('my-event', function () use ($dispatcher, &$called1, &$called2) {
  76. $called1 = true;
  77. $dispatcher->addListener('my-event', function () use (&$called2) {
  78. $called2 = true;
  79. });
  80. });
  81. $dispatcher->dispatch(new Event(), 'my-event');
  82. $this->assertTrue($called1);
  83. $this->assertFalse($called2);
  84. $dispatcher->dispatch(new Event(), 'my-event');
  85. $this->assertTrue($called2);
  86. }
  87. public function testListenerCanRemoveItselfWhenExecuted()
  88. {
  89. $eventDispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch());
  90. $listener1 = function () use ($eventDispatcher, &$listener1) {
  91. $eventDispatcher->removeListener('foo', $listener1);
  92. };
  93. $eventDispatcher->addListener('foo', $listener1);
  94. $eventDispatcher->addListener('foo', function () {});
  95. $eventDispatcher->dispatch(new Event(), 'foo');
  96. $this->assertCount(1, $eventDispatcher->getListeners('foo'), 'expected listener1 to be removed');
  97. }
  98. protected function getHttpKernel($dispatcher)
  99. {
  100. $controllerResolver = $this->createMock(ControllerResolverInterface::class);
  101. $controllerResolver->expects($this->once())->method('getController')->willReturn(function () {
  102. return new Response();
  103. });
  104. $argumentResolver = $this->createMock(ArgumentResolverInterface::class);
  105. $argumentResolver->expects($this->once())->method('getArguments')->willReturn([]);
  106. return new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);
  107. }
  108. }