‪TYPO3CMS  ‪main
FileWriterTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
22 use Psr\Log\LogLevel;
30 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
31 
32 final class ‪FileWriterTest extends UnitTestCase
33 {
34  protected string ‪$logFileDirectory = 'Log';
35  protected string ‪$logFileName = 'test.log';
36  protected string ‪$testRoot;
37 
38  protected function ‪setUp(): void
39  {
40  parent::setUp();
41  $this->testRoot = ‪Environment::getVarPath() . '/tests/';
42  ‪GeneralUtility::mkdir_deep($this->testRoot);
43  $this->testFilesToDelete[] = ‪$this->testRoot;
44  }
45 
46  protected function ‪createLogger(string $name = ''): ‪Logger
47  {
48  if (empty($name)) {
49  $name = ‪StringUtility::getUniqueId('test.core.log.');
50  }
51  GeneralUtility::makeInstance(LogManager::class)->registerLogger($name);
52  return GeneralUtility::makeInstance(LogManager::class)->getLogger($name);
53  }
54 
55  protected function ‪createWriter(string $prependName = ''): ‪FileWriter
56  {
57  ‪$logFileName = $this->‪getDefaultFileName($prependName);
58  if (file_exists(‪$logFileName)) {
59  unlink(‪$logFileName);
60  }
61  return GeneralUtility::makeInstance(FileWriter::class, [
62  'logFile' => ‪$logFileName,
63  ]);
64  }
65 
69  protected function ‪getDefaultFileName(string $prependName = ''): string
70  {
71  return $this->testRoot . $this->logFileDirectory . '/' . $prependName . ‪$this->logFileName;
72  }
73 
74  #[Test]
75  public function ‪setLogFileSetsLogFile(): void
76  {
77  $writer = GeneralUtility::makeInstance(FileWriter::class);
78  $writer->setLogFile($this->‪getDefaultFileName());
79  self::assertEquals($this->‪getDefaultFileName(), $writer->getLogFile());
80  }
81 
82  #[Test]
83  public function ‪setLogFileAcceptsAbsolutePath(): void
84  {
85  $writer = GeneralUtility::makeInstance(FileWriter::class);
86  $tempFile = rtrim(sys_get_temp_dir(), '/\\') . '/typo3.log';
87  $writer->setLogFile($tempFile);
88  self::assertEquals($tempFile, $writer->getLogFile());
89  }
90 
91  #[Test]
92  public function ‪createsLogFileDirectory(): void
93  {
94  $this->‪createWriter();
95  self::assertDirectoryExists($this->testRoot . $this->logFileDirectory);
96  }
97 
98  #[Test]
99  public function ‪createsLogFile(): void
100  {
101  $this->‪createWriter();
102  self::assertFileExists($this->‪getDefaultFileName());
103  }
104 
105  public static function ‪logsToFileDataProvider(): array
106  {
107  $simpleRecord = GeneralUtility::makeInstance(LogRecord::class, ‪StringUtility::getUniqueId('test.core.log.fileWriter.simpleRecord.'), LogLevel::INFO, 'test record');
108  $recordWithData = GeneralUtility::makeInstance(LogRecord::class, ‪StringUtility::getUniqueId('test.core.log.fileWriter.recordWithData.'), LogLevel::ALERT, 'test record with data', ['foo' => ['bar' => 'baz']]);
109  return [
110  'simple record' => [$simpleRecord, trim((string)$simpleRecord)],
111  'record with data' => [$recordWithData, trim((string)$recordWithData)],
112  ];
113  }
114 
115  #[DataProvider('logsToFileDataProvider')]
116  #[Test]
117  public function ‪logsToFile(‪LogRecord ‪$record, string $expectedResult): void
118  {
119  $this->‪createWriter()->writeLog($record);
120  $logFileContents = trim(file_get_contents($this->‪getDefaultFileName()));
121  self::assertEquals($expectedResult, $logFileContents);
122  }
123 
124  #[DataProvider('logsToFileDataProvider')]
125  #[Test]
126  public function ‪differentWritersLogToDifferentFiles(‪LogRecord ‪$record, string $expectedResult): void
127  {
128  $firstWriter = $this->‪createWriter();
129  $secondWriter = $this->‪createWriter('second-');
130 
131  $firstWriter->writeLog(‪$record);
132  $secondWriter->writeLog(‪$record);
133 
134  $firstLogFileContents = trim(file_get_contents($this->‪getDefaultFileName()));
135  $secondLogFileContents = trim(file_get_contents($this->‪getDefaultFileName('second-')));
136 
137  self::assertEquals($expectedResult, $firstLogFileContents);
138  self::assertEquals($expectedResult, $secondLogFileContents);
139  }
140 
141  #[Test]
142  public function ‪logsToFileWithUnescapedCharacters(): void
143  {
144  $recordWithData = GeneralUtility::makeInstance(
145  LogRecord::class,
146  ‪StringUtility::getUniqueId('test.core.log.fileWriter.recordWithData.'),
147  LogLevel::INFO,
148  'test record with unicode and slash in data to encode',
149  ['foo' => ['bar' => 'I paid 0.00€ for open source projects/code']]
150  );
151 
152  $expectedResult = '{"foo":{"bar":"I paid 0.00€ for open source projects/code"}}';
153 
154  $this->‪createWriter('encoded-data')->writeLog($recordWithData);
155  $logFileContents = trim(file_get_contents($this->‪getDefaultFileName('encoded-data')));
156  self::assertStringContainsString($expectedResult, $logFileContents);
157  }
158 
159  #[Test]
161  {
162  $firstWriter = $this->getMockBuilder(FileWriter::class)
163  ->onlyMethods([])
164  ->getMock();
165  $secondWriter = $this->getMockBuilder(FileWriter::class)
166  ->onlyMethods(['createLogFile'])
167  ->getMock();
168 
169  $secondWriter->expects(self::never())->method('createLogFile');
170 
171  $logFilePrefix = ‪StringUtility::getUniqueId('unique');
172  $firstWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
173  $secondWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
174  }
175 
176  #[Test]
178  {
179  $firstWriter = $this->getMockBuilder(FileWriter::class)
180  ->onlyMethods(['closeLogFile'])
181  ->getMock();
182  $secondWriter = $this->getMockBuilder(FileWriter::class)
183  ->onlyMethods(['closeLogFile'])
184  ->getMock();
185 
186  $firstWriter->expects(self::never())->method('closeLogFile');
187  $secondWriter->expects(self::once())->method('closeLogFile');
188 
189  $logFilePrefix = ‪StringUtility::getUniqueId('unique');
190  $firstWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
191  $secondWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
192  $firstWriter->__destruct();
193  $secondWriter->__destruct();
194  }
195 }
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\logsToFileWithUnescapedCharacters
‪logsToFileWithUnescapedCharacters()
Definition: FileWriterTest.php:142
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createsLogFileDirectory
‪createsLogFileDirectory()
Definition: FileWriterTest.php:92
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\$testRoot
‪string $testRoot
Definition: FileWriterTest.php:36
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\logsToFile
‪logsToFile(LogRecord $record, string $expectedResult)
Definition: FileWriterTest.php:117
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createLogger
‪createLogger(string $name='')
Definition: FileWriterTest.php:46
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\getDefaultFileName
‪non empty string getDefaultFileName(string $prependName='')
Definition: FileWriterTest.php:69
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createsLogFile
‪createsLogFile()
Definition: FileWriterTest.php:99
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\fileHandleIsNotClosedIfSecondFileWriterIsStillUsingSameFile
‪fileHandleIsNotClosedIfSecondFileWriterIsStillUsingSameFile()
Definition: FileWriterTest.php:177
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\setLogFileAcceptsAbsolutePath
‪setLogFileAcceptsAbsolutePath()
Definition: FileWriterTest.php:83
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\logsToFileDataProvider
‪static logsToFileDataProvider()
Definition: FileWriterTest.php:105
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest
Definition: FileWriterTest.php:33
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\$logFileDirectory
‪string $logFileDirectory
Definition: FileWriterTest.php:34
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep(string $directory)
Definition: GeneralUtility.php:1654
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Core\Log\LogRecord
Definition: LogRecord.php:24
‪TYPO3\CMS\Webhooks\Message\$record
‪identifier readonly int readonly array $record
Definition: PageModificationMessage.php:36
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\setLogFileSetsLogFile
‪setLogFileSetsLogFile()
Definition: FileWriterTest.php:75
‪TYPO3\CMS\Core\Log\Writer\FileWriter
Definition: FileWriter.php:29
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\setUp
‪setUp()
Definition: FileWriterTest.php:38
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createWriter
‪createWriter(string $prependName='')
Definition: FileWriterTest.php:55
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer
Definition: AbstractWriterTest.php:18
‪TYPO3\CMS\Core\Log\LogManager
Definition: LogManager.php:33
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Log\Logger
Definition: Logger.php:28
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\$logFileName
‪string $logFileName
Definition: FileWriterTest.php:35
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\aSecondLogWriterToTheSameFileDoesNotOpenTheFileTwice
‪aSecondLogWriterToTheSameFileDoesNotOpenTheFileTwice()
Definition: FileWriterTest.php:160
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\differentWritersLogToDifferentFiles
‪differentWritersLogToDifferentFiles(LogRecord $record, string $expectedResult)
Definition: FileWriterTest.php:126