Skip to content

Commit

Permalink
[TASK] Reduce VFS usage in unit tests - Part 1
Browse files Browse the repository at this point in the history
The component causes errors every once in a while and does not
provide a huge benefit anymore.
This part contains the low hanging fruits, the harder cases will
be tackled in other parts.

Resolves: #97762
Releases: main
Change-Id: I36d59cbf3514c13cceacf8de4bebf577b2389f59
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/74882
Tested-by: core-ci <typo3@b13.com>
Tested-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
  • Loading branch information
maddy2101 authored and lolli42 committed Jun 18, 2022
1 parent d1023c9 commit 69bf2c6
Show file tree
Hide file tree
Showing 19 changed files with 419 additions and 401 deletions.
5 changes: 0 additions & 5 deletions Build/phpstan/phpstan-baseline.neon
Expand Up @@ -1810,11 +1810,6 @@ parameters:
count: 1
path: ../../typo3/sysext/core/Tests/Unit/Log/Fixtures/WriterFixture.php

-
message: "#^Call to an undefined method org\\\\bovigo\\\\vfs\\\\vfsStreamContent\\:\\:hasChild\\(\\)\\.$#"
count: 1
path: ../../typo3/sysext/core/Tests/Unit/Log/Writer/FileWriterTest.php

-
message: "#^Call to an undefined method Symfony\\\\Component\\\\Mime\\\\Header\\\\HeaderInterface\\:\\:getAddress\\(\\)\\.$#"
count: 1
Expand Down
Expand Up @@ -20,6 +20,7 @@
use PHPUnit\Framework\MockObject\MockObject;
use TYPO3\CMS\Core\Configuration\ConfigurationManager;
use TYPO3\CMS\Core\Core\Environment;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\StringUtility;
use TYPO3\TestingFramework\Core\Unit\UnitTestCase;

Expand All @@ -41,6 +42,21 @@ protected function setUp(): void
);
}

/**
* Helper method to create a random directory and return the path.
* The path will be registered for deletion upon test ending
*
* @param string $prefix
* @return string
*/
protected function getTestDirectory(string $prefix = 'root_'): string
{
$path = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId($prefix);
GeneralUtility::mkdir_deep($path);
$this->testFilesToDelete[] = $path;
return $path;
}

/**
* @param array $methods
*/
Expand All @@ -59,12 +75,11 @@ public function getDefaultConfigurationExecutesDefinedDefaultConfigurationFile()
$this->expectException(\RuntimeException::class);
$this->expectExceptionCode(1310203814);

$defaultConfigurationFile = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('defaultConfiguration');
$defaultConfigurationFile = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('defaultConfiguration');
file_put_contents(
$defaultConfigurationFile,
'<?php throw new \RuntimeException(\'foo\', 1310203814); ?>'
);
$this->testFilesToDelete[] = $defaultConfigurationFile;

$this->subject
->expects(self::once())
Expand All @@ -80,12 +95,11 @@ public function getLocalConfigurationExecutesDefinedConfigurationFile(): void
{
$this->expectException(\RuntimeException::class);

$configurationFile = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('localConfiguration');
$configurationFile = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('localConfiguration');
file_put_contents(
$configurationFile,
'<?php throw new \RuntimeException(\'foo\', 1310203815); ?>'
);
$this->testFilesToDelete[] = $configurationFile;

$this->subject
->expects(self::once())
Expand Down Expand Up @@ -378,29 +392,27 @@ public function canWriteConfigurationReturnsTrueIfDirectoryAndFilesAreWritable()
$subject = $this->getAccessibleMock(ConfigurationManager::class, ['dummy']);

$directory = StringUtility::getUniqueId('test_');
$absoluteDirectory = Environment::getVarPath() . '/tests/' . $directory;
$absoluteDirectory = $this->getTestDirectory() . '/' . $directory;
mkdir($absoluteDirectory);

$file = StringUtility::getUniqueId('test_');
$absoluteFile1 = Environment::getVarPath() . '/tests/' . $file;
$absoluteFile1 = $absoluteDirectory . '/' . $file;
touch($absoluteFile1);
$this->testFilesToDelete[] = $absoluteFile1;
$subject->_set('localConfigurationFile', $absoluteFile1);

clearstatcache();

$result = $subject->canWriteConfiguration();

self::assertTrue($result);
$this->testFilesToDelete[] = $absoluteDirectory;
}

/**
* @test
*/
public function writeLocalConfigurationWritesSortedContentToConfigurationFile(): void
{
$configurationFile = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('localConfiguration');
$configurationFile = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('localConfiguration');
if (!is_file($configurationFile)) {
if (!$fh = fopen($configurationFile, 'wb')) {
self::markTestSkipped('Can not create file ' . $configurationFile . '. Please check your write permissions.');
Expand All @@ -414,7 +426,6 @@ public function writeLocalConfigurationWritesSortedContentToConfigurationFile():
1346364362
);
}
$this->testFilesToDelete[] = $configurationFile;

$this->subject
->method('getLocalConfigurationFileLocation')
Expand Down Expand Up @@ -444,11 +455,10 @@ public function createLocalConfigurationFromFactoryConfigurationThrowsExceptionI

$subject = $this->getAccessibleMock(ConfigurationManager::class, ['getLocalConfigurationFileLocation']);

$file = 'tests/' . StringUtility::getUniqueId('test_');
$absoluteFile = Environment::getVarPath() . '/' . $file;
$file = StringUtility::getUniqueId('test_');
$absoluteFile = $this->getTestDirectory() . '/' . $file;
touch($absoluteFile);
$subject->method('getLocalConfigurationFileLocation')->willReturn($absoluteFile);
$this->testFilesToDelete[] = $absoluteFile;
$subject->_set('localConfigurationFile', $file);

$subject->createLocalConfigurationFromFactoryConfiguration();
Expand All @@ -464,8 +474,8 @@ public function createLocalConfigurationFromFactoryConfigurationWritesContentFro
$subject->_set('localConfigurationFile', $localConfigurationFile);
$subject->method('getLocalConfigurationFileLocation')->willReturn(Environment::getVarPath() . '/' . $localConfigurationFile);

$factoryConfigurationFile = 'tests/' . StringUtility::getUniqueId('test_') . '.php';
$factoryConfigurationAbsoluteFile = Environment::getVarPath() . '/' . $factoryConfigurationFile;
$factoryConfigurationFile = StringUtility::getUniqueId('test_') . '.php';
$factoryConfigurationAbsoluteFile = $this->getTestDirectory() . '/' . $factoryConfigurationFile;
$subject->method('getFactoryConfigurationFileLocation')->willReturn($factoryConfigurationAbsoluteFile);
$uniqueContentString = StringUtility::getUniqueId('string_');
$validFactoryConfigurationFileContent =
Expand All @@ -477,7 +487,6 @@ public function createLocalConfigurationFromFactoryConfigurationWritesContentFro
$factoryConfigurationAbsoluteFile,
$validFactoryConfigurationFileContent
);
$this->testFilesToDelete[] = $factoryConfigurationAbsoluteFile;

$subject->_set('factoryConfigurationFile', $factoryConfigurationFile);

Expand All @@ -494,12 +503,13 @@ public function createLocalConfigurationFromFactoryConfigurationWritesContentFro
public function createLocalConfigurationFromFactoryConfigurationMergesConfigurationWithAdditionalFactoryFile(): void
{
$subject = $this->getAccessibleMock(ConfigurationManager::class, ['writeLocalConfiguration', 'getLocalConfigurationFileLocation', 'getFactoryConfigurationFileLocation', 'getAdditionalFactoryConfigurationFileLocation']);
$localConfigurationFile = '/tests/' . StringUtility::getUniqueId('dummy_');
$testDirectory = $this->getTestDirectory() . '/';
$localConfigurationFile = $testDirectory . StringUtility::getUniqueId('dummy_');
$subject->_set('localConfigurationFile', $localConfigurationFile);
$subject->method('getLocalConfigurationFileLocation')->willReturn(Environment::getVarPath() . '/' . $localConfigurationFile);
$subject->method('getLocalConfigurationFileLocation')->willReturn($localConfigurationFile);

$factoryConfigurationFile = 'tests/' . StringUtility::getUniqueId('test_') . '.php';
$factoryConfigurationAbsoluteFile = Environment::getVarPath() . '/' . $factoryConfigurationFile;
$factoryConfigurationFile = StringUtility::getUniqueId('test_') . '.php';
$factoryConfigurationAbsoluteFile = $testDirectory . $factoryConfigurationFile;
$subject->method('getFactoryConfigurationFileLocation')->willReturn($factoryConfigurationAbsoluteFile);
$validFactoryConfigurationFileContent =
'<?php' . LF .
Expand All @@ -508,11 +518,10 @@ public function createLocalConfigurationFromFactoryConfigurationMergesConfigurat
$factoryConfigurationAbsoluteFile,
$validFactoryConfigurationFileContent
);
$this->testFilesToDelete[] = $factoryConfigurationAbsoluteFile;
$subject->_set('factoryConfigurationFile', $factoryConfigurationFile);

$additionalFactoryConfigurationFile = 'tests/' . StringUtility::getUniqueId('test_') . '.php';
$additionalFactoryConfigurationAbsoluteFile = Environment::getVarPath() . '/' . $additionalFactoryConfigurationFile;
$additionalFactoryConfigurationFile = StringUtility::getUniqueId('test_') . '.php';
$additionalFactoryConfigurationAbsoluteFile = $testDirectory . $additionalFactoryConfigurationFile;
$subject->method('getAdditionalFactoryConfigurationFileLocation')->willReturn($additionalFactoryConfigurationAbsoluteFile);
$uniqueContentString = StringUtility::getUniqueId('string_');
$validAdditionalFactoryConfigurationFileContent =
Expand All @@ -524,7 +533,6 @@ public function createLocalConfigurationFromFactoryConfigurationMergesConfigurat
$additionalFactoryConfigurationAbsoluteFile,
$validAdditionalFactoryConfigurationFileContent
);
$this->testFilesToDelete[] = $additionalFactoryConfigurationAbsoluteFile;
$subject->_set('additionalFactoryConfigurationFile', $additionalFactoryConfigurationFile);

$subject
Expand Down
24 changes: 20 additions & 4 deletions typo3/sysext/core/Tests/Unit/Http/StreamFactoryTest.php
Expand Up @@ -20,6 +20,7 @@
use Psr\Http\Message\StreamFactoryInterface;
use TYPO3\CMS\Core\Core\Environment;
use TYPO3\CMS\Core\Http\StreamFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\StringUtility;
use TYPO3\TestingFramework\Core\Unit\UnitTestCase;

Expand All @@ -28,6 +29,21 @@
*/
class StreamFactoryTest extends UnitTestCase
{
/**
* Helper method to create a random directory and return the path.
* The path will be registered for deletion upon test ending
*
* @param string $prefix
* @return string
*/
protected function getTestDirectory(string $prefix = 'root_'): string
{
$path = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId($prefix);
GeneralUtility::mkdir_deep($path);
$this->testFilesToDelete[] = $path;
return $path;
}

/**
* @test
*/
Expand Down Expand Up @@ -94,7 +110,7 @@ public function createStreamReturnsAppendableStream(): void
*/
public function createStreamFromFile(): void
{
$fileName = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('test_');
$fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
file_put_contents($fileName, 'Foo');

$factory = new StreamFactory();
Expand All @@ -107,7 +123,7 @@ public function createStreamFromFile(): void
*/
public function createStreamFromFileWithMode(): void
{
$fileName = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('test_');
$fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');

$factory = new StreamFactory();
$stream = $factory->createStreamFromFile($fileName, 'w');
Expand All @@ -122,7 +138,7 @@ public function createStreamFromFileWithMode(): void
*/
public function createStreamFromFileWithInvalidMode(): void
{
$fileName = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('test_');
$fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
touch($fileName);

$this->expectException(\InvalidArgumentException::class);
Expand All @@ -148,7 +164,7 @@ public function createStreamFromFileWithMissingFile(): void
*/
public function createStreamFromResource(): void
{
$fileName = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('test_');
$fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
touch($fileName);
file_put_contents($fileName, 'Foo');

Expand Down

0 comments on commit 69bf2c6

Please sign in to comment.