Skip to content
Extraits de code Groupes Projets
ConfigTest.php 19,3 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\Config;
    
    /**
    
     * @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 = Config::getInstance();
    
            $config->setTestEnvironment($userFile, $globalFile, $commonFile);
    
            $config->init();
    
    
            $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 = Config::getInstance();
            $config->setTestEnvironment($userFile, $globalFile, $commonFile);
            $config->init();
    
            $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 = Config::getInstance();
    
            $config->setTestEnvironment($userFile, $globalFile);
            $config->init();
    
            $stringWritten = '&6^ geagea\'\'\'";;&';
            $config->Category = array('test' => $stringWritten);
    
            $this->assertEquals($stringWritten, $config->Category['test']);
    
    
            // This will write the file
            $config->forceSave();
    
            $config = Config::getInstance();
    
            $config->setTestEnvironment($userFile, $globalFile);
            $config->init();
    
    
            $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 = Config::getInstance();
    
            $config->setTestEnvironment($userFile, $globalFile);
    
    
            $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']);
    
            Config::getInstance()->clear();
    
        }
    
        /**
         * Dateprovider for testCompareElements
         */
        public function getCompareElementsData()
        {
            return array(
                array('string = string', array(
                    'a', 'a', 0,
                )),
                array('string > string', array(
                    'b', 'a', 1,
                )),
                array('string < string', array(
                    'a', 'b', -1,
                )),
                array('string vs array', array(
                    'a', array('a'), -1,
                )),
                array('array vs string', array(
                    array('a'), 'a', 1,
                )),
                array('array = array', array(
                    array('a'), array('a'), 0,
                )),
                array('array > array', array(
                    array('b'), array('a'), 1,
                )),
                array('array < array', array(
                    array('a'), array('b'), -1,
                )),
            );
        }
    
        /**
         * @dataProvider getCompareElementsData
         */
        public function testCompareElements($description, $test)
        {
            list($a, $b, $expected) = $test;
    
    
            $result = Config::compareElements($a, $b);
    
            $this->assertEquals($expected, $result, $description);
    
        }
    
        /**
         * Dataprovider for testArrayUnmerge
         * @return array
         */
    
        public function getArrayUnmergeData()
        {
    
            return array(
                array('description of test', array(
                    array(),
                    array(),
                )),
                array('override with empty', array(
                    array('login' => 'root', 'password' => 'b33r'),
                    array('password' => ''),
                )),
                array('override with non-empty', array(
                    array('login' => 'root', 'password' => ''),
                    array('password' => 'b33r'),
                )),
                array('add element', array(
                    array('login' => 'root', 'password' => ''),
                    array('auth' => 'Login'),
                )),
                array('override with empty array', array(
                    array('headers' => ''),
                    array('headers' => array()),
                )),
                array('override with array', array(
                    array('headers' => ''),
                    array('headers' => array('Content-Length', 'Content-Type')),
                )),
                array('override an array', array(
                    array('headers' => array()),
                    array('headers' => array('Content-Length', 'Content-Type')),
                )),
                array('override similar arrays', array(
                    array('headers' => array('Content-Length', 'Set-Cookie')),
                    array('headers' => array('Content-Length', 'Content-Type')),
                )),
                array('override dyslexic arrays', array(
                    array('headers' => array('Content-Type', 'Content-Length')),
                    array('headers' => array('Content-Length', 'Content-Type')),
                )),
            );
        }
    
        /**
         * @dataProvider getArrayUnmergeData
         */
        public function testArrayUnmerge($description, $test)
        {
    
            $configWriter = Config::getInstance();
    
    
            list($a, $b) = $test;
    
            $combined = array_merge($a, $b);
    
            $diff = $configWriter->array_unmerge($a, $combined);
    
            // expect $b == $diff
            $this->assertEquals(serialize($b), serialize($diff), $description);
        }
    
        /**
         * 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
                    array(),                                    // common
    
                    array('General' => array('debug' => '2')),
                    $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')),
                    $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('Tracker' => array('anonymize' => '2')),
                    $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('Segment' => array('dimension' => 'foo')),
                    $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')),
    
                    array('Tracker' => array('anonymize' => '0')),
                    $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')),
                    $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')),
                    $header . "[General]\nkey = \"&#36;value\"\nkey2 = \"&#36;{value}\"\n\n[CommonCategory]\nnewSetting = \"newValue\"\n\n",
                )),
    
            );
    
        }
    
        /**
         * @dataProvider getDumpConfigData
         */
        public function testDumpConfig($description, $test)
        {
    
            $config = Config::getInstance();
    
            list($configLocal, $configGlobal, $configCommon, $configCache, $expected) = $test;
    
            $output = $config->dumpConfig($configLocal, $configGlobal, $configCommon, $configCache);
    
            $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 = Config::getInstance();
            $config->setTestEnvironment($userFile, $globalFile, $commonFile);
            $config->init();
    
            $this->assertEquals('${@piwik(crash))}', $config->Category['key3']);
        }