Skip to content

Commit cfb15ff

Browse files
Merge branch '2.8'
* 2.8: [appveyor] fix ini matrix race conditions [Http*] Mock time() to fix transient tests [ci] Cache phpunit install [WebProfiler] [toolbar] Changed profiler toolbar color to comply with WCAG 2.0AA contrast standards Conflicts: appveyor.yml
2 parents 38a70f3 + 8a76fd9 commit cfb15ff

File tree

12 files changed

+60
-56
lines changed

12 files changed

+60
-56
lines changed

.travis.yml

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ addons:
77
- parallel
88
- language-pack-fr-base
99

10+
cache:
11+
directories:
12+
- .phpunit
13+
1014
matrix:
1115
include:
1216
- php: hhvm

appveyor.yml

+11-5
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,20 @@ init:
1313
- SET SYMFONY_DEPRECATIONS_HELPER=strict
1414
- SET PHP=1
1515
- SET ANSICON=121x90 (121x90)
16-
- SET PHP_INI_MATRIX=php.ini-min php.ini-max
1716
- SET SYMFONY_PHPUNIT_SKIPPED_TESTS=phpunit.skipped
1817

1918
install:
2019
- IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php)
2120
- cd c:\php
2221
- IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-5.5.9-nts-Win32-VC11-x86.zip
23-
- IF %PHP%==1 7z x php-5.5.9-nts-Win32-VC11-x86.zip -y > 7z.log
22+
- IF %PHP%==1 7z x php-5.5.9-nts-Win32-VC11-x86.zip -y >nul
23+
- IF %PHP%==1 del /Q *.zip
2424
- IF %PHP%==1 cd ext
2525
- IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/pecl/releases/apcu/4.0.7/php_apcu-4.0.7-5.5-nts-vc11-x86.zip
26-
- IF %PHP%==1 7z x php_apcu-4.0.7-5.5-nts-vc11-x86.zip -y > 7z.log
26+
- IF %PHP%==1 7z x php_apcu-4.0.7-5.5-nts-vc11-x86.zip -y >nul
2727
- IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/php_memcache-3.0.8-5.5-nts-vc11-x86.zip
28-
- IF %PHP%==1 7z x php_memcache-3.0.8-5.5-nts-vc11-x86.zip -y > 7z.log
28+
- IF %PHP%==1 7z x php_memcache-3.0.8-5.5-nts-vc11-x86.zip -y >nul
29+
- IF %PHP%==1 del /Q *.zip
2930
- IF %PHP%==1 cd ..
3031
- IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat
3132
- IF %PHP%==1 copy /Y php.ini-development php.ini-min
@@ -51,4 +52,9 @@ install:
5152

5253
test_script:
5354
- cd c:\projects\symfony
54-
- php phpunit symfony --exclude-group benchmark,intl-data
55+
- SET X=0
56+
- copy /Y c:\php\php.ini-min c:\php\php.ini
57+
- php phpunit symfony --exclude-group benchmark,intl-data || SET X=1
58+
- copy /Y c:\php\php.ini-max c:\php\php.ini
59+
- php phpunit symfony --exclude-group benchmark,intl-data || SET X=1
60+
- exit %X%

phpunit

+6-21
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ if (!file_exists($COMPOSER = __DIR__.'/composer.phar')) {
2424
$PHP = ProcessUtils::escapeArgument($PHP);
2525
$COMPOSER = $PHP.' '.ProcessUtils::escapeArgument($COMPOSER);
2626

27-
if (!file_exists("$PHPUNIT_DIR/phpunit-$PHPUNIT_VERSION/phpunit") || md5_file(__FILE__) !== @file_get_contents("$PHPUNIT_DIR/.md5") || (isset($argv[1]) && 'install' === $argv[1])) {
27+
if (!file_exists("$PHPUNIT_DIR/phpunit-$PHPUNIT_VERSION/phpunit") || md5_file(__FILE__) !== @file_get_contents("$PHPUNIT_DIR/.md5")) {
2828
// Build a standalone phpunit without symfony/yaml
2929

3030
$oldPwd = getcwd();
3131
@mkdir($PHPUNIT_DIR);
3232
chdir($PHPUNIT_DIR);
3333
if (file_exists("phpunit-$PHPUNIT_VERSION")) {
34-
passthru(sprintf('\\' === DIRECTORY_SEPARATOR ? 'del /S /F /Q %s & rmdir %1$s >nul 2>&1': 'rm -rf %s', "phpunit-$PHPUNIT_VERSION"));
34+
passthru(sprintf('\\' === DIRECTORY_SEPARATOR ? '(del /S /F /Q %s & rmdir %1$s) >nul': 'rm -rf %s', "phpunit-$PHPUNIT_VERSION"));
3535
}
3636
if (extension_loaded('openssl') && ini_get('allow_url_fopen')) {
3737
stream_copy_to_stream(fopen("https://github.com/sebastianbergmann/phpunit/archive/$PHPUNIT_VERSION.zip", 'rb'), fopen("$PHPUNIT_VERSION.zip", 'wb'));
@@ -58,7 +58,7 @@ EOPHP
5858
);
5959
chdir('..');
6060
if (file_exists('../src/Symfony/Bridge/PhpUnit') && `git diff --name-only HEAD^ -- ../src/Symfony/Bridge/PhpUnit`) {
61-
passthru(sprintf('\\' === DIRECTORY_SEPARATOR ? 'del /S /F /Q %s & rmdir %1$s >nul 2>&1': 'rm -rf %s', str_replace('/', DIRECTORY_SEPARATOR, "phpunit-$PHPUNIT_VERSION/vendor/symfony/phpunit-bridge")));
61+
passthru(sprintf('\\' === DIRECTORY_SEPARATOR ? '(del /S /F /Q %s & rmdir %1$s) >nul': 'rm -rf %s', str_replace('/', DIRECTORY_SEPARATOR, "phpunit-$PHPUNIT_VERSION/vendor/symfony/phpunit-bridge")));
6262
symlink(realpath('../src/Symfony/Bridge/PhpUnit'), "phpunit-$PHPUNIT_VERSION/vendor/symfony/phpunit-bridge");
6363
}
6464
file_put_contents('.md5', md5_file(__FILE__));
@@ -76,22 +76,10 @@ if (isset($argv[1]) && 'symfony' === $argv[1]) {
7676
$cmd[0] = sprintf('%s %s --colors=always', $PHP, ProcessUtils::escapeArgument("$PHPUNIT_DIR/phpunit-$PHPUNIT_VERSION/phpunit"));
7777
$cmd = str_replace('%', '%%', implode(' ', $cmd)).' %1$s';
7878

79-
$phpIniMatrix = isset($_SERVER['PHP_INI_MATRIX']) ? explode(' ', $_SERVER['PHP_INI_MATRIX']) : array();
80-
if ($phpIniMatrix) {
81-
if ('\\' !== DIRECTORY_SEPARATOR) {
82-
echo "Error: PHP_INI_MATRIX is a Windows-only feature.\n";
83-
exit(1);
84-
}
85-
86-
$phpDir = ProcessUtils::escapeArgument(dirname(`where.exe php`));
87-
88-
$newCmd = 'cmd /v:on /d /c "(SET X=0';
89-
foreach ($phpIniMatrix as $iniFile) {
90-
$newCmd .= " & copy /Y $phpDir\\$iniFile $phpDir\\php.ini & echo. & echo Running tests with $iniFile: & ($cmd || SET X=1)";
91-
}
92-
$cmd = $newCmd .= ' & exit !X!)%2$s"';
79+
if ('\\' === DIRECTORY_SEPARATOR) {
80+
$cmd = 'cmd /v:on /d /c "('.$cmd.')%2$s"';
9381
} else {
94-
$cmd .= ' %2$s';
82+
$cmd .= '%2$s';
9583
}
9684

9785
if (isset($argv[1]) && 'symfony' === $argv[1]) {
@@ -168,9 +156,6 @@ if (isset($argv[1]) && 'symfony' === $argv[1]) {
168156
}
169157
unlink($file);
170158
}
171-
if ($skippedTests) {
172-
@unlink("$component/$skippedTests");
173-
}
174159

175160
if ($procStatus) {
176161
$exit = 1;

src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php

-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,6 @@ public function testSubmitDifferentPattern()
262262
$this->assertDateTimeEquals($dateTime, $form->getData());
263263
}
264264

265-
// Bug fix
266265
public function testInitializeWithDateTime()
267266
{
268267
// Throws an exception if "data_class" option is not explicitly set

src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php

-1
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,6 @@ public function testPassWidgetToView()
705705
$this->assertSame('single_text', $view->vars['widget']);
706706
}
707707

708-
// Bug fix
709708
public function testInitializeWithDateTime()
710709
{
711710
// Throws an exception if "data_class" option is not explicitly set

src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php

-1
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,6 @@ public function testIsPartiallyFilledReturnsTrueIfChoiceAndSecondsEmpty()
467467
$this->assertTrue($form->isPartiallyFilled());
468468
}
469469

470-
// Bug fix
471470
public function testInitializeWithDateTime()
472471
{
473472
// Throws an exception if "data_class" option is not explicitly set

src/Symfony/Component/HttpFoundation/Response.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ public function sendHeaders()
325325
}
326326

327327
if (!$this->headers->has('Date')) {
328-
$this->setDate(new \DateTime());
328+
$this->setDate(\DateTime::createFromFormat('U', time()));
329329
}
330330

331331
// status
@@ -608,7 +608,7 @@ public function mustRevalidate()
608608
public function getDate()
609609
{
610610
if (!$this->headers->has('Date')) {
611-
$this->setDate(new \DateTime());
611+
$this->setDate(\DateTime::createFromFormat('U', time()));
612612
}
613613

614614
return $this->headers->getDate('Date');

src/Symfony/Component/HttpFoundation/Tests/CookieTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public function testGetExpiresTimeWithStringValue()
9595
$cookie = new Cookie('foo', 'bar', $value);
9696
$expire = strtotime($value);
9797

98-
$this->assertEquals($expire, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date');
98+
$this->assertEquals($expire, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date', 1);
9999
}
100100

101101
public function testGetDomain()

src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php

+20-17
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
use Symfony\Component\HttpFoundation\Request;
1515
use Symfony\Component\HttpFoundation\Response;
1616

17+
/**
18+
* @group time-sensitive
19+
*/
1720
class ResponseTest extends ResponseTestCase
1821
{
1922
public function testCreate()
@@ -259,16 +262,18 @@ public function testGetDate()
259262
{
260263
$oneHourAgo = $this->createDateTimeOneHourAgo();
261264
$response = new Response('', 200, array('Date' => $oneHourAgo->format(DATE_RFC2822)));
262-
$this->assertEquals(0, $oneHourAgo->diff($response->getDate())->format('%s'), '->getDate() returns the Date header if present');
265+
$date = $response->getDate();
266+
$this->assertEquals($oneHourAgo->getTimestamp(), $date->getTimestamp(), '->getDate() returns the Date header if present');
263267

264268
$response = new Response();
265269
$date = $response->getDate();
266-
$this->assertLessThan(1, $date->diff(new \DateTime(), true)->format('%s'), '->getDate() returns the current Date if no Date header present');
270+
$this->assertEquals(time(), $date->getTimestamp(), '->getDate() returns the current Date if no Date header present');
267271

268272
$response = new Response('', 200, array('Date' => $this->createDateTimeOneHourAgo()->format(DATE_RFC2822)));
269273
$now = $this->createDateTimeNow();
270274
$response->headers->set('Date', $now->format(DATE_RFC2822));
271-
$this->assertLessThanOrEqual(1, $now->diff($response->getDate())->format('%s'), '->getDate() returns the date when the header has been modified');
275+
$date = $response->getDate();
276+
$this->assertEquals($now->getTimestamp(), $date->getTimestamp(), '->getDate() returns the date when the header has been modified');
272277

273278
$response = new Response('', 200);
274279
$response->headers->remove('Date');
@@ -288,7 +293,7 @@ public function testGetMaxAge()
288293
$response = new Response();
289294
$response->headers->set('Cache-Control', 'must-revalidate');
290295
$response->headers->set('Expires', $this->createDateTimeOneHourLater()->format(DATE_RFC2822));
291-
$this->assertLessThanOrEqual(1, $response->getMaxAge() - 3600, '->getMaxAge() falls back to Expires when no max-age or s-maxage directive present');
296+
$this->assertEquals(3600, $response->getMaxAge(), '->getMaxAge() falls back to Expires when no max-age or s-maxage directive present');
292297

293298
$response = new Response();
294299
$response->headers->set('Cache-Control', 'must-revalidate');
@@ -359,7 +364,7 @@ public function testGetTtl()
359364

360365
$response = new Response();
361366
$response->headers->set('Expires', $this->createDateTimeOneHourLater()->format(DATE_RFC2822));
362-
$this->assertLessThanOrEqual(1, 3600 - $response->getTtl(), '->getTtl() uses the Expires header when no max-age is present');
367+
$this->assertEquals(3600, $response->getTtl(), '->getTtl() uses the Expires header when no max-age is present');
363368

364369
$response = new Response();
365370
$response->headers->set('Expires', $this->createDateTimeOneHourAgo()->format(DATE_RFC2822));
@@ -372,7 +377,7 @@ public function testGetTtl()
372377

373378
$response = new Response();
374379
$response->headers->set('Cache-Control', 'max-age=60');
375-
$this->assertLessThan(1, 60 - $response->getTtl(), '->getTtl() uses Cache-Control max-age when present');
380+
$this->assertEquals(60, $response->getTtl(), '->getTtl() uses Cache-Control max-age when present');
376381
}
377382

378383
public function testSetClientTtl()
@@ -572,7 +577,7 @@ public function testSetCache()
572577
$response->setCache($options);
573578
$this->assertEquals($response->getEtag(), '"whatever"');
574579

575-
$now = new \DateTime();
580+
$now = $this->createDateTimeNow();
576581
$options = array('last_modified' => $now);
577582
$response->setCache($options);
578583
$this->assertEquals($response->getLastModified()->getTimestamp(), $now->getTimestamp());
@@ -631,7 +636,7 @@ public function testSetExpires()
631636

632637
$this->assertNull($response->getExpires(), '->setExpires() remove the header when passed null');
633638

634-
$now = new \DateTime();
639+
$now = $this->createDateTimeNow();
635640
$response->setExpires($now);
636641

637642
$this->assertEquals($response->getExpires()->getTimestamp(), $now->getTimestamp());
@@ -640,7 +645,7 @@ public function testSetExpires()
640645
public function testSetLastModified()
641646
{
642647
$response = new Response();
643-
$response->setLastModified(new \DateTime());
648+
$response->setLastModified($this->createDateTimeNow());
644649
$this->assertNotNull($response->getLastModified());
645650

646651
$response->setLastModified(null);
@@ -825,7 +830,7 @@ public function testSettersAreChainable()
825830
'setCharset' => 'UTF-8',
826831
'setPublic' => null,
827832
'setPrivate' => null,
828-
'setDate' => new \DateTime(),
833+
'setDate' => $this->createDateTimeNow(),
829834
'expire' => null,
830835
'setMaxAge' => 1,
831836
'setSharedMaxAge' => 1,
@@ -858,21 +863,19 @@ public function invalidContentProvider()
858863

859864
protected function createDateTimeOneHourAgo()
860865
{
861-
$date = new \DateTime();
862-
863-
return $date->sub(new \DateInterval('PT1H'));
866+
return $this->createDateTimeNow()->sub(new \DateInterval('PT1H'));
864867
}
865868

866869
protected function createDateTimeOneHourLater()
867870
{
868-
$date = new \DateTime();
869-
870-
return $date->add(new \DateInterval('PT1H'));
871+
return $this->createDateTimeNow()->add(new \DateInterval('PT1H'));
871872
}
872873

873874
protected function createDateTimeNow()
874875
{
875-
return new \DateTime();
876+
$date = new \DateTime();
877+
878+
return $date->setTimestamp(time());
876879
}
877880

878881
protected function provideResponse()

src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQ
196196

197197
$this->restoreResponseBody($request, $response);
198198

199-
$response->setDate(new \DateTime(null, new \DateTimeZone('UTC')));
199+
$response->setDate(\DateTime::createFromFormat('U', time(), new \DateTimeZone('UTC')));
200200

201201
if (HttpKernelInterface::MASTER_REQUEST === $type && $this->options['debug']) {
202202
$response->headers->set('X-Symfony-Cache', $this->getLog());

src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php

+11-6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
use Symfony\Component\HttpFoundation\Request;
1616
use Symfony\Component\HttpFoundation\Response;
1717

18+
/**
19+
* @group time-sensitive
20+
*/
1821
class HttpCacheTest extends HttpCacheTestCase
1922
{
2023
public function testTerminateDelegatesTerminationOnlyForTerminableInterface()
@@ -125,7 +128,7 @@ public function testDoesNotCacheRequestsWithACookieHeader()
125128

126129
public function testRespondsWith304WhenIfModifiedSinceMatchesLastModified()
127130
{
128-
$time = new \DateTime();
131+
$time = \DateTime::createFromFormat('U', time());
129132

130133
$this->setNextResponse(200, array('Cache-Control' => 'public', 'Last-Modified' => $time->format(DATE_RFC2822), 'Content-Type' => 'text/plain'), 'Hello World');
131134
$this->request('GET', '/', array('HTTP_IF_MODIFIED_SINCE' => $time->format(DATE_RFC2822)));
@@ -154,7 +157,7 @@ public function testRespondsWith304WhenIfNoneMatchMatchesETag()
154157

155158
public function testRespondsWith304OnlyIfIfNoneMatchAndIfModifiedSinceBothMatch()
156159
{
157-
$time = new \DateTime();
160+
$time = \DateTime::createFromFormat('U', time());
158161

159162
$this->setNextResponse(200, array(), '', function ($request, $response) use ($time) {
160163
$response->setStatusCode(200);
@@ -593,7 +596,7 @@ public function testAssignsDefaultTtlWhenResponseHasNoFreshnessInformationAndAft
593596
$this->assertTraceContains('miss');
594597
$this->assertTraceContains('store');
595598
$this->assertEquals('Hello World', $this->response->getContent());
596-
$this->assertRegExp('/s-maxage=(?:2|3)/', $this->response->headers->get('Cache-Control'));
599+
$this->assertRegExp('/s-maxage=2/', $this->response->headers->get('Cache-Control'));
597600

598601
$this->request('GET', '/');
599602
$this->assertHttpKernelIsNotCalled();
@@ -607,7 +610,8 @@ public function testAssignsDefaultTtlWhenResponseHasNoFreshnessInformationAndAft
607610
$values = $this->getMetaStorageValues();
608611
$this->assertCount(1, $values);
609612
$tmp = unserialize($values[0]);
610-
$tmp[0][1]['date'] = \DateTime::createFromFormat('U', time() - 5)->format(DATE_RFC2822);
613+
$time = \DateTime::createFromFormat('U', time() - 5);
614+
$tmp[0][1]['date'] = $time->format(DATE_RFC2822);
611615
$r = new \ReflectionObject($this->store);
612616
$m = $r->getMethod('save');
613617
$m->setAccessible(true);
@@ -656,7 +660,8 @@ public function testAssignsDefaultTtlWhenResponseHasNoFreshnessInformationAndAft
656660
$values = $this->getMetaStorageValues();
657661
$this->assertCount(1, $values);
658662
$tmp = unserialize($values[0]);
659-
$tmp[0][1]['date'] = \DateTime::createFromFormat('U', time() - 5)->format(DATE_RFC2822);
663+
$time = \DateTime::createFromFormat('U', time() - 5);
664+
$tmp[0][1]['date'] = $time->format(DATE_RFC2822);
660665
$r = new \ReflectionObject($this->store);
661666
$m = $r->getMethod('save');
662667
$m->setAccessible(true);
@@ -1194,7 +1199,7 @@ public function testXForwarderForHeaderForPassRequests()
11941199

11951200
public function testEsiCacheRemoveValidationHeadersIfEmbeddedResponses()
11961201
{
1197-
$time = new \DateTime();
1202+
$time = \DateTime::createFromFormat('U', time());
11981203

11991204
$responses = array(
12001205
array(

src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Symfony\Component\HttpKernel\HttpCache\HttpCache;
1717
use Symfony\Component\HttpKernel\HttpCache\Store;
1818
use Symfony\Component\HttpKernel\HttpKernelInterface;
19+
use Symfony\Bridge\PhpUnit\ClockMock;
1920

2021
class HttpCacheTestCase extends \PHPUnit_Framework_TestCase
2122
{
@@ -32,6 +33,9 @@ class HttpCacheTestCase extends \PHPUnit_Framework_TestCase
3233

3334
protected function setUp()
3435
{
36+
if (class_exists('Symfony\Bridge\PhpUnit\ClockMock')) {
37+
ClockMock::register('Symfony\Component\HttpFoundation\Request');
38+
}
3539
$this->kernel = null;
3640

3741
$this->cache = null;

0 commit comments

Comments
 (0)