Newer
Older
* 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\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();
$this->iniFileChain = new DumpConfigTestMockIniFileChain(
array(
$this->pathGlobal => $configGlobal,
$this->pathCommon => $configCommon,
$this->pathLocal => $configLocal,
),
$configCache
);
}
}
class DumpConfigTestMockConfig extends Config
{
public function __construct($configLocal, $configGlobal, $configCommon, $configCache)
{
parent::__construct(new MockIniSettingsProvider($configLocal, $configGlobal, $configCommon, $configCache));
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();
diosmosis
a validé
$config = new Config(new GlobalSettingsProvider($globalFile, $userFile));
$this->assertEquals($stringWritten, $config->Category['test']);
'test' => $config->Category['test'],
$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()
{
$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";
// Test name, array(
// LOCAL
// GLOBAL
// COMMON
// CACHE
// --> EXPECTED <--
Matthieu Napoli
a validé
array(), // local
array('General' => array('debug' => 1)), // global
array(), // common
array(),
false,
)),
array('global only, cached get', array(
Matthieu Napoli
a validé
array(), // local
array('General' => array('debug' => 1)), // global
array(), // common
array('General' => array('debug' => 1)),
false,
)),
array('global only, cached set', array(
Matthieu Napoli
a validé
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(
Matthieu Napoli
a validé
array('General' => array('debug' => 1)), // local
array('General' => array('debug' => 1)), // global
array(), // common
array(),
false,
)),
array('local copy (same), cached get', array(
Matthieu Napoli
a validé
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(
Matthieu Napoli
a validé
array('General' => array('debug' => 1)), // local
array('General' => array('debug' => 1)), // global
array(), // common
Matthieu Napoli
a validé
array('General' => array('debug' => 2)),
$header . "[General]\ndebug = 2\n\n",
)),
array('local copy (different), not cached', array(
Matthieu Napoli
a validé
array('General' => array('debug' => 2)), // local
array('General' => array('debug' => 1)), // global
array(), // common
array(),
false,
)),
array('local copy (different), cached get', array(
Matthieu Napoli
a validé
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(
Matthieu Napoli
a validé
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(
Matthieu Napoli
a validé
array('Tracker' => array('anonymize' => 1)), // local
array('General' => array('debug' => 1)), // global
array(), // common
array(),
false,
)),
array('local copy, cached get, new section', array(
Matthieu Napoli
a validé
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(
Matthieu Napoli
a validé
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(
Matthieu Napoli
a validé
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(
Matthieu Napoli
a validé
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",
)),
diosmosis
a validé
array('sort, common sections before new section', array(
Matthieu Napoli
a validé
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",
diosmosis
a validé
)),
Matthieu Napoli
a validé
array('Tracker' => array('anonymize' => 1)), // local
array('Tracker' => array('anonymize' => 0), // global
'General' => array('debug' => 1)),
array(), // common
Matthieu Napoli
a validé
array('Tracker' => array('anonymize' => 0)),
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')),
diosmosis
a validé
$header . "[General]\nkey = \"value\"\n\n[CommonCategory]\nnewSetting = \"newValue\"\n\n",
Thomas Steur
a validé
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}')),
diosmosis
a validé
$header . "[General]\nkey = \"$value\"\nkey2 = \"${value}\"\n\n[CommonCategory]\nnewSetting = \"newValue\"\n\n",
Thomas Steur
a validé
)),
);
}
/**
* @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);
Thomas Steur
a validé
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));
Thomas Steur
a validé
$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';
copy($sourceConfigFile, $configFile);
$config = new Config(new GlobalSettingsProvider($sourceConfigFile, $configFile));
$config->forceSave();
$this->assertEquals(file_get_contents($sourceConfigFile), file_get_contents($configFile));
}
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));
$configCategory = $config->getFromGlobalConfig('Category');
$this->assertEquals('value1', $configCategory['key1']);
$this->assertEquals('value2', $configCategory['key2']);
$this->assertEquals(array('key1' => 'value1', 'key2' => 'value2'), $configCategory);
}
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));
$configCategory = $config->getFromCommonConfig('Category');
$this->assertEquals(array('key2' => 'valueCommon', 'key3' => '${@piwik(crash))}'), $configCategory);
}
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));
$this->assertEquals(array('key1' => 'value_overwritten'), $configCategory);