Merge "Change 'editfont' default preference to 'monospace'"
[lhc/web/wiklou.git] / tests / phpunit / includes / libs / objectcache / MultiWriteBagOStuffTest.php
1 <?php
2
3 /**
4 * @group Database
5 */
6 class MultiWriteBagOStuffTest extends MediaWikiTestCase {
7 /** @var HashBagOStuff */
8 private $cache1;
9 /** @var HashBagOStuff */
10 private $cache2;
11 /** @var MultiWriteBagOStuff */
12 private $cache;
13
14 protected function setUp() {
15 parent::setUp();
16
17 $this->cache1 = new HashBagOStuff();
18 $this->cache2 = new HashBagOStuff();
19 $this->cache = new MultiWriteBagOStuff( [
20 'caches' => [ $this->cache1, $this->cache2 ],
21 'replication' => 'async',
22 'asyncHandler' => 'DeferredUpdates::addCallableUpdate'
23 ] );
24 }
25
26 /**
27 * @covers MultiWriteBagOStuff::set
28 * @covers MultiWriteBagOStuff::doWrite
29 */
30 public function testSetImmediate() {
31 $key = wfRandomString();
32 $value = wfRandomString();
33 $this->cache->set( $key, $value );
34
35 // Set in tier 1
36 $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
37 // Set in tier 2
38 $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
39 }
40
41 /**
42 * @covers MultiWriteBagOStuff
43 */
44 public function testSyncMerge() {
45 $key = wfRandomString();
46 $value = wfRandomString();
47 $func = function () use ( $value ) {
48 return $value;
49 };
50
51 // XXX: DeferredUpdates bound to transactions in CLI mode
52 $dbw = wfGetDB( DB_MASTER );
53 $dbw->begin();
54 $this->cache->merge( $key, $func );
55
56 // Set in tier 1
57 $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
58 // Not yet set in tier 2
59 $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
60
61 $dbw->commit();
62
63 // Set in tier 2
64 $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
65
66 $key = wfRandomString();
67
68 $dbw->begin();
69 $this->cache->merge( $key, $func, 0, 1, BagOStuff::WRITE_SYNC );
70
71 // Set in tier 1
72 $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
73 // Also set in tier 2
74 $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
75
76 $dbw->commit();
77 }
78
79 /**
80 * @covers MultiWriteBagOStuff::set
81 */
82 public function testSetDelayed() {
83 $key = wfRandomString();
84 $value = (object)[ 'v' => wfRandomString() ];
85 $expectValue = clone $value;
86
87 // XXX: DeferredUpdates bound to transactions in CLI mode
88 $dbw = wfGetDB( DB_MASTER );
89 $dbw->begin();
90 $this->cache->set( $key, $value );
91
92 // Test that later changes to $value don't affect the saved value (e.g. T168040)
93 $value->v = 'bogus';
94
95 // Set in tier 1
96 $this->assertEquals( $expectValue, $this->cache1->get( $key ), 'Written to tier 1' );
97 // Not yet set in tier 2
98 $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
99
100 $dbw->commit();
101
102 // Set in tier 2
103 $this->assertEquals( $expectValue, $this->cache2->get( $key ), 'Written to tier 2' );
104 }
105
106 /**
107 * @covers MultiWriteBagOStuff::makeKey
108 */
109 public function testMakeKey() {
110 $cache1 = $this->getMockBuilder( HashBagOStuff::class )
111 ->setMethods( [ 'makeKey' ] )->getMock();
112 $cache1->expects( $this->once() )->method( 'makeKey' )
113 ->willReturn( 'special' );
114
115 $cache2 = $this->getMockBuilder( HashBagOStuff::class )
116 ->setMethods( [ 'makeKey' ] )->getMock();
117 $cache2->expects( $this->never() )->method( 'makeKey' );
118
119 $cache = new MultiWriteBagOStuff( [ 'caches' => [ $cache1, $cache2 ] ] );
120 $this->assertSame( 'special', $cache->makeKey( 'a', 'b' ) );
121 }
122
123 /**
124 * @covers MultiWriteBagOStuff::makeGlobalKey
125 */
126 public function testMakeGlobalKey() {
127 $cache1 = $this->getMockBuilder( HashBagOStuff::class )
128 ->setMethods( [ 'makeGlobalKey' ] )->getMock();
129 $cache1->expects( $this->once() )->method( 'makeGlobalKey' )
130 ->willReturn( 'special' );
131
132 $cache2 = $this->getMockBuilder( HashBagOStuff::class )
133 ->setMethods( [ 'makeGlobalKey' ] )->getMock();
134 $cache2->expects( $this->never() )->method( 'makeGlobalKey' );
135
136 $cache = new MultiWriteBagOStuff( [ 'caches' => [ $cache1, $cache2 ] ] );
137
138 $this->assertSame( 'special', $cache->makeGlobalKey( 'a', 'b' ) );
139 }
140 }