@@ -35,6 +35,7 @@ import (
35
35
"google.golang.org/grpc/codes"
36
36
"google.golang.org/grpc/mem"
37
37
"google.golang.org/grpc/metadata"
38
+ "google.golang.org/grpc/stats"
38
39
"google.golang.org/grpc/status"
39
40
"google.golang.org/protobuf/proto"
40
41
"google.golang.org/protobuf/protoadapt"
@@ -246,6 +247,22 @@ type handleStreamTest struct {
246
247
ht * serverHandlerTransport
247
248
}
248
249
250
+ type mockStatsHandler struct {}
251
+
252
+ func (h * mockStatsHandler ) TagRPC (ctx context.Context , _ * stats.RPCTagInfo ) context.Context {
253
+ return ctx
254
+ }
255
+
256
+ func (h * mockStatsHandler ) HandleRPC (context.Context , stats.RPCStats ) {
257
+ }
258
+
259
+ func (h * mockStatsHandler ) TagConn (ctx context.Context , _ * stats.ConnTagInfo ) context.Context {
260
+ return ctx
261
+ }
262
+
263
+ func (h * mockStatsHandler ) HandleConn (context.Context , stats.ConnStats ) {
264
+ }
265
+
249
266
func newHandleStreamTest (t * testing.T ) * handleStreamTest {
250
267
bodyr , bodyw := io .Pipe ()
251
268
req := & http.Request {
@@ -260,7 +277,12 @@ func newHandleStreamTest(t *testing.T) *handleStreamTest {
260
277
Body : bodyr ,
261
278
}
262
279
rw := newTestHandlerResponseWriter ().(testHandlerResponseWriter )
263
- ht , err := NewServerHandlerTransport (rw , req , nil , mem .DefaultBufferPool ())
280
+ // Add mock stats handlers to exercise the stats handler code path.
281
+ statsHandlers := make ([]stats.Handler , 0 , 5 )
282
+ for range 5 {
283
+ statsHandlers = append (statsHandlers , & mockStatsHandler {})
284
+ }
285
+ ht , err := NewServerHandlerTransport (rw , req , statsHandlers , mem .DefaultBufferPool ())
264
286
if err != nil {
265
287
t .Fatal (err )
266
288
}
@@ -485,6 +507,12 @@ func (s) TestHandlerTransport_HandleStreams_ErrDetails(t *testing.T) {
485
507
486
508
hst := newHandleStreamTest (t )
487
509
handleStream := func (s * ServerStream ) {
510
+ if err := s .SendHeader (metadata .New (map [string ]string {})); err != nil {
511
+ t .Error (err )
512
+ }
513
+ if err := s .SetTrailer (metadata .Pairs ("custom-trailer" , "Custom trailer value" )); err != nil {
514
+ t .Error (err )
515
+ }
488
516
s .WriteStatus (st )
489
517
}
490
518
ctx , cancel := context .WithTimeout (context .Background (), defaultTestTimeout )
@@ -501,6 +529,7 @@ func (s) TestHandlerTransport_HandleStreams_ErrDetails(t *testing.T) {
501
529
"Grpc-Status" : {fmt .Sprint (uint32 (statusCode ))},
502
530
"Grpc-Message" : {encodeGrpcMessage (msg )},
503
531
"Grpc-Status-Details-Bin" : {encodeBinHeader (stBytes )},
532
+ "Custom-Trailer" : []string {"Custom trailer value" },
504
533
}
505
534
506
535
checkHeaderAndTrailer (t , hst .rw , wantHeader , wantTrailer )
0 commit comments