forked from grpc-ecosystem/go-grpc-middleware
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshared_test.go
127 lines (110 loc) · 3.69 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
117
118
119
120
121
122
123
124
125
126
127
package grpc_logrus_test
import (
"bytes"
"context"
"encoding/json"
"io"
"testing"
grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus"
"github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus"
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"
"github.com/sirupsen/logrus"
"google.golang.org/grpc/codes"
)
var (
goodPing = &pb_testproto.PingRequest{Value: "something", SleepTimeMs: 9999}
)
type loggingPingService struct {
pb_testproto.TestServiceServer
}
func customCodeToLevel(c codes.Code) logrus.Level {
if c == codes.Unauthenticated {
// Make this a special case for tests, and an error.
return logrus.ErrorLevel
}
level := grpc_logrus.DefaultCodeToLevel(c)
return level
}
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)
ctxlogrus.AddFields(ctx, logrus.Fields{"custom_field": "custom_value"})
ctxlogrus.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)
ctxlogrus.AddFields(stream.Context(), logrus.Fields{"custom_field": "custom_value"})
ctxlogrus.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)
}
type logrusBaseSuite struct {
*grpc_testing.InterceptorTestSuite
mutexBuffer *grpc_testing.MutexReadWriter
buffer *bytes.Buffer
logger *logrus.Logger
}
func newLogrusBaseSuite(t *testing.T) *logrusBaseSuite {
b := &bytes.Buffer{}
muB := grpc_testing.NewMutexReadWriter(b)
logger := logrus.New()
logger.Out = muB
logger.Formatter = &logrus.JSONFormatter{DisableTimestamp: true}
return &logrusBaseSuite{
logger: logger,
buffer: b,
mutexBuffer: muB,
InterceptorTestSuite: &grpc_testing.InterceptorTestSuite{
TestService: &loggingPingService{&grpc_testing.TestPingService{T: t}},
},
}
}
func (s *logrusBaseSuite) SetupTest() {
s.mutexBuffer.Lock()
s.buffer.Reset()
s.mutexBuffer.Unlock()
}
func (s *logrusBaseSuite) 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, format string, level logrus.Level, code codes.Code, err error, fields logrus.Fields) {
if err != nil {
fields[logrus.ErrorKey] = err
}
format = "custom message"
entry := ctxlogrus.Extract(ctx).WithContext(ctx).WithFields(fields)
switch level {
case logrus.DebugLevel:
entry.Debugf(format)
case logrus.InfoLevel:
entry.Infof(format)
case logrus.WarnLevel:
entry.Warningf(format)
case logrus.ErrorLevel:
entry.Errorf(format)
case logrus.FatalLevel:
entry.Fatalf(format)
case logrus.PanicLevel:
entry.Panicf(format)
}
}