From eb39d5f945245d65c0f5e44466c6d616b62577f5 Mon Sep 17 00:00:00 2001 From: addshore Date: Wed, 27 Jun 2018 13:16:35 +0100 Subject: [PATCH] Introduce RevisionStoreFactory & Tests Bug: T194729 Change-Id: I0a8a441b803816281113e52a2a57cc07af8a1119 --- includes/MediaWikiServices.php | 9 ++ includes/ServiceWiring.php | 18 ++- includes/Storage/RevisionStoreFactory.php | 141 ++++++++++++++++++ .../includes/MediaWikiServicesTest.php | 2 + .../Storage/RevisionStoreFactoryTest.php | 131 ++++++++++++++++ 5 files changed, 293 insertions(+), 8 deletions(-) create mode 100644 includes/Storage/RevisionStoreFactory.php create mode 100644 tests/phpunit/includes/Storage/RevisionStoreFactoryTest.php diff --git a/includes/MediaWikiServices.php b/includes/MediaWikiServices.php index ac155745ae..8bd25d7a35 100644 --- a/includes/MediaWikiServices.php +++ b/includes/MediaWikiServices.php @@ -21,6 +21,7 @@ use MediaWiki\Storage\NameTableStore; use MediaWiki\Storage\RevisionFactory; use MediaWiki\Storage\RevisionLookup; use MediaWiki\Storage\RevisionStore; +use MediaWiki\Storage\RevisionStoreFactory; use Wikimedia\Rdbms\LBFactory; use LinkCache; use Wikimedia\Rdbms\LoadBalancer; @@ -757,6 +758,14 @@ class MediaWikiServices extends ServiceContainer { return $this->getService( 'RevisionStore' ); } + /** + * @since 1.32 + * @return RevisionStoreFactory + */ + public function getRevisionStoreFactory() { + return $this->getService( 'RevisionStoreFactory' ); + } + /** * @since 1.31 * @return RevisionLookup diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 425b789ae5..ba576d5899 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -46,7 +46,7 @@ use MediaWiki\Preferences\DefaultPreferencesFactory; use MediaWiki\Shell\CommandFactory; use MediaWiki\Storage\BlobStoreFactory; use MediaWiki\Storage\NameTableStore; -use MediaWiki\Storage\RevisionStore; +use MediaWiki\Storage\RevisionStoreFactory; use MediaWiki\Storage\SqlBlobStore; use Wikimedia\ObjectFactory; @@ -463,10 +463,15 @@ return [ }, 'RevisionStore' => function ( MediaWikiServices $services ) { + return $services->getRevisionStoreFactory()->getRevisionStore(); + }, + + 'RevisionStoreFactory' => function ( MediaWikiServices $services ) { /** @var SqlBlobStore $blobStore */ $blobStore = $services->getService( '_SqlBlobStore' ); + $config = $services->getMainConfig(); - $store = new RevisionStore( + $store = new RevisionStoreFactory( $services->getDBLoadBalancer(), $blobStore, $services->getMainWANObjectCache(), @@ -474,14 +479,11 @@ return [ $services->getContentModelStore(), $services->getSlotRoleStore(), $services->getMainConfig()->get( 'MultiContentRevisionSchemaMigrationStage' ), - $services->getActorMigration() + $services->getActorMigration(), + LoggerFactory::getInstance( 'RevisionStore' ), + $config->get( 'ContentHandlerUseDB' ) ); - $store->setLogger( LoggerFactory::getInstance( 'RevisionStore' ) ); - - $config = $services->getMainConfig(); - $store->setContentHandlerUseDB( $config->get( 'ContentHandlerUseDB' ) ); - return $store; }, diff --git a/includes/Storage/RevisionStoreFactory.php b/includes/Storage/RevisionStoreFactory.php new file mode 100644 index 0000000000..6f8bd99e0d --- /dev/null +++ b/includes/Storage/RevisionStoreFactory.php @@ -0,0 +1,141 @@ +loadBalancer = $loadBalancer; + $this->blobStore = $blobStore; + $this->cache = $cache; + $this->commentStore = $commentStore; + $this->contentModelStore = $contentModelStore; + $this->slotRoleStore = $slotRoleStore; + $this->mcrMigrationStage = $migrationStage; + $this->actorMigration = $actorMigration; + $this->logger = $logger; + $this->contentHandlerUseDB = $contentHandlerUseDB; + } + + /** + * @since 1.32 + * + * @param bool|string $wikiId false for the current domain / wikid + * + * @return RevisionStore for the given wikiId with all necessary services and a logger + */ + public function getRevisionStore( $wikiId = false ) { + Assert::parameterType( 'string|boolean', $wikiId, '$wikiId' ); + + $store = new RevisionStore( + $this->loadBalancer, + $this->blobStore, + $this->cache, + $this->commentStore, + $this->contentModelStore, + $this->slotRoleStore, + $this->mcrMigrationStage, + $this->actorMigration, + $wikiId + ); + + $store->setLogger( $this->logger ); + $store->setContentHandlerUseDB( $this->contentHandlerUseDB ); + + return $store; + } + +} diff --git a/tests/phpunit/includes/MediaWikiServicesTest.php b/tests/phpunit/includes/MediaWikiServicesTest.php index 93c7ed3f8d..31e6fefccf 100644 --- a/tests/phpunit/includes/MediaWikiServicesTest.php +++ b/tests/phpunit/includes/MediaWikiServicesTest.php @@ -14,6 +14,7 @@ use MediaWiki\Storage\BlobStoreFactory; use MediaWiki\Storage\NameTableStore; use MediaWiki\Storage\RevisionLookup; use MediaWiki\Storage\RevisionStore; +use MediaWiki\Storage\RevisionStoreFactory; use MediaWiki\Storage\SqlBlobStore; /** @@ -346,6 +347,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase { 'BlobStore' => [ 'BlobStore', BlobStore::class ], '_SqlBlobStore' => [ '_SqlBlobStore', SqlBlobStore::class ], 'RevisionStore' => [ 'RevisionStore', RevisionStore::class ], + 'RevisionStoreFactory' => [ 'RevisionStoreFactory', RevisionStoreFactory::class ], 'RevisionLookup' => [ 'RevisionLookup', RevisionLookup::class ], 'HttpRequestFactory' => [ 'HttpRequestFactory', HttpRequestFactory::class ], 'CommentStore' => [ 'CommentStore', CommentStore::class ], diff --git a/tests/phpunit/includes/Storage/RevisionStoreFactoryTest.php b/tests/phpunit/includes/Storage/RevisionStoreFactoryTest.php new file mode 100644 index 0000000000..a5c18ac5a6 --- /dev/null +++ b/tests/phpunit/includes/Storage/RevisionStoreFactoryTest.php @@ -0,0 +1,131 @@ +getMockLoadBalancer(), + $this->getMockSqlBlobStore(), + $this->getHashWANObjectCache(), + $this->getMockCommentStore(), + $this->getMockNameTableStore(), + $this->getMockNameTableStore(), + MIGRATION_OLD, + ActorMigration::newMigration(), + LoggerFactory::getInstance( 'someInstance' ), + true + ); + $this->assertTrue( true ); + } + + public function provideWikiIds() { + yield [ true ]; + yield [ false ]; + yield [ 'somewiki' ]; + yield [ 'somewiki', MIGRATION_OLD , false ]; + yield [ 'somewiki', MIGRATION_NEW , true ]; + } + + /** + * @dataProvider provideWikiIds + */ + public function testGetRevisionStore( + $wikiId, + $mcrMigrationStage = MIGRATION_OLD, + $contentHandlerUseDb = true + ) { + $lb = $this->getMockLoadBalancer(); + $blobStore = $this->getMockSqlBlobStore(); + $cache = $this->getHashWANObjectCache(); + $commentStore = $this->getMockCommentStore(); + $contentModelStore = $this->getMockNameTableStore(); + $slotRoleStore = $this->getMockNameTableStore(); + $actorMigration = ActorMigration::newMigration(); + $logger = LoggerFactory::getInstance( 'someInstance' ); + + $factory = new RevisionStoreFactory( + $lb, + $blobStore, + $cache, + $commentStore, + $contentModelStore, + $slotRoleStore, + $mcrMigrationStage, + $actorMigration, + $logger, + $contentHandlerUseDb + ); + + $store = $factory->getRevisionStore( $wikiId ); + $wrapper = TestingAccessWrapper::newFromObject( $store ); + + // ensure the correct object type is returned + $this->assertInstanceOf( RevisionStore::class, $store ); + + // ensure the RevisionStore is for the given wikiId + $this->assertSame( $wikiId, $wrapper->wikiId ); + + // ensure all other required services are correctly set + $this->assertSame( $lb, $wrapper->loadBalancer ); + $this->assertSame( $blobStore, $wrapper->blobStore ); + $this->assertSame( $cache, $wrapper->cache ); + $this->assertSame( $commentStore, $wrapper->commentStore ); + $this->assertSame( $contentModelStore, $wrapper->contentModelStore ); + $this->assertSame( $slotRoleStore, $wrapper->slotRoleStore ); + $this->assertSame( $mcrMigrationStage, $wrapper->mcrMigrationStage ); + $this->assertSame( $actorMigration, $wrapper->actorMigration ); + $this->assertSame( $logger, $wrapper->logger ); + $this->assertSame( $contentHandlerUseDb, $store->getContentHandlerUseDB() ); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|NameTableStore + */ + private function getMockNameTableStore() { + return $this->getMockBuilder( NameTableStore::class ) + ->disableOriginalConstructor()->getMock(); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|LoadBalancer + */ + private function getMockLoadBalancer() { + return $this->getMockBuilder( LoadBalancer::class ) + ->disableOriginalConstructor()->getMock(); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|SqlBlobStore + */ + private function getMockSqlBlobStore() { + return $this->getMockBuilder( SqlBlobStore::class ) + ->disableOriginalConstructor()->getMock(); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|CommentStore + */ + private function getMockCommentStore() { + return $this->getMockBuilder( CommentStore::class ) + ->disableOriginalConstructor()->getMock(); + } + + private function getHashWANObjectCache() { + return new WANObjectCache( [ 'cache' => new \HashBagOStuff() ] ); + } + +} -- 2.20.1