forked from grpc-ecosystem/go-grpc-middleware
-
Notifications
You must be signed in to change notification settings - Fork 0
/
shared_test.go
116 lines (100 loc) · 3.5 KB
/
shared_test.go
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
package grpc_zap_test
import (
"bytes"
"context"
"encoding/json"
"io"
"testing"
"github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap"
grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags"
grpc_testing "github.com/grpc-ecosystem/go-grpc-middleware/testing"
pb_testproto "github.com/grpc-ecosystem/go-grpc-middleware/testing/testproto"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"google.golang.org/grpc/codes"
)
var (
goodPing = &pb_testproto.PingRequest{Value: "something", SleepTimeMs: 9999}
)
type loggingPingService struct {
pb_testproto.TestServiceServer
}
func (s *loggingPingService) Ping(ctx context.Context, ping *pb_testproto.PingRequest) (*pb_testproto.PingResponse, error) {
grpc_ctxtags.Extract(ctx).Set("custom_tags.string", "something").Set("custom_tags.int", 1337)
ctxzap.AddFields(ctx, zap.String("custom_field", "custom_value"))
ctxzap.Extract(ctx).Info("some ping")
return s.TestServiceServer.Ping(ctx, ping)
}
func (s *loggingPingService) PingError(ctx context.Context, ping *pb_testproto.PingRequest) (*pb_testproto.Empty, error) {
return s.TestServiceServer.PingError(ctx, ping)
}
func (s *loggingPingService) PingList(ping *pb_testproto.PingRequest, stream pb_testproto.TestService_PingListServer) error {
grpc_ctxtags.Extract(stream.Context()).Set("custom_tags.string", "something").Set("custom_tags.int", 1337)
ctxzap.Extract(stream.Context()).Info("some pinglist")
return s.TestServiceServer.PingList(ping, stream)
}
func (s *loggingPingService) PingEmpty(ctx context.Context, empty *pb_testproto.Empty) (*pb_testproto.PingResponse, error) {
return s.TestServiceServer.PingEmpty(ctx, empty)
}
func newBaseZapSuite(t *testing.T) *zapBaseSuite {
b := &bytes.Buffer{}
muB := grpc_testing.NewMutexReadWriter(b)
zap.NewDevelopmentConfig()
jsonEncoder := zapcore.NewJSONEncoder(zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "msg",
StacktraceKey: "stacktrace",
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.EpochTimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
})
core := zapcore.NewCore(jsonEncoder, zapcore.AddSync(muB), zap.LevelEnablerFunc(func(zapcore.Level) bool { return true }))
log := zap.New(core)
s := &zapBaseSuite{
log: log,
buffer: b,
mutexBuffer: muB,
InterceptorTestSuite: &grpc_testing.InterceptorTestSuite{
TestService: &loggingPingService{&grpc_testing.TestPingService{T: t}},
},
}
return s
}
type zapBaseSuite struct {
*grpc_testing.InterceptorTestSuite
mutexBuffer *grpc_testing.MutexReadWriter
buffer *bytes.Buffer
log *zap.Logger
}
func (s *zapBaseSuite) SetupTest() {
s.mutexBuffer.Lock()
s.buffer.Reset()
s.mutexBuffer.Unlock()
}
func (s *zapBaseSuite) getOutputJSONs() []map[string]interface{} {
ret := make([]map[string]interface{}, 0)
dec := json.NewDecoder(s.mutexBuffer)
for {
var val map[string]interface{}
err := dec.Decode(&val)
if err == io.EOF {
break
}
if err != nil {
s.T().Fatalf("failed decoding output from Logrus JSON: %v", err)
}
ret = append(ret, val)
}
return ret
}
func StubMessageProducer(ctx context.Context, msg string, level zapcore.Level, code codes.Code, err error, duration zapcore.Field) {
// re-extract logger from newCtx, as it may have extra fields that changed in the holder.
ctxzap.Extract(ctx).Check(level, "custom message").Write(
zap.Error(err),
zap.String("grpc.code", code.String()),
duration,
)
}