‪TYPO3CMS  11.5
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 org\bovigo\vfs\vfsStream;
21 use org\bovigo\vfs\vfsStreamWrapper;
29 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
30 
34 class ‪FileWriterTest extends UnitTestCase
35 {
36  protected string ‪$logFileDirectory = 'Log';
37  protected string ‪$logFileName = 'test.log';
38 
39  protected function ‪setUpVfsStream(): void
40  {
41  vfsStream::setup('LogRoot');
42  }
43 
51  protected function ‪createLogger(string $name = ''): ‪Logger
52  {
53  if (empty($name)) {
54  $name = ‪StringUtility::getUniqueId('test.core.log.');
55  }
56  GeneralUtility::makeInstance(LogManager::class)->registerLogger($name);
57  $logger = GeneralUtility::makeInstance(LogManager::class)->getLogger($name);
58  return $logger;
59  }
60 
67  protected function ‪createWriter(string $prependName = ''): ‪FileWriter
68  {
69  $writer = GeneralUtility::makeInstance(FileWriter::class, [
70  'logFile' => $this->‪getDefaultFileName($prependName),
71  ]);
72  return $writer;
73  }
74 
75  protected function ‪getDefaultFileName($prependName = ''): string
76  {
77  return 'vfs://LogRoot/' . $this->logFileDirectory . '/' . $prependName . ‪$this->logFileName;
78  }
79 
83  public function ‪setLogFileSetsLogFile(): void
84  {
85  $this->‪setUpVfsStream();
86  vfsStream::newFile($this->logFileName)->at(vfsStreamWrapper::getRoot());
87  $writer = GeneralUtility::makeInstance(FileWriter::class);
88  $writer->setLogFile($this->‪getDefaultFileName());
89  self::assertEquals($this->‪getDefaultFileName(), $writer->getLogFile());
90  }
91 
95  public function ‪setLogFileAcceptsAbsolutePath(): void
96  {
97  $writer = GeneralUtility::makeInstance(FileWriter::class);
98  $tempFile = rtrim(sys_get_temp_dir(), '/\\') . '/typo3.log';
99  $writer->setLogFile($tempFile);
100  self::assertEquals($tempFile, $writer->getLogFile());
101  }
102 
106  public function ‪createsLogFileDirectory(): void
107  {
108  $this->‪setUpVfsStream();
109  $this->‪createWriter();
110  self::assertTrue(vfsStreamWrapper::getRoot()->hasChild($this->logFileDirectory));
111  }
112 
116  public function ‪createsLogFile(): void
117  {
118  $this->‪setUpVfsStream();
119  $this->‪createWriter();
120  self::assertTrue(vfsStreamWrapper::getRoot()->getChild($this->logFileDirectory)->hasChild($this->logFileName));
121  }
122 
126  public function ‪logsToFileDataProvider(): array
127  {
128  $simpleRecord = GeneralUtility::makeInstance(LogRecord::class, ‪StringUtility::getUniqueId('test.core.log.fileWriter.simpleRecord.'), LogLevel::INFO, 'test record');
129  $recordWithData = GeneralUtility::makeInstance(LogRecord::class, ‪StringUtility::getUniqueId('test.core.log.fileWriter.recordWithData.'), LogLevel::ALERT, 'test record with data', ['foo' => ['bar' => 'baz']]);
130  return [
131  'simple record' => [$simpleRecord, trim((string)$simpleRecord)],
132  'record with data' => [$recordWithData, trim((string)$recordWithData)],
133  ];
134  }
135 
142  public function ‪logsToFile(‪LogRecord $record, string $expectedResult): void
143  {
144  $this->‪setUpVfsStream();
145  $this->‪createWriter()->‪writeLog($record);
146  $logFileContents = trim(file_get_contents($this->‪getDefaultFileName()));
147  self::assertEquals($expectedResult, $logFileContents);
148  }
149 
153  public function ‪logsToFileWithUnescapedCharacters(): void
154  {
155  $this->‪setUpVfsStream();
156 
157  $recordWithData = GeneralUtility::makeInstance(
158  LogRecord::class,
159  ‪StringUtility::getUniqueId('test.core.log.fileWriter.recordWithData.'),
160  LogLevel::INFO,
161  'test record with unicode and slash in data to encode',
162  ['foo' => ['bar' => 'I paid 0.00€ for open source projects/code']]
163  );
164 
165  $expectedResult = '{"foo":{"bar":"I paid 0.00€ for open source projects/code"}}';
166 
167  $this->‪createWriter('encoded-data')->‪writeLog($recordWithData);
168  $logFileContents = trim(file_get_contents($this->‪getDefaultFileName('encoded-data')));
169  self::assertStringContainsString($expectedResult, $logFileContents);
170  }
171 
178  public function ‪differentWritersLogToDifferentFiles(‪LogRecord $record, string $expectedResult): void
179  {
180  $this->‪setUpVfsStream();
181  $firstWriter = $this->‪createWriter();
182  $secondWriter = $this->‪createWriter('second-');
183 
184  $firstWriter->writeLog($record);
185  $secondWriter->writeLog($record);
186 
187  $firstLogFileContents = trim(file_get_contents($this->‪getDefaultFileName()));
188  $secondLogFileContents = trim(file_get_contents($this->‪getDefaultFileName('second-')));
189 
190  self::assertEquals($expectedResult, $firstLogFileContents);
191  self::assertEquals($expectedResult, $secondLogFileContents);
192  }
193 
198  {
199  $this->‪setUpVfsStream();
200 
201  $firstWriter = $this->getMockBuilder(FileWriter::class)
202  ->addMethods(['dummy'])
203  ->getMock();
204  $secondWriter = $this->getMockBuilder(FileWriter::class)
205  ->onlyMethods(['createLogFile'])
206  ->getMock();
207 
208  $secondWriter->expects(self::never())->method('createLogFile');
209 
210  $logFilePrefix = ‪StringUtility::getUniqueId('unique');
211  $firstWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
212  $secondWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
213  }
214 
219  {
220  $this->‪setUpVfsStream();
221 
222  $firstWriter = $this->getMockBuilder(FileWriter::class)
223  ->onlyMethods(['closeLogFile'])
224  ->getMock();
225  $secondWriter = $this->getMockBuilder(FileWriter::class)
226  ->onlyMethods(['closeLogFile'])
227  ->getMock();
228 
229  $firstWriter->expects(self::never())->method('closeLogFile');
230  $secondWriter->expects(self::once())->method('closeLogFile');
231 
232  $logFilePrefix = ‪StringUtility::getUniqueId('unique');
233  $firstWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
234  $secondWriter->setLogFile($this->‪getDefaultFileName($logFilePrefix));
235  $firstWriter->__destruct();
236  $secondWriter->__destruct();
237  }
238 }
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\logsToFileWithUnescapedCharacters
‪logsToFileWithUnescapedCharacters()
Definition: FileWriterTest.php:153
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createsLogFileDirectory
‪createsLogFileDirectory()
Definition: FileWriterTest.php:106
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\logsToFile
‪logsToFile(LogRecord $record, string $expectedResult)
Definition: FileWriterTest.php:142
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createsLogFile
‪createsLogFile()
Definition: FileWriterTest.php:116
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\fileHandleIsNotClosedIfSecondFileWriterIsStillUsingSameFile
‪fileHandleIsNotClosedIfSecondFileWriterIsStillUsingSameFile()
Definition: FileWriterTest.php:218
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\setLogFileAcceptsAbsolutePath
‪setLogFileAcceptsAbsolutePath()
Definition: FileWriterTest.php:95
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest
Definition: FileWriterTest.php:35
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createLogger
‪Logger createLogger(string $name='')
Definition: FileWriterTest.php:51
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\$logFileDirectory
‪string $logFileDirectory
Definition: FileWriterTest.php:36
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\createWriter
‪FileWriter createWriter(string $prependName='')
Definition: FileWriterTest.php:67
‪TYPO3\CMS\Core\Log\LogRecord
Definition: LogRecord.php:22
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\setLogFileSetsLogFile
‪setLogFileSetsLogFile()
Definition: FileWriterTest.php:83
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\setUpVfsStream
‪setUpVfsStream()
Definition: FileWriterTest.php:39
‪TYPO3\CMS\Core\Log\Writer\FileWriter
Definition: FileWriter.php:28
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer
Definition: AbstractWriterTest.php:18
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static string getUniqueId($prefix='')
Definition: StringUtility.php:128
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\logsToFileDataProvider
‪array logsToFileDataProvider()
Definition: FileWriterTest.php:126
‪TYPO3\CMS\Core\Log\LogManager
Definition: LogManager.php:33
‪TYPO3\CMS\Core\Log\Logger
Definition: Logger.php:27
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\$logFileName
‪string $logFileName
Definition: FileWriterTest.php:37
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\aSecondLogWriterToTheSameFileDoesNotOpenTheFileTwice
‪aSecondLogWriterToTheSameFileDoesNotOpenTheFileTwice()
Definition: FileWriterTest.php:197
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\getDefaultFileName
‪getDefaultFileName($prependName='')
Definition: FileWriterTest.php:75
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:22
‪TYPO3\CMS\Core\Log\LogLevel
Definition: LogLevel.php:24
‪TYPO3\CMS\Core\Tests\Unit\Log\Writer\FileWriterTest\differentWritersLogToDifferentFiles
‪differentWritersLogToDifferentFiles(LogRecord $record, string $expectedResult)
Definition: FileWriterTest.php:178
‪TYPO3\CMS\Core\Log\Writer\FileWriter\writeLog
‪WriterInterface writeLog(LogRecord $record)
Definition: FileWriter.php:139