github.com/snowflakedb/gosnowflake@v1.9.0/log_test.go (about) 1 // Copyright (c) 2023 Snowflake Computing Inc. All rights reserved. 2 3 package gosnowflake 4 5 import ( 6 "bytes" 7 "errors" 8 "strings" 9 "testing" 10 "time" 11 12 rlog "github.com/sirupsen/logrus" 13 ) 14 15 func createTestLogger() defaultLogger { 16 var rLogger = rlog.New() 17 var ret = defaultLogger{inner: rLogger} 18 return ret 19 } 20 21 func TestIsLevelEnabled(t *testing.T) { 22 logger := createTestLogger() 23 logger.SetLevel(rlog.TraceLevel) 24 if !logger.IsLevelEnabled(rlog.TraceLevel) { 25 t.Fatalf("log level should be trace but is %v", logger.GetLevel()) 26 } 27 } 28 29 func TestLogFunction(t *testing.T) { 30 logger := createTestLogger() 31 buf := &bytes.Buffer{} 32 var formatter = rlog.TextFormatter{CallerPrettyfier: SFCallerPrettyfier} 33 logger.SetFormatter(&formatter) 34 logger.SetReportCaller(true) 35 logger.SetOutput(buf) 36 logger.SetLevel(rlog.TraceLevel) 37 38 logger.Log(rlog.TraceLevel, "hello world") 39 logger.Logf(rlog.TraceLevel, "log %v", "format") 40 logger.Logln(rlog.TraceLevel, "log line") 41 42 var strbuf = buf.String() 43 if !strings.Contains(strbuf, "hello world") && 44 !strings.Contains(strbuf, "log format") && 45 !strings.Contains(strbuf, "log line") { 46 t.Fatalf("unexpected output in log %v", strbuf) 47 } 48 } 49 50 func TestSetLogLevelError(t *testing.T) { 51 logger := CreateDefaultLogger() 52 err := logger.SetLogLevel("unknown") 53 if err == nil { 54 t.Fatal("should have thrown an error") 55 } 56 } 57 58 func TestDefaultLogLevel(t *testing.T) { 59 logger := CreateDefaultLogger() 60 buf := &bytes.Buffer{} 61 logger.SetOutput(buf) 62 SetLogger(&logger) 63 64 // default logger level is info 65 logger.Info("info") 66 logger.Infof("info%v", "f") 67 logger.Infoln("infoln") 68 69 // debug and trace won't write to log since they are higher than info level 70 logger.Debug("debug") 71 logger.Debugf("debug%v", "f") 72 logger.Debugln("debugln") 73 74 logger.Trace("trace") 75 logger.Tracef("trace%v", "f") 76 logger.Traceln("traceln") 77 78 // print, warning and error should write to log since they are lower than info 79 logger.Print("print") 80 logger.Printf("print%v", "f") 81 logger.Println("println") 82 83 logger.Warn("warn") 84 logger.Warnf("warn%v", "f") 85 logger.Warnln("warnln") 86 87 logger.Warning("warning") 88 logger.Warningf("warning%v", "f") 89 logger.Warningln("warningln") 90 91 logger.Error("error") 92 logger.Errorf("error%v", "f") 93 logger.Errorln("errorln") 94 95 // verify output 96 var strbuf = buf.String() 97 98 if strings.Contains(strbuf, "debug") && 99 strings.Contains(strbuf, "trace") && 100 !strings.Contains(strbuf, "info") && 101 !strings.Contains(strbuf, "print") && 102 !strings.Contains(strbuf, "warn") && 103 !strings.Contains(strbuf, "warning") && 104 !strings.Contains(strbuf, "error") { 105 t.Fatalf("unexpected output in log: %v", strbuf) 106 } 107 } 108 109 func TestOffLogLevel(t *testing.T) { 110 logger := CreateDefaultLogger() 111 buf := &bytes.Buffer{} 112 logger.SetOutput(buf) 113 err := logger.SetLogLevel("OFF") 114 assertNilF(t, err) 115 SetLogger(&logger) 116 117 logger.Info("info") 118 logger.Infof("info%v", "f") 119 logger.Infoln("infoln") 120 logger.Debug("debug") 121 logger.Debugf("debug%v", "f") 122 logger.Debugln("debugln") 123 logger.Trace("trace") 124 logger.Tracef("trace%v", "f") 125 logger.Traceln("traceln") 126 logger.Print("print") 127 logger.Printf("print%v", "f") 128 logger.Println("println") 129 logger.Warn("warn") 130 logger.Warnf("warn%v", "f") 131 logger.Warnln("warnln") 132 logger.Warning("warning") 133 logger.Warningf("warning%v", "f") 134 logger.Warningln("warningln") 135 logger.Error("error") 136 logger.Errorf("error%v", "f") 137 logger.Errorln("errorln") 138 139 assertEqualE(t, buf.Len(), 0, "log messages count") 140 assertEqualE(t, logger.GetLogLevel(), "OFF", "log level") 141 } 142 143 func TestLogSetLevel(t *testing.T) { 144 logger := GetLogger() 145 buf := &bytes.Buffer{} 146 logger.SetOutput(buf) 147 logger.SetLogLevel("trace") 148 149 logger.Trace("should print at trace level") 150 logger.Debug("should print at debug level") 151 152 var strbuf = buf.String() 153 154 if !strings.Contains(strbuf, "trace level") && 155 !strings.Contains(strbuf, "debug level") { 156 t.Fatalf("unexpected output in log: %v", strbuf) 157 } 158 } 159 160 func TestLogWithError(t *testing.T) { 161 logger := CreateDefaultLogger() 162 buf := &bytes.Buffer{} 163 logger.SetOutput(buf) 164 165 err := errors.New("error") 166 logger.WithError(err).Info("hello world") 167 168 var strbuf = buf.String() 169 if !strings.Contains(strbuf, "error=error") { 170 t.Fatalf("unexpected output in log: %v", strbuf) 171 } 172 } 173 174 func TestLogWithTime(t *testing.T) { 175 logger := createTestLogger() 176 buf := &bytes.Buffer{} 177 logger.SetOutput(buf) 178 179 ti := time.Now() 180 logger.WithTime(ti).Info("hello") 181 time.Sleep(3 * time.Second) 182 183 var strbuf = buf.String() 184 if !strings.Contains(strbuf, ti.Format(time.RFC3339)) { 185 t.Fatalf("unexpected string in output: %v", strbuf) 186 } 187 } 188 189 func TestLogWithField(t *testing.T) { 190 logger := CreateDefaultLogger() 191 buf := &bytes.Buffer{} 192 logger.SetOutput(buf) 193 194 logger.WithField("field", "test").Info("hello") 195 var strbuf = buf.String() 196 if !strings.Contains(strbuf, "field=test") { 197 t.Fatalf("unexpected string in output: %v", strbuf) 198 } 199 } 200 201 func TestLogLevelFunctions(t *testing.T) { 202 logger := createTestLogger() 203 buf := &bytes.Buffer{} 204 logger.SetOutput(buf) 205 206 logger.TraceFn(func() []interface{} { 207 return []interface{}{ 208 "trace function", 209 } 210 }) 211 212 logger.DebugFn(func() []interface{} { 213 return []interface{}{ 214 "debug function", 215 } 216 }) 217 218 logger.InfoFn(func() []interface{} { 219 return []interface{}{ 220 "info function", 221 } 222 }) 223 224 logger.PrintFn(func() []interface{} { 225 return []interface{}{ 226 "print function", 227 } 228 }) 229 230 logger.WarningFn(func() []interface{} { 231 return []interface{}{ 232 "warning function", 233 } 234 }) 235 236 logger.ErrorFn(func() []interface{} { 237 return []interface{}{ 238 "error function", 239 } 240 }) 241 242 // check that info, print, warning and error were outputted to the log. 243 var strbuf = buf.String() 244 245 if strings.Contains(strbuf, "debug") && 246 strings.Contains(strbuf, "trace") && 247 !strings.Contains(strbuf, "info") && 248 !strings.Contains(strbuf, "print") && 249 !strings.Contains(strbuf, "warning") && 250 !strings.Contains(strbuf, "error") { 251 t.Fatalf("unexpected output in log: %v", strbuf) 252 } 253 }