Skip to content

Commit 76553e7

Browse files
committed
slog: replace fragile error parsing with subtests
slogtest.Run was added long ago enough that we can rely on it by dropping support for older Go releases.
1 parent 6aa6364 commit 76553e7

File tree

1 file changed

+40
-46
lines changed

1 file changed

+40
-46
lines changed

slog_test.go

Lines changed: 40 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -35,45 +35,46 @@ import (
3535
"go.uber.org/zap/zapcore"
3636
)
3737

38+
var unsupportedTests = func() map[string]bool {
39+
m := make(map[string]bool)
40+
for _, name := range []string{
41+
// Cannot avoid empty groups.
42+
"empty-group-record",
43+
"nested-empty-group-record",
44+
} {
45+
m[name] = true
46+
}
47+
return m
48+
}()
49+
3850
func TestSlogHandler(t *testing.T) {
3951
var buffer bytes.Buffer
40-
encoder := zapcore.NewJSONEncoder(zapcore.EncoderConfig{
41-
MessageKey: slog.MessageKey,
42-
TimeKey: slog.TimeKey,
43-
LevelKey: slog.LevelKey,
44-
EncodeLevel: func(level zapcore.Level, encoder zapcore.PrimitiveArrayEncoder) {
45-
encoder.AppendInt(int(level))
46-
},
47-
})
48-
core := zapcore.NewCore(encoder, zapcore.AddSync(&buffer), zapcore.Level(0))
49-
zl := zap.New(core)
50-
logger := zapr.NewLogger(zl)
51-
handler := slogr.NewSlogHandler(logger)
52+
slogtest.Run(t, func(t *testing.T) slog.Handler {
53+
name := t.Name()
54+
name = strings.SplitN(name, "/", 2)[1]
55+
if unsupportedTests[name] {
56+
t.Skip()
57+
}
5258

53-
err := slogtest.TestHandler(handler, func() []map[string]any {
54-
_ = zl.Sync()
59+
encoder := zapcore.NewJSONEncoder(zapcore.EncoderConfig{
60+
MessageKey: slog.MessageKey,
61+
TimeKey: slog.TimeKey,
62+
LevelKey: slog.LevelKey,
63+
EncodeLevel: func(level zapcore.Level, encoder zapcore.PrimitiveArrayEncoder) {
64+
encoder.AppendInt(int(level))
65+
},
66+
})
67+
68+
buffer.Reset()
69+
core := zapcore.NewCore(encoder, zapcore.AddSync(&buffer), zapcore.Level(0))
70+
zl := zap.New(core)
71+
logger := zapr.NewLogger(zl)
72+
handler := slogr.NewSlogHandler(logger)
73+
74+
return handler
75+
}, func(*testing.T) map[string]any {
5576
return parseOutput(t, buffer.Bytes())
5677
})
57-
t.Logf("Log output:\n%s\nAs JSON:\n%v\n", buffer.String(), parseOutput(t, buffer.Bytes()))
58-
// Correlating failures with individual test cases is hard with the current API.
59-
// See https://github.com/golang/go/issues/61758
60-
if err != nil {
61-
if err, ok := err.(interface {
62-
Unwrap() []error
63-
}); ok {
64-
for _, err := range err.Unwrap() {
65-
if !containsOne(err.Error(),
66-
"a Handler should ignore a zero Record.Time", // zapr always writes a time field.
67-
"a Handler should not output groups for an empty Record", // Relies on WithGroup and that always opens a group. Text may change, see https://go.dev/cl/516155
68-
) {
69-
t.Errorf("Unexpected error: %v", err)
70-
}
71-
}
72-
return
73-
}
74-
// Shouldn't be reached, errors from errors.Join can be split up.
75-
t.Errorf("Unexpected errors:\n%v", err)
76-
}
7778
}
7879

7980
func containsOne(hay string, needles ...string) bool {
@@ -165,17 +166,10 @@ func TestSlogCases(t *testing.T) {
165166
}
166167
}
167168

168-
func parseOutput(t *testing.T, output []byte) []map[string]any {
169-
var ms []map[string]any
170-
for _, line := range bytes.Split(output, []byte{'\n'}) {
171-
if len(line) == 0 {
172-
continue
173-
}
174-
var m map[string]any
175-
if err := json.Unmarshal(line, &m); err != nil {
176-
t.Fatal(err)
177-
}
178-
ms = append(ms, m)
169+
func parseOutput(t *testing.T, output []byte) map[string]any {
170+
var m map[string]any
171+
if err := json.Unmarshal(output, &m); err != nil {
172+
t.Fatal(err)
179173
}
180-
return ms
174+
return m
181175
}

0 commit comments

Comments
 (0)