...

Source file src/cdr.dev/slog/slog_test.go

Documentation: cdr.dev/slog

     1  package slog_test
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  	"runtime"
     7  	"testing"
     8  
     9  	"go.opencensus.io/trace"
    10  
    11  	"cdr.dev/slog"
    12  	"cdr.dev/slog/internal/assert"
    13  )
    14  
    15  var _, slogTestFile, _, _ = runtime.Caller(0)
    16  
    17  type fakeSink struct {
    18  	entries []slog.SinkEntry
    19  
    20  	syncs int
    21  }
    22  
    23  func (s *fakeSink) LogEntry(_ context.Context, e slog.SinkEntry) {
    24  	s.entries = append(s.entries, e)
    25  }
    26  
    27  func (s *fakeSink) Sync() {
    28  	s.syncs++
    29  }
    30  
    31  var bg = context.Background()
    32  
    33  func TestLogger(t *testing.T) {
    34  	t.Parallel()
    35  
    36  	t.Run("basic", func(t *testing.T) {
    37  		t.Parallel()
    38  
    39  		s1 := &fakeSink{}
    40  		s2 := &fakeSink{}
    41  		l := slog.Make(s1)
    42  		l = l.Leveled(slog.LevelError)
    43  		l = l.AppendSinks(s2)
    44  
    45  		l.Info(bg, "wow", slog.Error(io.EOF))
    46  		l.Error(bg, "meow", slog.Error(io.ErrUnexpectedEOF))
    47  
    48  		assert.Equal(t, "syncs", 1, s1.syncs)
    49  		assert.Len(t, "entries", 1, s1.entries)
    50  
    51  		assert.Equal(t, "sinks", s1, s2)
    52  	})
    53  
    54  	t.Run("helper", func(t *testing.T) {
    55  		t.Parallel()
    56  
    57  		s := &fakeSink{}
    58  		l := slog.Make(s)
    59  		h := func(ctx context.Context) {
    60  			slog.Helper()
    61  			l.Info(ctx, "logging in helper")
    62  		}
    63  
    64  		ctx := slog.With(bg, slog.F(
    65  			"ctx", 1024),
    66  		)
    67  		h(ctx)
    68  
    69  		assert.Len(t, "entries", 1, s.entries)
    70  		assert.Equal(t, "entry", slog.SinkEntry{
    71  			Time: s.entries[0].Time,
    72  
    73  			Level:   slog.LevelInfo,
    74  			Message: "logging in helper",
    75  
    76  			File: slogTestFile,
    77  			Func: "cdr.dev/slog_test.TestLogger.func2",
    78  			Line: 67,
    79  
    80  			Fields: slog.M(
    81  				slog.F("ctx", 1024),
    82  			),
    83  		}, s.entries[0])
    84  	})
    85  
    86  	t.Run("entry", func(t *testing.T) {
    87  		t.Parallel()
    88  
    89  		s := &fakeSink{}
    90  		l := slog.Make(s)
    91  		l = l.Named("hello")
    92  		l = l.Named("hello2")
    93  
    94  		ctx, span := trace.StartSpan(bg, "trace")
    95  		ctx = slog.With(ctx, slog.F("ctx", io.EOF))
    96  		l = l.With(slog.F("with", 2))
    97  
    98  		l.Info(ctx, "meow", slog.F("hi", "xd"))
    99  
   100  		assert.Len(t, "entries", 1, s.entries)
   101  		assert.Equal(t, "entry", slog.SinkEntry{
   102  			Time: s.entries[0].Time,
   103  
   104  			Level:   slog.LevelInfo,
   105  			Message: "meow",
   106  
   107  			LoggerNames: []string{"hello", "hello2"},
   108  
   109  			File: slogTestFile,
   110  			Func: "cdr.dev/slog_test.TestLogger.func3",
   111  			Line: 98,
   112  
   113  			SpanContext: span.SpanContext(),
   114  
   115  			Fields: slog.M(
   116  				slog.F("with", 2),
   117  				slog.F("ctx", io.EOF),
   118  				slog.F("hi", "xd"),
   119  			),
   120  		}, s.entries[0])
   121  	})
   122  
   123  	t.Run("levels", func(t *testing.T) {
   124  		t.Parallel()
   125  
   126  		s := &fakeSink{}
   127  		l := slog.Make(s)
   128  
   129  		exits := 0
   130  		l.SetExit(func(int) {
   131  			exits++
   132  		})
   133  
   134  		l = l.Leveled(slog.LevelDebug)
   135  		l.Debug(bg, "")
   136  		l.Info(bg, "")
   137  		l.Warn(bg, "")
   138  		l.Error(bg, "")
   139  		l.Critical(bg, "")
   140  		l.Fatal(bg, "")
   141  
   142  		assert.Len(t, "entries", 6, s.entries)
   143  		assert.Equal(t, "syncs", 3, s.syncs)
   144  		assert.Equal(t, "level", slog.LevelDebug, s.entries[0].Level)
   145  		assert.Equal(t, "level", slog.LevelInfo, s.entries[1].Level)
   146  		assert.Equal(t, "level", slog.LevelWarn, s.entries[2].Level)
   147  		assert.Equal(t, "level", slog.LevelError, s.entries[3].Level)
   148  		assert.Equal(t, "level", slog.LevelCritical, s.entries[4].Level)
   149  		assert.Equal(t, "level", slog.LevelFatal, s.entries[5].Level)
   150  		assert.Equal(t, "exits", 1, exits)
   151  	})
   152  }
   153  
   154  func TestLevel_String(t *testing.T) {
   155  	t.Parallel()
   156  
   157  	assert.Equal(t, "level string", "slog.Level(12)", slog.Level(12).String())
   158  }
   159  

View as plain text