diff options
Diffstat (limited to 'www/wiki/tests/phpunit/includes/Storage/SqlBlobStoreTest.php')
-rw-r--r-- | www/wiki/tests/phpunit/includes/Storage/SqlBlobStoreTest.php | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/www/wiki/tests/phpunit/includes/Storage/SqlBlobStoreTest.php b/www/wiki/tests/phpunit/includes/Storage/SqlBlobStoreTest.php new file mode 100644 index 00000000..dbbef11e --- /dev/null +++ b/www/wiki/tests/phpunit/includes/Storage/SqlBlobStoreTest.php @@ -0,0 +1,241 @@ +<?php + +namespace MediaWiki\Tests\Storage; + +use Language; +use MediaWiki\MediaWikiServices; +use MediaWiki\Storage\SqlBlobStore; +use MediaWikiTestCase; +use stdClass; +use TitleValue; + +/** + * @covers \MediaWiki\Storage\SqlBlobStore + * @group Database + */ +class SqlBlobStoreTest extends MediaWikiTestCase { + + /** + * @return SqlBlobStore + */ + public function getBlobStore( $legacyEncoding = false, $compressRevisions = false ) { + $services = MediaWikiServices::getInstance(); + + $store = new SqlBlobStore( + $services->getDBLoadBalancer(), + $services->getMainWANObjectCache() + ); + + if ( $compressRevisions ) { + $store->setCompressBlobs( $compressRevisions ); + } + if ( $legacyEncoding ) { + $store->setLegacyEncoding( $legacyEncoding, Language::factory( 'en' ) ); + } + + return $store; + } + + /** + * @covers \MediaWiki\Storage\SqlBlobStore::getCompressBlobs() + * @covers \MediaWiki\Storage\SqlBlobStore::setCompressBlobs() + */ + public function testGetSetCompressRevisions() { + $store = $this->getBlobStore(); + $this->assertFalse( $store->getCompressBlobs() ); + $store->setCompressBlobs( true ); + $this->assertTrue( $store->getCompressBlobs() ); + } + + /** + * @covers \MediaWiki\Storage\SqlBlobStore::getLegacyEncoding() + * @covers \MediaWiki\Storage\SqlBlobStore::getLegacyEncodingConversionLang() + * @covers \MediaWiki\Storage\SqlBlobStore::setLegacyEncoding() + */ + public function testGetSetLegacyEncoding() { + $store = $this->getBlobStore(); + $this->assertFalse( $store->getLegacyEncoding() ); + $this->assertNull( $store->getLegacyEncodingConversionLang() ); + $en = Language::factory( 'en' ); + $store->setLegacyEncoding( 'foo', $en ); + $this->assertSame( 'foo', $store->getLegacyEncoding() ); + $this->assertSame( $en, $store->getLegacyEncodingConversionLang() ); + } + + /** + * @covers \MediaWiki\Storage\SqlBlobStore::getCacheExpiry() + * @covers \MediaWiki\Storage\SqlBlobStore::setCacheExpiry() + */ + public function testGetSetCacheExpiry() { + $store = $this->getBlobStore(); + $this->assertSame( 604800, $store->getCacheExpiry() ); + $store->setCacheExpiry( 12 ); + $this->assertSame( 12, $store->getCacheExpiry() ); + } + + /** + * @covers \MediaWiki\Storage\SqlBlobStore::getUseExternalStore() + * @covers \MediaWiki\Storage\SqlBlobStore::setUseExternalStore() + */ + public function testGetSetUseExternalStore() { + $store = $this->getBlobStore(); + $this->assertFalse( $store->getUseExternalStore() ); + $store->setUseExternalStore( true ); + $this->assertTrue( $store->getUseExternalStore() ); + } + + public function provideDecompress() { + yield '(no legacy encoding), false in false out' => [ false, false, [], false ]; + yield '(no legacy encoding), empty in empty out' => [ false, '', [], '' ]; + yield '(no legacy encoding), empty in empty out' => [ false, 'A', [], 'A' ]; + yield '(no legacy encoding), string in with gzip flag returns string' => [ + // gzip string below generated with gzdeflate( 'AAAABBAAA' ) + false, "sttttr\002\022\000", [ 'gzip' ], 'AAAABBAAA', + ]; + yield '(no legacy encoding), string in with object flag returns false' => [ + // gzip string below generated with serialize( 'JOJO' ) + false, "s:4:\"JOJO\";", [ 'object' ], false, + ]; + yield '(no legacy encoding), serialized object in with object flag returns string' => [ + false, + // Using a TitleValue object as it has a getText method (which is needed) + serialize( new TitleValue( 0, 'HHJJDDFF' ) ), + [ 'object' ], + 'HHJJDDFF', + ]; + yield '(no legacy encoding), serialized object in with object & gzip flag returns string' => [ + false, + // Using a TitleValue object as it has a getText method (which is needed) + gzdeflate( serialize( new TitleValue( 0, '8219JJJ840' ) ) ), + [ 'object', 'gzip' ], + '8219JJJ840', + ]; + yield '(ISO-8859-1 encoding), string in string out' => [ + 'ISO-8859-1', + iconv( 'utf-8', 'ISO-8859-1', "1®Àþ1" ), + [], + '1®Àþ1', + ]; + yield '(ISO-8859-1 encoding), serialized object in with gzip flags returns string' => [ + 'ISO-8859-1', + gzdeflate( iconv( 'utf-8', 'ISO-8859-1', "4®Àþ4" ) ), + [ 'gzip' ], + '4®Àþ4', + ]; + yield '(ISO-8859-1 encoding), serialized object in with object flags returns string' => [ + 'ISO-8859-1', + serialize( new TitleValue( 0, iconv( 'utf-8', 'ISO-8859-1', "3®Àþ3" ) ) ), + [ 'object' ], + '3®Àþ3', + ]; + yield '(ISO-8859-1 encoding), serialized object in with object & gzip flags returns string' => [ + 'ISO-8859-1', + gzdeflate( serialize( new TitleValue( 0, iconv( 'utf-8', 'ISO-8859-1', "2®Àþ2" ) ) ) ), + [ 'gzip', 'object' ], + '2®Àþ2', + ]; + yield 'T184749 (windows-1252 encoding), string in string out' => [ + 'windows-1252', + iconv( 'utf-8', 'windows-1252', "sammansättningar" ), + [], + 'sammansättningar', + ]; + yield 'T184749 (windows-1252 encoding), string in string out with gzip' => [ + 'windows-1252', + gzdeflate( iconv( 'utf-8', 'windows-1252', "sammansättningar" ) ), + [ 'gzip' ], + 'sammansättningar', + ]; + } + + /** + * @dataProvider provideDecompress + * @covers \MediaWiki\Storage\SqlBlobStore::decompressData + * + * @param string|bool $legacyEncoding + * @param mixed $data + * @param array $flags + * @param mixed $expected + */ + public function testDecompressData( $legacyEncoding, $data, $flags, $expected ) { + $store = $this->getBlobStore( $legacyEncoding ); + $this->assertSame( + $expected, + $store->decompressData( $data, $flags ) + ); + } + + /** + * @covers \MediaWiki\Storage\SqlBlobStore::compressData + */ + public function testCompressRevisionTextUtf8() { + $store = $this->getBlobStore(); + $row = new stdClass; + $row->old_text = "Wiki est l'\xc3\xa9cole superieur !"; + $row->old_flags = $store->compressData( $row->old_text ); + $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ), + "Flags should contain 'utf-8'" ); + $this->assertFalse( false !== strpos( $row->old_flags, 'gzip' ), + "Flags should not contain 'gzip'" ); + $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !", + $row->old_text, "Direct check" ); + } + + /** + * @covers \MediaWiki\Storage\SqlBlobStore::compressData + */ + public function testCompressRevisionTextUtf8Gzip() { + $store = $this->getBlobStore( false, true ); + $this->checkPHPExtension( 'zlib' ); + + $row = new stdClass; + $row->old_text = "Wiki est l'\xc3\xa9cole superieur !"; + $row->old_flags = $store->compressData( $row->old_text ); + $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ), + "Flags should contain 'utf-8'" ); + $this->assertTrue( false !== strpos( $row->old_flags, 'gzip' ), + "Flags should contain 'gzip'" ); + $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !", + gzinflate( $row->old_text ), "Direct check" ); + } + + public function provideBlobs() { + yield [ '' ]; + yield [ 'someText' ]; + yield [ "sammansättningar" ]; + } + + /** + * @dataProvider provideBlobs + * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob + * @covers \MediaWiki\Storage\SqlBlobStore::getBlob + */ + public function testSimpleStoreGetBlobSimpleRoundtrip( $blob ) { + $store = $this->getBlobStore(); + $address = $store->storeBlob( $blob ); + $this->assertSame( $blob, $store->getBlob( $address ) ); + } + + /** + * @dataProvider provideBlobs + * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob + * @covers \MediaWiki\Storage\SqlBlobStore::getBlob + */ + public function testSimpleStoreGetBlobSimpleRoundtripWindowsLegacyEncoding( $blob ) { + $store = $this->getBlobStore( 'windows-1252' ); + $address = $store->storeBlob( $blob ); + $this->assertSame( $blob, $store->getBlob( $address ) ); + } + + /** + * @dataProvider provideBlobs + * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob + * @covers \MediaWiki\Storage\SqlBlobStore::getBlob + */ + public function testSimpleStoreGetBlobSimpleRoundtripWindowsLegacyEncodingGzip( $blob ) { + $store = $this->getBlobStore( 'windows-1252', true ); + $address = $store->storeBlob( $blob ); + $this->assertSame( $blob, $store->getBlob( $address ) ); + } + +} |