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