pictcode / lib / Cake / Test / Case / Model / Datasource / CakeSessionTest.php @ 4c96e5a3
履歴 | 表示 | アノテート | ダウンロード (22.474 KB)
| 1 | 635eef61 | spyder1211 | <?php
 | 
      
|---|---|---|---|
| 2 | /**
 | 
      ||
| 3 |  * SessionTest file
 | 
      ||
| 4 |  *
 | 
      ||
| 5 |  * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
 | 
      ||
| 6 |  * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 | 
      ||
| 7 |  *
 | 
      ||
| 8 |  * Licensed under The MIT License
 | 
      ||
| 9 |  * For full copyright and license information, please see the LICENSE.txt
 | 
      ||
| 10 |  * Redistributions of files must retain the above copyright notice
 | 
      ||
| 11 |  *
 | 
      ||
| 12 |  * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 | 
      ||
| 13 |  * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
 | 
      ||
| 14 |  * @package       Cake.Test.Case.Model.Datasource
 | 
      ||
| 15 |  * @since         CakePHP(tm) v 1.2.0.4206
 | 
      ||
| 16 |  * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 | 
      ||
| 17 |  */
 | 
      ||
| 18 | |||
| 19 | App::uses('CakeSession', 'Model/Datasource');  | 
      ||
| 20 | App::uses('DatabaseSession', 'Model/Datasource/Session');  | 
      ||
| 21 | App::uses('CacheSession', 'Model/Datasource/Session');  | 
      ||
| 22 | |||
| 23 | /**
 | 
      ||
| 24 |  * Class TestCakeSession
 | 
      ||
| 25 |  *
 | 
      ||
| 26 |  * @package       Cake.Test.Case.Model.Datasource
 | 
      ||
| 27 |  */
 | 
      ||
| 28 | class TestCakeSession extends CakeSession {  | 
      ||
| 29 | |||
| 30 | public static function setUserAgent($value) {  | 
      ||
| 31 | static::$_userAgent = $value;  | 
      ||
| 32 | }  | 
      ||
| 33 | |||
| 34 | public static function setHost($host) {  | 
      ||
| 35 | static::_setHost($host);  | 
      ||
| 36 | }  | 
      ||
| 37 | |||
| 38 | }  | 
      ||
| 39 | |||
| 40 | /**
 | 
      ||
| 41 |  * Class TestCacheSession
 | 
      ||
| 42 |  *
 | 
      ||
| 43 |  * @package       Cake.Test.Case.Model.Datasource
 | 
      ||
| 44 |  */
 | 
      ||
| 45 | class TestCacheSession extends CacheSession {  | 
      ||
| 46 | |||
| 47 | protected function _writeSession() {  | 
      ||
| 48 | return true;  | 
      ||
| 49 | }  | 
      ||
| 50 | |||
| 51 | }  | 
      ||
| 52 | |||
| 53 | /**
 | 
      ||
| 54 |  * Class TestDatabaseSession
 | 
      ||
| 55 |  *
 | 
      ||
| 56 |  * @package       Cake.Test.Case.Model.Datasource
 | 
      ||
| 57 |  */
 | 
      ||
| 58 | class TestDatabaseSession extends DatabaseSession {  | 
      ||
| 59 | |||
| 60 | protected function _writeSession() {  | 
      ||
| 61 | return true;  | 
      ||
| 62 | }  | 
      ||
| 63 | |||
| 64 | }  | 
      ||
| 65 | |||
| 66 | /**
 | 
      ||
| 67 |  * CakeSessionTest class
 | 
      ||
| 68 |  *
 | 
      ||
| 69 |  * @package       Cake.Test.Case.Model.Datasource
 | 
      ||
| 70 |  */
 | 
      ||
| 71 | class CakeSessionTest extends CakeTestCase {  | 
      ||
| 72 | |||
| 73 | protected static $_gcDivisor;  | 
      ||
| 74 | |||
| 75 | /**
 | 
      ||
| 76 |  * Fixtures used in the SessionTest
 | 
      ||
| 77 |  *
 | 
      ||
| 78 |  * @var array
 | 
      ||
| 79 |  */
 | 
      ||
| 80 | public $fixtures = array('core.session');  | 
      ||
| 81 | |||
| 82 | /**
 | 
      ||
| 83 |  * setup before class.
 | 
      ||
| 84 |  *
 | 
      ||
| 85 |  * @return void
 | 
      ||
| 86 |  */
 | 
      ||
| 87 | public static function setupBeforeClass() {  | 
      ||
| 88 |                 // Make sure garbage colector will be called
 | 
      ||
| 89 | static::$_gcDivisor = ini_get('session.gc_divisor');  | 
      ||
| 90 | ini_set('session.gc_divisor', '1');  | 
      ||
| 91 | }  | 
      ||
| 92 | |||
| 93 | /**
 | 
      ||
| 94 |  * teardown after class
 | 
      ||
| 95 |  *
 | 
      ||
| 96 |  * @return void
 | 
      ||
| 97 |  */
 | 
      ||
| 98 | public static function teardownAfterClass() {  | 
      ||
| 99 |                 // Revert to the default setting
 | 
      ||
| 100 | ini_set('session.gc_divisor', static::$_gcDivisor);  | 
      ||
| 101 | }  | 
      ||
| 102 | |||
| 103 | /**
 | 
      ||
| 104 |  * setUp method
 | 
      ||
| 105 |  *
 | 
      ||
| 106 |  * @return void
 | 
      ||
| 107 |  */
 | 
      ||
| 108 | public function setUp() {  | 
      ||
| 109 |                 parent::setUp();
 | 
      ||
| 110 | Configure::write('Session', array(  | 
      ||
| 111 | 'defaults' => 'php',  | 
      ||
| 112 | 'cookie' => 'cakephp',  | 
      ||
| 113 | 'timeout' => 120,  | 
      ||
| 114 | 'cookieTimeout' => 120,  | 
      ||
| 115 | 'ini' => array(),  | 
      ||
| 116 | ));  | 
      ||
| 117 | }  | 
      ||
| 118 | |||
| 119 | /**
 | 
      ||
| 120 |  * tearDown method
 | 
      ||
| 121 |  *
 | 
      ||
| 122 |  * @return void
 | 
      ||
| 123 |  */
 | 
      ||
| 124 | public function tearDown() {  | 
      ||
| 125 | if (TestCakeSession::started()) {  | 
      ||
| 126 | session_write_close();  | 
      ||
| 127 | }  | 
      ||
| 128 | unset($_SESSION);  | 
      ||
| 129 |                 parent::tearDown();
 | 
      ||
| 130 | }  | 
      ||
| 131 | |||
| 132 | /**
 | 
      ||
| 133 |  * test setting ini properties with Session configuration.
 | 
      ||
| 134 |  *
 | 
      ||
| 135 |  * @return void
 | 
      ||
| 136 |  */
 | 
      ||
| 137 | public function testSessionConfigIniSetting() {  | 
      ||
| 138 | $_SESSION = null;  | 
      ||
| 139 | |||
| 140 | Configure::write('Session', array(  | 
      ||
| 141 | 'cookie' => 'test',  | 
      ||
| 142 | 'checkAgent' => false,  | 
      ||
| 143 | 'timeout' => 86400,  | 
      ||
| 144 | 'ini' => array(  | 
      ||
| 145 | 'session.referer_check' => 'example.com',  | 
      ||
| 146 | 'session.use_trans_sid' => false  | 
      ||
| 147 | )  | 
      ||
| 148 | ));  | 
      ||
| 149 |                 TestCakeSession::start();
 | 
      ||
| 150 | $this->assertEquals('', ini_get('session.use_trans_sid'), 'Ini value is incorrect');  | 
      ||
| 151 | $this->assertEquals('example.com', ini_get('session.referer_check'), 'Ini value is incorrect');  | 
      ||
| 152 | $this->assertEquals('test', ini_get('session.name'), 'Ini value is incorrect');  | 
      ||
| 153 | }  | 
      ||
| 154 | |||
| 155 | /**
 | 
      ||
| 156 |  * testSessionPath
 | 
      ||
| 157 |  *
 | 
      ||
| 158 |  * @return void
 | 
      ||
| 159 |  */
 | 
      ||
| 160 | public function testSessionPath() {  | 
      ||
| 161 | TestCakeSession::init('/index.php');  | 
      ||
| 162 | $this->assertEquals('/', TestCakeSession::$path);  | 
      ||
| 163 | |||
| 164 | TestCakeSession::init('/sub_dir/index.php');  | 
      ||
| 165 | $this->assertEquals('/sub_dir/', TestCakeSession::$path);  | 
      ||
| 166 | }  | 
      ||
| 167 | |||
| 168 | /**
 | 
      ||
| 169 |  * testCakeSessionPathEmpty
 | 
      ||
| 170 |  *
 | 
      ||
| 171 |  * @return void
 | 
      ||
| 172 |  */
 | 
      ||
| 173 | public function testCakeSessionPathEmpty() {  | 
      ||
| 174 | TestCakeSession::init('');  | 
      ||
| 175 | $this->assertEquals('/', TestCakeSession::$path, 'Session path is empty, with "" as $base needs to be /');  | 
      ||
| 176 | }  | 
      ||
| 177 | |||
| 178 | /**
 | 
      ||
| 179 |  * testCakeSessionPathContainsParams
 | 
      ||
| 180 |  *
 | 
      ||
| 181 |  * @return void
 | 
      ||
| 182 |  */
 | 
      ||
| 183 | public function testCakeSessionPathContainsQuestion() {  | 
      ||
| 184 | TestCakeSession::init('/index.php?');  | 
      ||
| 185 | $this->assertEquals('/', TestCakeSession::$path);  | 
      ||
| 186 | }  | 
      ||
| 187 | |||
| 188 | /**
 | 
      ||
| 189 |  * testSetHost
 | 
      ||
| 190 |  *
 | 
      ||
| 191 |  * @return void
 | 
      ||
| 192 |  */
 | 
      ||
| 193 | public function testSetHost() {  | 
      ||
| 194 |                 TestCakeSession::init();
 | 
      ||
| 195 | TestCakeSession::setHost('cakephp.org');  | 
      ||
| 196 | $this->assertEquals('cakephp.org', TestCakeSession::$host);  | 
      ||
| 197 | }  | 
      ||
| 198 | |||
| 199 | /**
 | 
      ||
| 200 |  * testSetHostWithPort
 | 
      ||
| 201 |  *
 | 
      ||
| 202 |  * @return void
 | 
      ||
| 203 |  */
 | 
      ||
| 204 | public function testSetHostWithPort() {  | 
      ||
| 205 |                 TestCakeSession::init();
 | 
      ||
| 206 | TestCakeSession::setHost('cakephp.org:443');  | 
      ||
| 207 | $this->assertEquals('cakephp.org', TestCakeSession::$host);  | 
      ||
| 208 | }  | 
      ||
| 209 | |||
| 210 | /**
 | 
      ||
| 211 |  * test valid with bogus user agent.
 | 
      ||
| 212 |  *
 | 
      ||
| 213 |  * @return void
 | 
      ||
| 214 |  */
 | 
      ||
| 215 | public function testValidBogusUserAgent() {  | 
      ||
| 216 | Configure::write('Session.checkAgent', true);  | 
      ||
| 217 |                 TestCakeSession::start();
 | 
      ||
| 218 | $this->assertTrue(TestCakeSession::valid(), 'Newly started session should be valid');  | 
      ||
| 219 | |||
| 220 | TestCakeSession::userAgent('bogus!');  | 
      ||
| 221 | $this->assertFalse(TestCakeSession::valid(), 'user agent mismatch should fail.');  | 
      ||
| 222 | }  | 
      ||
| 223 | |||
| 224 | /**
 | 
      ||
| 225 |  * test valid with bogus user agent.
 | 
      ||
| 226 |  *
 | 
      ||
| 227 |  * @return void
 | 
      ||
| 228 |  */
 | 
      ||
| 229 | public function testValidTimeExpiry() {  | 
      ||
| 230 | Configure::write('Session.checkAgent', true);  | 
      ||
| 231 |                 TestCakeSession::start();
 | 
      ||
| 232 | $this->assertTrue(TestCakeSession::valid(), 'Newly started session should be valid');  | 
      ||
| 233 | |||
| 234 | TestCakeSession::$time = strtotime('next year');  | 
      ||
| 235 | $this->assertFalse(TestCakeSession::valid(), 'time should cause failure.');  | 
      ||
| 236 | }  | 
      ||
| 237 | |||
| 238 | /**
 | 
      ||
| 239 |  * testCheck method
 | 
      ||
| 240 |  *
 | 
      ||
| 241 |  * @return void
 | 
      ||
| 242 |  */
 | 
      ||
| 243 | public function testCheck() {  | 
      ||
| 244 | TestCakeSession::write('SessionTestCase', 'value');  | 
      ||
| 245 | $this->assertTrue(TestCakeSession::check('SessionTestCase'));  | 
      ||
| 246 | |||
| 247 | $this->assertFalse(TestCakeSession::check('NotExistingSessionTestCase'));  | 
      ||
| 248 | }  | 
      ||
| 249 | |||
| 250 | /**
 | 
      ||
| 251 |  * testSimpleRead method
 | 
      ||
| 252 |  *
 | 
      ||
| 253 |  * @return void
 | 
      ||
| 254 |  */
 | 
      ||
| 255 | public function testSimpleRead() {  | 
      ||
| 256 | TestCakeSession::write('testing', '1,2,3');  | 
      ||
| 257 | $result = TestCakeSession::read('testing');  | 
      ||
| 258 | $this->assertEquals('1,2,3', $result);  | 
      ||
| 259 | |||
| 260 | TestCakeSession::write('testing', array('1' => 'one', '2' => 'two', '3' => 'three'));  | 
      ||
| 261 | $result = TestCakeSession::read('testing.1');  | 
      ||
| 262 | $this->assertEquals('one', $result);  | 
      ||
| 263 | |||
| 264 | $result = TestCakeSession::read('testing');  | 
      ||
| 265 | $this->assertEquals(array('1' => 'one', '2' => 'two', '3' => 'three'), $result);  | 
      ||
| 266 | |||
| 267 | $result = TestCakeSession::read();  | 
      ||
| 268 | $this->assertTrue(isset($result['testing']));  | 
      ||
| 269 | $this->assertTrue(isset($result['Config']));  | 
      ||
| 270 | $this->assertTrue(isset($result['Config']['userAgent']));  | 
      ||
| 271 | |||
| 272 | TestCakeSession::write('This.is.a.deep.array.my.friend', 'value');  | 
      ||
| 273 | $result = TestCakeSession::read('This.is.a.deep.array.my.friend');  | 
      ||
| 274 | $this->assertEquals('value', $result);  | 
      ||
| 275 | }  | 
      ||
| 276 | |||
| 277 | /**
 | 
      ||
| 278 |  * testReadyEmpty
 | 
      ||
| 279 |  *
 | 
      ||
| 280 |  * @return void
 | 
      ||
| 281 |  */
 | 
      ||
| 282 | public function testReadyEmpty() {  | 
      ||
| 283 | $this->assertNull(TestCakeSession::read(''));  | 
      ||
| 284 | }  | 
      ||
| 285 | |||
| 286 | /**
 | 
      ||
| 287 |  * test writing a hash of values/
 | 
      ||
| 288 |  *
 | 
      ||
| 289 |  * @return void
 | 
      ||
| 290 |  */
 | 
      ||
| 291 | public function testWriteArray() {  | 
      ||
| 292 | $result = TestCakeSession::write(array(  | 
      ||
| 293 | 'one' => 1,  | 
      ||
| 294 | 'two' => 2,  | 
      ||
| 295 | 'three' => array('something'),  | 
      ||
| 296 | 'null' => null  | 
      ||
| 297 | ));  | 
      ||
| 298 | $this->assertTrue($result);  | 
      ||
| 299 | $this->assertEquals(1, TestCakeSession::read('one'));  | 
      ||
| 300 | $this->assertEquals(array('something'), TestCakeSession::read('three'));  | 
      ||
| 301 | $this->assertEquals(null, TestCakeSession::read('null'));  | 
      ||
| 302 | }  | 
      ||
| 303 | |||
| 304 | /**
 | 
      ||
| 305 |  * testWriteEmptyKey
 | 
      ||
| 306 |  *
 | 
      ||
| 307 |  * @return void
 | 
      ||
| 308 |  */
 | 
      ||
| 309 | public function testWriteEmptyKey() {  | 
      ||
| 310 | $this->assertFalse(TestCakeSession::write('', 'graham'));  | 
      ||
| 311 | $this->assertFalse(TestCakeSession::write('', ''));  | 
      ||
| 312 | $this->assertFalse(TestCakeSession::write(''));  | 
      ||
| 313 | }  | 
      ||
| 314 | |||
| 315 | /**
 | 
      ||
| 316 |  * Test overwriting a string value as if it were an array.
 | 
      ||
| 317 |  *
 | 
      ||
| 318 |  * @return void
 | 
      ||
| 319 |  */
 | 
      ||
| 320 | public function testWriteOverwriteStringValue() {  | 
      ||
| 321 | TestCakeSession::write('Some.string', 'value');  | 
      ||
| 322 | $this->assertEquals('value', TestCakeSession::read('Some.string'));  | 
      ||
| 323 | |||
| 324 | TestCakeSession::write('Some.string.array', array('values'));  | 
      ||
| 325 |                 $this->assertEquals(
 | 
      ||
| 326 | array('values'),  | 
      ||
| 327 | TestCakeSession::read('Some.string.array')  | 
      ||
| 328 | );  | 
      ||
| 329 | }  | 
      ||
| 330 | |||
| 331 | /**
 | 
      ||
| 332 |  * Test consuming session data.
 | 
      ||
| 333 |  *
 | 
      ||
| 334 |  * @return void
 | 
      ||
| 335 |  */
 | 
      ||
| 336 | public function testConsume() {  | 
      ||
| 337 | TestCakeSession::write('Some.string', 'value');  | 
      ||
| 338 | TestCakeSession::write('Some.array', array('key1' => 'value1', 'key2' => 'value2'));  | 
      ||
| 339 | $this->assertEquals('value', TestCakeSession::read('Some.string'));  | 
      ||
| 340 | $value = TestCakeSession::consume('Some.string');  | 
      ||
| 341 | $this->assertEquals('value', $value);  | 
      ||
| 342 | $this->assertFalse(TestCakeSession::check('Some.string'));  | 
      ||
| 343 | $value = TestCakeSession::consume('');  | 
      ||
| 344 | $this->assertNull($value);  | 
      ||
| 345 | $value = TestCakeSession::consume(null);  | 
      ||
| 346 | $this->assertNull($value);  | 
      ||
| 347 | $value = TestCakeSession::consume('Some.array');  | 
      ||
| 348 | $expected = array('key1' => 'value1', 'key2' => 'value2');  | 
      ||
| 349 | $this->assertEquals($expected, $value);  | 
      ||
| 350 | $this->assertFalse(TestCakeSession::check('Some.array'));  | 
      ||
| 351 | }  | 
      ||
| 352 | |||
| 353 | /**
 | 
      ||
| 354 |  * testId method
 | 
      ||
| 355 |  *
 | 
      ||
| 356 |  * @return void
 | 
      ||
| 357 |  */
 | 
      ||
| 358 | public function testId() {  | 
      ||
| 359 |                 TestCakeSession::destroy();
 | 
      ||
| 360 | |||
| 361 | $result = TestCakeSession::id();  | 
      ||
| 362 |                 $expected = session_id();
 | 
      ||
| 363 | $this->assertEquals($expected, $result);  | 
      ||
| 364 | |||
| 365 | TestCakeSession::id('MySessionId');  | 
      ||
| 366 | $result = TestCakeSession::id();  | 
      ||
| 367 | $this->assertEquals('MySessionId', $result);  | 
      ||
| 368 | }  | 
      ||
| 369 | |||
| 370 | /**
 | 
      ||
| 371 |  * testStarted method
 | 
      ||
| 372 |  *
 | 
      ||
| 373 |  * @return void
 | 
      ||
| 374 |  */
 | 
      ||
| 375 | public function testStarted() {  | 
      ||
| 376 | unset($_SESSION);  | 
      ||
| 377 | $_SESSION = null;  | 
      ||
| 378 | |||
| 379 | $this->assertFalse(TestCakeSession::started());  | 
      ||
| 380 | $this->assertTrue(TestCakeSession::start());  | 
      ||
| 381 | $this->assertTrue(TestCakeSession::started());  | 
      ||
| 382 | }  | 
      ||
| 383 | |||
| 384 | /**
 | 
      ||
| 385 |  * testDel method
 | 
      ||
| 386 |  *
 | 
      ||
| 387 |  * @return void
 | 
      ||
| 388 |  */
 | 
      ||
| 389 | public function testDelete() {  | 
      ||
| 390 | $this->assertTrue(TestCakeSession::write('Delete.me', 'Clearing out'));  | 
      ||
| 391 | $this->assertTrue(TestCakeSession::delete('Delete.me'));  | 
      ||
| 392 | $this->assertFalse(TestCakeSession::check('Delete.me'));  | 
      ||
| 393 | $this->assertTrue(TestCakeSession::check('Delete'));  | 
      ||
| 394 | |||
| 395 | $this->assertTrue(TestCakeSession::write('Clearing.sale', 'everything must go'));  | 
      ||
| 396 | $this->assertFalse(TestCakeSession::delete(''));  | 
      ||
| 397 | $this->assertTrue(TestCakeSession::check('Clearing.sale'));  | 
      ||
| 398 | $this->assertFalse(TestCakeSession::delete(null));  | 
      ||
| 399 | $this->assertTrue(TestCakeSession::check('Clearing.sale'));  | 
      ||
| 400 | |||
| 401 | $this->assertTrue(TestCakeSession::delete('Clearing'));  | 
      ||
| 402 | $this->assertFalse(TestCakeSession::check('Clearing.sale'));  | 
      ||
| 403 | $this->assertFalse(TestCakeSession::check('Clearing'));  | 
      ||
| 404 | }  | 
      ||
| 405 | |||
| 406 | /**
 | 
      ||
| 407 |  * testClear method
 | 
      ||
| 408 |  *
 | 
      ||
| 409 |  * @return void
 | 
      ||
| 410 |  */
 | 
      ||
| 411 | public function testClear() {  | 
      ||
| 412 | $this->assertTrue(TestCakeSession::write('Delete.me', 'Clearing out'));  | 
      ||
| 413 | TestCakeSession::clear(false);  | 
      ||
| 414 | $this->assertFalse(TestCakeSession::check('Delete.me'));  | 
      ||
| 415 | $this->assertFalse(TestCakeSession::check('Delete'));  | 
      ||
| 416 | |||
| 417 | TestCakeSession::write('Some.string', 'value');  | 
      ||
| 418 | TestCakeSession::clear(false);  | 
      ||
| 419 | $this->assertNull(TestCakeSession::read('Some'));  | 
      ||
| 420 | |||
| 421 | TestCakeSession::write('Some.string.array', array('values'));  | 
      ||
| 422 | TestCakeSession::clear(false);  | 
      ||
| 423 | $this->assertFalse(TestCakeSession::read());  | 
      ||
| 424 | }  | 
      ||
| 425 | |||
| 426 | /**
 | 
      ||
| 427 |  * testDestroy method
 | 
      ||
| 428 |  *
 | 
      ||
| 429 |  * @return void
 | 
      ||
| 430 |  */
 | 
      ||
| 431 | public function testDestroy() {  | 
      ||
| 432 | TestCakeSession::write('bulletProof', 'invincible');  | 
      ||
| 433 | $id = TestCakeSession::id();  | 
      ||
| 434 |                 TestCakeSession::destroy();
 | 
      ||
| 435 | |||
| 436 | $this->assertFalse(TestCakeSession::check('bulletProof'));  | 
      ||
| 437 | $this->assertNotEquals(TestCakeSession::id(), $id);  | 
      ||
| 438 | }  | 
      ||
| 439 | |||
| 440 | /**
 | 
      ||
| 441 |  * testCheckingSavedEmpty method
 | 
      ||
| 442 |  *
 | 
      ||
| 443 |  * @return void
 | 
      ||
| 444 |  */
 | 
      ||
| 445 | public function testCheckingSavedEmpty() {  | 
      ||
| 446 | $this->assertTrue(TestCakeSession::write('SessionTestCase', 0));  | 
      ||
| 447 | $this->assertTrue(TestCakeSession::check('SessionTestCase'));  | 
      ||
| 448 | |||
| 449 | $this->assertTrue(TestCakeSession::write('SessionTestCase', '0'));  | 
      ||
| 450 | $this->assertTrue(TestCakeSession::check('SessionTestCase'));  | 
      ||
| 451 | |||
| 452 | $this->assertTrue(TestCakeSession::write('SessionTestCase', false));  | 
      ||
| 453 | $this->assertTrue(TestCakeSession::check('SessionTestCase'));  | 
      ||
| 454 | |||
| 455 | $this->assertTrue(TestCakeSession::write('SessionTestCase', null));  | 
      ||
| 456 | $this->assertFalse(TestCakeSession::check('SessionTestCase'));  | 
      ||
| 457 | }  | 
      ||
| 458 | |||
| 459 | /**
 | 
      ||
| 460 |  * testCheckKeyWithSpaces method
 | 
      ||
| 461 |  *
 | 
      ||
| 462 |  * @return void
 | 
      ||
| 463 |  */
 | 
      ||
| 464 | public function testCheckKeyWithSpaces() {  | 
      ||
| 465 | $this->assertTrue(TestCakeSession::write('Session Test', "test"));  | 
      ||
| 466 | $this->assertTrue(TestCakeSession::check('Session Test'));  | 
      ||
| 467 | TestCakeSession::delete('Session Test');  | 
      ||
| 468 | |||
| 469 | $this->assertTrue(TestCakeSession::write('Session Test.Test Case', "test"));  | 
      ||
| 470 | $this->assertTrue(TestCakeSession::check('Session Test.Test Case'));  | 
      ||
| 471 | }  | 
      ||
| 472 | |||
| 473 | /**
 | 
      ||
| 474 |  * testCheckEmpty
 | 
      ||
| 475 |  *
 | 
      ||
| 476 |  * @return void
 | 
      ||
| 477 |  */
 | 
      ||
| 478 | public function testCheckEmpty() {  | 
      ||
| 479 | $this->assertFalse(TestCakeSession::check(''));  | 
      ||
| 480 | $this->assertFalse(TestCakeSession::check(null));  | 
      ||
| 481 | }  | 
      ||
| 482 | |||
| 483 | /**
 | 
      ||
| 484 |  * test key exploitation
 | 
      ||
| 485 |  *
 | 
      ||
| 486 |  * @return void
 | 
      ||
| 487 |  */
 | 
      ||
| 488 | public function testKeyExploit() {  | 
      ||
| 489 | $key = "a'] = 1; phpinfo(); \$_SESSION['a";  | 
      ||
| 490 | $result = TestCakeSession::write($key, 'haxored');  | 
      ||
| 491 | $this->assertFalse($result);  | 
      ||
| 492 | |||
| 493 | $result = TestCakeSession::read($key);  | 
      ||
| 494 | $this->assertNull($result);  | 
      ||
| 495 | }  | 
      ||
| 496 | |||
| 497 | /**
 | 
      ||
| 498 |  * testReadingSavedEmpty method
 | 
      ||
| 499 |  *
 | 
      ||
| 500 |  * @return void
 | 
      ||
| 501 |  */
 | 
      ||
| 502 | public function testReadingSavedEmpty() {  | 
      ||
| 503 | TestCakeSession::write('SessionTestCase', 0);  | 
      ||
| 504 | $this->assertEquals(0, TestCakeSession::read('SessionTestCase'));  | 
      ||
| 505 | |||
| 506 | TestCakeSession::write('SessionTestCase', '0');  | 
      ||
| 507 | $this->assertEquals('0', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 508 | $this->assertFalse(TestCakeSession::read('SessionTestCase') === 0);  | 
      ||
| 509 | |||
| 510 | TestCakeSession::write('SessionTestCase', false);  | 
      ||
| 511 | $this->assertFalse(TestCakeSession::read('SessionTestCase'));  | 
      ||
| 512 | |||
| 513 | TestCakeSession::write('SessionTestCase', null);  | 
      ||
| 514 | $this->assertEquals(null, TestCakeSession::read('SessionTestCase'));  | 
      ||
| 515 | }  | 
      ||
| 516 | |||
| 517 | /**
 | 
      ||
| 518 |  * testCheckUserAgentFalse method
 | 
      ||
| 519 |  *
 | 
      ||
| 520 |  * @return void
 | 
      ||
| 521 |  */
 | 
      ||
| 522 | public function testCheckUserAgentFalse() {  | 
      ||
| 523 | Configure::write('Session.checkAgent', false);  | 
      ||
| 524 | TestCakeSession::setUserAgent(md5('http://randomdomainname.com' . Configure::read('Security.salt')));  | 
      ||
| 525 | $this->assertTrue(TestCakeSession::valid());  | 
      ||
| 526 | }  | 
      ||
| 527 | |||
| 528 | /**
 | 
      ||
| 529 |  * testCheckUserAgentTrue method
 | 
      ||
| 530 |  *
 | 
      ||
| 531 |  * @return void
 | 
      ||
| 532 |  */
 | 
      ||
| 533 | public function testCheckUserAgentTrue() {  | 
      ||
| 534 | Configure::write('Session.checkAgent', true);  | 
      ||
| 535 | TestCakeSession::$error = false;  | 
      ||
| 536 | $agent = md5('http://randomdomainname.com' . Configure::read('Security.salt'));  | 
      ||
| 537 | |||
| 538 | TestCakeSession::write('Config.userAgent', md5('Hacking you!'));  | 
      ||
| 539 | TestCakeSession::setUserAgent($agent);  | 
      ||
| 540 | $this->assertFalse(TestCakeSession::valid());  | 
      ||
| 541 | }  | 
      ||
| 542 | |||
| 543 | /**
 | 
      ||
| 544 |  * testReadAndWriteWithCakeStorage method
 | 
      ||
| 545 |  *
 | 
      ||
| 546 |  * @return void
 | 
      ||
| 547 |  */
 | 
      ||
| 548 | public function testReadAndWriteWithCakeStorage() {  | 
      ||
| 549 | Configure::write('Session.defaults', 'cake');  | 
      ||
| 550 | |||
| 551 |                 TestCakeSession::init();
 | 
      ||
| 552 |                 TestCakeSession::start();
 | 
      ||
| 553 | |||
| 554 | TestCakeSession::write('SessionTestCase', 0);  | 
      ||
| 555 | $this->assertEquals(0, TestCakeSession::read('SessionTestCase'));  | 
      ||
| 556 | |||
| 557 | TestCakeSession::write('SessionTestCase', '0');  | 
      ||
| 558 | $this->assertEquals('0', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 559 | $this->assertFalse(TestCakeSession::read('SessionTestCase') === 0);  | 
      ||
| 560 | |||
| 561 | TestCakeSession::write('SessionTestCase', false);  | 
      ||
| 562 | $this->assertFalse(TestCakeSession::read('SessionTestCase'));  | 
      ||
| 563 | |||
| 564 | TestCakeSession::write('SessionTestCase', null);  | 
      ||
| 565 | $this->assertEquals(null, TestCakeSession::read('SessionTestCase'));  | 
      ||
| 566 | |||
| 567 | TestCakeSession::write('SessionTestCase', 'This is a Test');  | 
      ||
| 568 | $this->assertEquals('This is a Test', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 569 | |||
| 570 | TestCakeSession::write('SessionTestCase', 'This is a Test');  | 
      ||
| 571 | TestCakeSession::write('SessionTestCase', 'This was updated');  | 
      ||
| 572 | $this->assertEquals('This was updated', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 573 | |||
| 574 |                 TestCakeSession::destroy();
 | 
      ||
| 575 | $this->assertNull(TestCakeSession::read('SessionTestCase'));  | 
      ||
| 576 | }  | 
      ||
| 577 | |||
| 578 | /**
 | 
      ||
| 579 |  * test using a handler from app/Model/Datasource/Session.
 | 
      ||
| 580 |  *
 | 
      ||
| 581 |  * @return void
 | 
      ||
| 582 |  */
 | 
      ||
| 583 | public function testUsingAppLibsHandler() {  | 
      ||
| 584 | App::build(array(  | 
      ||
| 585 | 'Model/Datasource/Session' => array(  | 
      ||
| 586 | CAKE . 'Test' . DS . 'test_app' . DS . 'Model' . DS . 'Datasource' . DS . 'Session' . DS  | 
      ||
| 587 | ),  | 
      ||
| 588 | 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)  | 
      ||
| 589 | ), App::RESET);  | 
      ||
| 590 | Configure::write('Session', array(  | 
      ||
| 591 | 'defaults' => 'cake',  | 
      ||
| 592 | 'handler' => array(  | 
      ||
| 593 | 'engine' => 'TestAppLibSession'  | 
      ||
| 594 | )  | 
      ||
| 595 | ));  | 
      ||
| 596 | |||
| 597 |                 TestCakeSession::start();
 | 
      ||
| 598 | $this->assertTrue(TestCakeSession::started());  | 
      ||
| 599 | |||
| 600 |                 TestCakeSession::destroy();
 | 
      ||
| 601 | $this->assertFalse(TestCakeSession::started());  | 
      ||
| 602 | |||
| 603 |                 App::build();
 | 
      ||
| 604 | }  | 
      ||
| 605 | |||
| 606 | /**
 | 
      ||
| 607 |  * test using a handler from a plugin.
 | 
      ||
| 608 |  *
 | 
      ||
| 609 |  * @return void
 | 
      ||
| 610 |  */
 | 
      ||
| 611 | public function testUsingPluginHandler() {  | 
      ||
| 612 | App::build(array(  | 
      ||
| 613 | 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)  | 
      ||
| 614 | ), App::RESET);  | 
      ||
| 615 | CakePlugin::load('TestPlugin');  | 
      ||
| 616 | |||
| 617 | Configure::write('Session', array(  | 
      ||
| 618 | 'defaults' => 'cake',  | 
      ||
| 619 | 'handler' => array(  | 
      ||
| 620 | 'engine' => 'TestPlugin.TestPluginSession'  | 
      ||
| 621 | )  | 
      ||
| 622 | ));  | 
      ||
| 623 | |||
| 624 |                 TestCakeSession::start();
 | 
      ||
| 625 | $this->assertTrue(TestCakeSession::started());  | 
      ||
| 626 | |||
| 627 |                 TestCakeSession::destroy();
 | 
      ||
| 628 | $this->assertFalse(TestCakeSession::started());  | 
      ||
| 629 | |||
| 630 |                 App::build();
 | 
      ||
| 631 | }  | 
      ||
| 632 | |||
| 633 | /**
 | 
      ||
| 634 |  * testReadAndWriteWithCacheStorage method
 | 
      ||
| 635 |  *
 | 
      ||
| 636 |  * @return void
 | 
      ||
| 637 |  */
 | 
      ||
| 638 | public function testReadAndWriteWithCacheStorage() {  | 
      ||
| 639 | Configure::write('Session.defaults', 'cache');  | 
      ||
| 640 | Configure::write('Session.handler.engine', 'TestCacheSession');  | 
      ||
| 641 | |||
| 642 |                 TestCakeSession::init();
 | 
      ||
| 643 |                 TestCakeSession::destroy();
 | 
      ||
| 644 | |||
| 645 | TestCakeSession::write('SessionTestCase', 0);  | 
      ||
| 646 | $this->assertEquals(0, TestCakeSession::read('SessionTestCase'));  | 
      ||
| 647 | |||
| 648 | TestCakeSession::write('SessionTestCase', '0');  | 
      ||
| 649 | $this->assertEquals('0', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 650 | $this->assertFalse(TestCakeSession::read('SessionTestCase') === 0);  | 
      ||
| 651 | |||
| 652 | TestCakeSession::write('SessionTestCase', false);  | 
      ||
| 653 | $this->assertFalse(TestCakeSession::read('SessionTestCase'));  | 
      ||
| 654 | |||
| 655 | TestCakeSession::write('SessionTestCase', null);  | 
      ||
| 656 | $this->assertEquals(null, TestCakeSession::read('SessionTestCase'));  | 
      ||
| 657 | |||
| 658 | TestCakeSession::write('SessionTestCase', 'This is a Test');  | 
      ||
| 659 | $this->assertEquals('This is a Test', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 660 | |||
| 661 | TestCakeSession::write('SessionTestCase', 'This is a Test');  | 
      ||
| 662 | TestCakeSession::write('SessionTestCase', 'This was updated');  | 
      ||
| 663 | $this->assertEquals('This was updated', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 664 | |||
| 665 |                 TestCakeSession::destroy();
 | 
      ||
| 666 | $this->assertNull(TestCakeSession::read('SessionTestCase'));  | 
      ||
| 667 | }  | 
      ||
| 668 | |||
| 669 | /**
 | 
      ||
| 670 |  * test that changing the config name of the cache config works.
 | 
      ||
| 671 |  *
 | 
      ||
| 672 |  * @return void
 | 
      ||
| 673 |  */
 | 
      ||
| 674 | public function testReadAndWriteWithCustomCacheConfig() {  | 
      ||
| 675 | Configure::write('Session.defaults', 'cache');  | 
      ||
| 676 | Configure::write('Session.handler.engine', 'TestCacheSession');  | 
      ||
| 677 | Configure::write('Session.handler.config', 'session_test');  | 
      ||
| 678 | |||
| 679 | Cache::config('session_test', array(  | 
      ||
| 680 | 'engine' => 'File',  | 
      ||
| 681 | 'prefix' => 'session_test_',  | 
      ||
| 682 | ));  | 
      ||
| 683 | |||
| 684 |                 TestCakeSession::init();
 | 
      ||
| 685 |                 TestCakeSession::start();
 | 
      ||
| 686 | |||
| 687 | TestCakeSession::write('SessionTestCase', 'Some value');  | 
      ||
| 688 | $this->assertEquals('Some value', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 689 | $id = TestCakeSession::id();  | 
      ||
| 690 | |||
| 691 | Cache::delete($id, 'session_test');  | 
      ||
| 692 | }  | 
      ||
| 693 | |||
| 694 | /**
 | 
      ||
| 695 |  * testReadAndWriteWithDatabaseStorage method
 | 
      ||
| 696 |  *
 | 
      ||
| 697 |  * @return void
 | 
      ||
| 698 |  */
 | 
      ||
| 699 | public function testReadAndWriteWithDatabaseStorage() {  | 
      ||
| 700 | Configure::write('Session.defaults', 'database');  | 
      ||
| 701 | Configure::write('Session.handler.engine', 'TestDatabaseSession');  | 
      ||
| 702 | Configure::write('Session.handler.table', 'sessions');  | 
      ||
| 703 | Configure::write('Session.handler.model', 'Session');  | 
      ||
| 704 | Configure::write('Session.handler.database', 'test');  | 
      ||
| 705 | |||
| 706 |                 TestCakeSession::init();
 | 
      ||
| 707 | $this->assertNull(TestCakeSession::id());  | 
      ||
| 708 | |||
| 709 |                 TestCakeSession::start();
 | 
      ||
| 710 |                 $expected = session_id();
 | 
      ||
| 711 | $this->assertEquals($expected, TestCakeSession::id());  | 
      ||
| 712 | |||
| 713 |                 TestCakeSession::renew();
 | 
      ||
| 714 | $this->assertFalse($expected === TestCakeSession::id());  | 
      ||
| 715 | |||
| 716 |                 $expected = session_id();
 | 
      ||
| 717 | $this->assertEquals($expected, TestCakeSession::id());  | 
      ||
| 718 | |||
| 719 | TestCakeSession::write('SessionTestCase', 0);  | 
      ||
| 720 | $this->assertEquals(0, TestCakeSession::read('SessionTestCase'));  | 
      ||
| 721 | |||
| 722 | TestCakeSession::write('SessionTestCase', '0');  | 
      ||
| 723 | $this->assertEquals('0', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 724 | $this->assertFalse(TestCakeSession::read('SessionTestCase') === 0);  | 
      ||
| 725 | |||
| 726 | TestCakeSession::write('SessionTestCase', false);  | 
      ||
| 727 | $this->assertFalse(TestCakeSession::read('SessionTestCase'));  | 
      ||
| 728 | |||
| 729 | TestCakeSession::write('SessionTestCase', null);  | 
      ||
| 730 | $this->assertEquals(null, TestCakeSession::read('SessionTestCase'));  | 
      ||
| 731 | |||
| 732 | TestCakeSession::write('SessionTestCase', 'This is a Test');  | 
      ||
| 733 | $this->assertEquals('This is a Test', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 734 | |||
| 735 | TestCakeSession::write('SessionTestCase', 'Some additional data');  | 
      ||
| 736 | $this->assertEquals('Some additional data', TestCakeSession::read('SessionTestCase'));  | 
      ||
| 737 | |||
| 738 |                 TestCakeSession::destroy();
 | 
      ||
| 739 | $this->assertNull(TestCakeSession::read('SessionTestCase'));  | 
      ||
| 740 | |||
| 741 | Configure::write('Session', array(  | 
      ||
| 742 | 'defaults' => 'php'  | 
      ||
| 743 | ));  | 
      ||
| 744 |                 TestCakeSession::init();
 | 
      ||
| 745 | }  | 
      ||
| 746 | |||
| 747 | /**
 | 
      ||
| 748 |  * testSessionTimeout method
 | 
      ||
| 749 |  *
 | 
      ||
| 750 |  * @return void
 | 
      ||
| 751 |  */
 | 
      ||
| 752 | public function testSessionTimeout() {  | 
      ||
| 753 | Configure::write('debug', 2);  | 
      ||
| 754 | Configure::write('Session.defaults', 'cake');  | 
      ||
| 755 | Configure::write('Session.autoRegenerate', false);  | 
      ||
| 756 | |||
| 757 | $timeoutSeconds = Configure::read('Session.timeout') * 60;  | 
      ||
| 758 | |||
| 759 |                 TestCakeSession::destroy();
 | 
      ||
| 760 | TestCakeSession::write('Test', 'some value');  | 
      ||
| 761 | |||
| 762 | $this->assertWithinMargin(time() + $timeoutSeconds, CakeSession::$sessionTime, 1);  | 
      ||
| 763 | $this->assertEquals(10, $_SESSION['Config']['countdown']);  | 
      ||
| 764 | $this->assertWithinMargin(CakeSession::$sessionTime, $_SESSION['Config']['time'], 1);  | 
      ||
| 765 | $this->assertWithinMargin(time(), CakeSession::$time, 1);  | 
      ||
| 766 | $this->assertWithinMargin(time() + $timeoutSeconds, $_SESSION['Config']['time'], 1);  | 
      ||
| 767 | |||
| 768 | Configure::write('Session.harden', true);  | 
      ||
| 769 |                 TestCakeSession::destroy();
 | 
      ||
| 770 | |||
| 771 | TestCakeSession::write('Test', 'some value');  | 
      ||
| 772 | $this->assertWithinMargin(time() + $timeoutSeconds, CakeSession::$sessionTime, 1);  | 
      ||
| 773 | $this->assertEquals(10, $_SESSION['Config']['countdown']);  | 
      ||
| 774 | $this->assertWithinMargin(CakeSession::$sessionTime, $_SESSION['Config']['time'], 1);  | 
      ||
| 775 | $this->assertWithinMargin(time(), CakeSession::$time, 1);  | 
      ||
| 776 | $this->assertWithinMargin(CakeSession::$time + $timeoutSeconds, $_SESSION['Config']['time'], 1);  | 
      ||
| 777 | }  | 
      ||
| 778 | |||
| 779 | /**
 | 
      ||
| 780 |  * Test that cookieTimeout matches timeout when unspecified.
 | 
      ||
| 781 |  *
 | 
      ||
| 782 |  * @return void
 | 
      ||
| 783 |  */
 | 
      ||
| 784 | public function testCookieTimeoutFallback() {  | 
      ||
| 785 | $_SESSION = null;  | 
      ||
| 786 | Configure::write('Session', array(  | 
      ||
| 787 | 'defaults' => 'cake',  | 
      ||
| 788 | 'timeout' => 400,  | 
      ||
| 789 | ));  | 
      ||
| 790 |                 TestCakeSession::start();
 | 
      ||
| 791 | $this->assertEquals(400, Configure::read('Session.cookieTimeout'));  | 
      ||
| 792 | $this->assertEquals(400, Configure::read('Session.timeout'));  | 
      ||
| 793 | $this->assertEquals(400 * 60, ini_get('session.cookie_lifetime'));  | 
      ||
| 794 | $this->assertEquals(400 * 60, ini_get('session.gc_maxlifetime'));  | 
      ||
| 795 | |||
| 796 | $_SESSION = null;  | 
      ||
| 797 | Configure::write('Session', array(  | 
      ||
| 798 | 'defaults' => 'cake',  | 
      ||
| 799 | 'timeout' => 400,  | 
      ||
| 800 | 'cookieTimeout' => 600  | 
      ||
| 801 | ));  | 
      ||
| 802 |                 TestCakeSession::start();
 | 
      ||
| 803 | $this->assertEquals(600, Configure::read('Session.cookieTimeout'));  | 
      ||
| 804 | $this->assertEquals(400, Configure::read('Session.timeout'));  | 
      ||
| 805 | }  | 
      ||
| 806 | |||
| 807 | /**
 | 
      ||
| 808 |  * Proves that invalid sessions will be destroyed and re-created
 | 
      ||
| 809 |  * if invalid
 | 
      ||
| 810 |  *
 | 
      ||
| 811 |  * @return void
 | 
      ||
| 812 |  */
 | 
      ||
| 813 | public function testInvalidSessionRenew() {  | 
      ||
| 814 |                 TestCakeSession::start();
 | 
      ||
| 815 | $this->assertNotEmpty($_SESSION['Config']);  | 
      ||
| 816 | $data = $_SESSION;  | 
      ||
| 817 | |||
| 818 | session_write_close();  | 
      ||
| 819 | $_SESSION = null;  | 
      ||
| 820 | |||
| 821 |                 TestCakeSession::start();
 | 
      ||
| 822 | $this->assertEquals($data, $_SESSION);  | 
      ||
| 823 | TestCakeSession::write('Foo', 'Bar');  | 
      ||
| 824 | |||
| 825 | session_write_close();  | 
      ||
| 826 | $_SESSION = null;  | 
      ||
| 827 | |||
| 828 | TestCakeSession::userAgent('bogus!');  | 
      ||
| 829 |                 TestCakeSession::start();
 | 
      ||
| 830 | $this->assertNotEquals($data, $_SESSION);  | 
      ||
| 831 | $this->assertEquals('bogus!', $_SESSION['Config']['userAgent']);  | 
      ||
| 832 | }  | 
      ||
| 833 | |||
| 834 | }  |