Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F585084
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/maintenance/prewarmParsoidParserCache.php b/maintenance/prewarmParsoidParserCache.php
index 424e1414141..1816de31681 100644
--- a/maintenance/prewarmParsoidParserCache.php
+++ b/maintenance/prewarmParsoidParserCache.php
@@ -51,22 +51,22 @@ class PrewarmParsoidParserCache extends Maintenance {
}
private function getPageLookup(): PageLookup {
- $this->pageLookup = $this->getServiceContainer()->getPageStore();
+ $this->pageLookup ??= $this->getServiceContainer()->getPageStore();
return $this->pageLookup;
}
private function getRevisionLookup(): RevisionLookup {
- $this->revisionLookup = $this->getServiceContainer()->getRevisionLookup();
+ $this->revisionLookup ??= $this->getServiceContainer()->getRevisionLookup();
return $this->revisionLookup;
}
private function getParserOutputAccess(): ParserOutputAccess {
- $this->parserOutputAccess = $this->getServiceContainer()->getParserOutputAccess();
+ $this->parserOutputAccess ??= $this->getServiceContainer()->getParserOutputAccess();
return $this->parserOutputAccess;
}
private function getParsoidSiteConfig(): ParsoidSiteConfig {
- $this->parsoidSiteConfig = $this->getServiceContainer()->getParsoidSiteConfig();
+ $this->parsoidSiteConfig ??= $this->getServiceContainer()->getParsoidSiteConfig();
return $this->parsoidSiteConfig;
}
@@ -100,7 +100,7 @@ class PrewarmParsoidParserCache extends Maintenance {
}
}
- /*
+ /**
* NamespaceInfo::getCanonicalIndex() requires the namespace to be in lowercase,
* so let's do some normalization and return its canonical index.
*
diff --git a/tests/phpunit/maintenance/PrewarmParsoidParserCacheTest.php b/tests/phpunit/maintenance/PrewarmParsoidParserCacheTest.php
new file mode 100644
index 00000000000..19669abe1af
--- /dev/null
+++ b/tests/phpunit/maintenance/PrewarmParsoidParserCacheTest.php
@@ -0,0 +1,141 @@
+<?php
+
+namespace MediaWiki\Tests\Maintenance;
+
+use MediaWiki\Page\PageRecord;
+use MediaWiki\Page\PageStore;
+use MediaWiki\Page\ParserOutputAccess;
+use MediaWiki\Parser\ParserOptions;
+use MediaWiki\Parser\Parsoid\Config\SiteConfig;
+use MediaWiki\Status\Status;
+use MediaWiki\Title\Title;
+use PrewarmParsoidParserCache;
+
+/**
+ * @covers \PrewarmParsoidParserCache
+ * @group Database
+ * @author Dreamy Jazz
+ */
+class PrewarmParsoidParserCacheTest extends MaintenanceBaseTestCase {
+
+ protected function getMaintenanceClass() {
+ return PrewarmParsoidParserCache::class;
+ }
+
+ public function testWhenStartFromIsBeyondLargestPageId() {
+ $mockParserOutputAccess = $this->createMock( ParserOutputAccess::class );
+ $mockParserOutputAccess->expects( $this->never() )
+ ->method( 'getParserOutput' );
+ $this->setService( 'ParserOutputAccess', $mockParserOutputAccess );
+
+ $this->maintenance->setOption( 'start-from', 12345 );
+ $this->maintenance->execute();
+ $this->expectOutputString(
+ "\nWarming parsoid parser cache with Parsoid output...\n\n" .
+ "\nDone pre-warming parsoid parser cache...\n"
+ );
+ }
+
+ public function testWhenAllPagesHaveNoEntryInPageLookupService() {
+ $mockParserOutputAccess = $this->createMock( ParserOutputAccess::class );
+ $mockParserOutputAccess->expects( $this->never() )
+ ->method( 'getParserOutput' );
+ $this->setService( 'ParserOutputAccess', $mockParserOutputAccess );
+
+ $mockPageLookup = $this->createMock( PageStore::class );
+ $mockPageLookup->method( 'getPageById' )
+ ->willReturn( null );
+ $this->setService( 'PageStore', $mockPageLookup );
+
+ $this->maintenance->execute();
+
+ $actualOutput = $this->getActualOutputForAssertion();
+ foreach ( range( 1, 4 ) as $pageId ) {
+ $this->assertStringContainsString( "[Skipped] Page ID: $pageId not found", $actualOutput );
+ }
+ }
+
+ public function testWhenAllPagesDoNotHaveSupportedContentModel() {
+ $mockParserOutputAccess = $this->createMock( ParserOutputAccess::class );
+ $mockParserOutputAccess->expects( $this->never() )
+ ->method( 'getParserOutput' );
+ $this->setService( 'ParserOutputAccess', $mockParserOutputAccess );
+
+ $mockParsoidSiteConfig = $this->createMock( SiteConfig::class );
+ $mockParsoidSiteConfig->method( 'supportsContentModel' )
+ ->willReturn( false );
+ $this->setService( 'ParsoidSiteConfig', $mockParsoidSiteConfig );
+
+ $this->maintenance->execute();
+
+ $actualOutput = $this->getActualOutputForAssertion();
+ foreach ( range( 1, 4 ) as $pageId ) {
+ $this->assertStringContainsString(
+ "[Skipped] Content model \"" . CONTENT_MODEL_WIKITEXT . "\" not supported for page ID: $pageId",
+ $actualOutput
+ );
+ }
+ }
+
+ public function testWhenOnlyFilteringForTemplateNamespaceWhichFailsToParse() {
+ $mockParserOutputAccess = $this->createMock( ParserOutputAccess::class );
+ $mockParserOutputAccess->expects( $this->once() )
+ ->method( 'getParserOutput' )
+ ->willReturnCallback( function ( PageRecord $page, $parserOptions, $revision, int $options ) {
+ $this->assertSame( NS_TEMPLATE, $page->getNamespace() );
+ $this->assertSame( 'Test', $page->getDBkey() );
+ $this->assertSame( ParserOutputAccess::OPT_FORCE_PARSE, $options );
+ return Status::newFatal( 'test' );
+ } );
+ $this->setService( 'ParserOutputAccess', $mockParserOutputAccess );
+
+ $this->maintenance->setOption( 'namespace', 'template' );
+ $this->maintenance->setOption( 'force', 1 );
+ $this->maintenance->execute();
+
+ $actualOutput = $this->getActualOutputForAssertion();
+ $this->assertStringNotContainsString(
+ ': 1', $actualOutput, 'First test page should have been excluded by namespace filter'
+ );
+ $this->assertStringContainsString( 'Error parsing page ID: 2 or writing to parser cache', $actualOutput );
+ $this->assertStringNotContainsString( '[Done] Page ID', $actualOutput );
+ }
+
+ public function testWhenRunningForAllPages() {
+ // Drop any existing cached parsoid parser cache entries so that we can see they are added by the script.
+ foreach ( range( 1, 4 ) as $pageId ) {
+ $wikiPage = $this->getServiceContainer()->getWikiPageFactory()->newFromTitle( Title::newFromID( $pageId ) );
+ $this->getServiceContainer()->getParserCache()
+ ->deleteOptionsKey( $wikiPage );
+
+ $popts = ParserOptions::newFromAnon();
+ $popts->setUseParsoid();
+ $this->assertNull( $this->getServiceContainer()->getParserOutputAccess()->getCachedParserOutput(
+ $wikiPage, $popts, $wikiPage->getRevisionRecord()
+ ) );
+ }
+
+ $this->maintenance->execute();
+
+ // Check that the script created parsoid cache entries.
+ $actualOutput = $this->getActualOutputForAssertion();
+ foreach ( range( 1, 4 ) as $pageId ) {
+ $this->assertStringContainsString( "[Done] Page ID: $pageId", $actualOutput );
+
+ $popts = ParserOptions::newFromAnon();
+ $popts->setUseParsoid();
+ $wikiPage = $this->getServiceContainer()->getWikiPageFactory()->newFromTitle( Title::newFromID( $pageId ) );
+ $this->assertNotNull( $this->getServiceContainer()->getParserOutputAccess()->getCachedParserOutput(
+ $wikiPage, $popts, $wikiPage->getRevisionRecord()
+ ) );
+ }
+ }
+
+ public function addDBDataOnce() {
+ // Add some content to some test pages which will be used to prewarm the cache
+ $this->editPage( Title::newFromText( 'Test' ), 'testingabc' );
+ $this->editPage( Title::newFromText( 'Template:Test' ), 'testingabc' );
+ $this->editPage( Title::newFromText( 'Testing' ), 'testingabc{{test}}' );
+ $this->editPage( Title::newFromText( 'Testingabcef' ), 'testingabc<span>Test!</span>' );
+ }
+}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Jul 5, 5:32 AM (15 h, 17 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
227516
Default Alt Text
(7 KB)
Attached To
Mode
rMW mediawiki
Attached
Detach File
Event Timeline
Log In to Comment