Merge "Warn if stateful ParserOutput transforms are used"
[lhc/web/wiklou.git] / tests / phpunit / includes / session / SessionInfoTest.php
1 <?php
2
3 namespace MediaWiki\Session;
4
5 use MediaWikiTestCase;
6
7 /**
8 * @group Session
9 * @group Database
10 * @covers MediaWiki\Session\SessionInfo
11 */
12 class SessionInfoTest extends MediaWikiTestCase {
13
14 public function testBasics() {
15 $anonInfo = UserInfo::newAnonymous();
16 $userInfo = UserInfo::newFromName( 'UTSysop', true );
17 $unverifiedUserInfo = UserInfo::newFromName( 'UTSysop', false );
18
19 try {
20 new SessionInfo( SessionInfo::MIN_PRIORITY - 1, [] );
21 $this->fail( 'Expected exception not thrown', 'priority < min' );
22 } catch ( \InvalidArgumentException $ex ) {
23 $this->assertSame( 'Invalid priority', $ex->getMessage(), 'priority < min' );
24 }
25
26 try {
27 new SessionInfo( SessionInfo::MAX_PRIORITY + 1, [] );
28 $this->fail( 'Expected exception not thrown', 'priority > max' );
29 } catch ( \InvalidArgumentException $ex ) {
30 $this->assertSame( 'Invalid priority', $ex->getMessage(), 'priority > max' );
31 }
32
33 try {
34 new SessionInfo( SessionInfo::MIN_PRIORITY, [ 'id' => 'ABC?' ] );
35 $this->fail( 'Expected exception not thrown', 'bad session ID' );
36 } catch ( \InvalidArgumentException $ex ) {
37 $this->assertSame( 'Invalid session ID', $ex->getMessage(), 'bad session ID' );
38 }
39
40 try {
41 new SessionInfo( SessionInfo::MIN_PRIORITY, [ 'userInfo' => new \stdClass ] );
42 $this->fail( 'Expected exception not thrown', 'bad userInfo' );
43 } catch ( \InvalidArgumentException $ex ) {
44 $this->assertSame( 'Invalid userInfo', $ex->getMessage(), 'bad userInfo' );
45 }
46
47 try {
48 new SessionInfo( SessionInfo::MIN_PRIORITY, [] );
49 $this->fail( 'Expected exception not thrown', 'no provider, no id' );
50 } catch ( \InvalidArgumentException $ex ) {
51 $this->assertSame( 'Must supply an ID when no provider is given', $ex->getMessage(),
52 'no provider, no id' );
53 }
54
55 try {
56 new SessionInfo( SessionInfo::MIN_PRIORITY, [ 'copyFrom' => new \stdClass ] );
57 $this->fail( 'Expected exception not thrown', 'bad copyFrom' );
58 } catch ( \InvalidArgumentException $ex ) {
59 $this->assertSame( 'Invalid copyFrom', $ex->getMessage(),
60 'bad copyFrom' );
61 }
62
63 $manager = new SessionManager();
64 $provider = $this->getMockBuilder( SessionProvider::class )
65 ->setMethods( [ 'persistsSessionId', 'canChangeUser', '__toString' ] )
66 ->getMockForAbstractClass();
67 $provider->setManager( $manager );
68 $provider->expects( $this->any() )->method( 'persistsSessionId' )
69 ->will( $this->returnValue( true ) );
70 $provider->expects( $this->any() )->method( 'canChangeUser' )
71 ->will( $this->returnValue( true ) );
72 $provider->expects( $this->any() )->method( '__toString' )
73 ->will( $this->returnValue( 'Mock' ) );
74
75 $provider2 = $this->getMockBuilder( SessionProvider::class )
76 ->setMethods( [ 'persistsSessionId', 'canChangeUser', '__toString' ] )
77 ->getMockForAbstractClass();
78 $provider2->setManager( $manager );
79 $provider2->expects( $this->any() )->method( 'persistsSessionId' )
80 ->will( $this->returnValue( true ) );
81 $provider2->expects( $this->any() )->method( 'canChangeUser' )
82 ->will( $this->returnValue( true ) );
83 $provider2->expects( $this->any() )->method( '__toString' )
84 ->will( $this->returnValue( 'Mock2' ) );
85
86 try {
87 new SessionInfo( SessionInfo::MIN_PRIORITY, [
88 'provider' => $provider,
89 'userInfo' => $anonInfo,
90 'metadata' => 'foo',
91 ] );
92 $this->fail( 'Expected exception not thrown', 'bad metadata' );
93 } catch ( \InvalidArgumentException $ex ) {
94 $this->assertSame( 'Invalid metadata', $ex->getMessage(), 'bad metadata' );
95 }
96
97 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
98 'provider' => $provider,
99 'userInfo' => $anonInfo
100 ] );
101 $this->assertSame( $provider, $info->getProvider() );
102 $this->assertNotNull( $info->getId() );
103 $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
104 $this->assertSame( $anonInfo, $info->getUserInfo() );
105 $this->assertTrue( $info->isIdSafe() );
106 $this->assertFalse( $info->forceUse() );
107 $this->assertFalse( $info->wasPersisted() );
108 $this->assertFalse( $info->wasRemembered() );
109 $this->assertFalse( $info->forceHTTPS() );
110 $this->assertNull( $info->getProviderMetadata() );
111
112 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
113 'provider' => $provider,
114 'userInfo' => $unverifiedUserInfo,
115 'metadata' => [ 'Foo' ],
116 ] );
117 $this->assertSame( $provider, $info->getProvider() );
118 $this->assertNotNull( $info->getId() );
119 $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
120 $this->assertSame( $unverifiedUserInfo, $info->getUserInfo() );
121 $this->assertTrue( $info->isIdSafe() );
122 $this->assertFalse( $info->forceUse() );
123 $this->assertFalse( $info->wasPersisted() );
124 $this->assertFalse( $info->wasRemembered() );
125 $this->assertFalse( $info->forceHTTPS() );
126 $this->assertSame( [ 'Foo' ], $info->getProviderMetadata() );
127
128 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
129 'provider' => $provider,
130 'userInfo' => $userInfo
131 ] );
132 $this->assertSame( $provider, $info->getProvider() );
133 $this->assertNotNull( $info->getId() );
134 $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
135 $this->assertSame( $userInfo, $info->getUserInfo() );
136 $this->assertTrue( $info->isIdSafe() );
137 $this->assertFalse( $info->forceUse() );
138 $this->assertFalse( $info->wasPersisted() );
139 $this->assertTrue( $info->wasRemembered() );
140 $this->assertFalse( $info->forceHTTPS() );
141 $this->assertNull( $info->getProviderMetadata() );
142
143 $id = $manager->generateSessionId();
144
145 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
146 'provider' => $provider,
147 'id' => $id,
148 'persisted' => true,
149 'userInfo' => $anonInfo
150 ] );
151 $this->assertSame( $provider, $info->getProvider() );
152 $this->assertSame( $id, $info->getId() );
153 $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
154 $this->assertSame( $anonInfo, $info->getUserInfo() );
155 $this->assertFalse( $info->isIdSafe() );
156 $this->assertFalse( $info->forceUse() );
157 $this->assertTrue( $info->wasPersisted() );
158 $this->assertFalse( $info->wasRemembered() );
159 $this->assertFalse( $info->forceHTTPS() );
160 $this->assertNull( $info->getProviderMetadata() );
161
162 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
163 'provider' => $provider,
164 'id' => $id,
165 'userInfo' => $userInfo
166 ] );
167 $this->assertSame( $provider, $info->getProvider() );
168 $this->assertSame( $id, $info->getId() );
169 $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
170 $this->assertSame( $userInfo, $info->getUserInfo() );
171 $this->assertFalse( $info->isIdSafe() );
172 $this->assertFalse( $info->forceUse() );
173 $this->assertFalse( $info->wasPersisted() );
174 $this->assertTrue( $info->wasRemembered() );
175 $this->assertFalse( $info->forceHTTPS() );
176 $this->assertNull( $info->getProviderMetadata() );
177
178 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
179 'id' => $id,
180 'persisted' => true,
181 'userInfo' => $userInfo,
182 'metadata' => [ 'Foo' ],
183 ] );
184 $this->assertSame( $id, $info->getId() );
185 $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
186 $this->assertSame( $userInfo, $info->getUserInfo() );
187 $this->assertFalse( $info->isIdSafe() );
188 $this->assertFalse( $info->forceUse() );
189 $this->assertTrue( $info->wasPersisted() );
190 $this->assertFalse( $info->wasRemembered() );
191 $this->assertFalse( $info->forceHTTPS() );
192 $this->assertNull( $info->getProviderMetadata() );
193
194 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
195 'id' => $id,
196 'remembered' => true,
197 'userInfo' => $userInfo,
198 ] );
199 $this->assertFalse( $info->wasRemembered(), 'no provider' );
200
201 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
202 'provider' => $provider,
203 'id' => $id,
204 'remembered' => true,
205 ] );
206 $this->assertFalse( $info->wasRemembered(), 'no user' );
207
208 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
209 'provider' => $provider,
210 'id' => $id,
211 'remembered' => true,
212 'userInfo' => $anonInfo,
213 ] );
214 $this->assertFalse( $info->wasRemembered(), 'anonymous user' );
215
216 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
217 'provider' => $provider,
218 'id' => $id,
219 'remembered' => true,
220 'userInfo' => $unverifiedUserInfo,
221 ] );
222 $this->assertFalse( $info->wasRemembered(), 'unverified user' );
223
224 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
225 'provider' => $provider,
226 'id' => $id,
227 'remembered' => false,
228 'userInfo' => $userInfo,
229 ] );
230 $this->assertFalse( $info->wasRemembered(), 'specific override' );
231
232 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
233 'id' => $id,
234 'idIsSafe' => true,
235 ] );
236 $this->assertSame( $id, $info->getId() );
237 $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
238 $this->assertTrue( $info->isIdSafe() );
239
240 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
241 'id' => $id,
242 'forceUse' => true,
243 ] );
244 $this->assertFalse( $info->forceUse(), 'no provider' );
245
246 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
247 'provider' => $provider,
248 'forceUse' => true,
249 ] );
250 $this->assertFalse( $info->forceUse(), 'no id' );
251
252 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
253 'provider' => $provider,
254 'id' => $id,
255 'forceUse' => true,
256 ] );
257 $this->assertTrue( $info->forceUse(), 'correct use' );
258
259 $info = new SessionInfo( SessionInfo::MIN_PRIORITY, [
260 'id' => $id,
261 'forceHTTPS' => 1,
262 ] );
263 $this->assertTrue( $info->forceHTTPS() );
264
265 $fromInfo = new SessionInfo( SessionInfo::MIN_PRIORITY, [
266 'id' => $id . 'A',
267 'provider' => $provider,
268 'userInfo' => $userInfo,
269 'idIsSafe' => true,
270 'forceUse' => true,
271 'persisted' => true,
272 'remembered' => true,
273 'forceHTTPS' => true,
274 'metadata' => [ 'foo!' ],
275 ] );
276 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 4, [
277 'copyFrom' => $fromInfo,
278 ] );
279 $this->assertSame( $id . 'A', $info->getId() );
280 $this->assertSame( SessionInfo::MIN_PRIORITY + 4, $info->getPriority() );
281 $this->assertSame( $provider, $info->getProvider() );
282 $this->assertSame( $userInfo, $info->getUserInfo() );
283 $this->assertTrue( $info->isIdSafe() );
284 $this->assertTrue( $info->forceUse() );
285 $this->assertTrue( $info->wasPersisted() );
286 $this->assertTrue( $info->wasRemembered() );
287 $this->assertTrue( $info->forceHTTPS() );
288 $this->assertSame( [ 'foo!' ], $info->getProviderMetadata() );
289
290 $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 4, [
291 'id' => $id . 'X',
292 'provider' => $provider2,
293 'userInfo' => $unverifiedUserInfo,
294 'idIsSafe' => false,
295 'forceUse' => false,
296 'persisted' => false,
297 'remembered' => false,
298 'forceHTTPS' => false,
299 'metadata' => null,
300 'copyFrom' => $fromInfo,
301 ] );
302 $this->assertSame( $id . 'X', $info->getId() );
303 $this->assertSame( SessionInfo::MIN_PRIORITY + 4, $info->getPriority() );
304 $this->assertSame( $provider2, $info->getProvider() );
305 $this->assertSame( $unverifiedUserInfo, $info->getUserInfo() );
306 $this->assertFalse( $info->isIdSafe() );
307 $this->assertFalse( $info->forceUse() );
308 $this->assertFalse( $info->wasPersisted() );
309 $this->assertFalse( $info->wasRemembered() );
310 $this->assertFalse( $info->forceHTTPS() );
311 $this->assertNull( $info->getProviderMetadata() );
312
313 $info = new SessionInfo( SessionInfo::MIN_PRIORITY, [
314 'id' => $id,
315 ] );
316 $this->assertSame(
317 '[' . SessionInfo::MIN_PRIORITY . "]null<null>$id",
318 (string)$info,
319 'toString'
320 );
321
322 $info = new SessionInfo( SessionInfo::MIN_PRIORITY, [
323 'provider' => $provider,
324 'id' => $id,
325 'persisted' => true,
326 'userInfo' => $userInfo
327 ] );
328 $this->assertSame(
329 '[' . SessionInfo::MIN_PRIORITY . "]Mock<+:{$userInfo->getId()}:UTSysop>$id",
330 (string)$info,
331 'toString'
332 );
333
334 $info = new SessionInfo( SessionInfo::MIN_PRIORITY, [
335 'provider' => $provider,
336 'id' => $id,
337 'persisted' => true,
338 'userInfo' => $unverifiedUserInfo
339 ] );
340 $this->assertSame(
341 '[' . SessionInfo::MIN_PRIORITY . "]Mock<-:{$userInfo->getId()}:UTSysop>$id",
342 (string)$info,
343 'toString'
344 );
345 }
346
347 public function testCompare() {
348 $id = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
349 $info1 = new SessionInfo( SessionInfo::MIN_PRIORITY + 1, [ 'id' => $id ] );
350 $info2 = new SessionInfo( SessionInfo::MIN_PRIORITY + 2, [ 'id' => $id ] );
351
352 $this->assertTrue( SessionInfo::compare( $info1, $info2 ) < 0, '<' );
353 $this->assertTrue( SessionInfo::compare( $info2, $info1 ) > 0, '>' );
354 $this->assertTrue( SessionInfo::compare( $info1, $info1 ) === 0, '==' );
355 }
356 }