diff options
Diffstat (limited to 'www/wiki/tests/phpunit/includes/ReadOnlyModeTest.php')
-rw-r--r-- | www/wiki/tests/phpunit/includes/ReadOnlyModeTest.php | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/www/wiki/tests/phpunit/includes/ReadOnlyModeTest.php b/www/wiki/tests/phpunit/includes/ReadOnlyModeTest.php new file mode 100644 index 00000000..b14424fb --- /dev/null +++ b/www/wiki/tests/phpunit/includes/ReadOnlyModeTest.php @@ -0,0 +1,194 @@ +<?php + +/** + * @group Database + * + * @covers ReadOnlyMode + * @covers ConfiguredReadOnlyMode + */ +class ReadOnlyModeTest extends MediaWikiTestCase { + public function provider() { + $rawTests = [ + 'None of anything' => [ + 'confMessage' => null, + 'hasFileName' => false, + 'fileContents' => false, + 'lbMessage' => false, + 'expectedState' => false, + 'expectedMessage' => false, + 'expectedConfState' => false, + 'expectedConfMessage' => false + ], + 'File missing' => [ + 'confMessage' => null, + 'hasFileName' => true, + 'fileContents' => false, + 'lbMessage' => false, + 'expectedState' => false, + 'expectedMessage' => false, + 'expectedConfState' => false, + 'expectedConfMessage' => false + ], + 'File empty' => [ + 'confMessage' => null, + 'hasFileName' => true, + 'fileContents' => '', + 'lbMessage' => false, + 'expectedState' => false, + 'expectedMessage' => false, + 'expectedConfState' => false, + 'expectedConfMessage' => false + ], + 'File has message' => [ + 'confMessage' => null, + 'hasFileName' => true, + 'fileContents' => 'Message', + 'lbMessage' => false, + 'expectedState' => true, + 'expectedMessage' => 'Message', + 'expectedConfState' => true, + 'expectedConfMessage' => 'Message', + ], + 'Conf has message' => [ + 'confMessage' => 'Message', + 'hasFileName' => false, + 'fileContents' => false, + 'lbMessage' => false, + 'expectedState' => true, + 'expectedMessage' => 'Message', + 'expectedConfState' => true, + 'expectedConfMessage' => 'Message' + ], + "Conf=false means don't check the file" => [ + 'confMessage' => false, + 'hasFileName' => true, + 'fileContents' => 'Message', + 'lbMessage' => false, + 'expectedState' => false, + 'expectedMessage' => false, + 'expectedConfState' => false, + 'expectedConfMessage' => false, + ], + 'LB has message' => [ + 'confMessage' => null, + 'hasFileName' => false, + 'fileContents' => false, + 'lbMessage' => 'Message', + 'expectedState' => true, + 'expectedMessage' => 'Message', + 'expectedConfState' => false, + 'expectedConfMessage' => false + ], + 'All three have a message: conf wins' => [ + 'confMessage' => 'conf', + 'hasFileName' => true, + 'fileContents' => 'file', + 'lbMessage' => 'lb', + 'expectedState' => true, + 'expectedMessage' => 'conf', + 'expectedConfState' => true, + 'expectedConfMessage' => 'conf' + ] + ]; + $cookedTests = []; + foreach ( $rawTests as $desc => $test ) { + $cookedTests[$desc] = [ $test ]; + } + return $cookedTests; + } + + private function createMode( $params, $makeLB ) { + $config = new HashConfig( [ + 'ReadOnly' => $params['confMessage'], + 'ReadOnlyFile' => $this->createFile( $params ), + ] ); + + $rom = new ConfiguredReadOnlyMode( $config ); + + if ( $makeLB ) { + $lb = $this->createLB( $params ); + $rom = new ReadOnlyMode( $rom, $lb ); + } + + return $rom; + } + + private function createLB( $params ) { + $lb = $this->getMockBuilder( \Wikimedia\Rdbms\LoadBalancer::class ) + ->disableOriginalConstructor() + ->getMock(); + $lb->expects( $this->any() )->method( 'getReadOnlyReason' ) + ->willReturn( $params['lbMessage'] ); + return $lb; + } + + private function createFile( $params ) { + if ( $params['hasFileName'] ) { + $fileName = $this->getNewTempFile(); + + if ( $params['fileContents'] === false ) { + unlink( $fileName ); + } else { + file_put_contents( $fileName, $params['fileContents'] ); + } + } else { + $fileName = null; + } + return $fileName; + } + + /** + * @dataProvider provider + */ + public function testWithLB( $params ) { + $rom = $this->createMode( $params, true ); + $this->assertSame( $params['expectedMessage'], $rom->getReason() ); + $this->assertSame( $params['expectedState'], $rom->isReadOnly() ); + } + + /** + * @dataProvider provider + */ + public function testWithoutLB( $params ) { + $cro = $this->createMode( $params, false ); + $this->assertSame( $params['expectedConfMessage'], $cro->getReason() ); + $this->assertSame( $params['expectedConfState'], $cro->isReadOnly() ); + } + + public function testSetReadOnlyReason() { + $rom = $this->createMode( + [ + 'confMessage' => 'conf', + 'hasFileName' => false, + 'fileContents' => false, + 'lbMessage' => 'lb' + ], + true ); + $rom->setReason( 'override' ); + $this->assertSame( 'override', $rom->getReason() ); + } + + /** + * @covers ReadOnlyMode::clearCache + * @covers ConfiguredReadOnlyMode::clearCache + */ + public function testClearCache() { + $fileName = $this->getNewTempFile(); + unlink( $fileName ); + $config = new HashConfig( [ + 'ReadOnly' => null, + 'ReadOnlyFile' => $fileName, + ] ); + $cro = new ConfiguredReadOnlyMode( $config ); + $lb = $this->createLB( [ 'lbMessage' => false ] ); + $rom = new ReadOnlyMode( $cro, $lb ); + + $this->assertSame( false, $rom->getReason(), 'initial' ); + + file_put_contents( $fileName, 'file' ); + $this->assertSame( false, $rom->getReason(), 'stale' ); + + $rom->clearCache(); + $this->assertSame( 'file', $rom->getReason(), 'fresh' ); + } +} |