code.gitea.io/gitea@v1.19.3/modules/log/writer_test.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package log
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  type CallbackWriteCloser struct {
    16  	callback func([]byte, bool)
    17  }
    18  
    19  func (c CallbackWriteCloser) Write(p []byte) (int, error) {
    20  	c.callback(p, false)
    21  	return len(p), nil
    22  }
    23  
    24  func (c CallbackWriteCloser) Close() error {
    25  	c.callback(nil, true)
    26  	return nil
    27  }
    28  
    29  func TestBaseLogger(t *testing.T) {
    30  	var written []byte
    31  	var closed bool
    32  
    33  	c := CallbackWriteCloser{
    34  		callback: func(p []byte, close bool) {
    35  			written = p
    36  			closed = close
    37  		},
    38  	}
    39  	prefix := "TestPrefix "
    40  	b := WriterLogger{
    41  		out:    c,
    42  		Level:  INFO,
    43  		Flags:  LstdFlags | LUTC,
    44  		Prefix: prefix,
    45  	}
    46  	location, _ := time.LoadLocation("EST")
    47  
    48  	date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location)
    49  
    50  	dateString := date.UTC().Format("2006/01/02 15:04:05")
    51  
    52  	event := Event{
    53  		level:    INFO,
    54  		msg:      "TEST MSG",
    55  		caller:   "CALLER",
    56  		filename: "FULL/FILENAME",
    57  		line:     1,
    58  		time:     date,
    59  	}
    60  
    61  	assert.Equal(t, INFO, b.GetLevel())
    62  
    63  	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)
    64  	b.LogEvent(&event)
    65  	assert.Equal(t, expected, string(written))
    66  	assert.False(t, closed)
    67  	written = written[:0]
    68  
    69  	event.level = DEBUG
    70  	expected = ""
    71  	b.LogEvent(&event)
    72  	assert.Equal(t, expected, string(written))
    73  	assert.False(t, closed)
    74  
    75  	event.level = TRACE
    76  	expected = ""
    77  	b.LogEvent(&event)
    78  	assert.Equal(t, expected, string(written))
    79  	assert.False(t, closed)
    80  
    81  	event.level = WARN
    82  	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)
    83  	b.LogEvent(&event)
    84  	assert.Equal(t, expected, string(written))
    85  	assert.False(t, closed)
    86  	written = written[:0]
    87  
    88  	event.level = ERROR
    89  	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)
    90  	b.LogEvent(&event)
    91  	assert.Equal(t, expected, string(written))
    92  	assert.False(t, closed)
    93  	written = written[:0]
    94  
    95  	event.level = CRITICAL
    96  	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)
    97  	b.LogEvent(&event)
    98  	assert.Equal(t, expected, string(written))
    99  	assert.False(t, closed)
   100  	written = written[:0]
   101  
   102  	b.Close()
   103  	assert.True(t, closed)
   104  }
   105  
   106  func TestBaseLoggerDated(t *testing.T) {
   107  	var written []byte
   108  	var closed bool
   109  
   110  	c := CallbackWriteCloser{
   111  		callback: func(p []byte, close bool) {
   112  			written = p
   113  			closed = close
   114  		},
   115  	}
   116  	prefix := ""
   117  	b := WriterLogger{
   118  		out:    c,
   119  		Level:  WARN,
   120  		Flags:  Ldate | Ltime | Lmicroseconds | Lshortfile | Llevel,
   121  		Prefix: prefix,
   122  	}
   123  
   124  	location, _ := time.LoadLocation("EST")
   125  
   126  	date := time.Date(2019, time.January, 13, 22, 3, 30, 115, location)
   127  
   128  	dateString := date.Format("2006/01/02 15:04:05.000000")
   129  
   130  	event := Event{
   131  		level:    WARN,
   132  		msg:      "TEST MESSAGE TEST\n",
   133  		caller:   "CALLER",
   134  		filename: "FULL/FILENAME",
   135  		line:     1,
   136  		time:     date,
   137  	}
   138  
   139  	assert.Equal(t, WARN, b.GetLevel())
   140  
   141  	expected := fmt.Sprintf("%s%s %s:%d [%s] %s", prefix, dateString, "FILENAME", event.line, strings.ToUpper(event.level.String()), event.msg)
   142  	b.LogEvent(&event)
   143  	assert.Equal(t, expected, string(written))
   144  	assert.False(t, closed)
   145  	written = written[:0]
   146  
   147  	event.level = INFO
   148  	expected = ""
   149  	b.LogEvent(&event)
   150  	assert.Equal(t, expected, string(written))
   151  	assert.False(t, closed)
   152  	written = written[:0]
   153  
   154  	event.level = ERROR
   155  	expected = fmt.Sprintf("%s%s %s:%d [%s] %s", prefix, dateString, "FILENAME", event.line, strings.ToUpper(event.level.String()), event.msg)
   156  	b.LogEvent(&event)
   157  	assert.Equal(t, expected, string(written))
   158  	assert.False(t, closed)
   159  	written = written[:0]
   160  
   161  	event.level = DEBUG
   162  	expected = ""
   163  	b.LogEvent(&event)
   164  	assert.Equal(t, expected, string(written))
   165  	assert.False(t, closed)
   166  	written = written[:0]
   167  
   168  	event.level = CRITICAL
   169  	expected = fmt.Sprintf("%s%s %s:%d [%s] %s", prefix, dateString, "FILENAME", event.line, strings.ToUpper(event.level.String()), event.msg)
   170  	b.LogEvent(&event)
   171  	assert.Equal(t, expected, string(written))
   172  	assert.False(t, closed)
   173  	written = written[:0]
   174  
   175  	event.level = TRACE
   176  	expected = ""
   177  	b.LogEvent(&event)
   178  	assert.Equal(t, expected, string(written))
   179  	assert.False(t, closed)
   180  	written = written[:0]
   181  
   182  	b.Close()
   183  	assert.True(t, closed)
   184  }
   185  
   186  func TestBaseLoggerMultiLineNoFlagsRegexp(t *testing.T) {
   187  	var written []byte
   188  	var closed bool
   189  
   190  	c := CallbackWriteCloser{
   191  		callback: func(p []byte, close bool) {
   192  			written = p
   193  			closed = close
   194  		},
   195  	}
   196  	prefix := ""
   197  	b := WriterLogger{
   198  		Level:           DEBUG,
   199  		StacktraceLevel: ERROR,
   200  		Flags:           -1,
   201  		Prefix:          prefix,
   202  		Expression:      "FILENAME",
   203  	}
   204  	b.NewWriterLogger(c)
   205  
   206  	location, _ := time.LoadLocation("EST")
   207  
   208  	date := time.Date(2019, time.January, 13, 22, 3, 30, 115, location)
   209  
   210  	event := Event{
   211  		level:    DEBUG,
   212  		msg:      "TEST\nMESSAGE\nTEST",
   213  		caller:   "CALLER",
   214  		filename: "FULL/FILENAME",
   215  		line:     1,
   216  		time:     date,
   217  	}
   218  
   219  	assert.Equal(t, DEBUG, b.GetLevel())
   220  
   221  	expected := "TEST\n\tMESSAGE\n\tTEST\n"
   222  	b.LogEvent(&event)
   223  	assert.Equal(t, expected, string(written))
   224  	assert.False(t, closed)
   225  	written = written[:0]
   226  
   227  	event.filename = "ELSEWHERE"
   228  
   229  	b.LogEvent(&event)
   230  	assert.Equal(t, "", string(written))
   231  	assert.False(t, closed)
   232  	written = written[:0]
   233  
   234  	event.caller = "FILENAME"
   235  	b.LogEvent(&event)
   236  	assert.Equal(t, expected, string(written))
   237  	assert.False(t, closed)
   238  	written = written[:0]
   239  
   240  	event = Event{
   241  		level:    DEBUG,
   242  		msg:      "TEST\nFILENAME\nTEST",
   243  		caller:   "CALLER",
   244  		filename: "FULL/ELSEWHERE",
   245  		line:     1,
   246  		time:     date,
   247  	}
   248  	expected = "TEST\n\tFILENAME\n\tTEST\n"
   249  	b.LogEvent(&event)
   250  	assert.Equal(t, expected, string(written))
   251  	assert.False(t, closed)
   252  	written = written[:0]
   253  }
   254  
   255  func TestBrokenRegexp(t *testing.T) {
   256  	var closed bool
   257  
   258  	c := CallbackWriteCloser{
   259  		callback: func(p []byte, close bool) {
   260  			closed = close
   261  		},
   262  	}
   263  
   264  	b := WriterLogger{
   265  		Level:           DEBUG,
   266  		StacktraceLevel: ERROR,
   267  		Flags:           -1,
   268  		Prefix:          prefix,
   269  		Expression:      "\\",
   270  	}
   271  	b.NewWriterLogger(c)
   272  	assert.Empty(t, b.regexp)
   273  	b.Close()
   274  	assert.True(t, closed)
   275  }