ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
RotatingFileHandlerTest.php
Go to the documentation of this file.
1<?php
2
3/*
4 * This file is part of the Monolog package.
5 *
6 * (c) Jordi Boggiano <j.boggiano@seld.be>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Monolog\Handler;
13
15use PHPUnit_Framework_Error_Deprecated;
16
21{
28 public $lastError;
29
30 public function setUp()
31 {
32 $dir = __DIR__.'/Fixtures';
33 chmod($dir, 0777);
34 if (!is_writable($dir)) {
35 $this->markTestSkipped($dir.' must be writable to test the RotatingFileHandler.');
36 }
37 $this->lastError = null;
38 $self = $this;
39 // workaround with &$self used for PHP 5.3
40 set_error_handler(function($code, $message) use (&$self) {
41 $self->lastError = array(
42 'code' => $code,
43 'message' => $message,
44 );
45 });
46 }
47
48 private function assertErrorWasTriggered($code, $message)
49 {
50 if (empty($this->lastError)) {
51 $this->fail(
52 sprintf(
53 'Failed asserting that error with code `%d` and message `%s` was triggered',
54 $code,
55 $message
56 )
57 );
58 }
59 $this->assertEquals($code, $this->lastError['code'], sprintf('Expected an error with code %d to be triggered, got `%s` instead', $code, $this->lastError['code']));
60 $this->assertEquals($message, $this->lastError['message'], sprintf('Expected an error with message `%d` to be triggered, got `%s` instead', $message, $this->lastError['message']));
61 }
62
64 {
65 touch(__DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400).'.rot');
66
67 $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot');
68 $handler->setFormatter($this->getIdentityFormatter());
69 $handler->handle($this->getRecord());
70
71 $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';
72 $this->assertTrue(file_exists($log));
73 $this->assertEquals('test', file_get_contents($log));
74 }
75
79 public function testRotation($createFile, $dateFormat, $timeCallback)
80 {
81 touch($old1 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-1)).'.rot');
82 touch($old2 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-2)).'.rot');
83 touch($old3 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-3)).'.rot');
84 touch($old4 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-4)).'.rot');
85
86 $log = __DIR__.'/Fixtures/foo-'.date($dateFormat).'.rot';
87
88 if ($createFile) {
89 touch($log);
90 }
91
92 $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);
93 $handler->setFormatter($this->getIdentityFormatter());
94 $handler->setFilenameFormat('{filename}-{date}', $dateFormat);
95 $handler->handle($this->getRecord());
96
97 $handler->close();
98
99 $this->assertTrue(file_exists($log));
100 $this->assertTrue(file_exists($old1));
101 $this->assertEquals($createFile, file_exists($old2));
102 $this->assertEquals($createFile, file_exists($old3));
103 $this->assertEquals($createFile, file_exists($old4));
104 $this->assertEquals('test', file_get_contents($log));
105 }
106
107 public function rotationTests()
108 {
109 $now = time();
110 $dayCallback = function($ago) use ($now) {
111 return $now + 86400 * $ago;
112 };
113 $monthCallback = function($ago) {
114 return gmmktime(0, 0, 0, date('n') + $ago, date('d'), date('Y'));
115 };
116 $yearCallback = function($ago) {
117 return gmmktime(0, 0, 0, date('n'), date('d'), date('Y') + $ago);
118 };
119
120 return array(
121 'Rotation is triggered when the file of the current day is not present'
122 => array(true, RotatingFileHandler::FILE_PER_DAY, $dayCallback),
123 'Rotation is not triggered when the file of the current day is already present'
124 => array(false, RotatingFileHandler::FILE_PER_DAY, $dayCallback),
125
126 'Rotation is triggered when the file of the current month is not present'
127 => array(true, RotatingFileHandler::FILE_PER_MONTH, $monthCallback),
128 'Rotation is not triggered when the file of the current month is already present'
129 => array(false, RotatingFileHandler::FILE_PER_MONTH, $monthCallback),
130
131 'Rotation is triggered when the file of the current year is not present'
132 => array(true, RotatingFileHandler::FILE_PER_YEAR, $yearCallback),
133 'Rotation is not triggered when the file of the current year is already present'
134 => array(false, RotatingFileHandler::FILE_PER_YEAR, $yearCallback),
135 );
136 }
137
141 public function testAllowOnlyFixedDefinedDateFormats($dateFormat, $valid)
142 {
143 $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);
144 $handler->setFilenameFormat('{filename}-{date}', $dateFormat);
145 if (!$valid) {
147 E_USER_DEPRECATED,
148 'Invalid date format - format must be one of RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), '.
149 'RotatingFileHandler::FILE_PER_MONTH ("Y-m") or RotatingFileHandler::FILE_PER_YEAR ("Y"), '.
150 'or you can set one of the date formats using slashes, underscores and/or dots instead of dashes.'
151 );
152 }
153 }
154
155 public function dateFormatProvider()
156 {
157 return array(
161 array('m-d-Y', false),
162 array('Y-m-d-h-i', false)
163 );
164 }
165
169 public function testDisallowFilenameFormatsWithoutDate($filenameFormat, $valid)
170 {
171 $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);
172 $handler->setFilenameFormat($filenameFormat, RotatingFileHandler::FILE_PER_DAY);
173 if (!$valid) {
175 E_USER_DEPRECATED,
176 'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.'
177 );
178 }
179 }
180
181 public function filenameFormatProvider()
182 {
183 return array(
184 array('{filename}', false),
185 array('{filename}-{date}', true),
186 array('{date}', true),
187 array('foobar-{date}', true),
188 array('foo-{date}-bar', true),
189 array('{date}-foobar', true),
190 array('foobar', false),
191 );
192 }
193
194 public function testReuseCurrentFile()
195 {
196 $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';
197 file_put_contents($log, "foo");
198 $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot');
199 $handler->setFormatter($this->getIdentityFormatter());
200 $handler->handle($this->getRecord());
201 $this->assertEquals('footest', file_get_contents($log));
202 }
203
204 public function tearDown()
205 {
206 foreach (glob(__DIR__.'/Fixtures/*.rot') as $file) {
207 unlink($file);
208 }
209 restore_error_handler();
210 }
211}
sprintf('%.4f', $callTime)
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
An exception for terminatinating execution or to throw for unit testing.
@covers Monolog\Handler\RotatingFileHandler
$lastError
This var should be private but then the anonymous function in the setUp method won't be able to set i...
testAllowOnlyFixedDefinedDateFormats($dateFormat, $valid)
@dataProvider dateFormatProvider
testDisallowFilenameFormatsWithoutDate($filenameFormat, $valid)
@dataProvider filenameFormatProvider
testRotation($createFile, $dateFormat, $timeCallback)
@dataProvider rotationTests
Stores logs to files that are rotated every day and a limited number of files are kept.
getRecord($level=Logger::WARNING, $message='test', $context=array())
Definition: TestCase.php:19
$valid
$code
Definition: example_050.php:99
if(!file_exists("$old.txt")) if( $old===$new) if(file_exists("$new.txt")) $file