PhpCookieManagerTest.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. // @codingStandardsIgnoreStart
  7. namespace {
  8. $mockTranslateSetCookie = false;
  9. }
  10. namespace Magento\Framework\Stdlib\Test\Unit\Cookie
  11. {
  12. use Magento\Framework\Stdlib\Cookie\PhpCookieManager;
  13. use Magento\Framework\Exception\InputException;
  14. use Magento\Framework\Stdlib\Cookie\FailureToSendException;
  15. use Magento\Framework\Stdlib\Cookie\CookieSizeLimitReachedException;
  16. use Magento\Framework\Phrase;
  17. use Magento\Framework\HTTP\Header as HttpHeader;
  18. use Psr\Log\LoggerInterface;
  19. // @codingStandardsIgnoreEnd
  20. /**
  21. * Test PhpCookieManager
  22. *
  23. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  24. */
  25. class PhpCookieManagerTest extends \PHPUnit\Framework\TestCase
  26. {
  27. const COOKIE_NAME = 'cookie_name';
  28. const SENSITIVE_COOKIE_NAME_NO_METADATA_HTTPS = 'sensitive_cookie_name_no_metadata_https';
  29. const SENSITIVE_COOKIE_NAME_NO_METADATA_NOT_HTTPS = 'sensitive_cookie_name_no_metadata_not_https';
  30. const SENSITIVE_COOKIE_NAME_NO_DOMAIN_NO_PATH = 'sensitive_cookie_name_no_domain_no_path';
  31. const SENSITIVE_COOKIE_NAME_WITH_DOMAIN_AND_PATH = 'sensitive_cookie_name_with_domain_and_path';
  32. const PUBLIC_COOKIE_NAME_NO_METADATA = 'public_cookie_name_no_metadata';
  33. const PUBLIC_COOKIE_NAME_DEFAULT_VALUES = 'public_cookie_name_default_values';
  34. const PUBLIC_COOKIE_NAME_SOME_FIELDS_SET = 'public_cookie_name_some_fields_set';
  35. const MAX_COOKIE_SIZE_TEST_NAME = 'max_cookie_size_test_name';
  36. const MAX_NUM_COOKIE_TEST_NAME = 'max_num_cookie_test_name';
  37. const DELETE_COOKIE_NAME = 'delete_cookie_name';
  38. const DELETE_COOKIE_NAME_NO_METADATA = 'delete_cookie_name_no_metadata';
  39. const EXCEPTION_COOKIE_NAME = 'exception_cookie_name';
  40. const COOKIE_VALUE = 'cookie_value';
  41. const DEFAULT_VAL = 'default';
  42. const COOKIE_SECURE = true;
  43. const COOKIE_NOT_SECURE = false;
  44. const COOKIE_HTTP_ONLY = true;
  45. const COOKIE_NOT_HTTP_ONLY = false;
  46. const COOKIE_EXPIRE_END_OF_SESSION = 0;
  47. /**
  48. * Mapping from constant names to functions that handle the assertions.
  49. */
  50. protected static $functionTestAssertionMapping = [
  51. self::DELETE_COOKIE_NAME => 'self::assertDeleteCookie',
  52. self::DELETE_COOKIE_NAME_NO_METADATA => 'self::assertDeleteCookieWithNoMetadata',
  53. self::SENSITIVE_COOKIE_NAME_NO_METADATA_HTTPS => 'self::assertSensitiveCookieWithNoMetaDataHttps',
  54. self::SENSITIVE_COOKIE_NAME_NO_METADATA_NOT_HTTPS => 'self::assertSensitiveCookieWithNoMetaDataNotHttps',
  55. self::SENSITIVE_COOKIE_NAME_NO_DOMAIN_NO_PATH => 'self::assertSensitiveCookieNoDomainNoPath',
  56. self::SENSITIVE_COOKIE_NAME_WITH_DOMAIN_AND_PATH => 'self::assertSensitiveCookieWithDomainAndPath',
  57. self::PUBLIC_COOKIE_NAME_NO_METADATA => 'self::assertPublicCookieWithNoMetaData',
  58. self::PUBLIC_COOKIE_NAME_DEFAULT_VALUES => 'self::assertPublicCookieWithDefaultValues',
  59. self::PUBLIC_COOKIE_NAME_NO_METADATA => 'self::assertPublicCookieWithNoMetaData',
  60. self::PUBLIC_COOKIE_NAME_DEFAULT_VALUES => 'self::assertPublicCookieWithDefaultValues',
  61. self::PUBLIC_COOKIE_NAME_SOME_FIELDS_SET => 'self::assertPublicCookieWithSomeFieldSet',
  62. self::MAX_COOKIE_SIZE_TEST_NAME => 'self::assertCookieSize',
  63. ];
  64. /**
  65. * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
  66. */
  67. protected $objectManager;
  68. /**
  69. * Cookie Manager
  70. *
  71. * @var \Magento\Framework\Stdlib\Cookie\PhpCookieManager
  72. */
  73. protected $cookieManager;
  74. /**
  75. * @var \PHPUnit_Framework_MockObject_MockObject|CookieScopeInterface
  76. */
  77. protected $scopeMock;
  78. /**
  79. * @var bool
  80. */
  81. public static $isSetCookieInvoked;
  82. /**
  83. * @var \Magento\Framework\App\Request\Http | \PHPUnit_Framework_MockObject_MockObject
  84. */
  85. protected $requestMock;
  86. /**
  87. * @var \Magento\Framework\Stdlib\Cookie\CookieReaderInterface | \PHPUnit_Framework_MockObject_MockObject
  88. */
  89. protected $readerMock;
  90. /**
  91. * @var LoggerInterface | \PHPUnit_Framework_MockObject_MockObject
  92. */
  93. protected $loggerMock;
  94. /**
  95. * @var HttpHeader | \PHPUnit_Framework_MockObject_MockObject
  96. */
  97. protected $httpHeaderMock;
  98. /**
  99. * @var array
  100. */
  101. protected $cookieArray;
  102. protected function setUp()
  103. {
  104. require_once __DIR__ . '/_files/setcookie_mock.php';
  105. $this->cookieArray = $_COOKIE;
  106. global $mockTranslateSetCookie;
  107. $mockTranslateSetCookie = true;
  108. self::$isSetCookieInvoked = false;
  109. $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  110. $this->scopeMock = $this->getMockBuilder(\Magento\Framework\Stdlib\Cookie\CookieScopeInterface::class)
  111. ->setMethods(['getPublicCookieMetadata', 'getCookieMetadata', 'getSensitiveCookieMetadata'])
  112. ->disableOriginalConstructor()
  113. ->getMock();
  114. $this->readerMock = $this->createMock(\Magento\Framework\Stdlib\Cookie\CookieReaderInterface::class);
  115. $this->loggerMock = $this->getMockBuilder(LoggerInterface::class)
  116. ->getMockForAbstractClass();
  117. $this->httpHeaderMock = $this->getMockBuilder(HttpHeader::class)
  118. ->disableOriginalConstructor()
  119. ->getMock();
  120. $this->cookieManager = $this->objectManager->getObject(
  121. \Magento\Framework\Stdlib\Cookie\PhpCookieManager::class,
  122. [
  123. 'scope' => $this->scopeMock,
  124. 'reader' => $this->readerMock,
  125. 'logger' => $this->loggerMock,
  126. 'httpHeader' => $this->httpHeaderMock
  127. ]
  128. );
  129. $this->requestMock = $this->getMockBuilder(\Magento\Framework\App\Request\Http::class)
  130. ->disableOriginalConstructor()
  131. ->getMock();
  132. }
  133. public function tearDown()
  134. {
  135. global $mockTranslateSetCookie;
  136. $mockTranslateSetCookie = false;
  137. $_COOKIE = $this->cookieArray = $_COOKIE;
  138. }
  139. public function testGetUnknownCookie()
  140. {
  141. $unknownCookieName = 'unknownCookieName';
  142. $this->stubGetCookie($unknownCookieName, self::DEFAULT_VAL, self::DEFAULT_VAL);
  143. $this->assertEquals(
  144. self::DEFAULT_VAL,
  145. $this->cookieManager->getCookie($unknownCookieName, self::DEFAULT_VAL)
  146. );
  147. }
  148. public function testGetCookie()
  149. {
  150. $this->stubGetCookie(self::COOKIE_NAME, self::DEFAULT_VAL, self::COOKIE_VALUE);
  151. $this->assertEquals(
  152. self::COOKIE_VALUE,
  153. $this->cookieManager->getCookie(self::COOKIE_NAME, self::DEFAULT_VAL)
  154. );
  155. }
  156. public function testDeleteCookie()
  157. {
  158. self::$isSetCookieInvoked = false;
  159. /** @var \Magento\Framework\Stdlib\Cookie\CookieMetadata $cookieMetadata */
  160. $cookieMetadata = $this->objectManager->getObject(
  161. \Magento\Framework\Stdlib\Cookie\CookieMetadata::class,
  162. [
  163. 'metadata' => [
  164. 'domain' => 'magento.url',
  165. 'path' => '/backend',
  166. ]
  167. ]
  168. );
  169. $this->scopeMock->expects($this->once())
  170. ->method('getCookieMetadata')
  171. ->with($cookieMetadata)
  172. ->will(
  173. $this->returnValue($cookieMetadata)
  174. );
  175. $this->cookieManager->deleteCookie(self::DELETE_COOKIE_NAME, $cookieMetadata);
  176. $this->assertTrue(self::$isSetCookieInvoked);
  177. }
  178. public function testDeleteCookieWithNoCookieMetadata()
  179. {
  180. self::$isSetCookieInvoked = false;
  181. $cookieMetadata = $this->objectManager->getObject(\Magento\Framework\Stdlib\Cookie\CookieMetadata::class);
  182. $this->scopeMock->expects($this->once())
  183. ->method('getCookieMetadata')
  184. ->with()
  185. ->will(
  186. $this->returnValue($cookieMetadata)
  187. );
  188. $this->cookieManager->deleteCookie(self::DELETE_COOKIE_NAME_NO_METADATA);
  189. $this->assertTrue(self::$isSetCookieInvoked);
  190. }
  191. public function testDeleteCookieWithFailureToSendException()
  192. {
  193. self::$isSetCookieInvoked = false;
  194. $cookieMetadata = $this->objectManager->getObject(\Magento\Framework\Stdlib\Cookie\CookieMetadata::class);
  195. $this->scopeMock->expects($this->once())
  196. ->method('getCookieMetadata')
  197. ->with()
  198. ->will(
  199. $this->returnValue($cookieMetadata)
  200. );
  201. try {
  202. $this->cookieManager->deleteCookie(self::EXCEPTION_COOKIE_NAME, $cookieMetadata);
  203. $this->fail('Expected exception not thrown.');
  204. } catch (FailureToSendException $fse) {
  205. $this->assertTrue(self::$isSetCookieInvoked);
  206. $this->assertSame(
  207. 'The cookie with "exception_cookie_name" cookieName couldn\'t be deleted.',
  208. $fse->getMessage()
  209. );
  210. }
  211. }
  212. /**
  213. * @param string $cookieName
  214. * @param bool $secure
  215. * @dataProvider isCurrentlySecureDataProvider
  216. */
  217. public function testSetSensitiveCookieNoMetadata($cookieName, $secure)
  218. {
  219. self::$isSetCookieInvoked = false;
  220. /** @var SensitiveCookieMetadata $sensitiveCookieMetadata */
  221. $sensitiveCookieMetadata = $this->objectManager
  222. ->getObject(
  223. \Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata::class,
  224. [
  225. 'request' => $this->requestMock
  226. ]
  227. );
  228. $this->scopeMock->expects($this->once())
  229. ->method('getSensitiveCookieMetadata')
  230. ->with()
  231. ->will(
  232. $this->returnValue($sensitiveCookieMetadata)
  233. );
  234. $this->requestMock->expects($this->once())
  235. ->method('isSecure')
  236. ->will($this->returnValue($secure));
  237. $this->cookieManager->setSensitiveCookie(
  238. $cookieName,
  239. 'cookie_value'
  240. );
  241. $this->assertTrue(self::$isSetCookieInvoked);
  242. }
  243. /**
  244. * @return array
  245. */
  246. public function isCurrentlySecureDataProvider()
  247. {
  248. return [
  249. [self::SENSITIVE_COOKIE_NAME_NO_METADATA_HTTPS, true],
  250. [self::SENSITIVE_COOKIE_NAME_NO_METADATA_NOT_HTTPS, false]
  251. ];
  252. }
  253. public function testSetSensitiveCookieNullDomainAndPath()
  254. {
  255. self::$isSetCookieInvoked = false;
  256. /** @var SensitiveCookieMetadata $sensitiveCookieMetadata */
  257. $sensitiveCookieMetadata = $this->objectManager
  258. ->getObject(
  259. \Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata::class,
  260. [
  261. 'request' => $this->requestMock,
  262. 'metadata' => [
  263. 'domain' => null,
  264. 'path' => null,
  265. ],
  266. ]
  267. );
  268. $this->scopeMock->expects($this->once())
  269. ->method('getSensitiveCookieMetadata')
  270. ->with($sensitiveCookieMetadata)
  271. ->will(
  272. $this->returnValue($sensitiveCookieMetadata)
  273. );
  274. $this->requestMock->expects($this->once())
  275. ->method('isSecure')
  276. ->will($this->returnValue(true));
  277. $this->cookieManager->setSensitiveCookie(
  278. self::SENSITIVE_COOKIE_NAME_NO_DOMAIN_NO_PATH,
  279. 'cookie_value',
  280. $sensitiveCookieMetadata
  281. );
  282. $this->assertTrue(self::$isSetCookieInvoked);
  283. }
  284. public function testSetSensitiveCookieWithPathAndDomain()
  285. {
  286. self::$isSetCookieInvoked = false;
  287. /** @var SensitiveCookieMetadata $sensitiveCookieMetadata */
  288. $sensitiveCookieMetadata = $this->objectManager
  289. ->getObject(
  290. \Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata::class,
  291. [
  292. 'request' => $this->requestMock,
  293. 'metadata' => [
  294. 'domain' => 'magento.url',
  295. 'path' => '/backend',
  296. ],
  297. ]
  298. );
  299. $this->scopeMock->expects($this->once())
  300. ->method('getSensitiveCookieMetadata')
  301. ->with($sensitiveCookieMetadata)
  302. ->will(
  303. $this->returnValue($sensitiveCookieMetadata)
  304. );
  305. $this->requestMock->expects($this->once())
  306. ->method('isSecure')
  307. ->will($this->returnValue(false));
  308. $this->cookieManager->setSensitiveCookie(
  309. self::SENSITIVE_COOKIE_NAME_WITH_DOMAIN_AND_PATH,
  310. 'cookie_value',
  311. $sensitiveCookieMetadata
  312. );
  313. $this->assertTrue(self::$isSetCookieInvoked);
  314. }
  315. public function testSetPublicCookieNoMetadata()
  316. {
  317. self::$isSetCookieInvoked = false;
  318. /** @var PublicCookieMetadata $publicCookieMetadata */
  319. $publicCookieMetadata = $this->objectManager->getObject(
  320. \Magento\Framework\Stdlib\Cookie\PublicCookieMetadata::class
  321. );
  322. $this->scopeMock->expects($this->once())
  323. ->method('getPublicCookieMetadata')
  324. ->with()
  325. ->will(
  326. $this->returnValue($publicCookieMetadata)
  327. );
  328. $this->cookieManager->setPublicCookie(
  329. self::PUBLIC_COOKIE_NAME_NO_METADATA,
  330. 'cookie_value'
  331. );
  332. $this->assertTrue(self::$isSetCookieInvoked);
  333. }
  334. public function testSetPublicCookieDefaultValues()
  335. {
  336. /** @var PublicCookieMetadata $publicCookieMetadata */
  337. $publicCookieMetadata = $this->objectManager->getObject(
  338. \Magento\Framework\Stdlib\Cookie\PublicCookieMetadata::class,
  339. [
  340. 'metadata' => [
  341. 'domain' => null,
  342. 'path' => null,
  343. 'secure' => false,
  344. 'http_only' => false,
  345. ],
  346. ]
  347. );
  348. $this->scopeMock->expects($this->once())
  349. ->method('getPublicCookieMetadata')
  350. ->with($publicCookieMetadata)
  351. ->will(
  352. $this->returnValue($publicCookieMetadata)
  353. );
  354. $this->cookieManager->setPublicCookie(
  355. self::PUBLIC_COOKIE_NAME_DEFAULT_VALUES,
  356. 'cookie_value',
  357. $publicCookieMetadata
  358. );
  359. $this->assertTrue(self::$isSetCookieInvoked);
  360. }
  361. public function testSetPublicCookieSomeFieldsSet()
  362. {
  363. self::$isSetCookieInvoked = false;
  364. /** @var PublicCookieMetadata $publicCookieMetadata */
  365. $publicCookieMetadata = $this->objectManager->getObject(
  366. \Magento\Framework\Stdlib\Cookie\PublicCookieMetadata::class,
  367. [
  368. 'metadata' => [
  369. 'domain' => 'magento.url',
  370. 'path' => '/backend',
  371. 'http_only' => true,
  372. ],
  373. ]
  374. );
  375. $this->scopeMock->expects($this->once())
  376. ->method('getPublicCookieMetadata')
  377. ->with($publicCookieMetadata)
  378. ->will(
  379. $this->returnValue($publicCookieMetadata)
  380. );
  381. $this->cookieManager->setPublicCookie(
  382. self::PUBLIC_COOKIE_NAME_SOME_FIELDS_SET,
  383. 'cookie_value',
  384. $publicCookieMetadata
  385. );
  386. $this->assertTrue(self::$isSetCookieInvoked);
  387. }
  388. public function testSetCookieBadName()
  389. {
  390. /** @var \Magento\Framework\Stdlib\Cookie\PublicCookieMetadata $publicCookieMetadata */
  391. $publicCookieMetadata = $this->objectManager->getObject(
  392. \Magento\Framework\Stdlib\Cookie\PublicCookieMetadata::class,
  393. [
  394. 'metadata' => [
  395. 'domain' => null,
  396. 'path' => null,
  397. 'secure' => false,
  398. 'http_only' => false,
  399. ],
  400. ]
  401. );
  402. $badCookieName = '';
  403. $cookieValue = 'some_value';
  404. $this->scopeMock->expects($this->once())
  405. ->method('getPublicCookieMetadata')
  406. ->with()
  407. ->will(
  408. $this->returnValue($publicCookieMetadata)
  409. );
  410. try {
  411. $this->cookieManager->setPublicCookie(
  412. $badCookieName,
  413. $cookieValue,
  414. $publicCookieMetadata
  415. );
  416. $this->fail('Failed to throw exception of bad cookie name');
  417. } catch (InputException $e) {
  418. $this->assertEquals(
  419. 'Cookie name cannot be empty and cannot contain these characters: =,; \\t\\r\\n\\013\\014',
  420. $e->getMessage()
  421. );
  422. }
  423. }
  424. public function testSetCookieSizeTooLarge()
  425. {
  426. /** @var PublicCookieMetadata $publicCookieMetadata */
  427. $publicCookieMetadata = $this->objectManager->getObject(
  428. \Magento\Framework\Stdlib\Cookie\PublicCookieMetadata::class,
  429. [
  430. 'metadata' => [
  431. 'domain' => null,
  432. 'path' => null,
  433. 'secure' => false,
  434. 'http_only' => false,
  435. 'duration' => 3600,
  436. ],
  437. ]
  438. );
  439. $this->scopeMock->expects($this->once())
  440. ->method('getPublicCookieMetadata')
  441. ->with()
  442. ->will(
  443. $this->returnValue($publicCookieMetadata)
  444. );
  445. $cookieValue = '';
  446. $cookieManager = $this->cookieManager;
  447. for ($i = 0; $i < $cookieManager::MAX_COOKIE_SIZE + 1; $i++) {
  448. $cookieValue = $cookieValue . 'a';
  449. }
  450. try {
  451. $this->cookieManager->setPublicCookie(
  452. self::MAX_COOKIE_SIZE_TEST_NAME,
  453. $cookieValue,
  454. $publicCookieMetadata
  455. );
  456. $this->fail('Failed to throw exception of excess cookie size.');
  457. } catch (CookieSizeLimitReachedException $e) {
  458. $this->assertEquals(
  459. "Unable to send the cookie. Size of 'max_cookie_size_test_name' is 4123 bytes.",
  460. $e->getMessage()
  461. );
  462. }
  463. }
  464. public function testSetTooManyCookies()
  465. {
  466. /** @var PublicCookieMetadata $publicCookieMetadata */
  467. $publicCookieMetadata = $this->objectManager->getObject(
  468. \Magento\Framework\Stdlib\Cookie\PublicCookieMetadata::class
  469. );
  470. $userAgent = 'some_user_agent';
  471. $cookieManager = $this->cookieManager;
  472. // Set $cookieManager::MAX_NUM_COOKIES number of cookies in superglobal $_COOKIE.
  473. for ($i = count($_COOKIE); $i < $cookieManager::MAX_NUM_COOKIES; $i++) {
  474. $_COOKIE['test_cookie_' . $i] = self::COOKIE_VALUE . '_' . $i;
  475. }
  476. $this->scopeMock->expects($this->once())
  477. ->method('getPublicCookieMetadata')
  478. ->with()
  479. ->will(
  480. $this->returnValue($publicCookieMetadata)
  481. );
  482. $this->httpHeaderMock->expects($this->any())
  483. ->method('getHttpUserAgent')
  484. ->willReturn($userAgent);
  485. $this->loggerMock->expects($this->once())
  486. ->method('warning')
  487. ->with(
  488. new Phrase('Unable to send the cookie. Maximum number of cookies would be exceeded.'),
  489. array_merge($_COOKIE, ['user-agent' => $userAgent])
  490. );
  491. $this->cookieManager->setPublicCookie(
  492. self::MAX_COOKIE_SIZE_TEST_NAME,
  493. self::COOKIE_VALUE,
  494. $publicCookieMetadata
  495. );
  496. }
  497. /**
  498. * Assert public, sensitive and delete cookie
  499. *
  500. * Suppressing UnusedFormalParameter, since PHPMD doesn't detect the callback call.
  501. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  502. */
  503. public static function assertCookie($name, $value, $expiry, $path, $domain, $secure, $httpOnly)
  504. {
  505. if (self::EXCEPTION_COOKIE_NAME == $name) {
  506. return false;
  507. } elseif (isset(self::$functionTestAssertionMapping[$name])) {
  508. call_user_func_array(self::$functionTestAssertionMapping[$name], func_get_args());
  509. } else {
  510. self::fail('Non-tested case in mock setcookie()');
  511. }
  512. return true;
  513. }
  514. /**
  515. * Assert delete cookie
  516. *
  517. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  518. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  519. */
  520. private static function assertDeleteCookie(
  521. $name,
  522. $value,
  523. $expiry,
  524. $path,
  525. $domain,
  526. $secure,
  527. $httpOnly
  528. ) {
  529. self::assertEquals(self::DELETE_COOKIE_NAME, $name);
  530. self::assertEquals('', $value);
  531. self::assertEquals($expiry, PhpCookieManager::EXPIRE_NOW_TIME);
  532. self::assertFalse($secure);
  533. self::assertFalse($httpOnly);
  534. self::assertEquals('magento.url', $domain);
  535. self::assertEquals('/backend', $path);
  536. }
  537. /**
  538. * Assert delete cookie with no meta data
  539. *
  540. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  541. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  542. */
  543. private static function assertDeleteCookieWithNoMetadata(
  544. $name,
  545. $value,
  546. $expiry,
  547. $path,
  548. $domain,
  549. $secure,
  550. $httpOnly
  551. ) {
  552. self::assertEquals(self::DELETE_COOKIE_NAME_NO_METADATA, $name);
  553. self::assertEquals('', $value);
  554. self::assertEquals($expiry, PhpCookieManager::EXPIRE_NOW_TIME);
  555. self::assertFalse($secure);
  556. self::assertFalse($httpOnly);
  557. self::assertEquals('', $domain);
  558. self::assertEquals('', $path);
  559. }
  560. /**
  561. * Assert sensitive cookie with no meta data
  562. *
  563. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  564. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  565. */
  566. private static function assertSensitiveCookieWithNoMetaDataHttps(
  567. $name,
  568. $value,
  569. $expiry,
  570. $path,
  571. $domain,
  572. $secure,
  573. $httpOnly
  574. ) {
  575. self::assertEquals(self::SENSITIVE_COOKIE_NAME_NO_METADATA_HTTPS, $name);
  576. self::assertEquals(self::COOKIE_VALUE, $value);
  577. self::assertEquals(PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME, $expiry);
  578. self::assertTrue($secure);
  579. self::assertTrue($httpOnly);
  580. self::assertEquals('', $domain);
  581. self::assertEquals('', $path);
  582. }
  583. /**
  584. * Assert sensitive cookie with no meta data
  585. *
  586. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  587. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  588. */
  589. private static function assertSensitiveCookieWithNoMetaDataNotHttps(
  590. $name,
  591. $value,
  592. $expiry,
  593. $path,
  594. $domain,
  595. $secure,
  596. $httpOnly
  597. ) {
  598. self::assertEquals(self::SENSITIVE_COOKIE_NAME_NO_METADATA_NOT_HTTPS, $name);
  599. self::assertEquals(self::COOKIE_VALUE, $value);
  600. self::assertEquals(PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME, $expiry);
  601. self::assertFalse($secure);
  602. self::assertTrue($httpOnly);
  603. self::assertEquals('', $domain);
  604. self::assertEquals('', $path);
  605. }
  606. /**
  607. * Assert sensitive cookie with no domain and path
  608. *
  609. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  610. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  611. */
  612. private static function assertSensitiveCookieNoDomainNoPath(
  613. $name,
  614. $value,
  615. $expiry,
  616. $path,
  617. $domain,
  618. $secure,
  619. $httpOnly
  620. ) {
  621. self::assertEquals(self::SENSITIVE_COOKIE_NAME_NO_DOMAIN_NO_PATH, $name);
  622. self::assertEquals(self::COOKIE_VALUE, $value);
  623. self::assertEquals(PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME, $expiry);
  624. self::assertTrue($secure);
  625. self::assertTrue($httpOnly);
  626. self::assertEquals('', $domain);
  627. self::assertEquals('', $path);
  628. }
  629. /**
  630. * Assert sensitive cookie with domain and path
  631. *
  632. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  633. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  634. */
  635. private static function assertSensitiveCookieWithDomainAndPath(
  636. $name,
  637. $value,
  638. $expiry,
  639. $path,
  640. $domain,
  641. $secure,
  642. $httpOnly
  643. ) {
  644. self::assertEquals(self::SENSITIVE_COOKIE_NAME_WITH_DOMAIN_AND_PATH, $name);
  645. self::assertEquals(self::COOKIE_VALUE, $value);
  646. self::assertEquals(PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME, $expiry);
  647. self::assertFalse($secure);
  648. self::assertTrue($httpOnly);
  649. self::assertEquals('magento.url', $domain);
  650. self::assertEquals('/backend', $path);
  651. }
  652. /**
  653. * Assert public cookie with no metadata
  654. *
  655. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  656. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  657. */
  658. private static function assertPublicCookieWithNoMetaData(
  659. $name,
  660. $value,
  661. $expiry,
  662. $path,
  663. $domain,
  664. $secure,
  665. $httpOnly
  666. ) {
  667. self::assertEquals(self::PUBLIC_COOKIE_NAME_NO_METADATA, $name);
  668. self::assertEquals(self::COOKIE_VALUE, $value);
  669. self::assertEquals(self::COOKIE_EXPIRE_END_OF_SESSION, $expiry);
  670. self::assertFalse($secure);
  671. self::assertFalse($httpOnly);
  672. self::assertEquals('', $domain);
  673. self::assertEquals('', $path);
  674. }
  675. /**
  676. * Assert public cookie with no domain and path
  677. *
  678. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  679. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  680. */
  681. private static function assertPublicCookieWithNoDomainNoPath(
  682. $name,
  683. $value,
  684. $expiry,
  685. $path,
  686. $domain,
  687. $secure,
  688. $httpOnly
  689. ) {
  690. self::assertEquals(self::PUBLIC_COOKIE_NAME_NO_METADATA, $name);
  691. self::assertEquals(self::COOKIE_VALUE, $value);
  692. self::assertEquals(PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME, $expiry);
  693. self::assertTrue($secure);
  694. self::assertTrue($httpOnly);
  695. self::assertEquals('magento.url', $domain);
  696. self::assertEquals('/backend', $path);
  697. }
  698. /**
  699. * Assert public cookie with default values
  700. *
  701. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  702. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  703. */
  704. private static function assertPublicCookieWithDefaultValues(
  705. $name,
  706. $value,
  707. $expiry,
  708. $path,
  709. $domain,
  710. $secure,
  711. $httpOnly
  712. ) {
  713. self::assertEquals(self::PUBLIC_COOKIE_NAME_DEFAULT_VALUES, $name);
  714. self::assertEquals(self::COOKIE_VALUE, $value);
  715. self::assertEquals(self::COOKIE_EXPIRE_END_OF_SESSION, $expiry);
  716. self::assertFalse($secure);
  717. self::assertFalse($httpOnly);
  718. self::assertEquals('', $domain);
  719. self::assertEquals('', $path);
  720. }
  721. /**
  722. * Assert public cookie with no field set
  723. *
  724. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  725. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  726. */
  727. private static function assertPublicCookieWithSomeFieldSet(
  728. $name,
  729. $value,
  730. $expiry,
  731. $path,
  732. $domain,
  733. $secure,
  734. $httpOnly
  735. ) {
  736. self::assertEquals(self::PUBLIC_COOKIE_NAME_SOME_FIELDS_SET, $name);
  737. self::assertEquals(self::COOKIE_VALUE, $value);
  738. self::assertEquals(self::COOKIE_EXPIRE_END_OF_SESSION, $expiry);
  739. self::assertFalse($secure);
  740. self::assertTrue($httpOnly);
  741. self::assertEquals('magento.url', $domain);
  742. self::assertEquals('/backend', $path);
  743. }
  744. /**
  745. * Assert cookie size
  746. *
  747. * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
  748. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  749. */
  750. private static function assertCookieSize(
  751. $name,
  752. $value,
  753. $expiry,
  754. $path,
  755. $domain,
  756. $secure,
  757. $httpOnly
  758. ) {
  759. self::assertEquals(self::MAX_COOKIE_SIZE_TEST_NAME, $name);
  760. self::assertEquals(self::COOKIE_VALUE, $value);
  761. self::assertEquals(self::COOKIE_EXPIRE_END_OF_SESSION, $expiry);
  762. self::assertFalse($secure);
  763. self::assertFalse($httpOnly);
  764. self::assertEquals('', $domain);
  765. self::assertEquals('', $path);
  766. }
  767. /**
  768. * @param $get
  769. * @param $default
  770. * @param $return
  771. */
  772. protected function stubGetCookie($get, $default, $return)
  773. {
  774. $this->readerMock->expects($this->atLeastOnce())
  775. ->method('getCookie')
  776. ->with($get, $default)
  777. ->willReturn($return);
  778. }
  779. }
  780. }