Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 69fd3fe

Browse files
committed
Fix and add tests for BootstrappingLoggerLoader
1 parent df0a82f commit 69fd3fe

File tree

5 files changed

+165
-14
lines changed

5 files changed

+165
-14
lines changed

src/Symfony/Component/Debug/Tests/ErrorHandlerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ public function testSettingLoggerWhenExceptionIsBuffered()
427427
$mockLogger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
428428
$mockLogger->expects($this->once())
429429
->method('log')
430-
->with(LogLevel::CRITICAL, 'Uncaught Exception: Foo message', array('exception' => $exception));
430+
->with(LogLevel::CRITICAL, 'Uncaught Exception: Foo message', array('exception' => $exception, BufferingLogger::BOOTSTRAPPING_FLAG => true));
431431

432432
$handler->setExceptionHandler(function () use ($handler, $mockLogger) {
433433
$handler->setDefaultLogger($mockLogger);

src/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public function lateCollect()
6969
$this->data['app_bootstrapping_logs'] = $boostrappingLogs['logs'];
7070
}
7171

72+
$this->data['logs'] = $this->sanitizeLogs($this->data['logs']);
7273
$this->data = $this->cloneVar($this->data);
7374
}
7475
}
@@ -198,9 +199,11 @@ private function computeErrorsCount()
198199
++$count['warning_count'];
199200
}
200201

201-
if (isset($log['context'][BufferingLogger::BOOTSTRAPPING_FLAG])) {
202-
++$count['app_bootstrapping_count'];
203-
$this->appBootstrappingLogs[] = $log;
202+
if (defined('Symfony\Component\Debug\BufferingLogger::BOOTSTRAPPING_FLAG')) {
203+
if (isset($log['context'][BufferingLogger::BOOTSTRAPPING_FLAG])) {
204+
++$count['app_bootstrapping_count'];
205+
$this->appBootstrappingLogs[] = $log;
206+
}
204207
}
205208

206209
if ($this->isSilencedOrDeprecationErrorLog($log)) {

src/Symfony/Component/HttpKernel/DataCollector/Util/BootstrappingLoggerLoader.php

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
*/
1717
class BootstrappingLoggerLoader
1818
{
19+
const NEW_BOOTSTRAPPING = true;
20+
const NO_NEW_BOOTSTRAPPING = false;
21+
1922
/**
2023
* @var string
2124
*/
@@ -34,7 +37,9 @@ public function __construct($cacheDir)
3437
*/
3538
private function getContainerHash()
3639
{
37-
return md5_file(current(glob($this->cacheDir.DIRECTORY_SEPARATOR.'*Container.php.meta')));
40+
$files = glob($this->cacheDir.DIRECTORY_SEPARATOR.'*Container.php.meta');
41+
42+
return (empty($files)) ? '' : md5_file(current($files));
3843
}
3944

4045
/**
@@ -45,35 +50,36 @@ public function isNewBootstrapping()
4550
$filename = $this->getBootstrappingLogsFilename();
4651

4752
if (!file_exists($filename)) {
48-
return true;
53+
return self::NEW_BOOTSTRAPPING;
4954
}
5055

5156
$rawContent = file_get_contents($filename);
5257
$appBoostrappingData = unserialize($rawContent);
5358

5459
if (!isset($appBoostrappingData['hash'])) {
55-
return true;
60+
return self::NEW_BOOTSTRAPPING;
5661
}
5762

5863
if ($appBoostrappingData['hash'] !== $this->getContainerHash()) {
59-
return true;
64+
return self::NEW_BOOTSTRAPPING;
6065
}
6166

62-
return false;
67+
return self::NO_NEW_BOOTSTRAPPING;
6368
}
6469

6570
/**
6671
* @return array
6772
*/
6873
public function loadBootsrappingLogs()
6974
{
70-
$filename = $this->getBootstrappingLogsFilename();
71-
72-
$rawContent = file_get_contents($filename);
75+
$rawContent = file_get_contents($this->getBootstrappingLogsFilename());
7376

7477
return unserialize($rawContent);
7578
}
7679

80+
/**
81+
* @param array $sanitizedLogs
82+
*/
7783
public function persistAppBootstrappingLogs($sanitizedLogs)
7884
{
7985
$appBootstrappingData = array(
@@ -88,7 +94,7 @@ public function persistAppBootstrappingLogs($sanitizedLogs)
8894
/**
8995
* @return string
9096
*/
91-
public function getBootstrappingLogsFilename()
97+
private function getBootstrappingLogsFilename()
9298
{
9399
return $this->cacheDir.DIRECTORY_SEPARATOR.'appBootstrapping.log';
94100
}

src/Symfony/Component/HttpKernel/Tests/DataCollector/LoggerDataCollectorTest.php

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public function testCollect($nb, $logs, $expectedLogs, $expectedDeprecationCount
2626
$logger->expects($this->once())->method('countErrors')->will($this->returnValue($nb));
2727
$logger->expects($this->exactly(2))->method('getLogs')->will($this->returnValue($logs));
2828

29-
$c = new LoggerDataCollector($logger);
29+
$c = new LoggerDataCollector($logger, $this->getCacheDir());
3030
$c->lateCollect();
3131

3232
$this->assertEquals('logger', $c->getName());
@@ -47,6 +47,8 @@ public function testCollect($nb, $logs, $expectedLogs, $expectedDeprecationCount
4747
if (isset($expectedPriorities)) {
4848
$this->assertSame($expectedPriorities, $c->getPriorities()->getValue(true));
4949
}
50+
51+
$this->clearDirectory(sys_get_temp_dir().'/http_cache');
5052
}
5153

5254
public function getCollectTestData()
@@ -102,4 +104,38 @@ public function getCollectTestData()
102104
1,
103105
);
104106
}
107+
108+
public static function clearDirectory($directory)
109+
{
110+
if (!is_dir($directory)) {
111+
return;
112+
}
113+
114+
$fp = opendir($directory);
115+
while (false !== $file = readdir($fp)) {
116+
if (!in_array($file, array('.', '..'))) {
117+
if (is_link($directory.'/'.$file)) {
118+
unlink($directory.'/'.$file);
119+
} elseif (is_dir($directory.'/'.$file)) {
120+
self::clearDirectory($directory.'/'.$file);
121+
rmdir($directory.'/'.$file);
122+
} else {
123+
unlink($directory.'/'.$file);
124+
}
125+
}
126+
}
127+
128+
closedir($fp);
129+
}
130+
131+
private function getCacheDir()
132+
{
133+
$cacheDir = sys_get_temp_dir().'/http_cache';
134+
135+
if (!is_dir($cacheDir) && false === @mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) {
136+
throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $cacheDir));
137+
}
138+
139+
return $cacheDir;
140+
}
105141
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\HttpKernel\Tests\DataCollector\Util;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\HttpKernel\DataCollector\Util\BootstrappingLoggerLoader;
16+
17+
class BootstrappingLoggerLoaderTest extends TestCase
18+
{
19+
/**
20+
* @var BootstrappingLoggerLoader
21+
*/
22+
private $bootstrappingLoggerLoaderFqcn;
23+
24+
protected function setUp()
25+
{
26+
$this->bootstrappingLoggerLoaderFqcn = BootstrappingLoggerLoader::class;
27+
}
28+
29+
protected function tearDown()
30+
{
31+
$this->removePersitedAppBootstrappingLogs();
32+
}
33+
34+
private function getCacheDir()
35+
{
36+
$cacheDir = sys_get_temp_dir().'/http_cache_bootstrapping';
37+
38+
if (!is_dir($cacheDir) && false === @mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) {
39+
throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $cacheDir));
40+
}
41+
42+
return $cacheDir;
43+
}
44+
45+
private function removePersitedAppBootstrappingLogs()
46+
{
47+
@unlink($this->getCacheDir().'/appBootstrapping.log');
48+
}
49+
50+
private function createProjectContainerFixture()
51+
{
52+
file_put_contents($this->getCacheDir().'/FixturesBootstrappingLogDebugProjectContainer.php.meta', 'a:37:{i:0;C:50:"Symfony\Component\Config\Resource\ComposerResource":1751:{a:2:{i:0;a:68:{s:4:"Core";s:6:"5.6.29";s:4:"date";s:6:"5.6.29";s:4:"ereg";b:0;s:6:"libxml";b:0;s:7:"openssl";b:0;s:4:"pcre";b:0;s:7:"sqlite3";s:7:"0.7-dev";s:4:"zlib";s:3:"2.0";s:6:"bcmath";b:0;s:3:"bz2";b:0;s:8:"calendar";b:0;s:5:"ctype";b:0;s:4:"curl";b:0;s:3:"dba";b:0;s:3:"dom";s:8:"20031129";s:4:"hash";s:3:"1.0";s:8:"fileinfo";s:5:"1.0.5";s:6:"filter";s:6:"0.11.0";s:3:"ftp";b:0;s:2:"gd";b:0;s:7:"gettext";b:0;s:3:"SPL";s:3:"0.2";s:5:"iconv";b:0;s:4:"json";s:5:"1.2.1";s:4:"ldap";b:0;s:8:"mbstring";b:0;s:7:"session";b:0;s:8:"standard";s:6:"5.6.29";s:7:"mysqlnd";s:79:"mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $";s:4:"odbc";s:3:"1.0";s:5:"pcntl";b:0;s:6:"mysqli";s:3:"0.1";s:3:"PDO";s:8:"1.0.4dev";s:9:"pdo_mysql";s:5:"1.0.2";s:8:"PDO_ODBC";s:5:"1.0.1";s:10:"pdo_sqlite";s:5:"1.0.1";s:4:"Phar";s:5:"2.0.2";s:5:"posix";b:0;s:8:"readline";s:6:"5.6.29";s:10:"Reflection";s:47:"$Id: 5f15287237d5f78d75b19c26915aa7bd83dee8b8 $";s:5:"mysql";s:3:"1.0";s:5:"shmop";b:0;s:9:"SimpleXML";s:3:"0.1";s:4:"soap";b:0;s:7:"sockets";b:0;s:4:"exif";s:51:"1.4 $Id: 8b0e34c10dc8a04b8e81d9d79985b2566141b03d $";s:7:"sysvmsg";b:0;s:7:"sysvsem";b:0;s:7:"sysvshm";b:0;s:9:"tokenizer";s:3:"0.1";s:4:"wddx";b:0;s:3:"xml";b:0;s:9:"xmlreader";s:3:"0.1";s:6:"xmlrpc";s:4:"0.51";s:9:"xmlwriter";s:3:"0.1";s:3:"xsl";s:3:"0.1";s:3:"zip";s:6:"1.12.5";s:4:"apcu";s:6:"4.0.11";s:8:"igbinary";s:5:"2.0.1";s:4:"intl";s:5:"1.1.0";s:6:"mcrypt";b:0;s:9:"memcached";s:5:"2.1.0";s:9:"pdo_pgsql";s:5:"1.0.2";s:5:"redis";s:5:"2.2.8";s:4:"ssh2";s:4:"0.12";s:5:"mhash";b:0;s:3:"apc";s:6:"4.0.11";s:6:"xdebug";s:5:"2.5.0";}i:1;a:2:{s:50:"/private/tmp/container/.phpunit/phpunit-5.7/vendor";i:1491257819;s:29:"/private/tmp/container/vendor";i:1491258091;}}}i:1;C:46:"Symfony\Component\Config\Resource\FileResource":87:{s:79:"/private/tmp/container/src/Symfony/Component/HttpKernel/TerminableInterface.php";}i:2;C:46:"Symfony\Component\Config\Resource\FileResource":87:{s:79:"/private/tmp/container/src/Symfony/Component/HttpKernel/HttpKernelInterface.php";}i:3;C:46:"Symfony\Component\Config\Resource\FileResource":83:{s:75:"/private/tmp/container/src/Symfony/Component/HttpKernel/KernelInterface.php";}i:4;C:46:"Symfony\Component\Config\Resource\FileResource":103:{s:95:"/private/tmp/container/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelWithoutBundles.php";}i:5;C:46:"Symfony\Component\Config\Resource\FileResource":74:{s:66:"/private/tmp/container/src/Symfony/Component/HttpKernel/Kernel.php";}i:6;C:46:"Symfony\Component\Config\Resource\FileResource":107:{s:99:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.php";}i:7;C:46:"Symfony\Component\Config\Resource\FileResource":110:{s:101:"/private/tmp/container/src/Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php";}i:8;C:57:"Symfony\Component\HttpKernel\Config\EnvParametersResource":57:{a:2:{s:6:"prefix";s:9:"SYMFONY__";s:9:"variables";a:0:{}}}i:9;C:46:"Symfony\Component\Config\Resource\FileResource":120:{s:111:"/private/tmp/container/src/Symfony/Component/HttpKernel/DependencyInjection/MergeExtensionConfigurationPass.php";}i:10;C:46:"Symfony\Component\Config\Resource\FileResource":118:{s:109:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php";}i:11;C:46:"Symfony\Component\Config\Resource\FileResource":102:{s:94:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ResolveClassPass.php";}i:12;C:46:"Symfony\Component\Config\Resource\FileResource":119:{s:110:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionInheritancePass.php";}i:13;C:46:"Symfony\Component\Config\Resource\FileResource":107:{s:99:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/AbstractRecursivePass.php";}i:14;C:46:"Symfony\Component\Config\Resource\FileResource":107:{s:99:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ExtensionCompilerPass.php";}i:15;C:46:"Symfony\Component\Config\Resource\FileResource":117:{s:108:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php";}i:16;C:46:"Symfony\Component\Config\Resource\FileResource":107:{s:99:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php";}i:17;C:46:"Symfony\Component\Config\Resource\FileResource":106:{s:98:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php";}i:18;C:46:"Symfony\Component\Config\Resource\FileResource":119:{s:110:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php";}i:19;C:46:"Symfony\Component\Config\Resource\FileResource":110:{s:101:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ResolveFactoryClassPass.php";}i:20;C:46:"Symfony\Component\Config\Resource\FileResource":107:{s:99:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/FactoryReturnTypePass.php";}i:21;C:46:"Symfony\Component\Config\Resource\FileResource":114:{s:105:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php";}i:22;C:46:"Symfony\Component\Config\Resource\FileResource":112:{s:103:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php";}i:23;C:46:"Symfony\Component\Config\Resource\FileResource":98:{s:90:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php";}i:24;C:46:"Symfony\Component\Config\Resource\FileResource":117:{s:108:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php";}i:25;C:46:"Symfony\Component\Config\Resource\FileResource":115:{s:106:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php";}i:26;C:46:"Symfony\Component\Config\Resource\FileResource":110:{s:101:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/RepeatablePassInterface.php";}i:27;C:46:"Symfony\Component\Config\Resource\FileResource":115:{s:106:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php";}i:28;C:46:"Symfony\Component\Config\Resource\FileResource":114:{s:105:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php";}i:29;C:46:"Symfony\Component\Config\Resource\FileResource":113:{s:104:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php";}i:30;C:46:"Symfony\Component\Config\Resource\FileResource":113:{s:104:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/CheckArgumentsValidityPass.php";}i:31;C:46:"Symfony\Component\Config\Resource\FileResource":111:{s:102:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.php";}i:32;C:46:"Symfony\Component\Config\Resource\FileResource":121:{s:112:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php";}i:33;C:46:"Symfony\Component\Config\Resource\FileResource":116:{s:107:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.php";}i:34;C:46:"Symfony\Component\Config\Resource\FileResource":98:{s:90:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php";}i:35;C:46:"Symfony\Component\Config\Resource\FileResource":131:{s:122:"/private/tmp/container/src/Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php";}i:36;C:56:"Symfony\Component\Config\Resource\ClassExistenceResource":34:{a:2:{i:0;s:9:"Container";i:1;i:0;}}}');
53+
}
54+
55+
private function getLogsFixtures()
56+
{
57+
return array(
58+
array(100, 'test', array('is_bootstraping' => true)),
59+
array(100, 'second test', array('is_bootstraping' => true)),
60+
);
61+
}
62+
63+
public function testIsNewBootstrapping()
64+
{
65+
$bootstrappingLoggerLoader = new $this->bootstrappingLoggerLoaderFqcn($this->getCacheDir());
66+
$this->assertTrue($bootstrappingLoggerLoader->isNewBootstrapping());
67+
68+
$this->createProjectContainerFixture();
69+
$this->assertFileExists($this->getCacheDir().'/FixturesBootstrappingLogDebugProjectContainer.php.meta');
70+
$this->assertTrue($bootstrappingLoggerLoader->isNewBootstrapping());
71+
72+
$bootstrappingLoggerLoader->persistAppBootstrappingLogs($this->getLogsFixtures());
73+
$this->assertFalse($bootstrappingLoggerLoader->isNewBootstrapping());
74+
75+
$this->removePersitedAppBootstrappingLogs();
76+
}
77+
78+
public function testPersistAppBootstrappingLogs()
79+
{
80+
$bootstrappingLoggerLoader = new $this->bootstrappingLoggerLoaderFqcn($this->getCacheDir());
81+
$bootstrappingLoggerLoader->persistAppBootstrappingLogs($this->getLogsFixtures());
82+
83+
$this->assertFileExists($this->getCacheDir().'/appBootstrapping.log');
84+
$this->assertEquals(md5_file($this->getCacheDir().'/appBootstrapping.log'), '4ffe252fb621c105f357e2a2c6c9b5c0');
85+
86+
$this->removePersitedAppBootstrappingLogs();
87+
}
88+
89+
public function testLoadBootsrappingLogs()
90+
{
91+
$bootstrappingLoggerLoader = new $this->bootstrappingLoggerLoaderFqcn($this->getCacheDir());
92+
$bootstrappingLoggerLoader->persistAppBootstrappingLogs($this->getLogsFixtures());
93+
94+
$data = $bootstrappingLoggerLoader->loadBootsrappingLogs();
95+
96+
$this->assertArrayHasKey('hash', $data);
97+
$this->assertArrayHasKey('app_bootstrapping', $data);
98+
$this->assertArrayHasKey('logs', $data);
99+
100+
$this->assertCount(2, $data['logs']);
101+
102+
$this->assertEquals(md5_file($this->getCacheDir().'/FixturesBootstrappingLogDebugProjectContainer.php.meta'), $data['hash']);
103+
104+
$this->removePersitedAppBootstrappingLogs();
105+
}
106+
}

0 commit comments

Comments
 (0)