* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * For full copyright and license information, please see the LICENSE.txt * Redistributions of files must retain the above copyright notice * * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests * @package Cake.Test.Case.Log.Engine * @since CakePHP(tm) v 1.3 * @license https://opensource.org/licenses/mit-license.php MIT License */ App::uses('FileLog', 'Log/Engine'); /** * CakeLogTest class * * @package Cake.Test.Case.Log.Engine */ class FileLogTest extends CakeTestCase { /** * testLogFileWriting method * * @return void */ public function testLogFileWriting() { $this->_deleteLogs(LOGS); $log = new FileLog(); $log->write('warning', 'Test warning'); $this->assertTrue(file_exists(LOGS . 'error.log')); $result = file_get_contents(LOGS . 'error.log'); $this->assertMatchesRegularExpression('/^2[0-9]{3}-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+ Warning: Test warning/', $result); $log->write('debug', 'Test warning'); $this->assertTrue(file_exists(LOGS . 'debug.log')); $result = file_get_contents(LOGS . 'debug.log'); $this->assertMatchesRegularExpression('/^2[0-9]{3}-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+ Debug: Test warning/', $result); $log->write('random', 'Test warning'); $this->assertTrue(file_exists(LOGS . 'random.log')); $result = file_get_contents(LOGS . 'random.log'); $this->assertMatchesRegularExpression('/^2[0-9]{3}-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+ Random: Test warning/', $result); } /** * test using the path setting to write logs in other places. * * @return void */ public function testPathSetting() { $path = TMP . 'tests' . DS; $this->_deleteLogs($path); $log = new FileLog(compact('path')); $log->write('warning', 'Test warning'); $this->assertTrue(file_exists($path . 'error.log')); } /** * test log rotation * * @return void */ public function testRotation() { $path = TMP . 'tests' . DS; $this->_deleteLogs($path); file_put_contents($path . 'error.log', "this text is under 35 bytes\n"); $log = new FileLog(array( 'path' => $path, 'size' => 35, 'rotate' => 2 )); $log->write('warning', 'Test warning one'); $this->assertTrue(file_exists($path . 'error.log')); $result = file_get_contents($path . 'error.log'); $this->assertMatchesRegularExpression('/Warning: Test warning one/', $result); $this->assertEquals(0, count(glob($path . 'error.log.*'))); clearstatcache(); $log->write('warning', 'Test warning second'); $files = glob($path . 'error.log.*'); $this->assertEquals(1, count($files)); $result = file_get_contents($files[0]); $this->assertMatchesRegularExpression('/this text is under 35 bytes/', $result); $this->assertMatchesRegularExpression('/Warning: Test warning one/', $result); sleep(1); clearstatcache(); $log->write('warning', 'Test warning third'); $result = file_get_contents($path . 'error.log'); $this->assertMatchesRegularExpression('/Warning: Test warning third/', $result); $files = glob($path . 'error.log.*'); $this->assertEquals(2, count($files)); $result = file_get_contents($files[0]); $this->assertMatchesRegularExpression('/this text is under 35 bytes/', $result); $result = file_get_contents($files[1]); $this->assertMatchesRegularExpression('/Warning: Test warning second/', $result); file_put_contents($path . 'error.log.0000000000', "The oldest log file with over 35 bytes.\n"); sleep(1); clearstatcache(); $log->write('warning', 'Test warning fourth'); // rotate count reached so file count should not increase $files = glob($path . 'error.log.*'); $this->assertEquals(2, count($files)); $result = file_get_contents($path . 'error.log'); $this->assertMatchesRegularExpression('/Warning: Test warning fourth/', $result); $result = file_get_contents(array_pop($files)); $this->assertMatchesRegularExpression('/Warning: Test warning third/', $result); $result = file_get_contents(array_pop($files)); $this->assertMatchesRegularExpression('/Warning: Test warning second/', $result); file_put_contents($path . 'debug.log', "this text is just greater than 35 bytes\n"); $log = new FileLog(array( 'path' => $path, 'size' => 35, 'rotate' => 0 )); file_put_contents($path . 'debug.log.0000000000', "The oldest log file with over 35 bytes.\n"); $log->write('debug', 'Test debug'); $this->assertTrue(file_exists($path . 'debug.log')); $result = file_get_contents($path . 'debug.log'); $this->assertMatchesRegularExpression('/^2[0-9]{3}-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+ Debug: Test debug/', $result); $this->assertFalse(strstr($result, 'greater than 5 bytes')); $this->assertEquals(0, count(glob($path . 'debug.log.*'))); } public function testMaskSetting() { if (DS === '\\') { $this->markTestSkipped('File permission testing does not work on Windows.'); } $path = TMP . 'tests' . DS; $this->_deleteLogs($path); $log = new FileLog(array('path' => $path, 'mask' => 0666)); $log->write('warning', 'Test warning one'); $result = substr(sprintf('%o', fileperms($path . 'error.log')), -4); $expected = '0666'; $this->assertEquals($expected, $result); unlink($path . 'error.log'); $log = new FileLog(array('path' => $path, 'mask' => 0644)); $log->write('warning', 'Test warning two'); $result = substr(sprintf('%o', fileperms($path . 'error.log')), -4); $expected = '0644'; $this->assertEquals($expected, $result); unlink($path . 'error.log'); $log = new FileLog(array('path' => $path, 'mask' => 0640)); $log->write('warning', 'Test warning three'); $result = substr(sprintf('%o', fileperms($path . 'error.log')), -4); $expected = '0640'; $this->assertEquals($expected, $result); unlink($path . 'error.log'); } /** * helper function to clears all log files in specified directory * * @return void */ protected function _deleteLogs($dir) { $files = array_merge(glob($dir . '*.log'), glob($dir . '*.log.*')); foreach ($files as $file) { unlink($file); } } }