Merge "Type hint against LinkTarget in WatchedItemStore"
[lhc/web/wiklou.git] / tests / phpunit / includes / externalstore / ExternalStoreAccessTest.php
1 <?php
2
3 use Wikimedia\Rdbms\LBFactory;
4
5 /**
6 * @covers ExternalStoreAccess
7 */
8 class ExternalStoreAccessTest extends MediaWikiTestCase {
9
10 use MediaWikiCoversValidator;
11
12 /**
13 * @covers ExternalStoreAccess::isReadOnly
14 */
15 public function testBasic() {
16 $active = [ 'memory' ];
17 $defaults = [ 'memory://cluster1', 'memory://cluster2' ];
18 $esFactory = new ExternalStoreFactory( $active, $defaults, 'db-prefix' );
19 $access = new ExternalStoreAccess( $esFactory );
20
21 $this->assertEquals( false, $access->isReadOnly() );
22
23 /** @var ExternalStoreMemory $store */
24 $store = $esFactory->getStore( 'memory' );
25 $this->assertInstanceOf( ExternalStoreMemory::class, $store );
26
27 $lb = $this->getMockBuilder( LoadBalancer::class )
28 ->disableOriginalConstructor()->getMock();
29 $lb->expects( $this->any() )->method( 'getReadOnlyReason' )->willReturn( 'Locked' );
30 $lb->expects( $this->any() )->method( 'getServerInfo' )->willReturn( [] );
31
32 $lbFactory = $this->getMockBuilder( LBFactory::class )
33 ->disableOriginalConstructor()->getMock();
34 $lbFactory->expects( $this->any() )->method( 'getExternalLB' )->willReturn( $lb );
35
36 $this->setService( 'DBLoadBalancerFactory', $lbFactory );
37
38 $active = [ 'db', 'mwstore' ];
39 $defaults = [ 'DB://clusterX' ];
40 $esFactory = new ExternalStoreFactory( $active, $defaults, 'db-prefix' );
41 $access = new ExternalStoreAccess( $esFactory );
42 $this->assertEquals( true, $access->isReadOnly() );
43
44 $store->clear();
45 }
46
47 /**
48 * @covers ExternalStoreAccess::fetchFromURL
49 * @covers ExternalStoreAccess::fetchFromURLs
50 * @covers ExternalStoreAccess::insert
51 */
52 public function testReadWrite() {
53 $active = [ 'memory' ]; // active store types
54 $defaults = [ 'memory://cluster1', 'memory://cluster2' ];
55 $esFactory = new ExternalStoreFactory( $active, $defaults, 'db-prefix' );
56 $access = new ExternalStoreAccess( $esFactory );
57
58 /** @var ExternalStoreMemory $storeLocal */
59 $storeLocal = $esFactory->getStore( 'memory' );
60 /** @var ExternalStoreMemory $storeOther */
61 $storeOther = $esFactory->getStore( 'memory', [ 'domain' => 'other' ] );
62 $this->assertInstanceOf( ExternalStoreMemory::class, $storeLocal );
63 $this->assertInstanceOf( ExternalStoreMemory::class, $storeOther );
64
65 $v1 = wfRandomString();
66 $v2 = wfRandomString();
67 $v3 = wfRandomString();
68
69 $this->assertEquals( false, $storeLocal->fetchFromURL( 'memory://cluster1/1' ) );
70
71 $url1 = 'memory://cluster1/1';
72 $this->assertEquals(
73 $url1,
74 $esFactory->getStoreForUrl( 'memory://cluster1' )
75 ->store( $esFactory->getStoreLocationFromUrl( 'memory://cluster1' ), $v1 )
76 );
77 $this->assertEquals(
78 $v1,
79 $esFactory->getStoreForUrl( 'memory://cluster1/1' )
80 ->fetchFromURL( 'memory://cluster1/1' )
81 );
82 $this->assertEquals( $v1, $storeLocal->fetchFromURL( 'memory://cluster1/1' ) );
83
84 $url2 = $access->insert( $v2 );
85 $url3 = $access->insert( $v3, [ 'domain' => 'other' ] );
86 $this->assertNotFalse( $url2 );
87 $this->assertNotFalse( $url3 );
88 // There is only one active store type
89 $this->assertEquals( $v2, $storeLocal->fetchFromURL( $url2 ) );
90 $this->assertEquals( $v3, $storeOther->fetchFromURL( $url3 ) );
91 $this->assertEquals( false, $storeOther->fetchFromURL( $url2 ) );
92 $this->assertEquals( false, $storeLocal->fetchFromURL( $url3 ) );
93
94 $res = $access->fetchFromURLs( [ $url1, $url2, $url3 ] );
95 $this->assertEquals( [ $url1 => $v1, $url2 => $v2, $url3 => false ], $res, "Local-only" );
96
97 $storeLocal->clear();
98 $storeOther->clear();
99 }
100 }