‪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 Psr\Log\LogLevel;
28 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
29 
30 final class ‪FileWriterTest extends UnitTestCase
31 {
32  protected string ‪$logFileDirectory = 'Log';
33  protected string ‪$logFileName = 'test.log';
34  protected string ‪$testRoot;
35 
36  protected function ‪setUp(): void
37  {
38  parent::setUp();
39  $this->testRoot = ‪Environment::getVarPath() . '/tests/';
40  ‪GeneralUtility::mkdir_deep($this->testRoot);
41  $this->testFilesToDelete[] = ‪$this->testRoot;
42  }
43 
44  protected function ‪createLogger(string $name = ''): ‪Logger
45  {
46  if (empty($name)) {
47  $name = ‪StringUtility::getUniqueId('test.core.log.');
48  }
49  GeneralUtility::makeInstance(LogManager::class)->registerLogger($name);
50  return GeneralUtility::makeInstance(LogManager::class)->getLogger($name);
51  }
52 
53  protected function ‪createWriter(string $prependName = ''): ‪FileWriter
54  {
55  ‪$logFileName = $this->‪getDefaultFileName($prependName);
56  if (file_exists(‪$logFileName)) {
57  unlink(‪$logFileName);
58  }
59  return GeneralUtility::makeInstance(FileWriter::class, [
60  'logFile' => ‪$logFileName,
61  ]);
62  }
63 
67  protected function ‪getDefaultFileName(string $prependName = ''): string
68  {
69  return $this->testRoot . $this->logFileDirectory . '/' . $prependName . ‪$this->logFileName;
70  }
71 
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 
85  public function ‪setLogFileAcceptsAbsolutePath(): void
86  {
87  $writer = GeneralUtility::makeInstance(FileWriter::class);
88  $tempFile = rtrim(sys_get_temp_dir(), '/\\') . '/typo3.log';
89  $writer->setLogFile($tempFile);
90  self::assertEquals($tempFile, $writer->getLogFile());
91  }
92 
96  public function ‪createsLogFileDirectory(): void
97  {
98  $this->‪createWriter();
99  self::assertDirectoryExists($this->testRoot . $this->logFileDirectory);
100  }
101 
105  public function ‪createsLogFile(): void
106  {
107  $this->‪createWriter();
108  self::assertFileExists($this->‪getDefaultFileName());
109  }
110 
111  public static function ‪logsToFileDataProvider(): array
112  {
113  $simpleRecord = GeneralUtility::makeInstance(LogRecord::class, ‪StringUtility::getUniqueId('test.core.log.fileWriter.simpleRecord.'), LogLevel::INFO, 'test record');
114  $recordWithData = GeneralUtility::makeInstance(LogRecord::class, ‪StringUtility::getUniqueId('test.core.log.fileWriter.recordWithData.'), LogLevel::ALERT, 'test record with data', ['foo' => ['bar' => 'baz']]);
115  return [
116  'simple record' => [$simpleRecord, trim((string)$simpleRecord)],
117  'record with data' => [$recordWithData, trim((string)$recordWithData)],
118  ];
119  }
120 
125  public function ‪logsToFile(‪LogRecord ‪$record, string $expectedResult): void
126  {
127  $this->‪createWriter()->writeLog($record);
128  $logFileContents = trim(file_get_contents($this->‪getDefaultFileName()));
129  self::assertEquals($expectedResult, $logFileContents);
130  }
131 
136  public function ‪differentWritersLogToDifferentFiles(‪LogRecord ‪$record, string $expectedResult): void
137  {
138  $firstWriter = $this->‪createWriter();
139  $secondWriter = $this->‪createWriter('second-');
140 
141  $firstWriter->writeLog(‪$record);
142  $secondWriter->writeLog(‪$record);
143 
144  $firstLogFileContents = trim(file_get_contents($this->‪getDefaultFileName()));
145  $secondLogFileContents = trim(file_get_contents($this->‪getDefaultFileName('second-')));
146 
147  self::assertEquals($expectedResult, $firstLogFileContents);
148  self::assertEquals($expectedResult, $secondLogFileContents);
149  }
150 
154  public function ‪logsToFileWithUnescapedCharacters(): void
155  {
156  $recordWithData = GeneralUtility::makeInstance(
157  LogRecord::class,
158  ‪StringUtility::getUniqueId('test.core.log.fileWriter.recordWithData.'),
159  LogLevel::INFO,
160  'test record with unicode and slash in data to encode',
161  ['foo' => ['bar' => 'I paid 0.00€ for open source projects/code']]
162  );
163 
164  $expectedResult = '{"foo":{"bar":"I paid 0.00€ for open source projects/code"}}';
165 
166  $this->‪createWriter('encoded-data')->writeLog($recordWithData);
167  $logFileContents = trim(file_get_contents($this->‪getDefaultFileName('encoded-data')));
168  self::assertStringContainsString($expectedResult, $logFileContents);
169  }
170 
175  {
176  $firstWriter = $this->getMockBuilder(FileWriter::class)
177  ->addMethods(['dummy'])
178  ->getMock();
179  $secondWriter = $this->getMockBuilder(FileWriter::class)
180  ->onlyMethods(['createLogFile'])
181  ->getMock();
182 
183  $secondWriter->expects(self::never())->method('createLogFile');
184 
185  $logFilePrefix = ‪StringUtility::getUniqueId('unique');
186  $firstWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
187  $secondWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
188  }
189 
194  {
195  $firstWriter = $this->getMockBuilder(FileWriter::class)
196  ->onlyMethods(['closeLogFile'])
197  ->getMock();
198  $secondWriter = $this->getMockBuilder(FileWriter::class)
199  ->onlyMethods(['closeLogFile'])
200  ->getMock();
201 
202  $firstWriter->expects(self::never())->method('closeLogFile');
203  $secondWriter->expects(self::once())->method('closeLogFile');
204 
205  $logFilePrefix = ‪StringUtility::getUniqueId('unique');
206  $firstWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
207  $secondWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
208  $firstWriter->__destruct();
209  $secondWriter->__destruct();
210  }
211 }
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\logsToFileWithUnescapedCharacters
‪logsToFileWithUnescapedCharacters()
Definition: FileWriterTest.php:154
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createsLogFileDirectory
‪createsLogFileDirectory()
Definition: FileWriterTest.php:96
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\$testRoot
‪string $testRoot
Definition: FileWriterTest.php:34
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\logsToFile
‪logsToFile(LogRecord $record, string $expectedResult)
Definition: FileWriterTest.php:125
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createLogger
‪createLogger(string $name='')
Definition: FileWriterTest.php:44
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\getDefaultFileName
‪non empty string getDefaultFileName(string $prependName='')
Definition: FileWriterTest.php:67
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createsLogFile
‪createsLogFile()
Definition: FileWriterTest.php:105
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\fileHandleIsNotClosedIfSecondFileWriterIsStillUsingSameFile
‪fileHandleIsNotClosedIfSecondFileWriterIsStillUsingSameFile()
Definition: FileWriterTest.php:193
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\setLogFileAcceptsAbsolutePath
‪setLogFileAcceptsAbsolutePath()
Definition: FileWriterTest.php:85
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\logsToFileDataProvider
‪static logsToFileDataProvider()
Definition: FileWriterTest.php:111
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest
Definition: FileWriterTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\$logFileDirectory
‪string $logFileDirectory
Definition: FileWriterTest.php:32
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep($directory)
Definition: GeneralUtility.php:1638
‪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:28
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\setUp
‪setUp()
Definition: FileWriterTest.php:36
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createWriter
‪createWriter(string $prependName='')
Definition: FileWriterTest.php:53
‪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:33
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\aSecondLogWriterToTheSameFileDoesNotOpenTheFileTwice
‪aSecondLogWriterToTheSameFileDoesNotOpenTheFileTwice()
Definition: FileWriterTest.php:174
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪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:136