@@ -3,13 +3,16 @@ package xtest
33import (
44 "context"
55 "fmt"
6+ "sync/atomic"
67 "testing"
78
89 "github.com/golang/protobuf/jsonpb"
910 "github.com/golang/protobuf/proto"
1011 "google.golang.org/grpc"
1112)
1213
14+ var globalLastStreamID int64 = 0
15+
1316// GrpcLogger use for log raw grpc messages
1417//
1518// Usage:
@@ -32,6 +35,44 @@ func (l GrpcLogger) UnaryClientInterceptor(ctx context.Context, method string, r
3235 return err
3336}
3437
38+ func (l GrpcLogger ) StreamClientInterceptor (ctx context.Context , desc * grpc.StreamDesc , cc * grpc.ClientConn , method string , streamer grpc.Streamer , opts ... grpc.CallOption ) (grpc.ClientStream , error ) {
39+ stream , err := streamer (ctx , desc , cc , method , opts ... )
40+ streamWrapper := newGrpcLoggerStream (stream , l .t )
41+ if stream != nil {
42+ stream = streamWrapper
43+ }
44+ l .t .Logf ("StreamStart: %v with err '%v' (streamID: %v)" , method , err , streamWrapper .streamID )
45+ return stream , err
46+ }
47+
48+ type grpcLoggerStream struct {
49+ grpc.ClientStream
50+ streamID int64
51+ t testing.TB
52+ }
53+
54+ func newGrpcLoggerStream (stream grpc.ClientStream , t testing.TB ) grpcLoggerStream {
55+ return grpcLoggerStream {stream , atomic .AddInt64 (& globalLastStreamID , 1 ), t }
56+ }
57+
58+ func (g grpcLoggerStream ) CloseSend () error {
59+ err := g .ClientStream .CloseSend ()
60+ g .t .Logf ("CloseSend: %v (streamID: %v)" , err , g .streamID )
61+ return err
62+ }
63+
64+ func (g grpcLoggerStream ) SendMsg (m interface {}) error {
65+ err := g .ClientStream .SendMsg (m )
66+ g .t .Logf ("SendMsg (streamID: %v) with err '%v':\n %v " , g .streamID , err , protoToString (m ))
67+ return err
68+ }
69+
70+ func (g grpcLoggerStream ) RecvMsg (m interface {}) error {
71+ err := g .ClientStream .RecvMsg (m )
72+ g .t .Logf ("RecvMsg (streamID: %v) with err '%v':\n %v " , g .streamID , err , protoToString (m ))
73+ return err
74+ }
75+
3576func protoToString (v interface {}) string {
3677 if mess , ok := v .(proto.Message ); ok {
3778 marshaler := jsonpb.Marshaler {}
0 commit comments