From 05102911db7cda649b1a21ad6d93fe2f4cdb7b3f Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Sun, 21 Jul 2019 14:40:50 +0200 Subject: [PATCH] Fix App\Mode determination --- src/App/Mode.php | 16 +++++++++------- tests/src/App/ModeTest.php | 26 +++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/App/Mode.php b/src/App/Mode.php index 7f5c31c4b..6cb79b6ed 100644 --- a/src/App/Mode.php +++ b/src/App/Mode.php @@ -13,9 +13,9 @@ use Friendica\Util\BasePath; */ class Mode { - const LOCALCONFIGPRESENT = 1; - const DBAVAILABLE = 2; - const DBCONFIGAVAILABLE = 4; + const LOCALCONFIGPRESENT = 1; + const DBAVAILABLE = 2; + const DBCONFIGAVAILABLE = 4; const MAINTENANCEDISABLED = 8; /*** @@ -58,7 +58,7 @@ class Mode * * @return Mode returns itself * - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \Exception */ public function determine($basePath = null) { @@ -88,8 +88,10 @@ class Mode $this->mode |= Mode::DBCONFIGAVAILABLE; - if ($this->configCache->get('system', 'maintenance') || - $this->database->selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])) { + if (!empty($this->configCache->get('system', 'maintenance')) || + // Don't use Config or Configuration here because we're possibly BEFORE initializing the Configuration, + // so this could lead to a dependency circle + !empty($this->database->selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])['v'])) { return $this; } @@ -134,4 +136,4 @@ class Mode $this->has(Mode::DBCONFIGAVAILABLE) && $this->has(Mode::MAINTENANCEDISABLED); } -} \ No newline at end of file +} diff --git a/tests/src/App/ModeTest.php b/tests/src/App/ModeTest.php index b8d2e5136..06aad1066 100644 --- a/tests/src/App/ModeTest.php +++ b/tests/src/App/ModeTest.php @@ -125,7 +125,31 @@ class ModeTest extends MockedTest ->andReturn(false)->once(); $this->databaseMock->shouldReceive('selectFirst') ->with('config', ['v'], ['cat' => 'system', 'k' => 'maintenance']) - ->andReturn(false)->once(); + ->andReturn(['v' => null])->once(); + + $mode = new Mode($this->basePathMock, $this->databaseMock, $this->configCacheMock); + $mode->determine(); + + $this->assertTrue($mode->isNormal()); + $this->assertFalse($mode->isInstall()); + + $this->assertTrue($mode->has(Mode::DBCONFIGAVAILABLE)); + $this->assertTrue($mode->has(Mode::MAINTENANCEDISABLED)); + } + + /** + * Test explicit disabled maintenance (in case you manually disable it) + */ + public function testDisabledMaintenance() + { + $this->databaseMock->shouldReceive('connected')->andReturn(true)->once(); + $this->databaseMock->shouldReceive('fetchFirst') + ->with('SHOW TABLES LIKE \'config\'')->andReturn(true)->once(); + $this->configCacheMock->shouldReceive('get')->with('system', 'maintenance') + ->andReturn(false)->once(); + $this->databaseMock->shouldReceive('selectFirst') + ->with('config', ['v'], ['cat' => 'system', 'k' => 'maintenance']) + ->andReturn(['v' => '0'])->once(); $mode = new Mode($this->basePathMock, $this->databaseMock, $this->configCacheMock); $mode->determine();