This is the first patch of a series of patches to remove ParserOutput::getText() calls from core. This series of patches should be functionally equivalent to I2b4bcddb234f10fd8592570cb0496adf3271328e. This first patch replaces the calls to getText to calls to ParserOutput::getRawText when the pipeline has no reason to be executed. Bug: T293512 Change-Id: I0ad53cd074ca9cf13e96e6b08179e13aeea180f4
120 lines
3.1 KiB
PHP
120 lines
3.1 KiB
PHP
<?php
|
|
|
|
use MediaWiki\Json\JsonCodec;
|
|
use MediaWiki\Parser\RevisionOutputCache;
|
|
use MediaWiki\PoolCounter\PoolWorkArticleViewOld;
|
|
use MediaWiki\Revision\RevisionRecord;
|
|
use MediaWiki\Status\Status;
|
|
use Psr\Log\NullLogger;
|
|
use Wikimedia\ObjectCache\BagOStuff;
|
|
use Wikimedia\ObjectCache\HashBagOStuff;
|
|
use Wikimedia\Stats\StatsFactory;
|
|
use Wikimedia\UUID\GlobalIdGenerator;
|
|
|
|
/**
|
|
* @covers \MediaWiki\PoolCounter\PoolWorkArticleViewOld
|
|
* @group Database
|
|
*/
|
|
class PoolWorkArticleViewOldTest extends PoolWorkArticleViewTest {
|
|
|
|
/** @var RevisionOutputCache */
|
|
private $cache = null;
|
|
|
|
/**
|
|
* @param WikiPage $page
|
|
* @param RevisionRecord|null $rev
|
|
* @param ParserOptions|null $options
|
|
*
|
|
* @return PoolWorkArticleViewOld
|
|
*/
|
|
protected function newPoolWorkArticleView(
|
|
WikiPage $page,
|
|
RevisionRecord $rev = null,
|
|
$options = null
|
|
) {
|
|
if ( !$options ) {
|
|
$options = ParserOptions::newFromAnon();
|
|
}
|
|
|
|
if ( !$rev ) {
|
|
$rev = $page->getRevisionRecord();
|
|
}
|
|
|
|
if ( !$this->cache ) {
|
|
$this->installRevisionOutputCache();
|
|
}
|
|
|
|
$renderer = $this->getServiceContainer()->getRevisionRenderer();
|
|
|
|
return new PoolWorkArticleViewOld(
|
|
'test:' . $rev->getId(),
|
|
$this->cache,
|
|
$rev,
|
|
$options,
|
|
$renderer,
|
|
$this->getLoggerSpi()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param BagOStuff|null $bag
|
|
*
|
|
* @return RevisionOutputCache
|
|
*/
|
|
private function installRevisionOutputCache( $bag = null ) {
|
|
$globalIdGenerator = $this->createMock( GlobalIdGenerator::class );
|
|
$globalIdGenerator->method( 'newUUIDv1' )->willReturn( 'uuid-uuid' );
|
|
$this->cache = new RevisionOutputCache(
|
|
'test',
|
|
new WANObjectCache( [ 'cache' => $bag ?: new HashBagOStuff() ] ),
|
|
60 * 60,
|
|
'20200101223344',
|
|
new JsonCodec(),
|
|
StatsFactory::newNull(),
|
|
new NullLogger(),
|
|
$globalIdGenerator
|
|
);
|
|
|
|
return $this->cache;
|
|
}
|
|
|
|
public function testUpdateCachedOutput() {
|
|
$options = ParserOptions::newFromAnon();
|
|
$page = $this->getExistingTestPage( __METHOD__ );
|
|
|
|
$cache = $this->installRevisionOutputCache();
|
|
|
|
$work = $this->newPoolWorkArticleView( $page, null, $options );
|
|
/** @var Status $status */
|
|
$status = $work->execute();
|
|
$this->assertStatusGood( $status );
|
|
|
|
$cachedOutput = $cache->get( $page->getRevisionRecord(), $options );
|
|
$this->assertNotEmpty( $cachedOutput );
|
|
$this->assertSame( $status->getValue()->getRawText(),
|
|
$cachedOutput->getRawText() );
|
|
}
|
|
|
|
public function testDoesNotCacheNotSafe() {
|
|
$page = $this->getExistingTestPage( __METHOD__ );
|
|
|
|
$cache = $this->installRevisionOutputCache();
|
|
|
|
$parserOptions = ParserOptions::newFromAnon();
|
|
$parserOptions->setWrapOutputClass( 'wrapwrap' ); // Not safe to cache!
|
|
|
|
$work = $this->newPoolWorkArticleView( $page, null, $parserOptions );
|
|
/** @var Status $status */
|
|
$status = $work->execute();
|
|
$this->assertStatusGood( $status );
|
|
|
|
$this->assertFalse( $cache->get( $page->getRevisionRecord(), $parserOptions ) );
|
|
}
|
|
|
|
public function testDoWorkWithFakeRevision() {
|
|
// PoolWorkArticleViewOld caches the results, but things with null revid should
|
|
// not be cached.
|
|
$this->expectException( InvalidArgumentException::class );
|
|
parent::testDoWorkWithFakeRevision();
|
|
}
|
|
}
|