1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
<?php
use MediaWiki\Tests\Unit\DummyServicesTrait;
use PHPUnit\Framework\MockObject\MockObject;
/**
* @covers \ExternalStoreAccess
*/
class ExternalStoreAccessTest extends MediaWikiIntegrationTestCase {
use DummyServicesTrait;
public function testBasic() {
$active = [ 'memory' ];
$defaults = [ 'memory://cluster1', 'memory://cluster2' ];
$esFactory = new ExternalStoreFactory( $active, $defaults, 'db-prefix' );
$access = new ExternalStoreAccess( $esFactory );
$this->assertFalse( $access->isReadOnly() );
/** @var ExternalStoreMemory $store */
$store = $esFactory->getStore( 'memory' );
$this->assertInstanceOf( ExternalStoreMemory::class, $store );
$location = $esFactory->getStoreLocationFromUrl( 'memory://cluster1' );
$this->assertFalse( $store->isReadOnly( $location ) );
}
/**
* @covers \ExternalStoreAccess::isReadOnly
*/
public function testReadOnly() {
/** @var ExternalStoreMedium|MockObject $medium */
$medium = $this->createMock( ExternalStoreMedium::class );
$medium->method( 'isReadOnly' )->willReturn( true );
/** @var ExternalStoreFactory|MockObject $esFactory */
$esFactory = $this->createMock( ExternalStoreFactory::class );
$esFactory->method( 'getWriteBaseUrls' )->willReturn( [ 'test:' ] );
$esFactory->method( 'getStoreForUrl' )->willReturn( $medium );
$esFactory->method( 'getStoreLocationFromUrl' )->willReturn( 'dummy' );
$access = new ExternalStoreAccess( $esFactory );
$this->assertTrue( $access->isReadOnly() );
$this->setService( 'ReadOnlyMode', $this->getDummyReadOnlyMode( 'Some absurd reason' ) );
$this->expectException( ReadOnlyError::class );
$access->insert( 'Lorem Ipsum' );
}
/**
* @covers \ExternalStoreAccess::fetchFromURL
* @covers \ExternalStoreAccess::fetchFromURLs
* @covers \ExternalStoreAccess::insert
*/
public function testReadWrite() {
$active = [ 'memory' ]; // active store types
$defaults = [ 'memory://cluster1', 'memory://cluster2' ];
$esFactory = new ExternalStoreFactory( $active, $defaults, 'db-prefix' );
$access = new ExternalStoreAccess( $esFactory );
/** @var ExternalStoreMemory $storeLocal */
$storeLocal = $esFactory->getStore( 'memory' );
/** @var ExternalStoreMemory $storeOther */
$storeOther = $esFactory->getStore( 'memory', [ 'domain' => 'other' ] );
$this->assertInstanceOf( ExternalStoreMemory::class, $storeLocal );
$this->assertInstanceOf( ExternalStoreMemory::class, $storeOther );
$v1 = wfRandomString();
$v2 = wfRandomString();
$v3 = wfRandomString();
$this->assertFalse( $storeLocal->fetchFromURL( 'memory://cluster1/1' ) );
$url1 = 'memory://cluster1/1';
$this->assertEquals(
$url1,
$esFactory->getStoreForUrl( 'memory://cluster1' )
->store( $esFactory->getStoreLocationFromUrl( 'memory://cluster1' ), $v1 )
);
$this->assertEquals(
$v1,
$esFactory->getStoreForUrl( 'memory://cluster1/1' )
->fetchFromURL( 'memory://cluster1/1' )
);
$this->assertEquals( $v1, $storeLocal->fetchFromURL( 'memory://cluster1/1' ) );
$url2 = $access->insert( $v2 );
$url3 = $access->insert( $v3, [ 'domain' => 'other' ] );
$this->assertNotFalse( $url2 );
$this->assertNotFalse( $url3 );
// There is only one active store type
$this->assertEquals( $v2, $storeLocal->fetchFromURL( $url2 ) );
$this->assertEquals( $v3, $storeOther->fetchFromURL( $url3 ) );
$this->assertFalse( $storeOther->fetchFromURL( $url2 ) );
$this->assertFalse( $storeLocal->fetchFromURL( $url3 ) );
$res = $access->fetchFromURLs( [ $url1, $url2, $url3 ] );
$this->assertEquals( [ $url1 => $v1, $url2 => $v2, $url3 => false ], $res, "Local-only" );
$storeLocal->clear();
$storeOther->clear();
}
}
|