Add SessionManager::invalidateSessionsForUser
[lhc/web/wiklou.git] / tests / phpunit / includes / session / SessionManagerTest.php
index a1b9bb4..2dee8bc 100644 (file)
@@ -48,7 +48,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $reset = TestUtils::setSessionManagerSingleton( null );
 
                $singleton = SessionManager::singleton();
-               $this->assertInstanceOf( 'MediaWiki\\Session\\SessionManager', $singleton );
+               $this->assertInstanceOf( SessionManager::class, $singleton );
                $this->assertSame( $singleton, SessionManager::singleton() );
        }
 
@@ -58,7 +58,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                if ( !PHPSessionHandler::isInstalled() ) {
                        PHPSessionHandler::install( SessionManager::singleton() );
                }
-               $rProp = new \ReflectionProperty( 'MediaWiki\\Session\\PHPSessionHandler', 'instance' );
+               $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' );
                $rProp->setAccessible( true );
                $handler = \TestingAccessWrapper::newFromObject( $rProp->getValue() );
                $oldEnable = $handler->enable;
@@ -191,7 +191,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $request->info1 = null;
                $request->info2 = null;
                $session = $manager->getSessionForRequest( $request );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( $idEmpty, $session->getId() );
                $this->assertFalse( $request->unpersist1 );
                $this->assertFalse( $request->unpersist2 );
@@ -210,7 +210,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'idIsSafe' => true,
                ] );
                $session = $manager->getSessionForRequest( $request );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( $id2, $session->getId() );
                $this->assertFalse( $request->unpersist1 );
                $this->assertFalse( $request->unpersist2 );
@@ -228,7 +228,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'idIsSafe' => true,
                ] );
                $session = $manager->getSessionForRequest( $request );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( $id1, $session->getId() );
                $this->assertFalse( $request->unpersist1 );
                $this->assertFalse( $request->unpersist2 );
@@ -251,7 +251,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                try {
                        $manager->getSessionForRequest( $request );
                        $this->fail( 'Expcected exception not thrown' );
-               } catch ( \OverFlowException $ex ) {
+               } catch ( \OverflowException $ex ) {
                        $this->assertStringStartsWith(
                                'Multiple sessions for this request tied for top priority: ',
                                $ex->getMessage()
@@ -299,7 +299,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'idIsSafe' => true,
                ] );
                $session = $manager->getSessionForRequest( $request );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( $id2, $session->getId() );
                $this->logger->setCollect( false );
                $this->assertTrue( $request->unpersist1 );
@@ -321,7 +321,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'idIsSafe' => true,
                ] );
                $session = $manager->getSessionForRequest( $request );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( $id1, $session->getId() );
                $this->logger->setCollect( false );
                $this->assertFalse( $request->unpersist1 );
@@ -338,7 +338,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ] );
                $request->info2 = null;
                $session = $manager->getSessionForRequest( $request );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( $id1, $session->getId() );
                $this->assertTrue( $request->unpersist1 ); // The saving of the session does it
                $this->assertFalse( $request->unpersist2 );
@@ -358,7 +358,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                // Unknown session ID
                $id = $manager->generateSessionId();
                $session = $manager->getSessionById( $id, true );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( $id, $session->getId() );
 
                $id = $manager->generateSessionId();
@@ -379,8 +379,42 @@ class SessionManagerTest extends MediaWikiTestCase {
                // Known session ID
                $this->store->setSession( $id, [] );
                $session = $manager->getSessionById( $id, false );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( $id, $session->getId() );
+
+               // Store isn't checked if the session is already loaded
+               $this->store->setSession( $id, [ 'metadata' => [
+                       'userId' => User::idFromName( 'UTSysop' ),
+                       'userToken' => 'bad',
+               ] ] );
+               $session2 = $manager->getSessionById( $id, false );
+               $this->assertInstanceOf( Session::class, $session2 );
+               $this->assertSame( $id, $session2->getId() );
+               unset( $session, $session2 );
+               $this->logger->setCollect( true );
+               $this->assertNull( $manager->getSessionById( $id, true ) );
+               $this->logger->setCollect( false );
+
+               // Failure to create an empty session
+               $manager = $this->getManager();
+               $provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'provideSessionInfo', 'newSessionInfo', '__toString' ] )
+                       ->getMock();
+               $provider->expects( $this->any() )->method( 'provideSessionInfo' )
+                       ->will( $this->returnValue( null ) );
+               $provider->expects( $this->any() )->method( 'newSessionInfo' )
+                       ->will( $this->returnValue( null ) );
+               $provider->expects( $this->any() )->method( '__toString' )
+                       ->will( $this->returnValue( 'MockProvider' ) );
+               $this->config->set( 'SessionProviders', [
+                       $this->objectCacheDef( $provider ),
+               ] );
+               $this->logger->setCollect( true );
+               $this->assertNull( $manager->getSessionById( $id, true ) );
+               $this->logger->setCollect( false );
+               $this->assertSame( [
+                       [ LogLevel::ERROR, 'Failed to create empty session: {exception}' ]
+               ], $this->logger->getBuffer() );
        }
 
        public function testGetEmptySession() {
@@ -450,7 +484,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ] );
                $info2 = null;
                $session = $manager->getEmptySession();
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( 'empty---------------------------', $session->getId() );
 
                // Info, explicitly
@@ -463,7 +497,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ] );
                $info2 = null;
                $session = $pmanager->getEmptySessionInternal( null, $expectId );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( $expectId, $session->getId() );
 
                // Wrong ID
@@ -538,7 +572,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'idIsSafe' => true,
                ] );
                $session = $manager->getEmptySession();
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( 'empty1--------------------------', $session->getId() );
 
                $expectId = null;
@@ -555,7 +589,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'idIsSafe' => true,
                ] );
                $session = $manager->getEmptySession();
-               $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session );
+               $this->assertInstanceOf( Session::class, $session );
                $this->assertSame( 'empty2--------------------------', $session->getId() );
 
                // Tied priorities throw an exception
@@ -608,6 +642,35 @@ class SessionManagerTest extends MediaWikiTestCase {
                }
        }
 
+       public function testInvalidateSessionsForUser() {
+               $user = User::newFromName( 'UTSysop' );
+               $manager = $this->getManager();
+
+               $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'invalidateSessionsForUser', '__toString' ] );
+
+               $provider1 = $providerBuilder->getMock();
+               $provider1->expects( $this->once() )->method( 'invalidateSessionsForUser' )
+                       ->with( $this->identicalTo( $user ) );
+               $provider1->expects( $this->any() )->method( '__toString' )
+                       ->will( $this->returnValue( 'MockProvider1' ) );
+
+               $provider2 = $providerBuilder->getMock();
+               $provider2->expects( $this->once() )->method( 'invalidateSessionsForUser' )
+                       ->with( $this->identicalTo( $user ) );
+               $provider2->expects( $this->any() )->method( '__toString' )
+                       ->will( $this->returnValue( 'MockProvider2' ) );
+
+               $this->config->set( 'SessionProviders', [
+                       $this->objectCacheDef( $provider1 ),
+                       $this->objectCacheDef( $provider2 ),
+               ] );
+
+               $oldToken = $user->getToken( true );
+               $manager->invalidateSessionsForUser( $user );
+               $this->assertNotEquals( $oldToken, $user->getToken() );
+       }
+
        public function testGetVaryHeaders() {
                $manager = $this->getManager();
 
@@ -717,8 +780,8 @@ class SessionManagerTest extends MediaWikiTestCase {
                $manager = \TestingAccessWrapper::newFromObject( $this->getManager() );
                $manager->setLogger( new \Psr\Log\NullLogger() );
 
-               $mock = $this->getMock( 'stdClass', [ 'save' ] );
-               $mock->expects( $this->once() )->method( 'save' );
+               $mock = $this->getMock( 'stdClass', [ 'shutdown' ] );
+               $mock->expects( $this->once() )->method( 'shutdown' );
 
                $manager->allSessionBackends = [ $mock ];
                $manager->shutdown();
@@ -809,7 +872,7 @@ class SessionManagerTest extends MediaWikiTestCase {
 
                \ObjectCache::$instances[__METHOD__] = new TestBagOStuff();
                $this->setMwGlobals( [ 'wgMainCacheType' => __METHOD__ ] );
-               $this->setMWGlobals( [
+               $this->setMwGlobals( [
                        'wgAuth' => new AuthPlugin,
                ] );
 
@@ -1143,7 +1206,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'provider' => 'Mock',
                ];
 
-               $builder = $this->getMockBuilder( 'MediaWiki\\Session\\SessionProvider' )
+               $builder = $this->getMockBuilder( SessionProvider::class )
                        ->setMethods( [ '__toString', 'mergeMetadata', 'refreshSessionInfo' ] );
 
                $provider = $builder->getMockForAbstractClass();
@@ -1258,7 +1321,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ] );
                $this->assertFalse( $info->isIdSafe(), 'sanity check' );
                $this->assertTrue( $loadSessionInfoFromStore( $info ) );
-               $this->assertInstanceOf( 'MediaWiki\\Session\\UserInfo', $info->getUserInfo() );
+               $this->assertInstanceOf( UserInfo::class, $info->getUserInfo() );
                $this->assertTrue( $info->getUserInfo()->isVerified() );
                $this->assertTrue( $info->getUserInfo()->isAnon() );
                $this->assertFalse( $info->isIdSafe() );