Abstract the session away in a class

This commit is contained in:
Robin Appelman 2013-05-28 00:50:00 +02:00
parent aeff1a4c4d
commit 76d13120ea
5 changed files with 221 additions and 0 deletions

39
lib/session/internal.php Normal file
View File

@ -0,0 +1,39 @@
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Session;
/**
* Class Internal
*
* wrap php's internal session handling into the Session interface
*
* @package OC\Session
*/
class Internal extends Memory {
public function __construct($name) {
session_write_close();
session_name($name);
if (@session_start()) {
throw new \Exception('Failed to start session');
}
$this->data = $_SESSION;
}
public function __destruct() {
$_SESSION = $this->data;
session_write_close();
}
public function clear() {
session_unset();
@session_regenerate_id(true);
@session_start();
$this->data = $_SESSION = array();
}
}

63
lib/session/memory.php Normal file
View File

@ -0,0 +1,63 @@
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Session;
/**
* Class Internal
*
* store session data in an in-memory array, not persistance
*
* @package OC\Session
*/
class Memory implements Session {
protected $data;
public function __construct($name) {
//no need to use $name since all data is already scoped to this instance
$this->data = array();
}
/**
* @param string $key
* @param mixed $value
*/
public function set($key, $value) {
$this->data[$key] = $value;
}
/**
* @param string $key
* @return mixed
*/
public function get($key) {
if (!$this->exists($key)) {
return null;
}
return $this->data[$key];
}
/**
* @param string $key
* @return bool
*/
public function exists($key) {
return isset($this->data[$key]);
}
/**
* @param string $key
*/
public function remove($key) {
unset($this->data[$key]);
}
public function clear() {
$this->data = array();
}
}

48
lib/session/session.php Normal file
View File

@ -0,0 +1,48 @@
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Session;
interface Session {
/**
* $name serves as a namespace for the session keys
*
* @param string $name
*/
public function __construct($name);
/**
* @param string $key
* @param mixed $value
*/
public function set($key, $value);
/**
* @param string $key
* @return mixed should return null if $key does not exist
*/
public function get($key);
/**
* @param string $key
* @return bool
*/
public function exists($key);
/**
* should not throw any errors if $key does not exist
*
* @param string $key
*/
public function remove($key);
/**
* removes all entries within the cache namespace
*/
public function clear();
}

View File

@ -0,0 +1,16 @@
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace Test\Session;
class Memory extends Session {
public function setUp() {
$this->instance = new \OC\Session\Memory(uniqid());
}
}

View File

@ -0,0 +1,55 @@
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace Test\Session;
abstract class Session extends \PHPUnit_Framework_TestCase {
/**
* @var \OC\Session\Session
*/
protected $instance;
public function tearDown() {
$this->instance->clear();
}
public function testNotExistsEmpty() {
$this->assertFalse($this->instance->exists('foo'));
}
public function testExistsAfterSet() {
$this->instance->set('foo', 1);
$this->assertTrue($this->instance->exists('foo'));
}
public function testNotExistsAfterRemove() {
$this->instance->set('foo', 1);
$this->instance->remove('foo');
$this->assertFalse($this->instance->exists('foo'));
}
public function testGetNonExisting() {
$this->assertNull($this->instance->get('foo'));
}
public function testGetAfterSet() {
$this->instance->set('foo', 'bar');
$this->assertEquals('bar', $this->instance->get(('foo')));
}
public function testRemoveNonExisting() {
$this->instance->remove('foo');
}
public function testNotExistsAfterClear() {
$this->instance->set('foo', 1);
$this->instance->clear();
$this->assertFalse($this->instance->exists('foo'));
}
}