2010-07-25 16:40:44 -04:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* DatabaseSessionTest file
|
|
|
|
*
|
2012-04-26 19:49:18 -07:00
|
|
|
* CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
|
2013-02-08 20:59:49 +09:00
|
|
|
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
2010-07-25 16:40:44 -04:00
|
|
|
*
|
|
|
|
* Licensed under The MIT License
|
2013-02-08 21:22:51 +09:00
|
|
|
* For full copyright and license information, please see the LICENSE.txt
|
2010-07-25 16:40:44 -04:00
|
|
|
* Redistributions of files must retain the above copyright notice.
|
|
|
|
*
|
2013-02-08 20:59:49 +09:00
|
|
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
2010-07-25 16:40:44 -04:00
|
|
|
* @link http://cakephp.org CakePHP(tm) Project
|
2011-07-26 01:46:14 -04:30
|
|
|
* @package Cake.Test.Case.Model.Datasource.Session
|
2010-07-25 16:40:44 -04:00
|
|
|
* @since CakePHP(tm) v 2.0
|
2013-05-31 00:11:14 +02:00
|
|
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
2010-07-25 16:40:44 -04:00
|
|
|
*/
|
|
|
|
|
2010-12-10 01:53:27 -04:30
|
|
|
App::uses('Model', 'Model');
|
2010-12-21 22:32:12 -04:30
|
|
|
App::uses('CakeSession', 'Model/Datasource');
|
2010-12-10 01:53:27 -04:30
|
|
|
App::uses('DatabaseSession', 'Model/Datasource/Session');
|
2010-12-21 22:32:12 -04:30
|
|
|
class_exists('CakeSession');
|
2010-07-25 16:40:44 -04:00
|
|
|
|
2013-05-31 00:11:14 +02:00
|
|
|
/**
|
|
|
|
* Class SessionTestModel
|
|
|
|
*
|
|
|
|
* @package Cake.Test.Case.Model.Datasource.Session
|
|
|
|
*/
|
2010-07-25 17:06:03 -04:00
|
|
|
class SessionTestModel extends Model {
|
2012-03-18 21:20:17 -04:00
|
|
|
|
2011-07-11 00:16:41 +02:00
|
|
|
public $useTable = 'sessions';
|
2012-03-18 21:20:17 -04:00
|
|
|
|
2010-07-25 17:06:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Database session test.
|
|
|
|
*
|
2011-07-26 01:46:14 -04:30
|
|
|
* @package Cake.Test.Case.Model.Datasource.Session
|
2010-07-25 17:06:03 -04:00
|
|
|
*/
|
2010-07-25 16:40:44 -04:00
|
|
|
class DatabaseSessionTest extends CakeTestCase {
|
2010-07-25 17:06:03 -04:00
|
|
|
|
|
|
|
protected static $_sessionBackup;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* fixtures
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public $fixtures = array('core.session');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* test case startup
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function setupBeforeClass() {
|
2015-07-21 10:22:53 +02:00
|
|
|
static::$_sessionBackup = Configure::read('Session');
|
2010-09-06 01:21:58 -04:00
|
|
|
Configure::write('Session.handler', array(
|
|
|
|
'model' => 'SessionTestModel',
|
2010-07-25 17:06:03 -04:00
|
|
|
));
|
|
|
|
Configure::write('Session.timeout', 100);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cleanup after test case.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function teardownAfterClass() {
|
2015-07-21 10:22:53 +02:00
|
|
|
Configure::write('Session', static::$_sessionBackup);
|
2010-07-25 17:06:03 -04:00
|
|
|
}
|
|
|
|
|
2010-09-06 00:43:58 -04:00
|
|
|
/**
|
2011-12-04 13:27:51 -08:00
|
|
|
* setUp
|
2010-09-06 00:43:58 -04:00
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-12-04 13:27:51 -08:00
|
|
|
public function setUp() {
|
|
|
|
parent::setUp();
|
2010-09-06 00:43:58 -04:00
|
|
|
$this->storage = new DatabaseSession();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2011-12-04 13:27:51 -08:00
|
|
|
* tearDown
|
2010-09-06 00:43:58 -04:00
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-12-04 13:27:51 -08:00
|
|
|
public function tearDown() {
|
2010-09-06 00:43:58 -04:00
|
|
|
unset($this->storage);
|
2010-09-06 01:21:58 -04:00
|
|
|
ClassRegistry::flush();
|
2011-12-04 13:27:51 -08:00
|
|
|
parent::tearDown();
|
2010-09-06 01:21:58 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* test that constructor sets the right things up.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-05-30 22:02:32 +02:00
|
|
|
public function testConstructionSettings() {
|
2010-09-06 01:21:58 -04:00
|
|
|
ClassRegistry::flush();
|
2013-01-23 13:45:50 +01:00
|
|
|
new DatabaseSession();
|
2010-09-06 01:21:58 -04:00
|
|
|
|
|
|
|
$session = ClassRegistry::getObject('session');
|
2010-12-24 12:54:04 -05:00
|
|
|
$this->assertInstanceOf('SessionTestModel', $session);
|
2010-09-06 01:21:58 -04:00
|
|
|
$this->assertEquals('Session', $session->alias);
|
2010-09-19 22:28:30 -04:30
|
|
|
$this->assertEquals('test', $session->useDbConfig);
|
2011-07-11 00:16:41 +02:00
|
|
|
$this->assertEquals('sessions', $session->useTable);
|
2010-09-06 00:43:58 -04:00
|
|
|
}
|
|
|
|
|
2010-07-25 17:06:03 -04:00
|
|
|
/**
|
|
|
|
* test opening the session
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-05-30 22:02:32 +02:00
|
|
|
public function testOpen() {
|
2010-09-06 00:43:58 -04:00
|
|
|
$this->assertTrue($this->storage->open());
|
2010-07-25 17:06:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* test write()
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-05-30 22:02:32 +02:00
|
|
|
public function testWrite() {
|
2015-12-28 11:29:17 -05:00
|
|
|
$this->storage->write('foo', 'Some value');
|
|
|
|
$this->assertEquals($this->storage->read('foo'), 'Some value');
|
2010-07-25 17:06:03 -04:00
|
|
|
}
|
|
|
|
|
2011-01-18 20:20:49 -05:00
|
|
|
/**
|
|
|
|
* testReadAndWriteWithDatabaseStorage method
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-05-30 22:02:32 +02:00
|
|
|
public function testWriteEmptySessionId() {
|
2011-01-18 20:20:49 -05:00
|
|
|
$result = $this->storage->write('', 'This is a Test');
|
|
|
|
$this->assertFalse($result);
|
|
|
|
}
|
2011-12-06 12:52:48 -08:00
|
|
|
|
2010-07-25 17:06:03 -04:00
|
|
|
/**
|
|
|
|
* test read()
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-05-30 22:02:32 +02:00
|
|
|
public function testRead() {
|
2010-09-06 00:43:58 -04:00
|
|
|
$this->storage->write('foo', 'Some value');
|
2015-12-28 11:29:17 -05:00
|
|
|
$this->assertEquals($this->storage->read('foo'), 'Some value');
|
2015-12-28 23:26:06 -05:00
|
|
|
$this->storage->write('bar', 0);
|
|
|
|
$this->assertEquals(0, $this->storage->read('bar'));
|
2015-12-28 11:29:17 -05:00
|
|
|
$this->assertSame('', $this->storage->read('made up value'));
|
2015-12-28 23:26:06 -05:00
|
|
|
|
2010-07-25 17:06:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* test blowing up the session.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-05-30 22:02:32 +02:00
|
|
|
public function testDestroy() {
|
2010-09-06 00:43:58 -04:00
|
|
|
$this->storage->write('foo', 'Some value');
|
2011-10-28 01:01:17 -04:00
|
|
|
|
2010-09-06 00:43:58 -04:00
|
|
|
$this->assertTrue($this->storage->destroy('foo'), 'Destroy failed');
|
2015-12-28 11:29:17 -05:00
|
|
|
$this->assertSame($this->storage->read('foo'), '');
|
2010-07-25 17:06:03 -04:00
|
|
|
}
|
2010-07-25 17:22:53 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* test the garbage collector
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-05-30 22:02:32 +02:00
|
|
|
public function testGc() {
|
2011-12-04 13:04:42 -08:00
|
|
|
ClassRegistry::flush();
|
2010-07-25 17:22:53 -04:00
|
|
|
Configure::write('Session.timeout', 0);
|
2011-12-04 13:04:42 -08:00
|
|
|
|
|
|
|
$storage = new DatabaseSession();
|
|
|
|
$storage->write('foo', 'Some value');
|
2010-07-25 17:22:53 -04:00
|
|
|
|
|
|
|
sleep(1);
|
2011-12-04 13:04:42 -08:00
|
|
|
$storage->gc();
|
2015-12-28 11:29:17 -05:00
|
|
|
$this->assertSame($storage->read('foo'), '');
|
2010-07-25 17:22:53 -04:00
|
|
|
}
|
2015-01-22 10:59:33 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* testConcurrentInsert
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function testConcurrentInsert() {
|
2015-01-23 08:47:05 +00:00
|
|
|
$this->skipIf(
|
|
|
|
$this->db instanceof Sqlite,
|
|
|
|
'Sqlite does not throw exceptions when attempting to insert a duplicate primary key'
|
|
|
|
);
|
|
|
|
|
2015-01-22 10:59:33 +00:00
|
|
|
ClassRegistry::removeObject('Session');
|
|
|
|
|
|
|
|
$mockedModel = $this->getMockForModel(
|
|
|
|
'SessionTestModel',
|
|
|
|
array('exists'),
|
|
|
|
array('alias' => 'MockedSessionTestModel', 'table' => 'sessions')
|
|
|
|
);
|
|
|
|
Configure::write('Session.handler.model', 'MockedSessionTestModel');
|
|
|
|
|
2015-01-23 08:28:08 +00:00
|
|
|
$counter = 0;
|
|
|
|
// First save
|
|
|
|
$mockedModel->expects($this->at($counter++))
|
2015-01-22 10:59:33 +00:00
|
|
|
->method('exists')
|
|
|
|
->will($this->returnValue(false));
|
|
|
|
|
2015-01-23 08:28:08 +00:00
|
|
|
// Second save
|
|
|
|
$mockedModel->expects($this->at($counter++))
|
|
|
|
->method('exists')
|
|
|
|
->will($this->returnValue(false));
|
|
|
|
|
|
|
|
// Second save retry
|
|
|
|
$mockedModel->expects($this->at($counter++))
|
|
|
|
->method('exists')
|
|
|
|
->will($this->returnValue(true));
|
|
|
|
|
|
|
|
// Datasource exists check
|
|
|
|
$mockedModel->expects($this->at($counter++))
|
|
|
|
->method('exists')
|
|
|
|
->will($this->returnValue(true));
|
|
|
|
|
2015-01-22 10:59:33 +00:00
|
|
|
$this->storage = new DatabaseSession();
|
|
|
|
|
|
|
|
$this->storage->write('foo', 'Some value');
|
|
|
|
$return = $this->storage->read('foo');
|
|
|
|
$this->assertSame('Some value', $return);
|
|
|
|
|
|
|
|
$this->storage->write('foo', 'Some other value');
|
|
|
|
$return = $this->storage->read('foo');
|
|
|
|
$this->assertSame('Some other value', $return);
|
|
|
|
}
|
2012-03-18 21:20:17 -04:00
|
|
|
}
|