github.com/qichengzx/mattermost-server@v4.5.1-0.20180604164826-2c75247c97d0+incompatible/mlog/global_test.go (about)

     1  package mlog_test
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"regexp"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/mattermost/mattermost-server/mlog"
    14  )
    15  
    16  func TestLoggingBeforeInitialized(t *testing.T) {
    17  	require.NotPanics(t, func() {
    18  		// None of these should segfault before mlog is globally configured
    19  		mlog.Info("info log")
    20  		mlog.Debug("debug log")
    21  		mlog.Warn("warning log")
    22  		mlog.Error("error log")
    23  		mlog.Critical("critical log")
    24  	})
    25  }
    26  
    27  func TestLoggingAfterInitialized(t *testing.T) {
    28  	testCases := []struct {
    29  		Description         string
    30  		LoggerConfiguration *mlog.LoggerConfiguration
    31  		ExpectedLogs        []string
    32  	}{
    33  		{
    34  			"file logging, json, debug",
    35  			&mlog.LoggerConfiguration{
    36  				EnableConsole: false,
    37  				EnableFile:    true,
    38  				FileJson:      true,
    39  				FileLevel:     mlog.LevelDebug,
    40  			},
    41  			[]string{
    42  				`{"level":"debug","ts":0,"caller":"mlog/global_test.go:0","msg":"real debug log"}`,
    43  				`{"level":"info","ts":0,"caller":"mlog/global_test.go:0","msg":"real info log"}`,
    44  				`{"level":"warn","ts":0,"caller":"mlog/global_test.go:0","msg":"real warning log"}`,
    45  				`{"level":"error","ts":0,"caller":"mlog/global_test.go:0","msg":"real error log"}`,
    46  				`{"level":"error","ts":0,"caller":"mlog/global_test.go:0","msg":"real critical log"}`,
    47  			},
    48  		},
    49  		{
    50  			"file logging, json, error",
    51  			&mlog.LoggerConfiguration{
    52  				EnableConsole: false,
    53  				EnableFile:    true,
    54  				FileJson:      true,
    55  				FileLevel:     mlog.LevelError,
    56  			},
    57  			[]string{
    58  				`{"level":"error","ts":0,"caller":"mlog/global_test.go:0","msg":"real error log"}`,
    59  				`{"level":"error","ts":0,"caller":"mlog/global_test.go:0","msg":"real critical log"}`,
    60  			},
    61  		},
    62  		{
    63  			"file logging, non-json, debug",
    64  			&mlog.LoggerConfiguration{
    65  				EnableConsole: false,
    66  				EnableFile:    true,
    67  				FileJson:      false,
    68  				FileLevel:     mlog.LevelDebug,
    69  			},
    70  			[]string{
    71  				`TIME	debug	mlog/global_test.go:0	real debug log`,
    72  				`TIME	info	mlog/global_test.go:0	real info log`,
    73  				`TIME	warn	mlog/global_test.go:0	real warning log`,
    74  				`TIME	error	mlog/global_test.go:0	real error log`,
    75  				`TIME	error	mlog/global_test.go:0	real critical log`,
    76  			},
    77  		},
    78  		{
    79  			"file logging, non-json, error",
    80  			&mlog.LoggerConfiguration{
    81  				EnableConsole: false,
    82  				EnableFile:    true,
    83  				FileJson:      false,
    84  				FileLevel:     mlog.LevelError,
    85  			},
    86  			[]string{
    87  				`TIME	error	mlog/global_test.go:0	real error log`,
    88  				`TIME	error	mlog/global_test.go:0	real critical log`,
    89  			},
    90  		},
    91  	}
    92  
    93  	for _, testCase := range testCases {
    94  		t.Run(testCase.Description, func(t *testing.T) {
    95  			var filePath string
    96  			if testCase.LoggerConfiguration.EnableFile {
    97  				tempDir, err := ioutil.TempDir(os.TempDir(), "TestLoggingAfterInitialized")
    98  				require.NoError(t, err)
    99  				defer os.Remove(tempDir)
   100  
   101  				filePath = filepath.Join(tempDir, "file.log")
   102  				testCase.LoggerConfiguration.FileLocation = filePath
   103  			}
   104  
   105  			logger := mlog.NewLogger(testCase.LoggerConfiguration)
   106  			mlog.InitGlobalLogger(logger)
   107  
   108  			mlog.Debug("real debug log")
   109  			mlog.Info("real info log")
   110  			mlog.Warn("real warning log")
   111  			mlog.Error("real error log")
   112  			mlog.Critical("real critical log")
   113  
   114  			if testCase.LoggerConfiguration.EnableFile {
   115  				logs, err := ioutil.ReadFile(filePath)
   116  				require.NoError(t, err)
   117  
   118  				actual := strings.TrimSpace(string(logs))
   119  
   120  				if testCase.LoggerConfiguration.FileJson {
   121  					reTs := regexp.MustCompile(`"ts":[0-9\.]+`)
   122  					reCaller := regexp.MustCompile(`"caller":"([^"]+):[0-9\.]+"`)
   123  					actual = reTs.ReplaceAllString(actual, `"ts":0`)
   124  					actual = reCaller.ReplaceAllString(actual, `"caller":"$1:0"`)
   125  				} else {
   126  					actualRows := strings.Split(actual, "\n")
   127  					for i, actualRow := range actualRows {
   128  						actualFields := strings.Split(actualRow, "\t")
   129  						if len(actualFields) > 3 {
   130  							actualFields[0] = "TIME"
   131  							reCaller := regexp.MustCompile(`([^"]+):[0-9\.]+`)
   132  							actualFields[2] = reCaller.ReplaceAllString(actualFields[2], "$1:0")
   133  							actualRows[i] = strings.Join(actualFields, "\t")
   134  						}
   135  					}
   136  
   137  					actual = strings.Join(actualRows, "\n")
   138  				}
   139  				require.Equal(t, testCase.ExpectedLogs, strings.Split(actual, "\n"))
   140  			}
   141  		})
   142  	}
   143  }