PageRenderTime 54ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/ZendTest/Http/Header/SetCookieTest.php

https://github.com/bate/zf2
PHP | 329 lines | 267 code | 33 blank | 29 comment | 2 complexity | 5f30fbb1fa9b1f67c95415d3ce5f5c1d MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework (http://framework.zend.com/)
  4. *
  5. * @link http://github.com/zendframework/zf2 for the canonical source repository
  6. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  7. * @license http://framework.zend.com/license/new-bsd New BSD License
  8. * @package Zend_Http
  9. */
  10. namespace ZendTest\Http\Header;
  11. use Zend\Http\Header\SetCookie;
  12. class SetCookieTest extends \PHPUnit_Framework_TestCase
  13. {
  14. /**
  15. * @group ZF2-254
  16. */
  17. public function testSetCookieConstructor()
  18. {
  19. $setCookieHeader = new SetCookie(
  20. 'myname', 'myvalue', 'Wed, 13-Jan-2021 22:23:01 GMT',
  21. '/accounts', 'docs.foo.com', true, true, 99, 9
  22. );
  23. $this->assertEquals('myname', $setCookieHeader->getName());
  24. $this->assertEquals('myvalue', $setCookieHeader->getValue());
  25. $this->assertEquals('Wed, 13-Jan-2021 22:23:01 GMT', $setCookieHeader->getExpires());
  26. $this->assertEquals('/accounts', $setCookieHeader->getPath());
  27. $this->assertEquals('docs.foo.com', $setCookieHeader->getDomain());
  28. $this->assertTrue($setCookieHeader->isSecure());
  29. $this->assertTrue($setCookieHeader->isHttpOnly());
  30. $this->assertEquals(99, $setCookieHeader->getMaxAge());
  31. $this->assertEquals(9, $setCookieHeader->getVersion());
  32. }
  33. public function testSetCookieFromStringCreatesValidSetCookieHeader()
  34. {
  35. $setCookieHeader = SetCookie::fromString('Set-Cookie: xxx');
  36. $this->assertInstanceOf('Zend\Http\Header\MultipleHeaderInterface', $setCookieHeader);
  37. $this->assertInstanceOf('Zend\Http\Header\HeaderInterface', $setCookieHeader);
  38. $this->assertInstanceOf('Zend\Http\Header\SetCookie', $setCookieHeader);
  39. }
  40. public function testSetCookieFromStringCanCreateSingleHeader()
  41. {
  42. $setCookieHeader = SetCookie::fromString('Set-Cookie: myname=myvalue');
  43. $this->assertInstanceOf('Zend\Http\Header\HeaderInterface', $setCookieHeader);
  44. $this->assertEquals('myname', $setCookieHeader->getName());
  45. $this->assertEquals('myvalue', $setCookieHeader->getValue());
  46. $setCookieHeader = SetCookie::fromString(
  47. 'set-cookie: myname=myvalue; Domain=docs.foo.com; Path=/accounts;'
  48. . 'Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; HttpOnly'
  49. );
  50. $this->assertInstanceOf('Zend\Http\Header\MultipleHeaderInterface', $setCookieHeader);
  51. $this->assertEquals('myname', $setCookieHeader->getName());
  52. $this->assertEquals('myvalue', $setCookieHeader->getValue());
  53. $this->assertEquals('docs.foo.com', $setCookieHeader->getDomain());
  54. $this->assertEquals('/accounts', $setCookieHeader->getPath());
  55. $this->assertEquals('Wed, 13-Jan-2021 22:23:01 GMT', $setCookieHeader->getExpires());
  56. $this->assertTrue($setCookieHeader->isSecure());
  57. $this->assertTrue($setCookieHeader->isHttponly());
  58. }
  59. public function testSetCookieFromStringCanCreateMultipleHeaders()
  60. {
  61. $setCookieHeaders = SetCookie::fromString(
  62. 'Set-Cookie: myname=myvalue, '
  63. . 'someothername=someothervalue; Domain=docs.foo.com; Path=/accounts;'
  64. . 'Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; HttpOnly'
  65. );
  66. $this->assertInternalType('array', $setCookieHeaders);
  67. $setCookieHeader = $setCookieHeaders[0];
  68. $this->assertInstanceOf('Zend\Http\Header\MultipleHeaderInterface', $setCookieHeader);
  69. $this->assertEquals('myname', $setCookieHeader->getName());
  70. $this->assertEquals('myvalue', $setCookieHeader->getValue());
  71. $setCookieHeader = $setCookieHeaders[1];
  72. $this->assertInstanceOf('Zend\Http\Header\MultipleHeaderInterface', $setCookieHeader);
  73. $this->assertEquals('someothername', $setCookieHeader->getName());
  74. $this->assertEquals('someothervalue', $setCookieHeader->getValue());
  75. $this->assertEquals('Wed, 13-Jan-2021 22:23:01 GMT', $setCookieHeader->getExpires());
  76. $this->assertEquals('docs.foo.com', $setCookieHeader->getDomain());
  77. $this->assertEquals('/accounts', $setCookieHeader->getPath());
  78. $this->assertTrue($setCookieHeader->isSecure());
  79. $this->assertTrue($setCookieHeader->isHttponly());
  80. }
  81. public function testSetCookieGetFieldNameReturnsHeaderName()
  82. {
  83. $setCookieHeader = new SetCookie();
  84. $this->assertEquals('Set-Cookie', $setCookieHeader->getFieldName());
  85. }
  86. public function testSetCookieGetFieldValueReturnsProperValue()
  87. {
  88. $setCookieHeader = new SetCookie();
  89. $setCookieHeader->setName('myname');
  90. $setCookieHeader->setValue('myvalue');
  91. $setCookieHeader->setExpires('Wed, 13-Jan-2021 22:23:01 GMT');
  92. $setCookieHeader->setDomain('docs.foo.com');
  93. $setCookieHeader->setPath('/accounts');
  94. $setCookieHeader->setSecure(true);
  95. $setCookieHeader->setHttponly(true);
  96. $target = 'myname=myvalue; Expires=Wed, 13-Jan-2021 22:23:01 GMT;'
  97. . ' Domain=docs.foo.com; Path=/accounts;'
  98. . ' Secure; HttpOnly';
  99. $this->assertEquals($target, $setCookieHeader->getFieldValue());
  100. }
  101. public function testSetCookieToStringReturnsHeaderFormattedString()
  102. {
  103. $setCookieHeader = new SetCookie();
  104. $setCookieHeader->setName('myname');
  105. $setCookieHeader->setValue('myvalue');
  106. $setCookieHeader->setExpires('Wed, 13-Jan-2021 22:23:01 GMT');
  107. $setCookieHeader->setDomain('docs.foo.com');
  108. $setCookieHeader->setPath('/accounts');
  109. $setCookieHeader->setSecure(true);
  110. $setCookieHeader->setHttponly(true);
  111. $target = 'Set-Cookie: myname=myvalue; Expires=Wed, 13-Jan-2021 22:23:01 GMT;'
  112. . ' Domain=docs.foo.com; Path=/accounts;'
  113. . ' Secure; HttpOnly';
  114. $this->assertEquals($target, $setCookieHeader->toString());
  115. }
  116. public function testSetCookieCanAppendOtherHeadersInWhenCreatingString()
  117. {
  118. $setCookieHeader = new SetCookie();
  119. $setCookieHeader->setName('myname');
  120. $setCookieHeader->setValue('myvalue');
  121. $setCookieHeader->setExpires('Wed, 13-Jan-2021 22:23:01 GMT');
  122. $setCookieHeader->setDomain('docs.foo.com');
  123. $setCookieHeader->setPath('/accounts');
  124. $setCookieHeader->setSecure(true);
  125. $setCookieHeader->setHttponly(true);
  126. $appendCookie = new SetCookie('othername', 'othervalue');
  127. $headerLine = $setCookieHeader->toStringMultipleHeaders(array($appendCookie));
  128. $target = 'Set-Cookie: myname=myvalue; Expires=Wed, 13-Jan-2021 22:23:01 GMT;'
  129. . ' Domain=docs.foo.com; Path=/accounts;'
  130. . ' Secure; HttpOnly, othername=othervalue';
  131. $this->assertEquals($target, $headerLine);
  132. }
  133. /** Implmentation specific tests here */
  134. /**
  135. * @group ZF2-169
  136. */
  137. public function testZF2_169()
  138. {
  139. $cookie = 'Set-Cookie: leo_auth_token="example"; Version=1; Max-Age=1799; Expires=Mon, 20-Feb-2012 02:49:57 GMT; Path=/';
  140. $setCookieHeader = SetCookie::fromString($cookie);
  141. $this->assertEquals($cookie, $setCookieHeader->toString());
  142. }
  143. /**
  144. * @group ZF2-169
  145. */
  146. public function testDoesNotAcceptCookieNameFromArbitraryLocationInHeaderValue()
  147. {
  148. $cookie = 'Set-Cookie: Version=1; Max-Age=1799; Expires=Mon, 20-Feb-2012 02:49:57 GMT; Path=/; leo_auth_token="example"';
  149. $setCookieHeader = SetCookie::fromString($cookie);
  150. $this->assertNotEquals('leo_auth_token', $setCookieHeader->getName());
  151. }
  152. public function testGetFieldName()
  153. {
  154. $c = new SetCookie();
  155. $this->assertEquals('Set-Cookie', $c->getFieldName());
  156. }
  157. /**
  158. * @dataProvider validCookieWithInfoProvider
  159. */
  160. public function testGetFieldValue($cStr, $info, $expected)
  161. {
  162. $cookie = SetCookie::fromString($cStr);
  163. if (! $cookie instanceof SetCookie) {
  164. $this->fail("Failed creating a cookie object from '$cStr'");
  165. }
  166. $this->assertEquals($expected, $cookie->getFieldValue());
  167. $this->assertEquals($cookie->getFieldName() . ': ' . $expected, $cookie->toString());
  168. }
  169. /**
  170. * @dataProvider validCookieWithInfoProvider
  171. */
  172. public function testToString($cStr, $info, $expected)
  173. {
  174. $cookie = SetCookie::fromString($cStr);
  175. if (! $cookie instanceof SetCookie) {
  176. $this->fail("Failed creating a cookie object from '$cStr'");
  177. }
  178. $this->assertEquals($cookie->getFieldName() . ': ' . $expected, $cookie->toString());
  179. }
  180. /**
  181. * Provide valid cookie strings with information about them
  182. *
  183. * @return array
  184. */
  185. public static function validCookieWithInfoProvider()
  186. {
  187. $now = time();
  188. $yesterday = $now - (3600 * 24);
  189. return array(
  190. array(
  191. 'Set-Cookie: justacookie=foo; domain=example.com',
  192. array(
  193. 'name' => 'justacookie',
  194. 'value' => 'foo',
  195. 'domain' => 'example.com',
  196. 'path' => '/',
  197. 'expires' => null,
  198. 'secure' => false,
  199. 'httponly'=> false
  200. ),
  201. 'justacookie=foo; Domain=example.com'
  202. ),
  203. array(
  204. 'Set-Cookie: expires=tomorrow; secure; path=/Space Out/; expires=Tue, 21-Nov-2006 08:33:44 GMT; domain=.example.com',
  205. array(
  206. 'name' => 'expires',
  207. 'value' => 'tomorrow',
  208. 'domain' => '.example.com',
  209. 'path' => '/Space Out/',
  210. 'expires' => strtotime('Tue, 21-Nov-2006 08:33:44 GMT'),
  211. 'secure' => true,
  212. 'httponly'=> false
  213. ),
  214. 'expires=tomorrow; Expires=Tue, 21-Nov-2006 08:33:44 GMT; Domain=.example.com; Path=/Space Out/; Secure'
  215. ),
  216. array(
  217. 'Set-Cookie: domain=unittests; expires=' . gmdate('D, d-M-Y H:i:s', $now) . ' GMT; domain=example.com; path=/some%20value/',
  218. array(
  219. 'name' => 'domain',
  220. 'value' => 'unittests',
  221. 'domain' => 'example.com',
  222. 'path' => '/some%20value/',
  223. 'expires' => $now,
  224. 'secure' => false,
  225. 'httponly'=> false
  226. ),
  227. 'domain=unittests; Expires=' . gmdate('D, d-M-Y H:i:s', $now) . ' GMT; Domain=example.com; Path=/some%20value/'
  228. ),
  229. array(
  230. 'Set-Cookie: path=indexAction; path=/; domain=.foo.com; expires=' . gmdate('D, d-M-Y H:i:s', $yesterday) . ' GMT',
  231. array(
  232. 'name' => 'path',
  233. 'value' => 'indexAction',
  234. 'domain' => '.foo.com',
  235. 'path' => '/',
  236. 'expires' => $yesterday,
  237. 'secure' => false,
  238. 'httponly'=> false
  239. ),
  240. 'path=indexAction; Expires=' . gmdate('D, d-M-Y H:i:s', $yesterday) . ' GMT; Domain=.foo.com; Path=/'
  241. ),
  242. array(
  243. 'Set-Cookie: secure=sha1; secure; SECURE; domain=some.really.deep.domain.com',
  244. array(
  245. 'name' => 'secure',
  246. 'value' => 'sha1',
  247. 'domain' => 'some.really.deep.domain.com',
  248. 'path' => '/',
  249. 'expires' => null,
  250. 'secure' => true,
  251. 'httponly'=> false
  252. ),
  253. 'secure=sha1; Domain=some.really.deep.domain.com; Secure'
  254. ),
  255. array(
  256. 'Set-Cookie: justacookie=foo; domain=example.com; httpOnly',
  257. array(
  258. 'name' => 'justacookie',
  259. 'value' => 'foo',
  260. 'domain' => 'example.com',
  261. 'path' => '/',
  262. 'expires' => null,
  263. 'secure' => false,
  264. 'httponly'=> true
  265. ),
  266. 'justacookie=foo; Domain=example.com; HttpOnly'
  267. ),
  268. array(
  269. 'Set-Cookie: PHPSESSID=123456789+abcd%2Cef; secure; domain=.localdomain; path=/foo/baz; expires=Tue, 21-Nov-2006 08:33:44 GMT;',
  270. array(
  271. 'name' => 'PHPSESSID',
  272. 'value' => '123456789+abcd%2Cef',
  273. 'domain' => '.localdomain',
  274. 'path' => '/foo/baz',
  275. 'expires' => 'Tue, 21-Nov-2006 08:33:44 GMT',
  276. 'secure' => true,
  277. 'httponly'=> false
  278. ),
  279. 'PHPSESSID=123456789%2Babcd%252Cef; Expires=Tue, 21-Nov-2006 08:33:44 GMT; Domain=.localdomain; Path=/foo/baz; Secure'
  280. ),
  281. array(
  282. 'Set-Cookie: myname=myvalue; Domain=docs.foo.com; Path=/accounts; Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; HttpOnly',
  283. array(
  284. 'name' => 'myname',
  285. 'value' => 'myvalue',
  286. 'domain' => 'docs.foo.com',
  287. 'path' => '/accounts',
  288. 'expires' => 'Wed, 13-Jan-2021 22:23:01 GMT',
  289. 'secure' => true,
  290. 'httponly'=> true
  291. ),
  292. 'myname=myvalue; Expires=Wed, 13-Jan-2021 22:23:01 GMT; Domain=docs.foo.com; Path=/accounts; Secure; HttpOnly'
  293. ),
  294. );
  295. }
  296. }