]> source.dussan.org Git - nextcloud-server.git/commitdiff
Abstract the session away in a class
authorRobin Appelman <icewind@owncloud.com>
Mon, 27 May 2013 22:50:00 +0000 (00:50 +0200)
committerRobin Appelman <icewind@owncloud.com>
Mon, 27 May 2013 22:50:00 +0000 (00:50 +0200)
lib/session/internal.php [new file with mode: 0644]
lib/session/memory.php [new file with mode: 0644]
lib/session/session.php [new file with mode: 0644]
tests/lib/session/memory.php [new file with mode: 0644]
tests/lib/session/session.php [new file with mode: 0644]

diff --git a/lib/session/internal.php b/lib/session/internal.php
new file mode 100644 (file)
index 0000000..713a154
--- /dev/null
@@ -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();
+       }
+}
diff --git a/lib/session/memory.php b/lib/session/memory.php
new file mode 100644 (file)
index 0000000..4202ddf
--- /dev/null
@@ -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();
+       }
+}
diff --git a/lib/session/session.php b/lib/session/session.php
new file mode 100644 (file)
index 0000000..3dce3b7
--- /dev/null
@@ -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();
+}
diff --git a/tests/lib/session/memory.php b/tests/lib/session/memory.php
new file mode 100644 (file)
index 0000000..2dc236b
--- /dev/null
@@ -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());
+       }
+}
diff --git a/tests/lib/session/session.php b/tests/lib/session/session.php
new file mode 100644 (file)
index 0000000..be28251
--- /dev/null
@@ -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'));
+       }
+}