1<?php
2/**
3 * Prepare the test setup.
4 */
5require_once dirname(__FILE__) . '/Base.php';
6
7/**
8 * Copyright 2012-2017 Horde LLC (http://www.horde.org/)
9 *
10 * @author     Jan Schneider <jan@horde.org>
11 * @category   Horde
12 * @package    Horde_SessionHandler
13 * @subpackage UnitTests
14 * @license    http://www.horde.org/licenses/lgpl21 LGPL 2.1
15 */
16class Horde_SessionHandler_Storage_BuiltinTest extends Horde_SessionHandler_Storage_Base
17{
18    public function testWrite()
19    {
20        session_name('sessionname');
21        session_id('sessionid');
22        session_start();
23        $this->assertEmpty($_SESSION);
24        $_SESSION['sessiondata'] = 'foo';
25        session_write_close();
26    }
27
28    /**
29     * @depends testWrite
30     */
31    public function testRead()
32    {
33        $this->assertEquals('sessiondata|s:3:"foo";', self::$handler->read('sessionid'));
34    }
35
36    /**
37     * @depends testWrite
38     */
39    public function testReopen()
40    {
41        session_write_close();
42        session_name('sessionname');
43        session_id('sessionid');
44        session_start();
45        $this->assertEquals('foo', $_SESSION['sessiondata']);
46        session_write_close();
47    }
48
49    /**
50     * @depends testWrite
51     */
52    public function testList()
53    {
54        session_write_close();
55        session_name('sessionname');
56        session_id('sessionid2');
57        session_start();
58        $_SESSION['sessiondata2'] = 'foo';
59        /* List while session is active. */
60        $ids = self::$handler->getSessionIDs();
61        sort($ids);
62        $this->assertEquals(array('sessionid', 'sessionid2'), $ids);
63        session_write_close();
64
65        /* List while session is inactive. */
66        $ids = self::$handler->getSessionIDs();
67        sort($ids);
68        $this->assertEquals(array('sessionid', 'sessionid2'), $ids);
69    }
70
71    /**
72     * @depends testList
73     */
74    public function testDestroy()
75    {
76        session_name('sessionname');
77        session_id('sessionid2');
78        session_start();
79        $sessionIds = self::$handler->getSessionIDs();
80        sort($sessionIds);
81        $this->assertEquals(array('sessionid', 'sessionid2'),
82                            $sessionIds);
83        session_destroy();
84        $this->assertEquals(array('sessionid'),
85                            self::$handler->getSessionIDs());
86    }
87
88    /**
89     * @depends testDestroy
90     */
91    public function testGc()
92    {
93        $this->probability = ini_get('session.gc_probability');
94        $this->divisor     = ini_get('session.gc_divisor');
95        $this->maxlifetime = ini_get('session.gc_maxlifetime');
96        ini_set('session.gc_probability', 100);
97        ini_set('session.gc_divisor', 1);
98        ini_set('session.gc_maxlifetime', -1);
99        session_name('sessionname');
100        session_start();
101        $this->assertEquals(array(),
102                            self::$handler->getSessionIDs());
103    }
104
105    public static function setUpBeforeClass()
106    {
107        parent::setUpBeforeClass();
108        session_cache_limiter('');
109        ini_set('session.use_cookies', 0);
110        ini_set('session.save_path', self::$dir);
111        self::$handler = new Horde_SessionHandler_Storage_Builtin(array('path' => self::$dir));
112    }
113
114    public function tearDown()
115    {
116        if (isset($this->probability)) {
117            ini_set('session.gc_probability', $this->probability);
118            ini_set('session.gc_divisor', $this->divisor);
119            ini_set('session.gc_maxlifetime', $this->maxlifetime);
120        }
121    }
122
123    /**
124     * @todo Rely on session_status() in H6.
125     */
126    public static function tearDownAfterClass()
127    {
128        parent::tearDownAfterClass();
129        unset($_SESSION);
130        if ((function_exists('session_status') &&
131             session_status() == PHP_SESSION_ACTIVE) ||
132            (!function_exists('session_status') &&
133             session_id())) {
134            session_destroy();
135        }
136        session_name(ini_get('session.name'));
137    }
138
139}
140