3 use MediaWiki\MediaWikiServices
;
9 * @covers ConfiguredReadOnlyMode
11 class ReadOnlyModeTest
extends MediaWikiTestCase
{
12 public function provider() {
14 'None of anything' => [
15 'confMessage' => null,
16 'hasFileName' => false,
17 'fileContents' => false,
19 'expectedState' => false,
20 'expectedMessage' => false,
21 'expectedConfState' => false,
22 'expectedConfMessage' => false
25 'confMessage' => null,
26 'hasFileName' => true,
27 'fileContents' => false,
29 'expectedState' => false,
30 'expectedMessage' => false,
31 'expectedConfState' => false,
32 'expectedConfMessage' => false
35 'confMessage' => null,
36 'hasFileName' => true,
39 'expectedState' => false,
40 'expectedMessage' => false,
41 'expectedConfState' => false,
42 'expectedConfMessage' => false
44 'File has message' => [
45 'confMessage' => null,
46 'hasFileName' => true,
47 'fileContents' => 'Message',
49 'expectedState' => true,
50 'expectedMessage' => 'Message',
51 'expectedConfState' => true,
52 'expectedConfMessage' => 'Message',
54 'Conf has message' => [
55 'confMessage' => 'Message',
56 'hasFileName' => false,
57 'fileContents' => false,
59 'expectedState' => true,
60 'expectedMessage' => 'Message',
61 'expectedConfState' => true,
62 'expectedConfMessage' => 'Message'
64 "Conf=false means don't check the file" => [
65 'confMessage' => false,
66 'hasFileName' => true,
67 'fileContents' => 'Message',
69 'expectedState' => false,
70 'expectedMessage' => false,
71 'expectedConfState' => false,
72 'expectedConfMessage' => false,
75 'confMessage' => null,
76 'hasFileName' => false,
77 'fileContents' => false,
78 'lbMessage' => 'Message',
79 'expectedState' => true,
80 'expectedMessage' => 'Message',
81 'expectedConfState' => false,
82 'expectedConfMessage' => false
84 'All three have a message: conf wins' => [
85 'confMessage' => 'conf',
86 'hasFileName' => true,
87 'fileContents' => 'file',
89 'expectedState' => true,
90 'expectedMessage' => 'conf',
91 'expectedConfState' => true,
92 'expectedConfMessage' => 'conf'
96 foreach ( $rawTests as $desc => $test ) {
97 $cookedTests[$desc] = [ $test ];
102 private function createMode( $params, $makeLB ) {
103 $config = new HashConfig( [
104 'ReadOnly' => $params['confMessage'],
105 'ReadOnlyFile' => $this->createFile( $params ),
108 $rom = new ConfiguredReadOnlyMode( $config );
111 $lb = $this->createLB( $params );
112 $rom = new ReadOnlyMode( $rom, $lb );
118 private function createLB( $params ) {
119 $lb = $this->getMockBuilder( \Wikimedia\Rdbms\LoadBalancer
::class )
120 ->disableOriginalConstructor()
122 $lb->expects( $this->any() )->method( 'getReadOnlyReason' )
123 ->willReturn( $params['lbMessage'] );
127 private function createFile( $params ) {
128 if ( $params['hasFileName'] ) {
129 $fileName = $this->getNewTempFile();
131 if ( $params['fileContents'] === false ) {
134 file_put_contents( $fileName, $params['fileContents'] );
143 * @dataProvider provider
145 public function testWithLB( $params ) {
146 $rom = $this->createMode( $params, true );
147 $this->assertSame( $params['expectedMessage'], $rom->getReason() );
148 $this->assertSame( $params['expectedState'], $rom->isReadOnly() );
152 * @dataProvider provider
154 public function testWithoutLB( $params ) {
155 $cro = $this->createMode( $params, false );
156 $this->assertSame( $params['expectedConfMessage'], $cro->getReason() );
157 $this->assertSame( $params['expectedConfState'], $cro->isReadOnly() );
160 public function testSetReadOnlyReason() {
161 $rom = $this->createMode(
163 'confMessage' => 'conf',
164 'hasFileName' => false,
165 'fileContents' => false,
169 $rom->setReason( 'override' );
170 $this->assertSame( 'override', $rom->getReason() );
174 * @covers ReadOnlyMode::clearCache
175 * @covers ConfiguredReadOnlyMode::clearCache
177 public function testClearCache() {
178 $fileName = $this->getNewTempFile();
180 $config = new HashConfig( [
182 'ReadOnlyFile' => $fileName,
184 $cro = new ConfiguredReadOnlyMode( $config );
185 $lb = $this->createLB( [ 'lbMessage' => false ] );
186 $rom = new ReadOnlyMode( $cro, $lb );
188 $this->assertSame( false, $rom->getReason(), 'initial' );
190 file_put_contents( $fileName, 'file' );
191 $this->assertSame( false, $rom->getReason(), 'stale' );
194 $this->assertSame( 'file', $rom->getReason(), 'fresh' );