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  }