From 383a6715c3c10a500dd880f0217eb7e013d68b4d Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Sat, 23 Mar 2019 15:37:05 +0100 Subject: [PATCH] Added first version of ConfigCacheSaver --- src/App.php | 2 +- src/Core/Config/Configuration.php | 12 +- src/Core/Console/AutomaticInstallation.php | 3 +- src/Factory/ConfigFactory.php | 5 +- src/Factory/DependencyFactory.php | 4 +- .../Config}/ConfigCacheLoader.php | 34 +-- src/Util/Config/ConfigCacheManager.php | 39 ++++ src/Util/Config/ConfigCacheSaver.php | 198 ++++++++++++++++++ tests/DatabaseTest.php | 4 +- tests/include/ApiTest.php | 4 +- tests/src/Database/DBATest.php | 4 +- tests/src/Database/DBStructureTest.php | 4 +- .../Config}/ConfigCacheLoaderTest.php | 36 +--- .../src/Util/Config/ConfigCacheSaverTest.php | 128 +++++++++++ 14 files changed, 409 insertions(+), 68 deletions(-) rename src/{Core/Config/Cache => Util/Config}/ConfigCacheLoader.php (86%) create mode 100644 src/Util/Config/ConfigCacheManager.php create mode 100644 src/Util/Config/ConfigCacheSaver.php rename tests/src/{Core/Config/Cache => Util/Config}/ConfigCacheLoaderTest.php (84%) create mode 100644 tests/src/Util/Config/ConfigCacheSaverTest.php diff --git a/src/App.php b/src/App.php index 7893cbe704..7c88f0f021 100644 --- a/src/App.php +++ b/src/App.php @@ -8,12 +8,12 @@ use Detection\MobileDetect; use DOMDocument; use DOMXPath; use Exception; -use Friendica\Core\Config\Cache\ConfigCacheLoader; use Friendica\Core\Config\Cache\IConfigCache; use Friendica\Core\Config\Configuration; use Friendica\Database\DBA; use Friendica\Model\Profile; use Friendica\Network\HTTPException\InternalServerErrorException; +use Friendica\Util\Config\ConfigCacheLoader; use Friendica\Util\HTTPSignature; use Friendica\Util\Profiler; use Psr\Log\LoggerInterface; diff --git a/src/Core/Config/Configuration.php b/src/Core/Config/Configuration.php index 532ed982a9..abf6af37ca 100644 --- a/src/Core/Config/Configuration.php +++ b/src/Core/Config/Configuration.php @@ -10,6 +10,16 @@ namespace Friendica\Core\Config; */ class Configuration { + /** + * The blacklist of configuration settings, which should not get saved to the backend + * @var array + */ + private $configSaveBlacklist = [ + 'config' => [ + 'hostname' => true, + ] + ]; + /** * @var Cache\IConfigCache */ @@ -117,7 +127,7 @@ class Configuration $cached = $this->configCache->set($cat, $key, $value); // If there is no connected adapter, we're finished - if (!$this->configAdapter->isConnected()) { + if (!$this->configAdapter->isConnected() && !empty($this->configSaveBlacklist[$cat][$key])) { return $cached; } diff --git a/src/Core/Console/AutomaticInstallation.php b/src/Core/Console/AutomaticInstallation.php index 280e3d1071..0c73c82b1b 100644 --- a/src/Core/Console/AutomaticInstallation.php +++ b/src/Core/Console/AutomaticInstallation.php @@ -7,6 +7,7 @@ use Friendica\BaseObject; use Friendica\Core\Config; use Friendica\Core\Installer; use Friendica\Core\Theme; +use Friendica\Util\Config\ConfigCacheLoader; use RuntimeException; class AutomaticInstallation extends Console @@ -103,7 +104,7 @@ HELP; } //reload the config cache - $loader = new Config\Cache\ConfigCacheLoader($a->getBasePath(), $a->getMode()); + $loader = new ConfigCacheLoader($a->getBasePath(), $a->getMode()); $loader->loadConfigFiles($configCache); } else { diff --git a/src/Factory/ConfigFactory.php b/src/Factory/ConfigFactory.php index 6a30cf0e05..7a281d97a5 100644 --- a/src/Factory/ConfigFactory.php +++ b/src/Factory/ConfigFactory.php @@ -6,15 +6,16 @@ use Friendica\Core; use Friendica\Core\Config; use Friendica\Core\Config\Adapter; use Friendica\Core\Config\Cache; +use Friendica\Util\Config\ConfigCacheLoader; class ConfigFactory { /** - * @param Cache\ConfigCacheLoader $loader The Config Cache loader (INI/config/.htconfig) + * @param ConfigCacheLoader $loader The Config Cache loader (INI/config/.htconfig) * * @return Cache\ConfigCache */ - public static function createCache(Cache\ConfigCacheLoader $loader) + public static function createCache(ConfigCacheLoader $loader) { $configCache = new Cache\ConfigCache(); $loader->loadConfigFiles($configCache); diff --git a/src/Factory/DependencyFactory.php b/src/Factory/DependencyFactory.php index 265dca88ef..9322a44cfe 100644 --- a/src/Factory/DependencyFactory.php +++ b/src/Factory/DependencyFactory.php @@ -3,9 +3,9 @@ namespace Friendica\Factory; use Friendica\App; -use Friendica\Core\Config\Cache; use Friendica\Factory; use Friendica\Util\BasePath; +use Friendica\Util\Config; class DependencyFactory { @@ -24,7 +24,7 @@ class DependencyFactory { $basePath = BasePath::create($directory, $_SERVER); $mode = new App\Mode($basePath); - $configLoader = new Cache\ConfigCacheLoader($basePath, $mode); + $configLoader = new Config\ConfigCacheLoader($basePath, $mode); $configCache = Factory\ConfigFactory::createCache($configLoader); $profiler = Factory\ProfilerFactory::create($configCache); Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER); diff --git a/src/Core/Config/Cache/ConfigCacheLoader.php b/src/Util/Config/ConfigCacheLoader.php similarity index 86% rename from src/Core/Config/Cache/ConfigCacheLoader.php rename to src/Util/Config/ConfigCacheLoader.php index 9e06d8fb89..f2f4f75422 100644 --- a/src/Core/Config/Cache/ConfigCacheLoader.php +++ b/src/Util/Config/ConfigCacheLoader.php @@ -1,29 +1,21 @@ appMode = $mode; - $this->baseDir = $baseDir; - $this->configDir = $baseDir . DIRECTORY_SEPARATOR . self::SUBDIRECTORY; } /** @@ -74,10 +65,10 @@ class ConfigCacheLoader */ public function loadCoreConfig($name) { - if (file_exists($this->configDir . DIRECTORY_SEPARATOR . $name . '.config.php')) { - return $this->loadConfigFile($this->configDir . DIRECTORY_SEPARATOR . $name . '.config.php'); - } elseif (file_exists($this->configDir . DIRECTORY_SEPARATOR . $name . '.ini.php')) { - return $this->loadINIConfigFile($this->configDir . DIRECTORY_SEPARATOR . $name . '.ini.php'); + if (!empty($this->getConfigFullName($name))) { + return $this->loadConfigFile($this->getConfigFullName($name)); + } elseif (!empty($this->getIniFullName($name))) { + return $this->loadINIConfigFile($this->getIniFullName($name)); } else { return []; } @@ -118,14 +109,11 @@ class ConfigCacheLoader */ private function loadLegacyConfig($name) { - $filePath = $this->baseDir . DIRECTORY_SEPARATOR . '.' . $name . '.php'; - $config = []; - - if (file_exists($filePath)) { + if (!empty($this->getHtConfigFullName($name))) { $a = new \stdClass(); $a->config = []; - include $filePath; + include $this->getHtConfigFullName($name); $htConfigCategories = array_keys($a->config); diff --git a/src/Util/Config/ConfigCacheManager.php b/src/Util/Config/ConfigCacheManager.php new file mode 100644 index 0000000000..1981717706 --- /dev/null +++ b/src/Util/Config/ConfigCacheManager.php @@ -0,0 +1,39 @@ +baseDir = $baseDir; + $this->configDir = $baseDir . DIRECTORY_SEPARATOR . self::SUBDIRECTORY; + } + + protected function getConfigFullName($name) + { + $fullName = $this->configDir . DIRECTORY_SEPARATOR . $name . '.config.php'; + return file_exists($fullName) ? $fullName : ''; + } + + protected function getIniFullName($name) + { + $fullName = $this->configDir . DIRECTORY_SEPARATOR . $name . '.ini.php'; + return file_exists($fullName) ? $fullName : ''; + } + + protected function getHtConfigFullName($name) + { + $fullName = $this->baseDir . DIRECTORY_SEPARATOR . '.' . $name . '.php'; + return file_exists($fullName) ? $fullName : ''; + } +} diff --git a/src/Util/Config/ConfigCacheSaver.php b/src/Util/Config/ConfigCacheSaver.php new file mode 100644 index 0000000000..d84ec6a929 --- /dev/null +++ b/src/Util/Config/ConfigCacheSaver.php @@ -0,0 +1,198 @@ +saveToLegacyConfig('htpreconfig', $cat, $key, $value); + $this->saveToLegacyConfig('htconfig', $cat, $key, $value); + $this->saveToCoreConfig('local', $cat, $key, $value); + } + + /** + * Saves a value to either an config or an ini file + * + * @param string $name The configuration file name ('local', 'addon', ..) + * @param string $cat The configuration category + * @param string $key The configuration key + * @param string $value The new value + */ + private function saveToCoreConfig($name, $cat, $key, $value) + { + if (!empty($this->getConfigFullName($name))) { + $this->saveConfigFile($this->getConfigFullName($name), $cat, $key, $value); + } elseif (!empty($this->getIniFullName($name))) { + $this->saveINIConfigFile($this->getIniFullName($name), $cat, $key, $value); + } else { + return; + } + } + + /** + * Saves a value to a config file + * + * @param string $fullName The configuration full name (including the path) + * @param string $cat The configuration category + * @param string $key The configuration key + * @param string $value The new value + * + * @throws \Exception In case a file operation doesn't work + */ + private function saveConfigFile($fullName, $cat, $key, $value) + { + $reading = fopen($fullName, 'r'); + if (!$reading) { + throw new \Exception('Cannot open config file \'' . $fullName . '\'.'); + } + $writing = fopen($fullName . '.tmp', 'w'); + if (!$writing) { + throw new \Exception('Cannot create temporary config file \'' . $fullName . '.tmp\'.'); + } + $categoryFound = false; + $categoryBracketFound = false; + $lineFound = false; + $lineArrowFound = false; + while (!feof($reading)) { + $line = fgets($reading); + // find the first line like "'system' =>" + if (!$categoryFound && stristr($line, sprintf('\'%s\'', $cat))) { + $categoryFound = true; + } + // find the first line with a starting bracket ( "[" ) + if ($categoryFound && !$categoryBracketFound && stristr($line, '[')) { + $categoryBracketFound = true; + } + // find the first line with the key like "'value'" + if ($categoryBracketFound && !$lineFound && stristr($line, sprintf('\'%s\'', $key))) { + $lineFound = true; + } + // find the first line with an arrow ("=>") after finding the key + if ($lineFound && !$lineArrowFound && stristr($line, '=>')) { + $lineArrowFound = true; + } + // find the current value and replace it + if ($lineArrowFound && preg_match_all('/\'(.*?)\'/', $line, $matches, PREG_SET_ORDER)) { + $lineVal = end($matches)[0]; + $writeLine = str_replace($lineVal, '\'' . $value . '\'', $line); + $categoryFound = false; + $categoryBracketFound = false; + $lineFound = false; + $lineArrowFound = false; + // if a line contains a closing bracket for the category ( "]" ) and we didn't find the key/value pair, + // add it as a new line before the closing bracket + } elseif ($categoryBracketFound && !$lineArrowFound && stristr($line, ']')) { + $categoryFound = false; + $categoryBracketFound = false; + $lineFound = false; + $lineArrowFound = false; + $writeLine = sprintf(self::INDENT . self::INDENT .'\'%s\' => \'%s\',' . PHP_EOL, $key, $value); + $writeLine .= $line; + } else { + $writeLine = $line; + } + fputs($writing, $writeLine); + } + if (!fclose($reading)) { + throw new \Exception('Cannot close config file \'' . $fullName . '\'.'); + }; + if (!fclose($writing)) { + throw new \Exception('Cannot close temporary config file \'' . $fullName . '.tmp\'.'); + }; + if (!rename($fullName, $fullName . '.old')) { + throw new \Exception('Cannot backup current config file \'' . $fullName . '\'.'); + } + if (!rename($fullName . '.tmp', $fullName)) { + throw new \Exception('Cannot move temporary config file \'' . $fullName . '.tmp\' to current.'); + } + } + + /** + * Saves a value to a ini file + * + * @param string $fullName The configuration full name (including the path) + * @param string $cat The configuration category + * @param string $key The configuration key + * @param string $value The new value + */ + private function saveINIConfigFile($fullName, $cat, $key, $value) + { + $reading = fopen($fullName, 'r'); + $writing = fopen($fullName . '.tmp', 'w'); + $categoryFound = false; + while (!feof($reading)) { + $line = fgets($reading); + if (!$categoryFound && stristr($line, sprintf('[%s]', $cat))) { + $categoryFound = true; + $writeLine = $line; + } elseif ($categoryFound && preg_match_all('/^' . $key . '\s*=\s*(.*?)$/', $line, $matches, PREG_SET_ORDER)) { + $writeLine = $key . ' = ' . $value . PHP_EOL; + $categoryFound = false; + } elseif ($categoryFound && (preg_match_all('/^\[.*?\]$/', $line) || preg_match_all('/^INI;.*$/', $line))) { + $categoryFound = false; + $writeLine = $key . ' = ' . $value . PHP_EOL; + $writeLine .= $line; + } else { + $writeLine = $line; + } + fputs($writing, $writeLine); + } + fclose($reading); + fclose($writing); + rename($fullName, $fullName . '.old'); + rename($fullName . '.tmp', $fullName); + } + + private function saveToLegacyConfig($name, $cat, $key, $value) + { + if (empty($this->getHtConfigFullName($name))) { + return; + } + $fullName = $this->getHtConfigFullName($name); + $reading = fopen($fullName, 'r'); + $writing = fopen($fullName . '.tmp', 'w'); + $found = false; + while (!feof($reading)) { + $line = fgets($reading); + if (preg_match_all('/^\$a\-\>config\[\'' . $cat . '\',\'' . $key . '\'\]\s*=\s\'*(.*?)\'$/', $line, $matches, PREG_SET_ORDER)) { + $writeLine = $key . ' = ' . $value . PHP_EOL; + $found = true; + } else { + $writeLine = $line; + } + fputs($writing, $writeLine); + } + if (!$found) { + $writeLine = $key . ' = ' . $value . PHP_EOL; + fputs($writing, $writeLine); + } + fclose($reading); + fclose($writing); + rename($fullName, $fullName . '.old'); + rename($fullName . '.tmp', $fullName); + } +} diff --git a/tests/DatabaseTest.php b/tests/DatabaseTest.php index 6a64b28816..d434674061 100644 --- a/tests/DatabaseTest.php +++ b/tests/DatabaseTest.php @@ -6,10 +6,10 @@ namespace Friendica\Test; use Friendica\App; -use Friendica\Core\Config\Cache; use Friendica\Database\DBA; use Friendica\Factory; use Friendica\Util\BasePath; +use Friendica\Util\Config\ConfigCacheLoader; use Friendica\Util\Profiler; use PHPUnit\DbUnit\DataSet\YamlDataSet; use PHPUnit\DbUnit\TestCaseTrait; @@ -43,7 +43,7 @@ abstract class DatabaseTest extends MockedTest $basePath = BasePath::create(dirname(__DIR__)); $mode = new App\Mode($basePath); - $configLoader = new Cache\ConfigCacheLoader($basePath, $mode); + $configLoader = new ConfigCacheLoader($basePath, $mode); $config = Factory\ConfigFactory::createCache($configLoader); $profiler = \Mockery::mock(Profiler::class); diff --git a/tests/include/ApiTest.php b/tests/include/ApiTest.php index 3d7e5bcfb6..bd1b041082 100644 --- a/tests/include/ApiTest.php +++ b/tests/include/ApiTest.php @@ -7,13 +7,13 @@ namespace Friendica\Test; use Friendica\App; use Friendica\Core\Config; -use Friendica\Core\Config\Cache; use Friendica\Core\PConfig; use Friendica\Core\Protocol; use Friendica\Core\System; use Friendica\Factory; use Friendica\Network\HTTPException; use Friendica\Util\BasePath; +use Friendica\Util\Config\ConfigCacheLoader; use Monolog\Handler\TestHandler; require_once __DIR__ . '/../../include/api.php'; @@ -38,7 +38,7 @@ class ApiTest extends DatabaseTest { $basePath = BasePath::create(dirname(__DIR__) . '/../'); $mode = new App\Mode($basePath); - $configLoader = new Cache\ConfigCacheLoader($basePath, $mode); + $configLoader = new ConfigCacheLoader($basePath, $mode); $configCache = Factory\ConfigFactory::createCache($configLoader); $profiler = Factory\ProfilerFactory::create($configCache); Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER); diff --git a/tests/src/Database/DBATest.php b/tests/src/Database/DBATest.php index e638e27405..28f5afbd77 100644 --- a/tests/src/Database/DBATest.php +++ b/tests/src/Database/DBATest.php @@ -3,11 +3,11 @@ namespace Friendica\Test\src\Database; use Friendica\App; use Friendica\Core\Config; -use Friendica\Core\Config\Cache; use Friendica\Database\DBA; use Friendica\Factory; use Friendica\Test\DatabaseTest; use Friendica\Util\BasePath; +use Friendica\Util\Config\ConfigCacheLoader; class DBATest extends DatabaseTest { @@ -15,7 +15,7 @@ class DBATest extends DatabaseTest { $basePath = BasePath::create(dirname(__DIR__) . '/../../'); $mode = new App\Mode($basePath); - $configLoader = new Cache\ConfigCacheLoader($basePath, $mode); + $configLoader = new ConfigCacheLoader($basePath, $mode); $configCache = Factory\ConfigFactory::createCache($configLoader); $profiler = Factory\ProfilerFactory::create($configCache); Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER); diff --git a/tests/src/Database/DBStructureTest.php b/tests/src/Database/DBStructureTest.php index 34f659b51c..65d5c85a42 100644 --- a/tests/src/Database/DBStructureTest.php +++ b/tests/src/Database/DBStructureTest.php @@ -3,11 +3,11 @@ namespace Friendica\Test\src\Database; use Friendica\App; -use Friendica\Core\Config\Cache; use Friendica\Database\DBStructure; use Friendica\Factory; use Friendica\Test\DatabaseTest; use Friendica\Util\BasePath; +use Friendica\Util\Config\ConfigCacheLoader; class DBStructureTest extends DatabaseTest { @@ -15,7 +15,7 @@ class DBStructureTest extends DatabaseTest { $basePath = BasePath::create(dirname(__DIR__) . '/../../'); $mode = new App\Mode($basePath); - $configLoader = new Cache\ConfigCacheLoader($basePath, $mode); + $configLoader = new ConfigCacheLoader($basePath, $mode); $configCache = Factory\ConfigFactory::createCache($configLoader); $profiler = Factory\ProfilerFactory::create($configCache); Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER); diff --git a/tests/src/Core/Config/Cache/ConfigCacheLoaderTest.php b/tests/src/Util/Config/ConfigCacheLoaderTest.php similarity index 84% rename from tests/src/Core/Config/Cache/ConfigCacheLoaderTest.php rename to tests/src/Util/Config/ConfigCacheLoaderTest.php index 39dc20efdb..be0c5c01a5 100644 --- a/tests/src/Core/Config/Cache/ConfigCacheLoaderTest.php +++ b/tests/src/Util/Config/ConfigCacheLoaderTest.php @@ -1,12 +1,12 @@ delConfigFile('local.config.php'); - $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - 'datasets' . DIRECTORY_SEPARATOR . - 'config' . DIRECTORY_SEPARATOR . - 'local.config.php'; + $file = dirname(__DIR__) . DIRECTORY_SEPARATOR; vfsStream::newFile('local.config.php') ->at($this->root->getChild('config')) @@ -101,13 +95,7 @@ class ConfigCacheLoaderTest extends MockedTest { $this->delConfigFile('local.config.php'); - $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - 'datasets' . DIRECTORY_SEPARATOR . - 'config' . DIRECTORY_SEPARATOR . - 'local.ini.php'; + $file = dirname(__DIR__) . DIRECTORY_SEPARATOR; vfsStream::newFile('local.ini.php') ->at($this->root->getChild('config')) @@ -133,13 +121,7 @@ class ConfigCacheLoaderTest extends MockedTest { $this->delConfigFile('local.config.php'); - $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - 'datasets' . DIRECTORY_SEPARATOR . - 'config' . DIRECTORY_SEPARATOR . - '.htconfig.test.php'; + $file = dirname(__DIR__) . DIRECTORY_SEPARATOR; vfsStream::newFile('.htconfig.php') ->at($this->root) @@ -183,13 +165,7 @@ class ConfigCacheLoaderTest extends MockedTest vfsStream::create($structure, $this->root); - $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - '..' . DIRECTORY_SEPARATOR . - 'datasets' . DIRECTORY_SEPARATOR . - 'config' . DIRECTORY_SEPARATOR . - 'local.config.php'; + $file = dirname(__DIR__) . DIRECTORY_SEPARATOR; vfsStream::newFile('test.config.php') ->at($this->root->getChild('addon')->getChild('test')->getChild('config')) diff --git a/tests/src/Util/Config/ConfigCacheSaverTest.php b/tests/src/Util/Config/ConfigCacheSaverTest.php new file mode 100644 index 0000000000..da2f050eb7 --- /dev/null +++ b/tests/src/Util/Config/ConfigCacheSaverTest.php @@ -0,0 +1,128 @@ +setUpVfsDir(); + $this->mode = \Mockery::mock(App\Mode::class); + $this->mode->shouldReceive('isInstall')->andReturn(true); + } + /** + * Test the saveToConfigFile() method with a local.config.php file + */ + public function testSaveToConfigFileLocal() + { + $this->delConfigFile('local.config.php'); + $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . + '..' . DIRECTORY_SEPARATOR . + '..' . DIRECTORY_SEPARATOR . + '..' . DIRECTORY_SEPARATOR . + 'datasets' . DIRECTORY_SEPARATOR . + 'config' . DIRECTORY_SEPARATOR . + 'local.config.php'; + vfsStream::newFile('local.config.php') + ->at($this->root->getChild('config')) + ->setContent(file_get_contents($file)); + $configCacheSaver = new ConfigCacheSaver($this->root->url()); + $configCacheLoader = new ConfigCacheLoader($this->root->url(), $this->mode); + $configCache = new ConfigCache(); + $configCacheLoader->loadConfigFiles($configCache); + $this->assertEquals('admin@test.it', $configCache->get('config', 'admin_email')); + $this->assertEquals('!!', $configCache->get('config', 'test_val')); + $configCacheSaver->saveToConfigFile('config', 'admin_email', 'new@mail.it'); + $configCacheSaver->saveToConfigFile('config', 'test_val', 'Testing$!"$with@all.we can!'); + $newConfigCache = new ConfigCache(); + $configCacheLoader->loadConfigFiles($newConfigCache); + $this->assertEquals('new@mail.it', $newConfigCache->get('config', 'admin_email')); + $this->assertEquals('Testing$!"$with@all.we can!', $newConfigCache->get('config', 'test_val')); + $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php')); + $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php.old')); + $this->assertFalse($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php.tmp')); + $this->assertEquals(file_get_contents($file), file_get_contents($this->root->getChild('config' . DIRECTORY_SEPARATOR . 'local.config.php.old')->url())); + } + /** + * Test the saveToConfigFile() method with a local.ini.php file + */ + public function testSaveToConfigFileINI() + { + $this->delConfigFile('local.config.php'); + $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . + '..' . DIRECTORY_SEPARATOR . + '..' . DIRECTORY_SEPARATOR . + '..' . DIRECTORY_SEPARATOR . + 'datasets' . DIRECTORY_SEPARATOR . + 'config' . DIRECTORY_SEPARATOR . + 'local.ini.php'; + vfsStream::newFile('local.ini.php') + ->at($this->root->getChild('config')) + ->setContent(file_get_contents($file)); + $configCacheSaver = new ConfigCacheSaver($this->root->url()); + $configCacheLoader = new ConfigCacheLoader($this->root->url(), $this->mode); + $configCache = new ConfigCache(); + $configCacheLoader->loadConfigFiles($configCache); + $this->assertEquals('admin@test.it', $configCache->get('config', 'admin_email')); + $this->assertEquals('!!', $configCache->get('config', 'test_val')); + $configCacheSaver->saveToConfigFile('config', 'admin_email', 'new@mail.it'); + $configCacheSaver->saveToConfigFile('config', 'test_val', "Testing@with.all we can"); + $newConfigCache = new ConfigCache(); + $configCacheLoader->loadConfigFiles($newConfigCache); + $this->assertEquals('new@mail.it', $newConfigCache->get('config', 'admin_email')); + $this->assertEquals("Testing@with.all we can", $newConfigCache->get('config', 'test_val')); + $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php')); + $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php.old')); + $this->assertFalse($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php.tmp')); + $this->assertEquals(file_get_contents($file), file_get_contents($this->root->getChild('config' . DIRECTORY_SEPARATOR . 'local.ini.old')->url())); + } + /** + * Test the saveToConfigFile() method with a .htconfig.php file + * @todo fix it after 2019.03 merge to develop + */ + public function testSaveToConfigFileHtconfig() + { + $this->markTestSkipped('Needs 2019.03 merge to develop first'); + $this->delConfigFile('local.config.php'); + $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . + '..' . DIRECTORY_SEPARATOR . + '..' . DIRECTORY_SEPARATOR . + '..' . DIRECTORY_SEPARATOR . + 'datasets' . DIRECTORY_SEPARATOR . + 'config' . DIRECTORY_SEPARATOR . + '.htconfig.test.php'; + vfsStream::newFile('.htconfig.php') + ->at($this->root) + ->setContent(file_get_contents($file)); + $configCacheSaver = new ConfigCacheSaver($this->root->url(), $this->mode); + $configCache = new ConfigCache(); + $configCacheSaver->loadConfigFiles($configCache); + $this->assertEquals('admin@test.it', $configCache->get('config', 'admin_email')); + $this->assertEquals('!!', $configCache->get('config', 'test_val')); + $configCacheSaver->saveToConfigFile('config', 'admin_email', 'new@mail.it'); + $configCacheSaver->saveToConfigFile('config', 'test_val', 'Testing$!"$with@all.we can!'); + $newConfigCache = new ConfigCache(); + $configCacheSaver->loadConfigFiles($newConfigCache); + $this->assertEquals('new@mail.it', $newConfigCache->get('config', 'admin_email')); + $this->assertEquals('Testing$!"$with@all.we can!', $newConfigCache->get('config', 'test_val')); + $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . '.htconfig.php')); + $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . '.htconfig.php.old')); + $this->assertFalse($this->root->hasChild('config' . DIRECTORY_SEPARATOR . '.htconfig.php.tmp')); + $this->assertEquals(file_get_contents($file), file_get_contents($this->root->getChild('config' . DIRECTORY_SEPARATOR . '.htconfig.php.old')->url())); + } +}