Skip to content
Extraits de code Groupes Projets
ConfigTest.php 19,6 ko
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
    
     * Piwik - free/libre analytics platform
    
     *
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
    
    namespace Piwik\Tests\Unit;
    
    use PHPUnit_Framework_TestCase;
    
    use Piwik\Application\Kernel\GlobalSettingsProvider;
    
    use Piwik\Config;
    
    use Piwik\Tests\Framework\Mock\TestConfig;
    
    class DumpConfigTestMockIniFileChain extends Config\IniFileChain
    {
        public function __construct($settingsChain, $mergedSettings)
        {
            parent::__construct();
    
            $this->settingsChain = $settingsChain;
            $this->mergedSettings = $mergedSettings;
        }
    }
    
    
    class MockIniSettingsProvider extends GlobalSettingsProvider
    
    {
        public function __construct($configLocal, $configGlobal, $configCommon, $configCache)
        {
            parent::__construct();
    
    
    diosmosis's avatar
    diosmosis a validé
            $this->iniFileChain = new DumpConfigTestMockIniFileChain(
    
                array(
                    $this->pathGlobal => $configGlobal,
                    $this->pathCommon => $configCommon,
                    $this->pathLocal => $configLocal,
                ),
                $configCache
            );
    
    diosmosis's avatar
    diosmosis a validé
    class DumpConfigTestMockConfig extends Config
    {
        public function __construct($configLocal, $configGlobal, $configCommon, $configCache)
        {
    
            parent::__construct(new MockIniSettingsProvider($configLocal, $configGlobal, $configCommon, $configCache));
    
     * @group Core
    
    class ConfigTest extends \PHPUnit_Framework_TestCase
    
    {
        public function testUserConfigOverwritesSectionGlobalConfigValue()
        {
            $userFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/config.ini.php';
            $globalFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/global.ini.php';
    
            $commonFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/common.ini.php';
    
            $config = new Config(new GlobalSettingsProvider($globalFile, $userFile, $commonFile));
    
            $this->assertEquals("value_overwritten", $config->Category['key1']);
            $this->assertEquals("value2", $config->Category['key2']);
            $this->assertEquals('tes"t', $config->GeneralSection['login']);
            $this->assertEquals("value3", $config->CategoryOnlyInGlobalFile['key3']);
            $this->assertEquals("value4", $config->CategoryOnlyInGlobalFile['key4']);
    
    
            $expectedArray = array('plugin"1', 'plugin2', 'plugin3');
            $array = $config->TestArray;
    
            $this->assertEquals($expectedArray, $array['installed']);
    
    
            $expectedArray = array('value1', 'value2');
            $array = $config->TestArrayOnlyInGlobalFile;
    
            $this->assertEquals($expectedArray, $array['my_array']);
    
    
            $expectedArray = array('value1', 'value2');
            $array = $config->TestArrayOnlyInGlobalFile;
            $this->assertEquals($expectedArray, $array['my_array']);
    
        }
    
        public function test_CommonConfig_Overrides()
        {
            $userFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/config.ini.php';
            $globalFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/global.ini.php';
            $commonFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/common.config.ini.php';
    
    
            $config = new Config(new GlobalSettingsProvider($globalFile, $userFile, $commonFile));
    
    
            $this->assertEquals("valueCommon", $config->Category['key2'], var_export($config->Category['key2'], true));
            $this->assertEquals("test", $config->GeneralSection['password']);
            $this->assertEquals("commonValue", $config->TestOnlyInCommon['value']);
    
    
        }
    
        public function testWritingConfigWithSpecialCharacters()
        {
            $userFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/config.written.ini.php';
            $globalFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/global.ini.php';
    
    
            $config = new Config(new GlobalSettingsProvider($globalFile, $userFile));
    
    
            $stringWritten = '&6^ geagea\'\'\'";;&';
            $config->Category = array('test' => $stringWritten);
    
            $this->assertEquals($stringWritten, $config->Category['test']);
    
    
            // This will write the file
            $config->forceSave();
    
            $config = new Config(new GlobalSettingsProvider($globalFile, $userFile));
    
            $this->assertEquals($stringWritten, $config->Category['test']);
    
            $config->Category = array(
    
                'test'  => $config->Category['test'],
    
                'test2' => $stringWritten,
            );
    
            $this->assertEquals($stringWritten, $config->Category['test']);
            $this->assertEquals($stringWritten, $config->Category['test2']);
    
        }
    
        public function testUserConfigOverwritesGlobalConfig()
        {
            $userFile = PIWIK_PATH_TEST_TO_ROOT . '/tests/resources/Config/config.ini.php';
            $globalFile = PIWIK_PATH_TEST_TO_ROOT . '/tests/resources/Config/global.ini.php';
    
    
            $config = new Config(new GlobalSettingsProvider($globalFile, $userFile));
    
            $this->assertEquals("value_overwritten", $config->Category['key1']);
            $this->assertEquals("value2", $config->Category['key2']);
            $this->assertEquals("tes\"t", $config->GeneralSection['login']);
            $this->assertEquals("value3", $config->CategoryOnlyInGlobalFile['key3']);
            $this->assertEquals("value4", $config->CategoryOnlyInGlobalFile['key4']);
    
    
            $expectedArray = array('plugin"1', 'plugin2', 'plugin3');
            $array = $config->TestArray;
    
            $this->assertEquals($expectedArray, $array['installed']);
    
    
            $expectedArray = array('value1', 'value2');
            $array = $config->TestArrayOnlyInGlobalFile;
    
            $this->assertEquals($expectedArray, $array['my_array']);
    
        }
    
        /**
         * Dataprovider for testDumpConfig
         */
        public function getDumpConfigData()
        {
    
    sgiehl's avatar
    sgiehl a validé
            $header = "; <?php exit; ?> DO NOT REMOVE THIS LINE\n" .
    
                "; file automatically generated or modified by Piwik; you can manually override the default values in global.ini.php by redefining them in this file.\n";
    
    
            return array(
    
                // Test name, array(
                //   LOCAL
                //   GLOBAL
                //   COMMON
                //   CACHE
                //   --> EXPECTED <--
    
                array('global only, not cached', array(
    
                    array(),                                  // local
                    array('General' => array('debug' => 1)),  // global
                    array(),                                  // common
    
                    array(),
                    false,
                )),
    
                array('global only, cached get', array(
    
                    array(),                                  // local
                    array('General' => array('debug' => 1)),  // global
                    array(),                                  // common
                    array('General' => array('debug' => 1)),
    
                    false,
                )),
    
                array('global only, cached set', array(
    
                    array(),                                  // local
                    array('General' => array('debug' => 1)),  // global
                    array(),                                  // common
                    array('General' => array('debug' => 2)),
    
                    $header . "[General]\ndebug = 2\n\n",
                )),
    
                array('local copy (same), not cached', array(
    
                    array('General' => array('debug' => 1)),  // local
                    array('General' => array('debug' => 1)),  // global
                    array(),                                  // common
    
                    array(),
                    false,
                )),
    
                array('local copy (same), cached get', array(
    
                    array('General' => array('debug' => 1)),  // local
                    array('General' => array('debug' => 1)),  // global
                    array(),                                  // common
                    array('General' => array('debug' => 1)),
    
                    false,
                )),
    
                array('local copy (same), cached set', array(
    
                    array('General' => array('debug' => 1)),  // local
                    array('General' => array('debug' => 1)),  // global
    
                    $header . "[General]\ndebug = 2\n\n",
                )),
    
                array('local copy (different), not cached', array(
    
                    array('General' => array('debug' => 2)),  // local
                    array('General' => array('debug' => 1)),  // global
                    array(),                                  // common
    
                    array(),
                    false,
                )),
    
                array('local copy (different), cached get', array(
    
                    array('General' => array('debug' => 2)),  // local
                    array('General' => array('debug' => 1)),  // global
                    array(),                                  // common
                    array('General' => array('debug' => 2)),
    
                    false,
                )),
    
                array('local copy (different), cached set', array(
    
                    array('General' => array('debug' => 2)),  // local
                    array('General' => array('debug' => 1)),  // global
                    array(),                                  // common
                    array('General' => array('debug' => 3)),
    
                    $header . "[General]\ndebug = 3\n\n",
                )),
    
                array('local copy, not cached, new section', array(
    
                    array('Tracker' => array('anonymize' => 1)),  // local
                    array('General' => array('debug' => 1)),      // global
                    array(),                                      // common
    
                    array(),
                    false,
                )),
    
                array('local copy, cached get, new section', array(
    
                    array('Tracker' => array('anonymize' => 1)),  // local
                    array('General' => array('debug' => 1)),      // global
                    array(),                                      // common
                    array('Tracker' => array('anonymize' => 1)),
    
                    false,
                )),
    
                array('local copy, cached set local, new section', array(
    
                    array('Tracker' => array('anonymize' => 1)),  // local
                    array('General' => array('debug' => 1)),      // global
                    array(),                                      // common
                    array('Tracker' => array('anonymize' => 2)),
    
                    $header . "[Tracker]\nanonymize = 2\n\n",
                )),
    
                array('local copy, cached set global, new section', array(
    
                    array('Tracker' => array('anonymize' => 1)),  // local
                    array('General' => array('debug' => 1)),      // global
                    array(),                                      // common
    
                    array('General' => array('debug' => 2), 'Tracker' => array('anonymize' => 1)),
    
                    $header . "[General]\ndebug = 2\n\n[Tracker]\nanonymize = 1\n\n",
                )),
    
                array('sort, common sections', array(
    
                    array('Tracker' => array('anonymize' => 1),   // local
                          'General' => array('debug' => 1)),
                    array('General' => array('debug' => 0),       // global
                          'Tracker' => array('anonymize' => 0)),
                    array(),                                      // common
    
                    array('Tracker' => array('anonymize' => 2),
                          'General' => array('debug' => 1)),
    
                    $header . "[General]\ndebug = 1\n\n[Tracker]\nanonymize = 2\n\n",
                )),
    
    
                array('sort, common sections before new section', array(
    
                    array('Tracker' => array('anonymize' => 1),   // local
                          'General' => array('debug' => 1)),
                    array('General' => array('debug' => 0),       // global
                          'Tracker' => array('anonymize' => 0)),
                    array(),                                      // common
    
                    array('Segment' => array('dimension' => 'foo'),
                          'Tracker' => array('anonymize' => 1),   // local
                          'General' => array('debug' => 1)),
    
                    $header . "[General]\ndebug = 1\n\n[Tracker]\nanonymize = 1\n\n[Segment]\ndimension = \"foo\"\n\n",
    
    
                array('change back to default', array(
    
                    array('Tracker' => array('anonymize' => 1)),  // local
                    array('Tracker' => array('anonymize' => 0),   // global
                          'General' => array('debug' => 1)),
    
                    $header
                )),
    
    
                array('[General] trusted_hosts has been updated and only this one is written', array(
                    array('General' => array('trusted_hosts' => 'someRandomHostToOverwrite')),  // local
                    array('General' => array('settingGlobal' => 'global',   // global
                                             'settingCommon' => 'global',
                                             'trusted_hosts' => 'none')),
                    array('General' => array('settingCommon' => 'common',       // common
                                             'settingCommon2' => 'common')),
                    array('General' => array('trusted_hosts' => 'works')),
                    $header . "[General]\ntrusted_hosts = \"works\"\n\n",
                )),
    
                // Same as above but without trusted_hosts default value in global.ini.php
    
                // Also, settingCommon3 is the same in the local file as in common, so it is not written out
                array('trusted_hosts and settingCommon3 changed ', array(
                    array('General' => array('trusted_hosts' => 'someRandomHostToOverwrite')), // local
                    array('General' => array('settingGlobal' => 'global',                   // global
    
                                             'settingCommon' => 'global')),
    
                    array('General' => array('settingCommon' => 'common',                   // common
                                             'settingCommon2' => 'common',
                                             'settingCommon3' => 'common3')),
                    array('General' => array('trusted_hosts' => 'works',               // common
                                             'settingCommon2' => 'common', // will be cleared since it's same as in common
                                             'settingCommon3' => 'commonOverridenByLocal')),
                    $header . "[General]\ntrusted_hosts = \"works\"\nsettingCommon3 = \"commonOverridenByLocal\"\n\n",
                )),
    
                // the value in [General]->key has changed
                // the value in [CommonCategory]->newSetting has changed,
                //         but  [CommonCategory]->settingCommon2 hasn't so it is not written
                array('Common tests file', array(
                    array('General' => array('key' => 'value')),                            // local
                    array('General' => array('key' => 'global'),                            // global
                          'CommonCategory' => array('settingGlobal' => 'valueGlobal')),
                    array('CommonCategory' => array('settingCommon' => 'common',            // common
                                                    'settingCommon2' => 'common2')),
                    array('CommonCategory' => array('settingCommon2' => 'common2',
    
                                                    'newSetting' => 'newValue'),
                          'General' => array('key' => 'value')),
    
                    $header . "[General]\nkey = \"value\"\n\n[CommonCategory]\nnewSetting = \"newValue\"\n\n",
    
    
                array('Converts Dollar Sign To Dollar Entity', array(
                    array('General' => array('key' => '$value', 'key2' => '${value}')),      // local
                    array('General' => array('key' => '$global'),                            // global
                        'CommonCategory' => array('settingGlobal' => 'valueGlobal')),
                    array('CommonCategory' => array('settingCommon' => 'common',            // common
                        'settingCommon2' => 'common2')),
                    array('CommonCategory' => array('settingCommon2' => 'common2',
    
                                                    'newSetting' => 'newValue'),
                        'General' => array('key' => '$value', 'key2' => '${value}')),
    
                    $header . "[General]\nkey = \"&#36;value\"\nkey2 = \"&#36;{value}\"\n\n[CommonCategory]\nnewSetting = \"newValue\"\n\n",
    
            );
    
        }
    
        /**
         * @dataProvider getDumpConfigData
         */
        public function testDumpConfig($description, $test)
        {
    
            list($configLocal, $configGlobal, $configCommon, $configCache, $expected) = $test;
    
            $config = new DumpConfigTestMockConfig($configLocal, $configGlobal, $configCommon, $configCache);
    
            $output = $config->dumpConfig();
    
            $this->assertEquals($expected, $output, $description);
    
    
        public function testDollarEntityGetsConvertedToDollarSign()
        {
            $userFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/config.ini.php';
            $globalFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/global.ini.php';
            $commonFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/common.config.ini.php';
    
    
            $config = new Config(new GlobalSettingsProvider($globalFile, $userFile, $commonFile));
    
    
            $this->assertEquals('${@piwik(crash))}', $config->Category['key3']);
        }
    
    
        public function test_forceSave_writesNothingIfThereAreNoChanges()
        {
            $sourceConfigFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/config.ini.php';
            $configFile = PIWIK_INCLUDE_PATH . '/tmp/tmp.config.ini.php';
    
    
            if(file_exists($configFile)){
    
    ThaDafinser's avatar
    ThaDafinser a validé
                @unlink($configFile);
    
            $config = new Config(new GlobalSettingsProvider($sourceConfigFile, $configFile));
    
            $config->forceSave();
    
            $this->assertEquals(file_get_contents($sourceConfigFile), file_get_contents($configFile));
    
            if(file_exists($configFile)){
    
    ThaDafinser's avatar
    ThaDafinser a validé
                @unlink($configFile);
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
        public function testFromGlobalConfig()
        {
            $userFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/config.ini.php';
            $globalFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/global.ini.php';
            $commonFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/common.config.ini.php';
            
    
            $config = new Config(new GlobalSettingsProvider($globalFile, $userFile, $commonFile));
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
            $configCategory = $config->getFromGlobalConfig('Category');
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
            $this->assertEquals('value1', $configCategory['key1']);
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
            $this->assertEquals('value2', $configCategory['key2']);
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
            $this->assertEquals(array('key1' => 'value1', 'key2' => 'value2'), $configCategory);
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
        }
        
        public function testFromCommonConfig()
        {
            $userFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/config.ini.php';
            $globalFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/global.ini.php';
            $commonFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/common.config.ini.php';
        
    
            $config = new Config(new GlobalSettingsProvider($globalFile, $userFile, $commonFile));
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
            $configCategory = $config->getFromCommonConfig('Category');
    
            $this->assertEquals(array('key2' => 'valueCommon', 'key3' => '${@piwik(crash))}'), $configCategory);
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
        }
        
        public function testFromLocalConfig()
        {
            $userFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/config.ini.php';
            $globalFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/global.ini.php';
            $commonFile = PIWIK_INCLUDE_PATH . '/tests/resources/Config/common.config.ini.php';
        
    
            $config = new Config(new GlobalSettingsProvider($globalFile, $userFile, $commonFile));
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
            $configCategory = $config->getFromLocalConfig('Category');
    
            $this->assertEquals(array('key1' => 'value_overwritten'), $configCategory);
    
    Martin Keckeis's avatar
    Martin Keckeis a validé
        }