Skip to content

Commit e490d66

Browse files
Merge branch '2.7' into 2.8
* 2.7: [Bridge\PhpUnit] Exit as late as possible Update Repository Symlink Helper Document explicitly that dotfiles and vcs files are ignored by default do not mock the container builder in tests
2 parents 641a46b + ec9a109 commit e490d66

File tree

19 files changed

+432
-671
lines changed

19 files changed

+432
-671
lines changed

link

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ if (!is_dir("$argv[1]/vendor/symfony")) {
3737
$sfPackages = array('symfony/symfony' => __DIR__);
3838

3939
$filesystem = new Filesystem();
40-
foreach (glob(__DIR__.'/src/Symfony/{Bundle,Bridge,Component,Component/Security}/*', GLOB_BRACE | GLOB_ONLYDIR | GLOB_NOSORT) as $dir) {
40+
$braces = array('Bundle', 'Bridge', 'Component', 'Component/Security');
41+
$directories = call_user_func_array('array_merge', array_values(array_map(function ($part) {
42+
return glob(__DIR__.'/src/Symfony/'.$part.'/*', GLOB_ONLYDIR | GLOB_NOSORT);
43+
}, $braces)));
44+
45+
foreach ($directories as $dir) {
4146
if ($filesystem->exists($composer = "$dir/composer.json")) {
4247
$sfPackages[json_decode(file_get_contents($composer))->name] = $dir;
4348
}

src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -161,32 +161,53 @@ public static function register($mode = 0)
161161
return $b['count'] - $a['count'];
162162
};
163163

164-
foreach (array('unsilenced', 'remaining', 'legacy', 'other') as $group) {
165-
if ($deprecations[$group.'Count']) {
166-
echo "\n", $colorize(sprintf('%s deprecation notices (%d)', ucfirst($group), $deprecations[$group.'Count']), 'legacy' !== $group), "\n";
164+
$displayDeprecations = function ($deprecations) use ($colorize, $cmp) {
165+
foreach (array('unsilenced', 'remaining', 'legacy', 'other') as $group) {
166+
if ($deprecations[$group.'Count']) {
167+
echo "\n", $colorize(sprintf('%s deprecation notices (%d)', ucfirst($group), $deprecations[$group.'Count']), 'legacy' !== $group), "\n";
167168

168-
uasort($deprecations[$group], $cmp);
169+
uasort($deprecations[$group], $cmp);
169170

170-
foreach ($deprecations[$group] as $msg => $notices) {
171-
echo "\n ", $notices['count'], 'x: ', $msg, "\n";
171+
foreach ($deprecations[$group] as $msg => $notices) {
172+
echo "\n ", $notices['count'], 'x: ', $msg, "\n";
172173

173-
arsort($notices);
174+
arsort($notices);
174175

175-
foreach ($notices as $method => $count) {
176-
if ('count' !== $method) {
177-
echo ' ', $count, 'x in ', preg_replace('/(.*)\\\\(.*?::.*?)$/', '$2 from $1', $method), "\n";
176+
foreach ($notices as $method => $count) {
177+
if ('count' !== $method) {
178+
echo ' ', $count, 'x in ', preg_replace('/(.*)\\\\(.*?::.*?)$/', '$2 from $1', $method), "\n";
179+
}
178180
}
179181
}
180182
}
181183
}
182-
}
183-
if (!empty($notices)) {
184-
echo "\n";
185-
}
184+
if (!empty($notices)) {
185+
echo "\n";
186+
}
187+
};
186188

187-
if (DeprecationErrorHandler::MODE_WEAK !== $mode && $mode < $deprecations['unsilencedCount'] + $deprecations['remainingCount'] + $deprecations['otherCount']) {
188-
exit(1);
189+
$displayDeprecations($deprecations);
190+
191+
// store failing status
192+
$isFailing = DeprecationErrorHandler::MODE_WEAK !== $mode && $mode < $deprecations['unsilencedCount'] + $deprecations['remainingCount'] + $deprecations['otherCount'];
193+
194+
// reset deprecations array
195+
foreach ($deprecations as $group => $arrayOrInt) {
196+
$deprecations[$group] = is_int($arrayOrInt) ? 0 : array();
189197
}
198+
199+
register_shutdown_function(function () use (&$deprecations, $isFailing, $displayDeprecations, $mode) {
200+
foreach ($deprecations as $group => $arrayOrInt) {
201+
if (0 < (is_int($arrayOrInt) ? $arrayOrInt : count($arrayOrInt))) {
202+
echo "Shutdown-time deprecations:\n";
203+
break;
204+
}
205+
}
206+
$displayDeprecations($deprecations);
207+
if ($isFailing || DeprecationErrorHandler::MODE_WEAK !== $mode && $mode < $deprecations['unsilencedCount'] + $deprecations['remainingCount'] + $deprecations['otherCount']) {
208+
exit(1);
209+
}
210+
});
190211
});
191212
}
192213
}

src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/default.phpt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ $foo = new FooTestCase();
5959
$foo->testLegacyFoo();
6060
$foo->testNonLegacyBar();
6161

62+
register_shutdown_function(function () {
63+
exit('I get precedence over any exit statements inside the deprecation error handler.');
64+
});
65+
6266
?>
6367
--EXPECTF--
6468
Unsilenced deprecation notices (3)
@@ -80,3 +84,4 @@ Other deprecation notices (1)
8084

8185
1x: root deprecation
8286

87+
I get precedence over any exit statements inside the deprecation error handler.
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
--TEST--
2+
Test DeprecationErrorHandler in default mode
3+
--FILE--
4+
<?php
5+
6+
putenv('SYMFONY_DEPRECATIONS_HELPER');
7+
putenv('ANSICON');
8+
putenv('ConEmuANSI');
9+
putenv('TERM');
10+
11+
$vendor = __DIR__;
12+
while (!file_exists($vendor.'/vendor')) {
13+
$vendor = dirname($vendor);
14+
}
15+
define('PHPUNIT_COMPOSER_INSTALL', $vendor.'/vendor/autoload.php');
16+
require PHPUNIT_COMPOSER_INSTALL;
17+
require_once __DIR__.'/../../bootstrap.php';
18+
19+
@trigger_error('root deprecation', E_USER_DEPRECATED);
20+
21+
eval(<<<'EOPHP'
22+
namespace PHPUnit\Util;
23+
24+
class Test
25+
{
26+
public static function getGroups()
27+
{
28+
return array();
29+
}
30+
}
31+
EOPHP
32+
);
33+
34+
class PHPUnit_Util_Test
35+
{
36+
public static function getGroups()
37+
{
38+
return array();
39+
}
40+
}
41+
42+
class FooTestCase
43+
{
44+
public function testLegacyFoo()
45+
{
46+
@trigger_error('silenced foo deprecation', E_USER_DEPRECATED);
47+
trigger_error('unsilenced foo deprecation', E_USER_DEPRECATED);
48+
trigger_error('unsilenced foo deprecation', E_USER_DEPRECATED);
49+
}
50+
51+
public function testNonLegacyBar()
52+
{
53+
@trigger_error('silenced bar deprecation', E_USER_DEPRECATED);
54+
trigger_error('unsilenced bar deprecation', E_USER_DEPRECATED);
55+
}
56+
}
57+
58+
$foo = new FooTestCase();
59+
$foo->testLegacyFoo();
60+
$foo->testNonLegacyBar();
61+
62+
register_shutdown_function(function () {
63+
@trigger_error('root deprecation during shutdown', E_USER_DEPRECATED);
64+
});
65+
66+
?>
67+
--EXPECTF--
68+
Unsilenced deprecation notices (3)
69+
70+
2x: unsilenced foo deprecation
71+
2x in FooTestCase::testLegacyFoo
72+
73+
1x: unsilenced bar deprecation
74+
1x in FooTestCase::testNonLegacyBar
75+
76+
Remaining deprecation notices (1)
77+
78+
1x: silenced bar deprecation
79+
1x in FooTestCase::testNonLegacyBar
80+
81+
Legacy deprecation notices (1)
82+
83+
Other deprecation notices (1)
84+
85+
1x: root deprecation
86+
87+
Shutdown-time deprecations:
88+
89+
Other deprecation notices (1)
90+
91+
1x: root deprecation during shutdown

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddCacheWarmerPassTest.php

Lines changed: 21 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -12,80 +12,52 @@
1212
namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Compiler;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\DependencyInjection\ContainerBuilder;
1516
use Symfony\Component\DependencyInjection\Reference;
1617
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddCacheWarmerPass;
1718

1819
class AddCacheWarmerPassTest extends TestCase
1920
{
2021
public function testThatCacheWarmersAreProcessedInPriorityOrder()
2122
{
22-
$services = array(
23-
'my_cache_warmer_service1' => array(0 => array('priority' => 100)),
24-
'my_cache_warmer_service2' => array(0 => array('priority' => 200)),
25-
'my_cache_warmer_service3' => array(),
26-
);
27-
28-
$definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
29-
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('findTaggedServiceIds', 'getDefinition', 'hasDefinition'))->getMock();
23+
$container = new ContainerBuilder();
24+
$cacheWarmerDefinition = $container->register('cache_warmer')->addArgument(array());
25+
$container->register('my_cache_warmer_service1')->addTag('kernel.cache_warmer', array('priority' => 100));
26+
$container->register('my_cache_warmer_service2')->addTag('kernel.cache_warmer', array('priority' => 200));
27+
$container->register('my_cache_warmer_service3')->addTag('kernel.cache_warmer');
3028

31-
$container->expects($this->atLeastOnce())
32-
->method('findTaggedServiceIds')
33-
->will($this->returnValue($services));
34-
$container->expects($this->atLeastOnce())
35-
->method('getDefinition')
36-
->with('cache_warmer')
37-
->will($this->returnValue($definition));
38-
$container->expects($this->atLeastOnce())
39-
->method('hasDefinition')
40-
->with('cache_warmer')
41-
->will($this->returnValue(true));
29+
$addCacheWarmerPass = new AddCacheWarmerPass();
30+
$addCacheWarmerPass->process($container);
4231

43-
$definition->expects($this->once())
44-
->method('replaceArgument')
45-
->with(0, array(
32+
$this->assertEquals(
33+
array(
4634
new Reference('my_cache_warmer_service2'),
4735
new Reference('my_cache_warmer_service1'),
4836
new Reference('my_cache_warmer_service3'),
49-
));
50-
51-
$addCacheWarmerPass = new AddCacheWarmerPass();
52-
$addCacheWarmerPass->process($container);
37+
),
38+
$cacheWarmerDefinition->getArgument(0)
39+
);
5340
}
5441

5542
public function testThatCompilerPassIsIgnoredIfThereIsNoCacheWarmerDefinition()
5643
{
57-
$definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
58-
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition'))->getMock();
59-
60-
$container->expects($this->never())->method('findTaggedServiceIds');
61-
$container->expects($this->never())->method('getDefinition');
62-
$container->expects($this->atLeastOnce())
63-
->method('hasDefinition')
64-
->with('cache_warmer')
65-
->will($this->returnValue(false));
66-
$definition->expects($this->never())->method('replaceArgument');
44+
$container = new ContainerBuilder();
6745

6846
$addCacheWarmerPass = new AddCacheWarmerPass();
6947
$addCacheWarmerPass->process($container);
48+
49+
// we just check that the pass does not break if no cache warmer is registered
50+
$this->addToAssertionCount(1);
7051
}
7152

7253
public function testThatCacheWarmersMightBeNotDefined()
7354
{
74-
$definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
75-
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition'))->getMock();
76-
77-
$container->expects($this->atLeastOnce())
78-
->method('findTaggedServiceIds')
79-
->will($this->returnValue(array()));
80-
$container->expects($this->never())->method('getDefinition');
81-
$container->expects($this->atLeastOnce())
82-
->method('hasDefinition')
83-
->with('cache_warmer')
84-
->will($this->returnValue(true));
85-
86-
$definition->expects($this->never())->method('replaceArgument');
55+
$container = new ContainerBuilder();
56+
$cacheWarmerDefinition = $container->register('cache_warmer')->addArgument(array());
8757

8858
$addCacheWarmerPass = new AddCacheWarmerPass();
8959
$addCacheWarmerPass->process($container);
60+
61+
$this->assertSame(array(), $cacheWarmerDefinition->getArgument(0));
9062
}
9163
}

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConstraintValidatorsPassTest.php

Lines changed: 20 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -13,72 +13,40 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConstraintValidatorsPass;
16+
use Symfony\Component\DependencyInjection\ContainerBuilder;
17+
use Symfony\Component\DependencyInjection\Reference;
1618

1719
class AddConstraintValidatorsPassTest extends TestCase
1820
{
1921
public function testThatConstraintValidatorServicesAreProcessed()
2022
{
21-
$services = array(
22-
'my_constraint_validator_service1' => array(0 => array('alias' => 'my_constraint_validator_alias1')),
23-
'my_constraint_validator_service2' => array(),
24-
);
25-
26-
$validatorFactoryDefinition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
27-
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('findTaggedServiceIds', 'getDefinition', 'hasDefinition'))->getMock();
28-
29-
$validatorDefinition1 = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->setMethods(array('getClass'))->getMock();
30-
$validatorDefinition2 = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->setMethods(array('getClass'))->getMock();
31-
32-
$validatorDefinition1->expects($this->atLeastOnce())
33-
->method('getClass')
34-
->willReturn('My\Fully\Qualified\Class\Named\Validator1');
35-
$validatorDefinition2->expects($this->atLeastOnce())
36-
->method('getClass')
37-
->willReturn('My\Fully\Qualified\Class\Named\Validator2');
23+
$container = new ContainerBuilder();
24+
$constraintValidatorFactoryDefinition = $container->register('validator.validator_factory')
25+
->setArguments(array(new Reference('service_container'), array()));
26+
$container->register('my_constraint_validator_service1', 'My\Fully\Qualified\Class\Named\Validator1')
27+
->addTag('validator.constraint_validator', array('alias' => 'my_constraint_validator_alias1'));
28+
$container->register('my_constraint_validator_service2', 'My\Fully\Qualified\Class\Named\Validator2')
29+
->addTag('validator.constraint_validator');
3830

39-
$container->expects($this->any())
40-
->method('getDefinition')
41-
->with($this->anything())
42-
->will($this->returnValueMap(array(
43-
array('my_constraint_validator_service1', $validatorDefinition1),
44-
array('my_constraint_validator_service2', $validatorDefinition2),
45-
array('validator.validator_factory', $validatorFactoryDefinition),
46-
)));
47-
48-
$container->expects($this->atLeastOnce())
49-
->method('findTaggedServiceIds')
50-
->will($this->returnValue($services));
51-
$container->expects($this->atLeastOnce())
52-
->method('hasDefinition')
53-
->with('validator.validator_factory')
54-
->will($this->returnValue(true));
31+
$addConstraintValidatorsPass = new AddConstraintValidatorsPass();
32+
$addConstraintValidatorsPass->process($container);
5533

56-
$validatorFactoryDefinition->expects($this->once())
57-
->method('replaceArgument')
58-
->with(1, array(
34+
$this->assertEquals(
35+
array(
5936
'My\Fully\Qualified\Class\Named\Validator1' => 'my_constraint_validator_service1',
6037
'my_constraint_validator_alias1' => 'my_constraint_validator_service1',
6138
'My\Fully\Qualified\Class\Named\Validator2' => 'my_constraint_validator_service2',
62-
));
63-
64-
$addConstraintValidatorsPass = new AddConstraintValidatorsPass();
65-
$addConstraintValidatorsPass->process($container);
39+
),
40+
$constraintValidatorFactoryDefinition->getArgument(1)
41+
);
6642
}
6743

6844
public function testThatCompilerPassIsIgnoredIfThereIsNoConstraintValidatorFactoryDefinition()
6945
{
70-
$definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
71-
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition'))->getMock();
72-
73-
$container->expects($this->never())->method('findTaggedServiceIds');
74-
$container->expects($this->never())->method('getDefinition');
75-
$container->expects($this->atLeastOnce())
76-
->method('hasDefinition')
77-
->with('validator.validator_factory')
78-
->will($this->returnValue(false));
79-
$definition->expects($this->never())->method('replaceArgument');
80-
8146
$addConstraintValidatorsPass = new AddConstraintValidatorsPass();
82-
$addConstraintValidatorsPass->process($container);
47+
$addConstraintValidatorsPass->process(new ContainerBuilder());
48+
49+
// we just check that the pass does not fail if no constraint validator factory is registered
50+
$this->addToAssertionCount(1);
8351
}
8452
}

0 commit comments

Comments
 (0)