Skip to content
Snippets Groups Projects
Commit 77f7c33c authored by Dale Sikkema's avatar Dale Sikkema
Browse files

MAGETWO-35465: testSetNoCacheHeaders randomly fails

parent dbd56db5
Branches
No related merge requests found
......@@ -29,15 +29,17 @@ class Response extends Http implements \Magento\Framework\App\Response\FileInter
* @param CookieManagerInterface $cookieManager
* @param CookieMetadataFactory $cookieMetadataFactory
* @param \Magento\Framework\App\Http\Context $context
* @param \Magento\Framework\Stdlib\DateTime $dateTime
* @param \Magento\Framework\File\Transfer\Adapter\Http $transferAdapter
*/
public function __construct(
CookieManagerInterface $cookieManager,
CookieMetadataFactory $cookieMetadataFactory,
\Magento\Framework\App\Http\Context $context,
\Magento\Framework\Stdlib\DateTime $dateTime,
\Magento\Framework\File\Transfer\Adapter\Http $transferAdapter
) {
parent::__construct($cookieManager, $cookieMetadataFactory, $context);
parent::__construct($cookieManager, $cookieMetadataFactory, $context, $dateTime);
$this->_transferAdapter = $transferAdapter;
}
......
......@@ -27,7 +27,8 @@ class ControllerAbstractTest extends \Magento\TestFramework\TestCase\AbstractCon
$response = new \Magento\TestFramework\Response(
$this->getMock('Magento\Framework\Stdlib\CookieManagerInterface'),
$this->getMock('Magento\Framework\Stdlib\Cookie\CookieMetadataFactory', [], [], '', false),
$this->getMock('Magento\Framework\App\Http\Context', [], [], '', false)
$this->getMock('Magento\Framework\App\Http\Context', [], [], '', false),
$this->getMock('Magento\Framework\Stdlib\DateTime', [], [], '', false)
);
$this->_objectManager = $this->getMock(
......
......@@ -11,42 +11,44 @@ use Magento\Framework\App\Http\Context;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Stdlib\Cookie\CookieMetadataFactory;
use Magento\Framework\Stdlib\CookieManagerInterface;
use Magento\Framework\Stdlib\DateTime;
class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response
{
/**
* Cookie to store page vary string
*/
/** Cookie to store page vary string */
const COOKIE_VARY_STRING = 'X-Magento-Vary';
/**
* @var \Magento\Framework\Stdlib\CookieManagerInterface
*/
/** Format for expiration timestamp headers */
const EXPIRATION_TIMESTAMP_FORMAT = 'D, d M Y H:i:s T';
/** @var \Magento\Framework\Stdlib\CookieManagerInterface */
protected $cookieManager;
/**
* @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory
*/
/** @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory */
protected $cookieMetadataFactory;
/**
* @var \Magento\Framework\App\Http\Context
*/
/** @var \Magento\Framework\App\Http\Context */
protected $context;
/** @var DateTime */
protected $dateTime;
/**
* @param CookieManagerInterface $cookieManager
* @param CookieMetadataFactory $cookieMetadataFactory
* @param Context $context
* @param DateTime $dateTime
*/
public function __construct(
CookieManagerInterface $cookieManager,
CookieMetadataFactory $cookieMetadataFactory,
Context $context
Context $context,
DateTime $dateTime
) {
$this->cookieManager = $cookieManager;
$this->cookieMetadataFactory = $cookieMetadataFactory;
$this->context = $context;
$this->dateTime = $dateTime;
}
/**
......@@ -97,7 +99,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response
}
$this->setHeader('pragma', 'cache', true);
$this->setHeader('cache-control', 'public, max-age=' . $ttl . ', s-maxage=' . $ttl, true);
$this->setHeader('expires', gmdate('D, d M Y H:i:s T', strtotime('+' . $ttl . ' seconds')), true);
$this->setHeader('expires', $this->getExpirationHeader('+' . $ttl . ' seconds'), true);
}
/**
......@@ -114,7 +116,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response
}
$this->setHeader('pragma', 'cache', true);
$this->setHeader('cache-control', 'private, max-age=' . $ttl, true);
$this->setHeader('expires', gmdate('D, d M Y H:i:s T', strtotime('+' . $ttl . ' seconds')), true);
$this->setHeader('expires', $this->getExpirationHeader('+' . $ttl . ' seconds'), true);
}
/**
......@@ -126,7 +128,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response
{
$this->setHeader('pragma', 'no-cache', true);
$this->setHeader('cache-control', 'no-store, no-cache, must-revalidate, max-age=0', true);
$this->setHeader('expires', gmdate('D, d M Y H:i:s T', strtotime('-1 year')), true);
$this->setHeader('expires', $this->getExpirationHeader('-1 year'), true);
}
/**
......@@ -160,4 +162,15 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response
$this->cookieManager = $objectManager->create('Magento\Framework\Stdlib\CookieManagerInterface');
$this->cookieMetadataFactory = $objectManager->get('Magento\Framework\Stdlib\Cookie\CookieMetadataFactory');
}
/**
* Given a time input, returns the formatted header
*
* @param string $time
* @return string
*/
protected function getExpirationHeader($time)
{
return $this->dateTime->gmDate(self::EXPIRATION_TIMESTAMP_FORMAT, $this->dateTime->strToTime($time));
}
}
......@@ -13,7 +13,7 @@ use \Magento\Framework\App\Response\Http;
class HttpTest extends \PHPUnit_Framework_TestCase
{
/**
* @var \Magento\Framework\App\Response\Http
* @var Http
*/
protected $model;
......@@ -32,6 +32,9 @@ class HttpTest extends \PHPUnit_Framework_TestCase
*/
protected $contextMock;
/** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\Http\Context */
protected $dateTimeMock;
protected function setUp()
{
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
......@@ -41,12 +44,18 @@ class HttpTest extends \PHPUnit_Framework_TestCase
$this->cookieManagerMock = $this->getMock('Magento\Framework\Stdlib\CookieManagerInterface');
$this->contextMock = $this->getMockBuilder('Magento\Framework\App\Http\Context')->disableOriginalConstructor()
->getMock();
$this->dateTimeMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime')
->disableOriginalConstructor()
->getMock();
$this->model = $objectManager->getObject(
'Magento\Framework\App\Response\Http',
[
'cookieManager' => $this->cookieManagerMock,
'cookieMetadataFactory' => $this->cookieMetadataFactoryMock,
'context' => $this->contextMock
'context' => $this->contextMock,
'dateTime' => $this->dateTimeMock
]
);
$this->model->headersSentThrowsException = false;
......@@ -118,14 +127,24 @@ class HttpTest extends \PHPUnit_Framework_TestCase
public function testSetPublicHeaders()
{
$ttl = 120;
$timestamp = 1000000;
$pragma = 'cache';
$cacheControl = 'max-age=' . $ttl . ', public, s-maxage=' . $ttl;
$expiresResult = gmdate('D, d M Y H:i:s T', time() + $ttl);
$expiresResult ='Thu, 01 Jan 1970 00:00:00 GMT';
$this->dateTimeMock->expects($this->once())
->method('strToTime')
->with('+' . $ttl . ' seconds')
->willReturn($timestamp);
$this->dateTimeMock->expects($this->once())
->method('gmDate')
->with(Http::EXPIRATION_TIMESTAMP_FORMAT, $timestamp)
->willReturn($expiresResult);
$this->model->setPublicHeaders($ttl);
$this->assertEquals($pragma, $this->model->getHeader('Pragma')->getFieldValue());
$this->assertEquals($cacheControl, $this->model->getHeader('Cache-Control')->getFieldValue());
$this->assertLessThanOrEqual($expiresResult, $this->model->getHeader('Expires')->getFieldValue());
$this->assertSame($expiresResult, $this->model->getHeader('Expires')->getFieldValue());
}
/**
......@@ -146,14 +165,24 @@ class HttpTest extends \PHPUnit_Framework_TestCase
public function testSetPrivateHeaders()
{
$ttl = 120;
$timestamp = 1000000;
$pragma = 'cache';
$cacheControl = 'max-age=' . $ttl . ', private';
$expires = gmdate('D, d M Y H:i:s T', strtotime('+' . $ttl . ' seconds'));
$expiresResult ='Thu, 01 Jan 1970 00:00:00 GMT';
$this->dateTimeMock->expects($this->once())
->method('strToTime')
->with('+' . $ttl . ' seconds')
->willReturn($timestamp);
$this->dateTimeMock->expects($this->once())
->method('gmDate')
->with(Http::EXPIRATION_TIMESTAMP_FORMAT, $timestamp)
->willReturn($expiresResult);
$this->model->setPrivateHeaders($ttl);
$this->assertEquals($pragma, $this->model->getHeader('Pragma')->getFieldValue());
$this->assertEquals($cacheControl, $this->model->getHeader('Cache-Control')->getFieldValue());
$this->assertEquals($expires, $this->model->getHeader('Expires')->getFieldValue());
$this->assertEquals($expiresResult, $this->model->getHeader('Expires')->getFieldValue());
}
/**
......@@ -173,14 +202,24 @@ class HttpTest extends \PHPUnit_Framework_TestCase
*/
public function testSetNoCacheHeaders()
{
$timestamp = 1000000;
$pragma = 'no-cache';
$cacheControl = 'max-age=0, must-revalidate, no-cache, no-store';
$expires = gmdate('D, d M Y H:i:s T', strtotime('-1 year'));
$expiresResult ='Thu, 01 Jan 1970 00:00:00 GMT';
$this->dateTimeMock->expects($this->once())
->method('strToTime')
->with('-1 year')
->willReturn($timestamp);
$this->dateTimeMock->expects($this->once())
->method('gmDate')
->with(Http::EXPIRATION_TIMESTAMP_FORMAT, $timestamp)
->willReturn($expiresResult);
$this->model->setNoCacheHeaders();
$this->assertEquals($pragma, $this->model->getHeader('Pragma')->getFieldValue());
$this->assertEquals($cacheControl, $this->model->getHeader('Cache-Control')->getFieldValue());
$this->assertEquals($expires, $this->model->getHeader('Expires')->getFieldValue());
$this->assertEquals($expiresResult, $this->model->getHeader('Expires')->getFieldValue());
}
/**
......
......@@ -68,4 +68,31 @@ class DateTime
{
return preg_replace('#[ 0:-]#', '', $date) === '';
}
/**
* Wrapper for native gmdate function
*
* @param string $format
* @param int $time
* @return string The given time in given format
*
* @codeCoverageIgnore
*/
public function gmDate($format, $time)
{
return gmdate($format, $time);
}
/**
* Wrapper for native strtotime function
*
* @param string $timeStr
* @return int
*
* @codeCoverageIgnore
*/
public function strToTime($timeStr)
{
return strtotime($timeStr);
}
}
......@@ -63,6 +63,8 @@ class DateTime
* @param string $format
* @param int|string $input date in current timezone
* @return string
*
* @deprecated (MAGETWO-35555)
*/
public function gmtDate($format = null, $input = null)
{
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment