Repository navigation
Expand file tree
/
Copy pathvalue_test.go
More file actions
118 lines (93 loc) · 4.03 KB
/
Copy pathvalue_test.go
File metadata and controls
118 lines (93 loc) · 4.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package logging_test
import (
"errors"
"strings"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/amarin/logging"
)
const (
keyUser logging.IntKey = "user"
keyName logging.StringKey = "name"
keyTook logging.DurationKey = "took"
keyErr logging.ErrorKey = "err"
keyOrder logging.TypedKey[map[string]bool] = "order"
keyPassword logging.RedactedKey[string] = "password"
keyPlain logging.Key = "plain"
)
type order struct{ id string }
func (o order) LoggingValues() []logging.Value {
return []logging.Value{keyName.Value(o.id), keyPassword.Value("secret-" + o.id)}
}
type secretString struct{}
func (secretString) String() string { panic("masked value must not be inspected") }
func TestValue_Accessors(t *testing.T) {
v := keyPlain.Value(5)
require.Equal(t, logging.Key("plain"), v.Key())
require.Equal(t, 5, v.Any())
require.Equal(t, []logging.Value{v}, v.LoggingValues())
require.Equal(t, logging.Key("user"), keyUser.Key())
require.Equal(t, "user", keyUser.String())
require.Equal(t, 1, keyUser.Value(1).Any())
require.Equal(t, "***", keyPassword.Value("x").Any())
require.Equal(t, "password", keyPassword.String())
}
func TestWithValuesFrom_WritesValuesInOrder(t *testing.T) {
s := initJSON(t, logging.WithLevel(logging.LevelDebug), logging.WithRedact("plain"))
module := logging.Values{keyName.Value("billing")}
l := logging.WithValuesFrom(logging.NewLogger(),
keyUser.Value(42), module, order{id: "A-17"}, nil, keyPlain.Value("hidden by config"),
logging.Key("").Value("no key"), keyTook.Value(time.Second), keyErr.Value(errors.New("boom")))
l.Info("paid")
recs := s.records(t)
require.Len(t, recs, 1)
rec := recs[0]
require.EqualValues(t, 42, rec["user"])
require.Equal(t, "***", rec["password"], "typed secret is masked")
require.Equal(t, "***", rec["plain"], "config redact applies")
require.EqualValues(t, 1, rec["took"])
require.Equal(t, "boom", rec["err"])
require.NotContains(t, s.String(), "secret-A-17")
require.NotContains(t, s.String(), "no key")
line := s.String()
require.Less(t, strings.Index(line, `"user"`), strings.Index(line, `"name"`), "order of sources")
require.Less(t, strings.Index(line, `"name"`), strings.Index(line, `"password"`))
}
func TestWithValuesFrom_SameKeysAreNotMerged(t *testing.T) {
s := initJSON(t)
logging.WithValuesFrom(logging.NewLogger(), keyName.Value("a"), keyName.Value("b")).Info("x")
require.Equal(t, 2, strings.Count(s.String(), `"name"`))
}
func TestWithValuesFrom_NothingToAddReturnsLogger(t *testing.T) {
l := logging.NewLogger()
require.Same(t, l, logging.WithValuesFrom(l))
require.Same(t, l, logging.WithValuesFrom(l, nil, logging.Values{}, logging.Key("").Value(1)))
}
func TestRedactedKey_NeverTouchesTheValue(t *testing.T) {
s := initJSON(t)
logging.WithValuesFrom(logging.NewLogger(), logging.RedactedKey[secretString]("token").Value(secretString{})).Info("x")
require.Equal(t, "***", s.records(t)[0]["token"])
}
// plainLogger hides the optional interfaces to test the generic path.
type plainLogger struct{ logging.Logger }
func (p plainLogger) WithKey(key string, value any) logging.Logger {
return plainLogger{Logger: p.Logger.WithKey(key, value)}
}
func TestWithValuesFrom_ForeignLoggerAndDefaultAndTestLogger(t *testing.T) {
s := initJSON(t)
logging.WithValuesFrom(plainLogger{Logger: logging.NewLogger()}, keyUser.Value(1), keyName.Value("n")).Info("foreign")
var d logging.Default
logging.WithValuesFrom(&d, keyUser.Value(2)).Info("default")
recs := s.records(t)
require.Len(t, recs, 2)
require.EqualValues(t, 1, recs[0]["user"])
require.Equal(t, "n", recs[0]["name"])
require.EqualValues(t, 2, recs[1]["user"])
tl := logging.NewTestLogger(logging.WithRedact("plain"))
logging.WithValuesFrom(tl, keyUser.Value(3), keyPassword.Value("p"), keyPlain.Value("q")).Info("tl")
fields := tl.Records()[0].Fields
require.EqualValues(t, 3, fields["user"])
require.Equal(t, "***", fields["password"])
require.Equal(t, "***", fields["plain"])
}