4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\HttpFoundation\Tests\Session\Storage;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
16 use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
17 use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
18 use Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler;
19 use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
20 use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy;
21 use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
24 * Test class for NativeSessionStorage.
26 * @author Drak <drak@zikula.org>
28 * These tests require separate processes.
30 * @runTestsInSeparateProcesses
31 * @preserveGlobalState disabled
33 class NativeSessionStorageTest extends TestCase
37 protected function setUp()
39 $this->iniSet('session.save_handler', 'files');
40 $this->iniSet('session.save_path', $this->savePath = sys_get_temp_dir().'/sf2test');
41 if (!is_dir($this->savePath)) {
42 mkdir($this->savePath);
46 protected function tearDown()
48 session_write_close();
49 array_map('unlink', glob($this->savePath.'/*'));
50 if (is_dir($this->savePath)) {
51 rmdir($this->savePath);
54 $this->savePath = null;
58 * @param array $options
60 * @return NativeSessionStorage
62 protected function getStorage(array $options = array())
64 $storage = new NativeSessionStorage($options);
65 $storage->registerBag(new AttributeBag());
70 public function testBag()
72 $storage = $this->getStorage();
73 $bag = new FlashBag();
74 $storage->registerBag($bag);
75 $this->assertSame($bag, $storage->getBag($bag->getName()));
79 * @expectedException \InvalidArgumentException
81 public function testRegisterBagException()
83 $storage = $this->getStorage();
84 $storage->getBag('non_existing');
88 * @expectedException \LogicException
90 public function testRegisterBagForAStartedSessionThrowsException()
92 $storage = $this->getStorage();
94 $storage->registerBag(new AttributeBag());
97 public function testGetId()
99 $storage = $this->getStorage();
100 $this->assertSame('', $storage->getId(), 'Empty ID before starting session');
103 $id = $storage->getId();
104 $this->assertInternalType('string', $id);
105 $this->assertNotSame('', $id);
108 $this->assertSame($id, $storage->getId(), 'ID stays after saving session');
111 public function testRegenerate()
113 $storage = $this->getStorage();
115 $id = $storage->getId();
116 $storage->getBag('attributes')->set('lucky', 7);
117 $storage->regenerate();
118 $this->assertNotEquals($id, $storage->getId());
119 $this->assertEquals(7, $storage->getBag('attributes')->get('lucky'));
122 public function testRegenerateDestroy()
124 $storage = $this->getStorage();
126 $id = $storage->getId();
127 $storage->getBag('attributes')->set('legs', 11);
128 $storage->regenerate(true);
129 $this->assertNotEquals($id, $storage->getId());
130 $this->assertEquals(11, $storage->getBag('attributes')->get('legs'));
133 public function testSessionGlobalIsUpToDateAfterIdRegeneration()
135 $storage = $this->getStorage();
137 $storage->getBag('attributes')->set('lucky', 7);
138 $storage->regenerate();
139 $storage->getBag('attributes')->set('lucky', 42);
141 $this->assertEquals(42, $_SESSION['_sf2_attributes']['lucky']);
144 public function testRegenerationFailureDoesNotFlagStorageAsStarted()
146 $storage = $this->getStorage();
147 $this->assertFalse($storage->regenerate());
148 $this->assertFalse($storage->isStarted());
151 public function testDefaultSessionCacheLimiter()
153 $this->iniSet('session.cache_limiter', 'nocache');
155 $storage = new NativeSessionStorage();
156 $this->assertEquals('', ini_get('session.cache_limiter'));
159 public function testExplicitSessionCacheLimiter()
161 $this->iniSet('session.cache_limiter', 'nocache');
163 $storage = new NativeSessionStorage(array('cache_limiter' => 'public'));
164 $this->assertEquals('public', ini_get('session.cache_limiter'));
167 public function testCookieOptions()
170 'cookie_lifetime' => 123456,
171 'cookie_path' => '/my/cookie/path',
172 'cookie_domain' => 'symfony.example.com',
173 'cookie_secure' => true,
174 'cookie_httponly' => false,
177 $this->getStorage($options);
178 $temp = session_get_cookie_params();
181 foreach ($temp as $key => $value) {
182 $gco['cookie_'.$key] = $value;
185 $this->assertEquals($options, $gco);
189 * @expectedException \InvalidArgumentException
191 public function testSetSaveHandlerException()
193 $storage = $this->getStorage();
194 $storage->setSaveHandler(new \stdClass());
197 public function testSetSaveHandler53()
199 if (\PHP_VERSION_ID >= 50400) {
200 $this->markTestSkipped('Test skipped, for PHP 5.3 only.');
203 $this->iniSet('session.save_handler', 'files');
204 $storage = $this->getStorage();
205 $storage->setSaveHandler();
206 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler());
207 $storage->setSaveHandler(null);
208 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler());
209 $storage->setSaveHandler(new NativeSessionHandler());
210 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler());
211 $storage->setSaveHandler(new SessionHandlerProxy(new NullSessionHandler()));
212 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
213 $storage->setSaveHandler(new NullSessionHandler());
214 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
215 $storage->setSaveHandler(new NativeProxy());
216 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler());
222 public function testSetSaveHandler54()
224 $this->iniSet('session.save_handler', 'files');
225 $storage = $this->getStorage();
226 $storage->setSaveHandler();
227 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
228 $storage->setSaveHandler(null);
229 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
230 $storage->setSaveHandler(new SessionHandlerProxy(new NativeSessionHandler()));
231 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
232 $storage->setSaveHandler(new NativeSessionHandler());
233 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
234 $storage->setSaveHandler(new SessionHandlerProxy(new NullSessionHandler()));
235 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
236 $storage->setSaveHandler(new NullSessionHandler());
237 $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
241 * @expectedException \RuntimeException
243 public function testStartedOutside()
245 $storage = $this->getStorage();
247 $this->assertFalse($storage->getSaveHandler()->isActive());
248 $this->assertFalse($storage->isStarted());
251 $this->assertTrue(isset($_SESSION));
252 if (\PHP_VERSION_ID >= 50400) {
253 // this only works in PHP >= 5.4 where session_status is available
254 $this->assertTrue($storage->getSaveHandler()->isActive());
256 // PHP session might have started, but the storage driver has not, so false is correct here
257 $this->assertFalse($storage->isStarted());
259 $key = $storage->getMetadataBag()->getStorageKey();
260 $this->assertFalse(isset($_SESSION[$key]));
264 public function testRestart()
266 $storage = $this->getStorage();
268 $id = $storage->getId();
269 $storage->getBag('attributes')->set('lucky', 7);
272 $this->assertSame($id, $storage->getId(), 'Same session ID after restarting');
273 $this->assertSame(7, $storage->getBag('attributes')->get('lucky'), 'Data still available');