2019-04-02 08:48:31 +01:00
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package log
import (
"compress/gzip"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestFileLoggerFails ( t * testing . T ) {
tmpDir , err := ioutil . TempDir ( "" , "TestFileLogger" )
assert . NoError ( t , err )
defer os . RemoveAll ( tmpDir )
prefix := "TestPrefix "
level := INFO
flags := LstdFlags | LUTC | Lfuncname
//filename := filepath.Join(tmpDir, "test.log")
fileLogger := NewFileLogger ( )
//realFileLogger, ok := fileLogger.(*FileLogger)
//assert.Equal(t, true, ok)
// Fail if there is bad json
err = fileLogger . Init ( "{" )
assert . Error ( t , err )
// Fail if there is no filename
err = fileLogger . Init ( fmt . Sprintf ( "{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\"}" , prefix , level . String ( ) , flags , "" ) )
assert . Error ( t , err )
// Fail if the file isn't a filename
err = fileLogger . Init ( fmt . Sprintf ( "{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\"}" , prefix , level . String ( ) , flags , filepath . ToSlash ( tmpDir ) ) )
assert . Error ( t , err )
}
func TestFileLogger ( t * testing . T ) {
tmpDir , err := ioutil . TempDir ( "" , "TestFileLogger" )
assert . NoError ( t , err )
defer os . RemoveAll ( tmpDir )
prefix := "TestPrefix "
level := INFO
flags := LstdFlags | LUTC | Lfuncname
filename := filepath . Join ( tmpDir , "test.log" )
fileLogger := NewFileLogger ( )
realFileLogger , ok := fileLogger . ( * FileLogger )
assert . Equal ( t , true , ok )
location , _ := time . LoadLocation ( "EST" )
date := time . Date ( 2019 , time . January , 13 , 22 , 3 , 30 , 15 , location )
dateString := date . UTC ( ) . Format ( "2006/01/02 15:04:05" )
event := Event {
level : INFO ,
msg : "TEST MSG" ,
caller : "CALLER" ,
filename : "FULL/FILENAME" ,
line : 1 ,
time : date ,
}
expected := fmt . Sprintf ( "%s%s %s:%d:%s [%c] %s\n" , prefix , dateString , event . filename , event . line , event . caller , strings . ToUpper ( event . level . String ( ) ) [ 0 ] , event . msg )
fileLogger . Init ( fmt . Sprintf ( "{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\",\"maxsize\":%d,\"compress\":false}" , prefix , level . String ( ) , flags , filepath . ToSlash ( filename ) , len ( expected ) * 2 ) )
assert . Equal ( t , flags , realFileLogger . Flags )
assert . Equal ( t , level , realFileLogger . Level )
assert . Equal ( t , level , fileLogger . GetLevel ( ) )
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
logData , err := ioutil . ReadFile ( filename )
assert . NoError ( t , err )
assert . Equal ( t , expected , string ( logData ) )
event . level = DEBUG
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
logData , err = ioutil . ReadFile ( filename )
assert . NoError ( t , err )
assert . Equal ( t , expected , string ( logData ) )
event . level = TRACE
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
logData , err = ioutil . ReadFile ( filename )
assert . NoError ( t , err )
assert . Equal ( t , expected , string ( logData ) )
event . level = WARN
2019-06-12 21:41:28 +02:00
expected += fmt . Sprintf ( "%s%s %s:%d:%s [%c] %s\n" , prefix , dateString , event . filename , event . line , event . caller , strings . ToUpper ( event . level . String ( ) ) [ 0 ] , event . msg )
2019-04-02 08:48:31 +01:00
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
logData , err = ioutil . ReadFile ( filename )
assert . NoError ( t , err )
assert . Equal ( t , expected , string ( logData ) )
// Should rotate
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
logData , err = ioutil . ReadFile ( filename + fmt . Sprintf ( ".%s.%03d" , time . Now ( ) . Format ( "2006-01-02" ) , 1 ) )
assert . NoError ( t , err )
assert . Equal ( t , expected , string ( logData ) )
logData , err = ioutil . ReadFile ( filename )
assert . NoError ( t , err )
expected = fmt . Sprintf ( "%s%s %s:%d:%s [%c] %s\n" , prefix , dateString , event . filename , event . line , event . caller , strings . ToUpper ( event . level . String ( ) ) [ 0 ] , event . msg )
assert . Equal ( t , expected , string ( logData ) )
for num := 2 ; num <= 999 ; num ++ {
file , err := os . OpenFile ( filename + fmt . Sprintf ( ".%s.%03d" , time . Now ( ) . Format ( "2006-01-02" ) , num ) , os . O_RDONLY | os . O_CREATE , 0666 )
assert . NoError ( t , err )
file . Close ( )
}
err = realFileLogger . DoRotate ( )
assert . Error ( t , err )
2019-06-12 21:41:28 +02:00
expected += fmt . Sprintf ( "%s%s %s:%d:%s [%c] %s\n" , prefix , dateString , event . filename , event . line , event . caller , strings . ToUpper ( event . level . String ( ) ) [ 0 ] , event . msg )
2019-04-02 08:48:31 +01:00
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
logData , err = ioutil . ReadFile ( filename )
assert . NoError ( t , err )
assert . Equal ( t , expected , string ( logData ) )
// Should fail to rotate
2019-06-12 21:41:28 +02:00
expected += fmt . Sprintf ( "%s%s %s:%d:%s [%c] %s\n" , prefix , dateString , event . filename , event . line , event . caller , strings . ToUpper ( event . level . String ( ) ) [ 0 ] , event . msg )
2019-04-02 08:48:31 +01:00
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
logData , err = ioutil . ReadFile ( filename )
assert . NoError ( t , err )
assert . Equal ( t , expected , string ( logData ) )
fileLogger . Close ( )
}
func TestCompressFileLogger ( t * testing . T ) {
tmpDir , err := ioutil . TempDir ( "" , "TestFileLogger" )
assert . NoError ( t , err )
defer os . RemoveAll ( tmpDir )
prefix := "TestPrefix "
level := INFO
flags := LstdFlags | LUTC | Lfuncname
filename := filepath . Join ( tmpDir , "test.log" )
fileLogger := NewFileLogger ( )
realFileLogger , ok := fileLogger . ( * FileLogger )
assert . Equal ( t , true , ok )
location , _ := time . LoadLocation ( "EST" )
date := time . Date ( 2019 , time . January , 13 , 22 , 3 , 30 , 15 , location )
dateString := date . UTC ( ) . Format ( "2006/01/02 15:04:05" )
event := Event {
level : INFO ,
msg : "TEST MSG" ,
caller : "CALLER" ,
filename : "FULL/FILENAME" ,
line : 1 ,
time : date ,
}
expected := fmt . Sprintf ( "%s%s %s:%d:%s [%c] %s\n" , prefix , dateString , event . filename , event . line , event . caller , strings . ToUpper ( event . level . String ( ) ) [ 0 ] , event . msg )
fileLogger . Init ( fmt . Sprintf ( "{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\",\"maxsize\":%d,\"compress\":true}" , prefix , level . String ( ) , flags , filepath . ToSlash ( filename ) , len ( expected ) * 2 ) )
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
logData , err := ioutil . ReadFile ( filename )
assert . NoError ( t , err )
assert . Equal ( t , expected , string ( logData ) )
event . level = WARN
2019-06-12 21:41:28 +02:00
expected += fmt . Sprintf ( "%s%s %s:%d:%s [%c] %s\n" , prefix , dateString , event . filename , event . line , event . caller , strings . ToUpper ( event . level . String ( ) ) [ 0 ] , event . msg )
2019-04-02 08:48:31 +01:00
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
logData , err = ioutil . ReadFile ( filename )
assert . NoError ( t , err )
assert . Equal ( t , expected , string ( logData ) )
// Should rotate
fileLogger . LogEvent ( & event )
fileLogger . Flush ( )
for num := 2 ; num <= 999 ; num ++ {
file , err := os . OpenFile ( filename + fmt . Sprintf ( ".%s.%03d.gz" , time . Now ( ) . Format ( "2006-01-02" ) , num ) , os . O_RDONLY | os . O_CREATE , 0666 )
assert . NoError ( t , err )
file . Close ( )
}
err = realFileLogger . DoRotate ( )
assert . Error ( t , err )
}
func TestCompressOldFile ( t * testing . T ) {
tmpDir , err := ioutil . TempDir ( "" , "TestFileLogger" )
assert . NoError ( t , err )
defer os . RemoveAll ( tmpDir )
fname := filepath . Join ( tmpDir , "test" )
nonGzip := filepath . Join ( tmpDir , "test-nonGzip" )
f , err := os . OpenFile ( fname , os . O_CREATE | os . O_WRONLY , 0660 )
assert . NoError ( t , err )
ng , err := os . OpenFile ( nonGzip , os . O_CREATE | os . O_WRONLY , 0660 )
assert . NoError ( t , err )
for i := 0 ; i < 999 ; i ++ {
f . WriteString ( "This is a test file\n" )
ng . WriteString ( "This is a test file\n" )
}
f . Close ( )
ng . Close ( )
err = compressOldLogFile ( fname , - 1 )
assert . NoError ( t , err )
_ , err = os . Lstat ( fname + ".gz" )
assert . NoError ( t , err )
f , err = os . Open ( fname + ".gz" )
assert . NoError ( t , err )
zr , err := gzip . NewReader ( f )
assert . NoError ( t , err )
data , err := ioutil . ReadAll ( zr )
assert . NoError ( t , err )
original , err := ioutil . ReadFile ( nonGzip )
assert . NoError ( t , err )
assert . Equal ( t , original , data )
}