ReadOnlyModeTest.php 4.9 KB

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