2 namespace TYPO3\CMS\Core\Tests\Unit\Configuration
;
4 /***************************************************************
7 * (c) 2012-2013 Christian Kuhn <lolli@schwarzbu.ch>
10 * This script is part of the TYPO3 project. The TYPO3 project is
11 * free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * The GNU General Public License can be found at
17 * http://www.gnu.org/copyleft/gpl.html.
19 * This script is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * This copyright notice MUST APPEAR in all copies of the script!
25 ***************************************************************/
30 * @author Christian Kuhn <lolli@schwarzbu.ch>
32 class ConfigurationManagerTest
extends \TYPO3\CMS\Core\Tests\UnitTestCase
{
35 * Absolute path to files that must be removed
36 * after a test - handled in tearDown
38 protected $testFilesToDelete = array();
41 * @var \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject
45 public function setUp() {
46 $this->createFixtureWithMockedMethods(
48 'getDefaultConfigurationFileLocation',
49 'getLocalConfigurationFileLocation',
57 public function tearDown() {
58 foreach ($this->testFilesToDelete
as $absoluteFileName) {
59 \TYPO3\CMS\Core\Utility\GeneralUtility
::unlink_tempfile($absoluteFileName);
64 * @param array $methods
66 protected function createFixtureWithMockedMethods(array $methods) {
67 $this->fixture
= $this->getMock(
68 'TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager',
75 * @expectedException \RuntimeException
77 public function getDefaultConfigurationExecutesDefinedDefaultConfigurationFile() {
78 $defaultConfigurationFile = PATH_site
. 'typo3temp/' . uniqid('defaultConfiguration');
80 $defaultConfigurationFile,
81 '<?php throw new \RuntimeException(\'foo\', 1310203814); ?>'
83 $this->testFilesToDelete
[] = $defaultConfigurationFile;
86 ->expects($this->once())
87 ->method('getDefaultConfigurationFileLocation')
88 ->will($this->returnValue($defaultConfigurationFile));
89 $this->fixture
->getDefaultConfiguration();
94 * @expectedException \RuntimeException
96 public function getLocalConfigurationExecutesDefinedConfigurationFile() {
97 $configurationFile = PATH_site
. 'typo3temp/' . uniqid('localConfiguration');
100 '<?php throw new \RuntimeException(\'foo\', 1310203815); ?>'
102 $this->testFilesToDelete
[] = $configurationFile;
105 ->expects($this->once())
106 ->method('getLocalConfigurationFileLocation')
107 ->will($this->returnValue($configurationFile));
108 $this->fixture
->getLocalConfiguration();
114 public function updateLocalConfigurationWritesNewMergedLocalConfigurationArray() {
115 $currentLocalConfiguration = array(
117 'changed' => 'unChanged',
119 $overrideConfiguration = array(
120 'changed' => 'changed',
123 $expectedConfiguration = array(
125 'changed' => 'changed',
129 $this->createFixtureWithMockedMethods(
131 'getLocalConfiguration',
132 'writeLocalConfiguration',
135 $this->fixture
->expects($this->once())
136 ->method('getLocalConfiguration')
137 ->will($this->returnValue($currentLocalConfiguration));
138 $this->fixture
->expects($this->once())
139 ->method('writeLocalConfiguration')
140 ->with($expectedConfiguration);
142 $this->fixture
->updateLocalConfiguration($overrideConfiguration);
148 public function getDefaultConfigurationValueByPathReturnsCorrectValue() {
149 $this->createFixtureWithMockedMethods(
151 'getDefaultConfiguration',
154 $this->fixture
->expects($this->once())
155 ->method('getDefaultConfiguration')
156 ->will($this->returnValue(array(
161 $this->assertSame('value', $this->fixture
->getDefaultConfigurationValueByPath('path'));
167 public function getLocalConfigurationValueByPathReturnsCorrectValue() {
168 $this->createFixtureWithMockedMethods(
170 'getLocalConfiguration',
173 $this->fixture
->expects($this->once())
174 ->method('getLocalConfiguration')
175 ->will($this->returnValue(array(
180 $this->assertSame('value', $this->fixture
->getLocalConfigurationValueByPath('path'));
186 public function getConfigurationValueByPathReturnsCorrectValue() {
187 $this->createFixtureWithMockedMethods(
189 'getDefaultConfiguration',
190 'getLocalConfiguration',
193 $this->fixture
->expects($this->once())
194 ->method('getDefaultConfiguration')
195 ->will($this->returnValue(array(
199 $this->fixture
->expects($this->once())
200 ->method('getLocalConfiguration')
201 ->will($this->returnValue(array(
202 'path' => 'valueOverride',
206 $this->assertSame('valueOverride', $this->fixture
->getConfigurationValueByPath('path'));
212 public function setLocalConfigurationValueByPathReturnFalseIfPathIsNotValid() {
213 $this->createFixtureWithMockedMethods(array(
214 'isValidLocalConfigurationPath',
216 $this->fixture
->expects($this->once())
217 ->method('isValidLocalConfigurationPath')
218 ->will($this->returnValue(FALSE
));
220 $this->assertFalse($this->fixture
->setLocalConfigurationValueByPath('path', 'value'));
226 public function setLocalConfigurationValueByPathUpdatesValueDefinedByPath() {
227 $currentLocalConfiguration = array(
229 'toUpdate' => 'notUpdated',
231 $expectedConfiguration = array(
233 'toUpdate' => 'updated',
236 $this->createFixtureWithMockedMethods(
238 'isValidLocalConfigurationPath',
239 'getLocalConfiguration',
240 'writeLocalConfiguration',
243 $this->fixture
->expects($this->once())
244 ->method('isValidLocalConfigurationPath')
245 ->will($this->returnValue(TRUE
));
246 $this->fixture
->expects($this->once())
247 ->method('getLocalConfiguration')
248 ->will($this->returnValue($currentLocalConfiguration));
249 $this->fixture
->expects($this->once())
250 ->method('writeLocalConfiguration')
251 ->with($expectedConfiguration);
253 $this->fixture
->setLocalConfigurationValueByPath('toUpdate', 'updated');
259 public function setLocalConfigurationValuesByPathValuePairsSetsPathValuePairs() {
260 $currentLocalConfiguration = array(
262 'toUpdate' => 'notUpdated',
264 $expectedConfiguration = array(
266 'toUpdate' => 'updated',
270 $this->createFixtureWithMockedMethods(
272 'isValidLocalConfigurationPath',
273 'getLocalConfiguration',
274 'writeLocalConfiguration',
277 $this->fixture
->expects($this->any())
278 ->method('isValidLocalConfigurationPath')
279 ->will($this->returnValue(TRUE
));
280 $this->fixture
->expects($this->once())
281 ->method('getLocalConfiguration')
282 ->will($this->returnValue($currentLocalConfiguration));
283 $this->fixture
->expects($this->once())
284 ->method('writeLocalConfiguration')
285 ->with($expectedConfiguration);
288 'toUpdate' => 'updated',
291 $this->fixture
->setLocalConfigurationValuesByPathValuePairs($pairs);
297 public function canWriteConfigurationReturnsFalseIfDirectoryIsNotWritable() {
298 if (TYPO3_OS
== 'WIN') {
299 $this->markTestSkipped('Not available on Windows');
301 /** @var $fixture \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface */
302 $fixture = $this->getAccessibleMock('TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager', array('dummy'));
304 $directory = 'typo3temp/' . uniqid('test_');
305 $absoluteDirectory = PATH_site
. $directory;
306 mkdir($absoluteDirectory);
307 chmod($absoluteDirectory, 0544);
310 $fixture->_set('pathTypo3Conf', $directory);
312 $result = $fixture->canWriteConfiguration();
314 chmod($absoluteDirectory, 0755);
315 rmdir($absoluteDirectory);
317 $this->assertFalse($result);
323 public function canWriteConfigurationReturnsFalseIfLocalConfigurationFileIsNotWritable() {
324 if (TYPO3_OS
== 'WIN') {
325 $this->markTestSkipped('Not available on Windows');
327 /** @var $fixture \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface */
328 $fixture = $this->getAccessibleMock('TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager', array('dummy'));
330 $file = 'typo3temp/' . uniqid('test_');
331 $absoluteFile = PATH_site
. $file;
332 touch($absoluteFile);
333 $this->testFilesToDelete
[] = $absoluteFile;
334 chmod($absoluteFile, 0444);
337 $fixture->_set('localConfigurationFile', $file);
339 $result = $fixture->canWriteConfiguration();
341 chmod($absoluteFile, 0644);
343 $this->assertFalse($result);
349 public function canWriteConfigurationReturnsFalseIfLocalconfFileIsNotWritable() {
350 if (TYPO3_OS
== 'WIN') {
351 $this->markTestSkipped('Not available on Windows');
353 /** @var $fixture \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface */
354 $fixture = $this->getAccessibleMock('TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager', array('dummy'));
356 $file = 'typo3temp/' . uniqid('test_');
357 $absoluteFile = PATH_site
. $file;
358 touch($absoluteFile);
359 $this->testFilesToDelete
[] = $absoluteFile;
360 chmod($absoluteFile, 0444);
363 $fixture->_set('localconfFile', $file);
365 $result = $fixture->canWriteConfiguration();
367 chmod($absoluteFile, 0644);
369 $this->assertFalse($result);
375 public function canWriteConfigurationReturnsTrueIfDirectoryAndFilesAreWritable() {
376 /** @var $fixture \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface */
377 $fixture = $this->getAccessibleMock('TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager', array('dummy'));
379 $directory = 'typo3temp/' . uniqid('test_');
380 $absoluteDirectory = PATH_site
. $directory;
381 mkdir($absoluteDirectory);
382 $fixture->_set('pathTypo3Conf', $directory);
384 $file1 = 'typo3temp/' . uniqid('test_');
385 $absoluteFile1 = PATH_site
. $file1;
386 touch($absoluteFile1);
387 $this->testFilesToDelete
[] = $absoluteFile1;
388 $fixture->_set('localConfigurationFile', $file1);
390 $file2 = 'typo3temp/' . uniqid('test_');
391 $absoluteFile2 = PATH_site
. $file2;
392 touch($absoluteFile2);
393 $this->testFilesToDelete
[] = $absoluteFile2;
394 $fixture->_set('localconfFile', $file2);
398 $result = $fixture->canWriteConfiguration();
400 $this->assertTrue($result);
406 public function writeLocalConfigurationWritesSortedContentToConfigurationFile() {
407 $configurationFile = PATH_site
. 'typo3temp/' . uniqid('localConfiguration');
408 if (!is_file($configurationFile)) {
409 if (!$fh = fopen($configurationFile, 'wb')) {
410 $this->markTestSkipped('Can not create file ' . $configurationFile . '. Please check your write permissions.');
415 if (!@is_file
($configurationFile)) {
416 throw new \
RuntimeException('File ' . $configurationFile . ' could not be found. Please check your write permissions', 1346364362);
418 $this->testFilesToDelete
[] = $configurationFile;
421 ->expects($this->any())
422 ->method('getLocalConfigurationFileLocation')
423 ->will($this->returnValue($configurationFile));
431 'return array(' . LF
.
432 TAB
. '\'bar\' => 23,' . LF
.
433 TAB
. '\'foo\' => 42,' . LF
.
437 $this->fixture
->writeLocalConfiguration($pairs);
438 $this->assertSame($expectedContent, file_get_contents($configurationFile));
443 * @expectedException \RuntimeException
445 public function createLocalConfigurationFromFactoryConfigurationThrowsExceptionIfFileExists() {
446 /** @var $fixture \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface */
447 $fixture = $this->getAccessibleMock('TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager', array('dummy'));
449 $file = 'typo3temp/' . uniqid('test_');
450 $absoluteFile = PATH_site
. $file;
451 touch($absoluteFile);
452 $this->testFilesToDelete
[] = $absoluteFile;
453 $fixture->_set('localConfigurationFile', $file);
455 $fixture->createLocalConfigurationFromFactoryConfiguration();
461 public function createLocalConfigurationFromFactoryConfigurationWritesContentFromFactoryFile() {
462 /** @var $fixture \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface */
463 $fixture = $this->getAccessibleMock('TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager', array('writeLocalConfiguration'));
464 $fixture->_set('localConfigurationFile', 'typo3temp/' . uniqid('dummy_'));
466 $factoryConfigurationFile = 'typo3temp/' . uniqid('test_') . '.php';
467 $factoryConfigurationAbsoluteFile = PATH_site
. $factoryConfigurationFile;
468 $uniqueContentString = uniqid('string_');
469 $validFactoryConfigurationFileContent =
471 'return array(' . LF
.
472 $uniqueContentString . ' => foo,' . LF
.
476 $factoryConfigurationAbsoluteFile,
477 $validFactoryConfigurationFileContent
479 $this->testFilesToDelete
[] = $factoryConfigurationAbsoluteFile;
481 $fixture->_set('factoryConfigurationFile', $factoryConfigurationFile);
484 ->expects($this->once())
485 ->method('writeLocalConfiguration')
486 ->with($this->arrayHasKey($uniqueContentString));
487 $fixture->createLocalConfigurationFromFactoryConfiguration();
493 public function createLocalConfigurationFromFactoryConfigurationMergesConfigurationWithAdditionalFactoryFile() {
494 /** @var $fixture \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface */
495 $fixture = $this->getAccessibleMock('TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager', array('writeLocalConfiguration'));
496 $fixture->_set('localConfigurationFile', 'typo3temp/' . uniqid('dummy_'));
498 $factoryConfigurationFile = 'typo3temp/' . uniqid('test_') . '.php';
499 $factoryConfigurationAbsoluteFile = PATH_site
. $factoryConfigurationFile;
500 $validFactoryConfigurationFileContent =
502 'return array();' . LF
.
505 $factoryConfigurationAbsoluteFile,
506 $validFactoryConfigurationFileContent
508 $this->testFilesToDelete
[] = $factoryConfigurationAbsoluteFile;
509 $fixture->_set('factoryConfigurationFile', $factoryConfigurationFile);
511 $additionalFactoryConfigurationFile = 'typo3temp/' . uniqid('test_') . '.php';
512 $additionalFactoryConfigurationAbsoluteFile = PATH_site
. $additionalFactoryConfigurationFile;
513 $uniqueContentString = uniqid('string_');
514 $validAdditionalFactoryConfigurationFileContent =
516 'return array(' . LF
.
517 $uniqueContentString . ' => foo,' . LF
.
521 $additionalFactoryConfigurationAbsoluteFile,
522 $validAdditionalFactoryConfigurationFileContent
524 $this->testFilesToDelete
[] = $additionalFactoryConfigurationAbsoluteFile;
525 $fixture->_set('additionalFactoryConfigurationFile', $additionalFactoryConfigurationFile);
528 ->expects($this->once())
529 ->method('writeLocalConfiguration')
530 ->with($this->arrayHasKey($uniqueContentString));
531 $fixture->createLocalConfigurationFromFactoryConfiguration();
537 public function isValidLocalConfigurationPathAcceptsWhitelistedPath() {
538 /** @var $fixture \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface */
539 $fixture = $this->getAccessibleMock('TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager', array('dummy'));
540 $fixture->_set('whiteListedLocalConfigurationPaths', array('foo/bar'));
541 $this->assertTrue($fixture->_call('isValidLocalConfigurationPath', 'foo/bar/baz'));
547 public function isValidLocalConfigurationPathDeniesNotWhitelistedPath() {
548 /** @var $fixture \TYPO3\CMS\Core\Configuration\ConfigurationManager|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface */
549 $fixture = $this->getAccessibleMock('TYPO3\\CMS\\Core\\Configuration\\ConfigurationManager', array('dummy'));
550 $fixture->_set('whiteListedLocalConfigurationPaths', array('foo/bar'));
551 $this->assertFalse($fixture->_call('isValidLocalConfigurationPath', 'bar/baz'));