Navigation Menu

Skip to content

Commit

Permalink
[TwigBundle] Do not clean output buffering below initial level
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
igorw committed Nov 11, 2011
1 parent 6b0e7c8 commit ed1a6c2
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 1 deletion.
Expand Up @@ -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();
}

Expand Down
@@ -0,0 +1,91 @@
<?php

/*
* This file is part of the Symfony framework.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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;
}
}
13 changes: 13 additions & 0 deletions src/Symfony/Component/HttpKernel/Kernel.php
Expand Up @@ -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';
Expand Down Expand Up @@ -120,6 +121,8 @@ public function boot()
return;
}

$this->startObLevel = ob_get_level();

// init bundles
$this->initializeBundles();

Expand Down Expand Up @@ -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.
*
Expand Down
7 changes: 7 additions & 0 deletions src/Symfony/Component/HttpKernel/KernelInterface.php
Expand Up @@ -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.
*
Expand Down

0 comments on commit ed1a6c2

Please sign in to comment.