From ed1a6c2e453025ceff40193a1ac53aeb1f72647a Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Fri, 11 Nov 2011 12:03:15 +0100 Subject: [PATCH] [TwigBundle] Do not clean output buffering below initial level This resulted in issues with PHPUnit 3.6, which will buffer all output and clean them in the end. Since we cleaned their buffer, the subsequent clean would raise a warning. This is documented in issue 390 of the PHPUnit tracker. Closes #2531. --- .../Controller/ExceptionController.php | 3 +- .../Controller/ExceptionControllerTest.php | 91 +++++++++++++++++++ src/Symfony/Component/HttpKernel/Kernel.php | 13 +++ .../Component/HttpKernel/KernelInterface.php | 7 ++ 4 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Bundle/TwigBundle/Tests/Controller/ExceptionControllerTest.php diff --git a/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php b/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php index 05fbd74ca6..fa44c12a35 100644 --- a/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php +++ b/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php @@ -41,8 +41,9 @@ public function showAction(FlattenException $exception, DebugLoggerInterface $lo // some Windows configurations where ob_get_level() // never reaches 0 $count = 100; + $startObLevel = $this->container->get('kernel')->getStartObLevel(); $currentContent = ''; - while (ob_get_level() && --$count) { + while (ob_get_level() > $startObLevel && --$count) { $currentContent .= ob_get_clean(); } diff --git a/src/Symfony/Bundle/TwigBundle/Tests/Controller/ExceptionControllerTest.php b/src/Symfony/Bundle/TwigBundle/Tests/Controller/ExceptionControllerTest.php new file mode 100644 index 0000000000..a34c4f9fd4 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/Controller/ExceptionControllerTest.php @@ -0,0 +1,91 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Symfony\Bundle\TwigBundle\Tests\Controller; + +use Symfony\Bundle\TwigBundle\Tests\TestCase; + +use Symfony\Bundle\TwigBundle\Controller\ExceptionController; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Scope; +use Symfony\Component\DependencyInjection\Definition; + +class ExceptionControllerTest extends TestCase +{ + protected $controller; + protected $container; + protected $flatten; + protected $templating; + protected $kernel; + + protected function setUp() + { + parent::setUp(); + + $this->flatten = $this->getMock('Symfony\Component\HttpKernel\Exception\FlattenException'); + $this->flatten + ->expects($this->once()) + ->method('getStatusCode') + ->will($this->returnValue(404)); + $this->flatten + ->expects($this->once()) + ->method('getHeaders') + ->will($this->returnValue(array())); + $this->controller = new ExceptionController(); + $this->kernel = $this->getMock('Symfony\\Component\\HttpKernel\\KernelInterface'); + $this->templating = $this->getMockBuilder('Symfony\\Bundle\\TwigBundle\\TwigEngine') + ->disableOriginalConstructor() + ->getMock(); + $this->templating + ->expects($this->any()) + ->method('renderResponse') + ->will($this->returnValue($this->getMock('Symfony\Component\HttpFoundation\Response'))); + $this->container = $this->getContainer(); + } + + protected function tearDown() + { + parent::tearDown(); + + $this->controller = null; + $this->container = null; + $this->flatten = null; + $this->templating = null; + $this->kernel = null; + } + + public function testOnlyClearOwnOutputBuffers() + { + $this->container->enterScope('request'); + + $this->kernel + ->expects($this->once()) + ->method('getStartObLevel') + ->will($this->returnValue(1)); + + $this->controller->setContainer($this->container); + $this->controller->showAction($this->flatten); + } + + private function getContainer() + { + $container = new ContainerBuilder(); + $container->addScope(new Scope('request')); + $container->register('request', 'Symfony\\Component\\HttpFoundation\\Request')->setScope('request'); + $container->set('templating', $this->templating); + $container->setParameter('kernel.bundles', array()); + $container->setParameter('kernel.cache_dir', __DIR__); + $container->setParameter('kernel.root_dir', __DIR__); + $container->set('kernel', $this->kernel); + + return $container; + } +} diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index f20d73eac2..1d72672e46 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -55,6 +55,7 @@ abstract class Kernel implements KernelInterface protected $booted; protected $name; protected $startTime; + protected $startObLevel; protected $classes; const VERSION = '2.0.6-DEV'; @@ -120,6 +121,8 @@ public function boot() return; } + $this->startObLevel = ob_get_level(); + // init bundles $this->initializeBundles(); @@ -421,6 +424,16 @@ public function getStartTime() return $this->debug ? $this->startTime : -INF; } + /** + * Gets the ob_level at the start of the request + * + * @return integer The request start ob_level + */ + public function getStartObLevel() + { + return $this->startObLevel; + } + /** * Gets the cache directory. * diff --git a/src/Symfony/Component/HttpKernel/KernelInterface.php b/src/Symfony/Component/HttpKernel/KernelInterface.php index 4fb0abc0ad..888592a81d 100644 --- a/src/Symfony/Component/HttpKernel/KernelInterface.php +++ b/src/Symfony/Component/HttpKernel/KernelInterface.php @@ -179,6 +179,13 @@ function getContainer(); */ function getStartTime(); + /** + * Gets the ob_level at the start of the request + * + * @return integer The request start ob_level + */ + function getStartObLevel(); + /** * Gets the cache directory. *