PluginProbe
WP Discourse / trunk
WP Discourse vtrunk
2.6.4 2.6.3 1.2.1 1.2.2 1.2.5 1.2.6 1.2.7 1.2.8 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.85 1.4.0 1.4.15 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 All 150 releases
wp-discourse / tests / phpunit / test-file-handler.php

test-file-handler.php in WP Discourse trunk, at tests/phpunit/test-file-handler.php

214 lines 6.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class FileHandlerTest
4 *
5 * @package WPDiscourse
6 */
7
8 namespace WPDiscourse\Test;
9
10 use WPDiscourse\Logs\Logger;
11 use WPDiscourse\Logs\FileManager;
12 use WPDiscourse\Logs\FileHandler;
13 use WPDiscourse\Logs\LineFormatter;
14 use WPDiscourse\Test\UnitTest;
15
16 /**
17 * FileHandler test case.
18 */
19 class FileHandlerTest extends UnitTest {
20 /**
21 * It creates an instance of FileHandler
22 */
23 public function test_construct() {
24 $file_handler = new FileHandler( new FileManager() );
25 $this->assertInstanceOf( FileHandler::class, $file_handler );
26 }
27
28 /**
29 * It is enabled if the File Manager is ready
30 */
31 public function test_enabled() {
32 $file_handler = new FileHandler( new FileManager() );
33 $this->assertTrue( $file_handler->enabled() );
34 }
35
36 /**
37 * It is not enabled if the File Manager is not ready
38 */
39 public function test_not_enabled() {
40 $file_manager_double = \Mockery::mock( FileManager::class )->makePartial();
41 $file_manager_double->shouldReceive( 'ready' )->andReturn( false );
42 $file_handler = new FileHandler( $file_manager_double );
43 $this->assertFalse( $file_handler->enabled() );
44 }
45
46 /**
47 * It creates log files to write logs to
48 */
49 public function test_log_file_create() {
50 $file_handler = new FileHandler( new FileManager() );
51 $logger = Logger::create( 'test', self::$plugin_options, $file_handler );
52 $logger->info( 'New Log' );
53
54 $manager = new FileManager();
55 $log_files = glob( $manager->logs_dir . '/*.log' );
56 $this->assertCount( 1, $log_files );
57
58 $log_file = $log_files[0];
59 $this->assertFileExists( $log_file );
60 }
61
62 /**
63 * It writes logs to a file it has created
64 */
65 public function test_log_file_write() {
66 $file_handler = new FileHandler( new FileManager() );
67 $logger = Logger::create( 'test', self::$plugin_options, $file_handler );
68 $logger->info( 'New Log' );
69
70 $manager = new FileManager();
71 $log_files = glob( $manager->logs_dir . '/*.log' );
72 $this->assertCount( 1, $log_files );
73
74 $log_file = $log_files[0];
75 $last_entry = shell_exec( "tail -n 1 $log_file" );
76 $this->assertMatchesRegularExpression( '/New Log/', $last_entry );
77 }
78
79 /**
80 * It writes multiple logs to the same file
81 */
82 public function test_log_file_multiple() {
83 $file_manager = new FileManager();
84 $file_handler = new FileHandler( $file_manager );
85
86 $logger = Logger::create( 'test', self::$plugin_options, $file_handler );
87 for ( $i = 1; $i <= 10; $i++ ) {
88 $logger->warning( "Multi Log $i" );
89 }
90
91 $log_files = glob( $file_manager->logs_dir . '/*.log' );
92 $this->assertCount( 1, $log_files );
93
94 $matching_line_count = 0;
95 $handle = fopen( $log_files[0], 'r' );
96 while ( ! feof( $handle ) ) {
97 $line = fgets( $handle );
98
99 if ( strpos( $line, 'Multi Log' ) !== false ) {
100 ++$matching_line_count;
101 }
102 }
103 fclose( $handle );
104
105 $this->assertEquals( 10, $matching_line_count );
106 }
107
108 /**
109 * It rotates log files every day.
110 */
111 public function test_log_file_date_rotation() {
112 $file_manager = new FileManager();
113 $file_handler = new FileHandler( $file_manager );
114
115 $logger = Logger::create( 'test', self::$plugin_options, $file_handler );
116 $logger->warning( "Today's Log" );
117
118 $todays_datetime = new \DateTimeImmutable( 'now' );
119 $tomorrows_datetime = new \DateTimeImmutable( 'tomorrow' );
120
121 // Make file handler think it's tomorrow.
122 $tomorrows_file_handler = new FileHandler( $file_manager, null, null, $tomorrows_datetime );
123
124 // Make logger think it's tomorrow.
125 $tomorrows_logger = Logger::create( 'test', self::$plugin_options, $tomorrows_file_handler );
126 $tomorrows_logger->pushProcessor(
127 function ( $record ) use ( $tomorrows_datetime ) {
128 $record['datetime'] = $tomorrows_datetime;
129 return $record;
130 }
131 );
132
133 $tomorrows_logger->warning( "Tomorrow's Log" );
134
135 $tomorrows_date = $tomorrows_datetime->format( FileHandler::DATE_FORMAT );
136 $todays_date = $todays_datetime->format( FileHandler::DATE_FORMAT );
137
138 $files = $file_handler->list_files();
139 $this->assertMatchesRegularExpression( '/' . $tomorrows_date . '/', $files[0] );
140 $this->assertMatchesRegularExpression( '/' . $todays_date . '/', $files[1] );
141 }
142
143 /**
144 * It rotates logs when size limit is reached.
145 */
146 public function test_log_file_size_limit_rotation() {
147 $file_manager = new FileManager();
148 $file_handler = new FileHandler( $file_manager );
149
150 $logger = Logger::create( 'high-volume', self::$plugin_options, $file_handler );
151 $logger->warning( 'High volume log' );
152
153 // It's inefficient to create a large file via individual logs, so we're
154 // stuffing the log file with filler data so it's almost up to the limit
155 // then taking it over the limit with normal logs.
156
157 $handle = fopen( $file_handler->getUrl(), 'wb' );
158 $limit = $file_handler->get_file_size_limit();
159
160 while ( fstat( $handle )['size'] < ( $limit - ( 1024 * 30 * 1 ) ) ) {
161 fwrite( $handle, str_repeat( "filler line taking up 30 bts\n", 1024 ) );
162 }
163
164 for ( $i = 1; $i <= 300; $i++ ) {
165 $logger->warning( 'High volume log' );
166 }
167
168 $this->assertLessThanOrEqual( $limit, fstat( $handle )['size'] );
169 $this->assertCount( 2, $file_handler->list_files() );
170 }
171
172 /**
173 * It increments file numbers on each rotation.
174 */
175 public function test_log_file_number() {
176 $file_manager = new FileManager();
177
178 // Size limit to restrict each file to a single line.
179 $low_limit_file_handler = new FileHandler( $file_manager, 200 );
180
181 $logger = Logger::create( 'one-log-per-file', self::$plugin_options, $low_limit_file_handler );
182
183 for ( $i = 1; $i <= 7; $i++ ) {
184 $logger->warning( 'A line long enough to take it over 100 bytes with log metadata' );
185 }
186
187 $this->assertCount( 7, $low_limit_file_handler->list_files() );
188 $this->assertEquals( 7, $low_limit_file_handler->current_file_number() );
189 }
190
191 /**
192 * It respects the max_files limit.
193 */
194 public function test_log_max_files() {
195 $file_manager = new FileManager();
196
197 // Size limit to restrict each file to a single line.
198 $handler = new FileHandler( $file_manager, 200 );
199 $logger = Logger::create( 'one-log-per-file', self::$plugin_options, $handler );
200
201 for ( $i = 1; $i <= 15; $i++ ) {
202 $logger->warning( 'A line long enough to take it over 100 bytes with log metadata' );
203 }
204
205 $files = $handler->list_files();
206
207 $this->assertCount( 10, $files );
208
209 // Ensure the right files have been removed.
210 $this->assertEquals( 15, $handler->get_number_from_url( $files[0] ) );
211 $this->assertEquals( 6, $handler->get_number_from_url( end( $files ) ) );
212 }
213 }
214