Add tablesUsed to RevisionStoreDbTest
[lhc/web/wiklou.git] / tests / phpunit / includes / ReadOnlyModeTest.php
1 <?php
2
3 /**
4 * @group Database
5 *
6 * @covers ReadOnlyMode
7 * @covers ConfiguredReadOnlyMode
8 */
9 class ReadOnlyModeTest extends MediaWikiTestCase {
10 public function provider() {
11 $rawTests = [
12 'None of anything' => [
13 'confMessage' => null,
14 'hasFileName' => false,
15 'fileContents' => false,
16 'lbMessage' => false,
17 'expectedState' => false,
18 'expectedMessage' => false,
19 'expectedConfState' => false,
20 'expectedConfMessage' => false
21 ],
22 'File missing' => [
23 'confMessage' => null,
24 'hasFileName' => true,
25 'fileContents' => false,
26 'lbMessage' => false,
27 'expectedState' => false,
28 'expectedMessage' => false,
29 'expectedConfState' => false,
30 'expectedConfMessage' => false
31 ],
32 'File empty' => [
33 'confMessage' => null,
34 'hasFileName' => true,
35 'fileContents' => '',
36 'lbMessage' => false,
37 'expectedState' => false,
38 'expectedMessage' => false,
39 'expectedConfState' => false,
40 'expectedConfMessage' => false
41 ],
42 'File has message' => [
43 'confMessage' => null,
44 'hasFileName' => true,
45 'fileContents' => 'Message',
46 'lbMessage' => false,
47 'expectedState' => true,
48 'expectedMessage' => 'Message',
49 'expectedConfState' => true,
50 'expectedConfMessage' => 'Message',
51 ],
52 'Conf has message' => [
53 'confMessage' => 'Message',
54 'hasFileName' => false,
55 'fileContents' => false,
56 'lbMessage' => false,
57 'expectedState' => true,
58 'expectedMessage' => 'Message',
59 'expectedConfState' => true,
60 'expectedConfMessage' => 'Message'
61 ],
62 "Conf=false means don't check the file" => [
63 'confMessage' => false,
64 'hasFileName' => true,
65 'fileContents' => 'Message',
66 'lbMessage' => false,
67 'expectedState' => false,
68 'expectedMessage' => false,
69 'expectedConfState' => false,
70 'expectedConfMessage' => false,
71 ],
72 'LB has message' => [
73 'confMessage' => null,
74 'hasFileName' => false,
75 'fileContents' => false,
76 'lbMessage' => 'Message',
77 'expectedState' => true,
78 'expectedMessage' => 'Message',
79 'expectedConfState' => false,
80 'expectedConfMessage' => false
81 ],
82 'All three have a message: conf wins' => [
83 'confMessage' => 'conf',
84 'hasFileName' => true,
85 'fileContents' => 'file',
86 'lbMessage' => 'lb',
87 'expectedState' => true,
88 'expectedMessage' => 'conf',
89 'expectedConfState' => true,
90 'expectedConfMessage' => 'conf'
91 ]
92 ];
93 $cookedTests = [];
94 foreach ( $rawTests as $desc => $test ) {
95 $cookedTests[$desc] = [ $test ];
96 }
97 return $cookedTests;
98 }
99
100 private function createMode( $params, $makeLB ) {
101 $config = new HashConfig( [
102 'ReadOnly' => $params['confMessage'],
103 'ReadOnlyFile' => $this->createFile( $params ),
104 ] );
105
106 $rom = new ConfiguredReadOnlyMode( $config );
107
108 if ( $makeLB ) {
109 $lb = $this->createLB( $params );
110 $rom = new ReadOnlyMode( $rom, $lb );
111 }
112
113 return $rom;
114 }
115
116 private function createLB( $params ) {
117 $lb = $this->getMockBuilder( \Wikimedia\Rdbms\LoadBalancer::class )
118 ->disableOriginalConstructor()
119 ->getMock();
120 $lb->expects( $this->any() )->method( 'getReadOnlyReason' )
121 ->willReturn( $params['lbMessage'] );
122 return $lb;
123 }
124
125 private function createFile( $params ) {
126 if ( $params['hasFileName'] ) {
127 $fileName = $this->getNewTempFile();
128
129 if ( $params['fileContents'] === false ) {
130 unlink( $fileName );
131 } else {
132 file_put_contents( $fileName, $params['fileContents'] );
133 }
134 } else {
135 $fileName = null;
136 }
137 return $fileName;
138 }
139
140 /**
141 * @dataProvider provider
142 */
143 public function testWithLB( $params ) {
144 $rom = $this->createMode( $params, true );
145 $this->assertSame( $params['expectedMessage'], $rom->getReason() );
146 $this->assertSame( $params['expectedState'], $rom->isReadOnly() );
147 }
148
149 /**
150 * @dataProvider provider
151 */
152 public function testWithoutLB( $params ) {
153 $cro = $this->createMode( $params, false );
154 $this->assertSame( $params['expectedConfMessage'], $cro->getReason() );
155 $this->assertSame( $params['expectedConfState'], $cro->isReadOnly() );
156 }
157
158 public function testSetReadOnlyReason() {
159 $rom = $this->createMode(
160 [
161 'confMessage' => 'conf',
162 'hasFileName' => false,
163 'fileContents' => false,
164 'lbMessage' => 'lb'
165 ],
166 true );
167 $rom->setReason( 'override' );
168 $this->assertSame( 'override', $rom->getReason() );
169 }
170
171 /**
172 * @covers ReadOnlyMode::clearCache
173 * @covers ConfiguredReadOnlyMode::clearCache
174 */
175 public function testClearCache() {
176 $fileName = $this->getNewTempFile();
177 unlink( $fileName );
178 $config = new HashConfig( [
179 'ReadOnly' => null,
180 'ReadOnlyFile' => $fileName,
181 ] );
182 $cro = new ConfiguredReadOnlyMode( $config );
183 $lb = $this->createLB( [ 'lbMessage' => false ] );
184 $rom = new ReadOnlyMode( $cro, $lb );
185
186 $this->assertSame( false, $rom->getReason(), 'initial' );
187
188 file_put_contents( $fileName, 'file' );
189 $this->assertSame( false, $rom->getReason(), 'stale' );
190
191 $rom->clearCache();
192 $this->assertSame( 'file', $rom->getReason(), 'fresh' );
193 }
194 }