code.gitea.io/gitea@v1.19.3/modules/log/conn_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  	"io"
     9  	"net"
    10  	"strings"
    11  	"sync"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  func listenReadAndClose(t *testing.T, l net.Listener, expected string) {
    19  	conn, err := l.Accept()
    20  	assert.NoError(t, err)
    21  	defer conn.Close()
    22  	written, err := io.ReadAll(conn)
    23  
    24  	assert.NoError(t, err)
    25  	assert.Equal(t, expected, string(written))
    26  }
    27  
    28  func TestConnLogger(t *testing.T) {
    29  	protocol := "tcp"
    30  	address := ":3099"
    31  
    32  	l, err := net.Listen(protocol, address)
    33  	if err != nil {
    34  		t.Fatal(err)
    35  	}
    36  	defer l.Close()
    37  
    38  	prefix := "TestPrefix "
    39  	level := INFO
    40  	flags := LstdFlags | LUTC | Lfuncname
    41  
    42  	logger := NewConn()
    43  	connLogger := logger.(*ConnLogger)
    44  
    45  	logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, true, true, protocol, address))
    46  
    47  	assert.Equal(t, flags, connLogger.Flags)
    48  	assert.Equal(t, level, connLogger.Level)
    49  	assert.Equal(t, level, logger.GetLevel())
    50  
    51  	location, _ := time.LoadLocation("EST")
    52  
    53  	date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location)
    54  
    55  	dateString := date.UTC().Format("2006/01/02 15:04:05")
    56  
    57  	event := Event{
    58  		level:    INFO,
    59  		msg:      "TEST MSG",
    60  		caller:   "CALLER",
    61  		filename: "FULL/FILENAME",
    62  		line:     1,
    63  		time:     date,
    64  	}
    65  	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)
    66  	var wg sync.WaitGroup
    67  	wg.Add(2)
    68  	go func() {
    69  		defer wg.Done()
    70  		listenReadAndClose(t, l, expected)
    71  	}()
    72  	go func() {
    73  		defer wg.Done()
    74  		err := logger.LogEvent(&event)
    75  		assert.NoError(t, err)
    76  	}()
    77  	wg.Wait()
    78  
    79  	event.level = WARN
    80  	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)
    81  	wg.Add(2)
    82  	go func() {
    83  		defer wg.Done()
    84  		listenReadAndClose(t, l, expected)
    85  	}()
    86  	go func() {
    87  		defer wg.Done()
    88  		err := logger.LogEvent(&event)
    89  		assert.NoError(t, err)
    90  	}()
    91  	wg.Wait()
    92  
    93  	logger.Close()
    94  }
    95  
    96  func TestConnLoggerBadConfig(t *testing.T) {
    97  	logger := NewConn()
    98  
    99  	err := logger.Init("{")
   100  	assert.Error(t, err)
   101  	assert.Contains(t, err.Error(), "Unable to parse JSON")
   102  	logger.Close()
   103  }
   104  
   105  func TestConnLoggerCloseBeforeSend(t *testing.T) {
   106  	protocol := "tcp"
   107  	address := ":3099"
   108  
   109  	prefix := "TestPrefix "
   110  	level := INFO
   111  	flags := LstdFlags | LUTC | Lfuncname
   112  
   113  	logger := NewConn()
   114  
   115  	logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, false, false, protocol, address))
   116  	logger.Close()
   117  }
   118  
   119  func TestConnLoggerFailConnect(t *testing.T) {
   120  	protocol := "tcp"
   121  	address := ":3099"
   122  
   123  	prefix := "TestPrefix "
   124  	level := INFO
   125  	flags := LstdFlags | LUTC | Lfuncname
   126  
   127  	logger := NewConn()
   128  
   129  	logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, false, false, protocol, address))
   130  
   131  	assert.Equal(t, level, logger.GetLevel())
   132  
   133  	location, _ := time.LoadLocation("EST")
   134  
   135  	date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location)
   136  
   137  	// dateString := date.UTC().Format("2006/01/02 15:04:05")
   138  
   139  	event := Event{
   140  		level:    INFO,
   141  		msg:      "TEST MSG",
   142  		caller:   "CALLER",
   143  		filename: "FULL/FILENAME",
   144  		line:     1,
   145  		time:     date,
   146  	}
   147  
   148  	err := logger.LogEvent(&event)
   149  	assert.Error(t, err)
   150  
   151  	logger.Close()
   152  }
   153  
   154  func TestConnLoggerClose(t *testing.T) {
   155  	protocol := "tcp"
   156  	address := ":3099"
   157  
   158  	l, err := net.Listen(protocol, address)
   159  	if err != nil {
   160  		t.Fatal(err)
   161  	}
   162  	defer l.Close()
   163  
   164  	prefix := "TestPrefix "
   165  	level := INFO
   166  	flags := LstdFlags | LUTC | Lfuncname
   167  
   168  	logger := NewConn()
   169  	connLogger := logger.(*ConnLogger)
   170  
   171  	logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, false, false, protocol, address))
   172  
   173  	assert.Equal(t, flags, connLogger.Flags)
   174  	assert.Equal(t, level, connLogger.Level)
   175  	assert.Equal(t, level, logger.GetLevel())
   176  	location, _ := time.LoadLocation("EST")
   177  
   178  	date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location)
   179  
   180  	dateString := date.UTC().Format("2006/01/02 15:04:05")
   181  
   182  	event := Event{
   183  		level:    INFO,
   184  		msg:      "TEST MSG",
   185  		caller:   "CALLER",
   186  		filename: "FULL/FILENAME",
   187  		line:     1,
   188  		time:     date,
   189  	}
   190  	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)
   191  	var wg sync.WaitGroup
   192  	wg.Add(2)
   193  	go func() {
   194  		defer wg.Done()
   195  		err := logger.LogEvent(&event)
   196  		assert.NoError(t, err)
   197  		logger.Close()
   198  	}()
   199  	go func() {
   200  		defer wg.Done()
   201  		listenReadAndClose(t, l, expected)
   202  	}()
   203  	wg.Wait()
   204  
   205  	logger = NewConn()
   206  	connLogger = logger.(*ConnLogger)
   207  
   208  	logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, false, true, protocol, address))
   209  
   210  	assert.Equal(t, flags, connLogger.Flags)
   211  	assert.Equal(t, level, connLogger.Level)
   212  	assert.Equal(t, level, logger.GetLevel())
   213  
   214  	event.level = WARN
   215  	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)
   216  	wg.Add(2)
   217  	go func() {
   218  		defer wg.Done()
   219  		listenReadAndClose(t, l, expected)
   220  	}()
   221  	go func() {
   222  		defer wg.Done()
   223  		err := logger.LogEvent(&event)
   224  		assert.NoError(t, err)
   225  		logger.Close()
   226  	}()
   227  	wg.Wait()
   228  	logger.Flush()
   229  	logger.Close()
   230  }