pictcode / lib / Cake / Test / Case / Model / Datasource / CakeSessionTest.php @ 0b1b8047
履歴 | 表示 | アノテート | ダウンロード (22.474 KB)
1 |
<?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 |
} |