15
15
16
16
class PdoSessionHandlerTest extends \PHPUnit_Framework_TestCase
17
17
{
18
- private $ pdo ;
18
+ private $ dbFile ;
19
19
20
20
protected function setUp ()
21
21
{
22
22
if (!class_exists ('PDO ' ) || !in_array ('sqlite ' , \PDO ::getAvailableDrivers ())) {
23
23
$ this ->markTestSkipped ('This test requires SQLite support in your environment ' );
24
24
}
25
+ }
26
+
27
+ protected function tearDown ()
28
+ {
29
+ // make sure the temporary database file is deleted when it has been created (even when a test fails)
30
+ if ($ this ->dbFile ) {
31
+ @unlink ($ this ->dbFile );
32
+ }
33
+ }
34
+
35
+ protected function getPersistentSqliteDsn ()
36
+ {
37
+ $ this ->dbFile = tempnam (sys_get_temp_dir (), 'sf2_sqlite_sessions ' );
25
38
26
- $ this ->pdo = new \PDO ('sqlite::memory: ' );
27
- $ this ->pdo ->setAttribute (\PDO ::ATTR_ERRMODE , \PDO ::ERRMODE_EXCEPTION );
28
- $ sql = 'CREATE TABLE sessions (sess_id VARCHAR(128) PRIMARY KEY, sess_data BLOB, sess_lifetime MEDIUMINT, sess_time INTEGER) ' ;
29
- $ this ->pdo ->exec ($ sql );
39
+ return 'sqlite: ' . $ this ->dbFile ;
40
+ }
41
+
42
+ protected function getMemorySqlitePdo ()
43
+ {
44
+ $ pdo = new \PDO ('sqlite::memory: ' );
45
+ $ pdo ->setAttribute (\PDO ::ATTR_ERRMODE , \PDO ::ERRMODE_EXCEPTION );
46
+ $ storage = new PdoSessionHandler ($ pdo );
47
+ $ storage ->createTable ();
48
+
49
+ return $ pdo ;
30
50
}
31
51
32
52
/**
33
53
* @expectedException \InvalidArgumentException
34
54
*/
35
55
public function testWrongPdoErrMode ()
36
56
{
37
- $ this ->pdo ->setAttribute (\PDO ::ATTR_ERRMODE , \PDO ::ERRMODE_SILENT );
57
+ $ pdo = $ this ->getMemorySqlitePdo ();
58
+ $ pdo ->setAttribute (\PDO ::ATTR_ERRMODE , \PDO ::ERRMODE_SILENT );
38
59
39
- $ storage = new PdoSessionHandler ($ this -> pdo );
60
+ $ storage = new PdoSessionHandler ($ pdo );
40
61
}
41
62
42
63
/**
43
64
* @expectedException \RuntimeException
44
65
*/
45
66
public function testInexistentTable ()
46
67
{
47
- $ storage = new PdoSessionHandler ($ this ->pdo , array ('db_table ' => 'inexistent_table ' ));
68
+ $ storage = new PdoSessionHandler ($ this ->getMemorySqlitePdo () , array ('db_table ' => 'inexistent_table ' ));
48
69
$ storage ->open ('' , 'sid ' );
49
70
$ storage ->read ('id ' );
50
71
$ storage ->write ('id ' , 'data ' );
51
72
$ storage ->close ();
52
73
}
53
74
54
- public function testWithLazyDnsConnection ()
75
+ /**
76
+ * @expectedException \RuntimeException
77
+ */
78
+ public function testCreateTableTwice ()
55
79
{
56
- $ dbFile = tempnam (sys_get_temp_dir (), 'sf2_sqlite_sessions ' );
57
- if (file_exists ($ dbFile )) {
58
- @unlink ($ dbFile );
59
- }
80
+ $ storage = new PdoSessionHandler ($ this ->getMemorySqlitePdo ());
81
+ $ storage ->createTable ();
82
+ }
60
83
61
- $ pdo = new \PDO ('sqlite: ' . $ dbFile );
62
- $ sql = 'CREATE TABLE sessions (sess_id VARCHAR(128) PRIMARY KEY, sess_data BLOB, sess_lifetime MEDIUMINT, sess_time INTEGER) ' ;
63
- $ pdo ->exec ($ sql );
64
- $ pdo = null ;
84
+ public function testWithLazyDsnConnection ()
85
+ {
86
+ $ dsn = $ this ->getPersistentSqliteDsn ();
65
87
66
- $ storage = new PdoSessionHandler ('sqlite: ' . $ dbFile );
88
+ $ storage = new PdoSessionHandler ($ dsn );
89
+ $ storage ->createTable ();
67
90
$ storage ->open ('' , 'sid ' );
68
91
$ data = $ storage ->read ('id ' );
69
92
$ storage ->write ('id ' , 'data ' );
@@ -74,43 +97,32 @@ public function testWithLazyDnsConnection()
74
97
$ data = $ storage ->read ('id ' );
75
98
$ storage ->close ();
76
99
$ this ->assertSame ('data ' , $ data , 'Written value can be read back correctly ' );
77
-
78
- @unlink ($ dbFile );
79
100
}
80
101
81
102
public function testWithLazySavePathConnection ()
82
103
{
83
- $ dbFile = tempnam (sys_get_temp_dir (), 'sf2_sqlite_sessions ' );
84
- if (file_exists ($ dbFile )) {
85
- @unlink ($ dbFile );
86
- }
104
+ $ dsn = $ this ->getPersistentSqliteDsn ();
87
105
88
- $ pdo = new \PDO ('sqlite: ' . $ dbFile );
89
- $ sql = 'CREATE TABLE sessions (sess_id VARCHAR(128) PRIMARY KEY, sess_data BLOB, sess_lifetime MEDIUMINT, sess_time INTEGER) ' ;
90
- $ pdo ->exec ($ sql );
91
- $ pdo = null ;
92
-
93
- // Open is called with what ini_set('session.save_path', 'sqlite:' . $dbFile) would mean
106
+ // Open is called with what ini_set('session.save_path', $dsn) would mean
94
107
$ storage = new PdoSessionHandler (null );
95
- $ storage ->open ('sqlite: ' . $ dbFile , 'sid ' );
108
+ $ storage ->open ($ dsn , 'sid ' );
109
+ $ storage ->createTable ();
96
110
$ data = $ storage ->read ('id ' );
97
111
$ storage ->write ('id ' , 'data ' );
98
112
$ storage ->close ();
99
113
$ this ->assertSame ('' , $ data , 'New session returns empty string data ' );
100
114
101
- $ storage ->open (' sqlite: ' . $ dbFile , 'sid ' );
115
+ $ storage ->open ($ dsn , 'sid ' );
102
116
$ data = $ storage ->read ('id ' );
103
117
$ storage ->close ();
104
118
$ this ->assertSame ('data ' , $ data , 'Written value can be read back correctly ' );
105
-
106
- @unlink ($ dbFile );
107
119
}
108
120
109
121
public function testReadWriteReadWithNullByte ()
110
122
{
111
123
$ sessionData = 'da ' . "\0" . 'ta ' ;
112
124
113
- $ storage = new PdoSessionHandler ($ this ->pdo );
125
+ $ storage = new PdoSessionHandler ($ this ->getMemorySqlitePdo () );
114
126
$ storage ->open ('' , 'sid ' );
115
127
$ readData = $ storage ->read ('id ' );
116
128
$ storage ->write ('id ' , $ sessionData );
@@ -128,7 +140,7 @@ public function testReadWriteReadWithNullByte()
128
140
*/
129
141
public function testWriteDifferentSessionIdThanRead ()
130
142
{
131
- $ storage = new PdoSessionHandler ($ this ->pdo );
143
+ $ storage = new PdoSessionHandler ($ this ->getMemorySqlitePdo () );
132
144
$ storage ->open ('' , 'sid ' );
133
145
$ storage ->read ('id ' );
134
146
$ storage ->destroy ('id ' );
@@ -139,13 +151,13 @@ public function testWriteDifferentSessionIdThanRead()
139
151
$ data = $ storage ->read ('new_id ' );
140
152
$ storage ->close ();
141
153
142
- $ this ->assertSame ('data_of_new_session_id ' , $ data , 'Data of regenerated session id is available ' );
154
+ $ this ->assertSame ('data_of_new_session_id ' , $ data , 'Data of regenerated session id is available ' );
143
155
}
144
156
145
157
public function testWrongUsageStillWorks ()
146
158
{
147
159
// wrong method sequence that should no happen, but still works
148
- $ storage = new PdoSessionHandler ($ this ->pdo );
160
+ $ storage = new PdoSessionHandler ($ this ->getMemorySqlitePdo () );
149
161
$ storage ->write ('id ' , 'data ' );
150
162
$ storage ->write ('other_id ' , 'other_data ' );
151
163
$ storage ->destroy ('inexistent ' );
@@ -160,19 +172,20 @@ public function testWrongUsageStillWorks()
160
172
161
173
public function testSessionDestroy ()
162
174
{
163
- $ storage = new PdoSessionHandler ($ this ->pdo );
175
+ $ pdo = $ this ->getMemorySqlitePdo ();
176
+ $ storage = new PdoSessionHandler ($ pdo );
164
177
165
178
$ storage ->open ('' , 'sid ' );
166
179
$ storage ->read ('id ' );
167
180
$ storage ->write ('id ' , 'data ' );
168
181
$ storage ->close ();
169
- $ this ->assertEquals (1 , $ this -> pdo ->query ('SELECT COUNT(*) FROM sessions ' )->fetchColumn ());
182
+ $ this ->assertEquals (1 , $ pdo ->query ('SELECT COUNT(*) FROM sessions ' )->fetchColumn ());
170
183
171
184
$ storage ->open ('' , 'sid ' );
172
185
$ storage ->read ('id ' );
173
186
$ storage ->destroy ('id ' );
174
187
$ storage ->close ();
175
- $ this ->assertEquals (0 , $ this -> pdo ->query ('SELECT COUNT(*) FROM sessions ' )->fetchColumn ());
188
+ $ this ->assertEquals (0 , $ pdo ->query ('SELECT COUNT(*) FROM sessions ' )->fetchColumn ());
176
189
177
190
$ storage ->open ('' , 'sid ' );
178
191
$ data = $ storage ->read ('id ' );
@@ -183,7 +196,8 @@ public function testSessionDestroy()
183
196
public function testSessionGC ()
184
197
{
185
198
$ previousLifeTime = ini_set ('session.gc_maxlifetime ' , 1000 );
186
- $ storage = new PdoSessionHandler ($ this ->pdo );
199
+ $ pdo = $ this ->getMemorySqlitePdo ();
200
+ $ storage = new PdoSessionHandler ($ pdo );
187
201
188
202
$ storage ->open ('' , 'sid ' );
189
203
$ storage ->read ('id ' );
@@ -195,7 +209,7 @@ public function testSessionGC()
195
209
ini_set ('session.gc_maxlifetime ' , -1 ); // test that you can set lifetime of a session after it has been read
196
210
$ storage ->write ('gc_id ' , 'data ' );
197
211
$ storage ->close ();
198
- $ this ->assertEquals (2 , $ this -> pdo ->query ('SELECT COUNT(*) FROM sessions ' )->fetchColumn (), 'No session pruned because gc not called ' );
212
+ $ this ->assertEquals (2 , $ pdo ->query ('SELECT COUNT(*) FROM sessions ' )->fetchColumn (), 'No session pruned because gc not called ' );
199
213
200
214
$ storage ->open ('' , 'sid ' );
201
215
$ data = $ storage ->read ('gc_id ' );
@@ -205,12 +219,22 @@ public function testSessionGC()
205
219
ini_set ('session.gc_maxlifetime ' , $ previousLifeTime );
206
220
207
221
$ this ->assertSame ('' , $ data , 'Session already considered garbage, so not returning data even if it is not pruned yet ' );
208
- $ this ->assertEquals (1 , $ this -> pdo ->query ('SELECT COUNT(*) FROM sessions ' )->fetchColumn (), 'Expired session is pruned ' );
222
+ $ this ->assertEquals (1 , $ pdo ->query ('SELECT COUNT(*) FROM sessions ' )->fetchColumn (), 'Expired session is pruned ' );
209
223
}
210
224
211
225
public function testGetConnection ()
212
226
{
213
- $ storage = new PdoSessionHandler ($ this ->pdo );
227
+ $ storage = new PdoSessionHandler ($ this ->getMemorySqlitePdo ());
228
+
229
+ $ method = new \ReflectionMethod ($ storage , 'getConnection ' );
230
+ $ method ->setAccessible (true );
231
+
232
+ $ this ->assertInstanceOf ('\PDO ' , $ method ->invoke ($ storage ));
233
+ }
234
+
235
+ public function testGetConnectionConnectsIfNeeded ()
236
+ {
237
+ $ storage = new PdoSessionHandler ('sqlite::memory: ' );
214
238
215
239
$ method = new \ReflectionMethod ($ storage , 'getConnection ' );
216
240
$ method ->setAccessible (true );
0 commit comments