@@ -22,6 +22,8 @@ import (
2222 "google.golang.org/grpc/grpclog"
2323 "google.golang.org/grpc/metadata"
2424
25+ "fmt"
26+
2527 pb "github.com/mwitkow/grpc-proxy/testservice"
2628)
2729
@@ -72,6 +74,27 @@ func (s *assertingService) PingList(ping *pb.PingRequest, stream pb.TestService_
7274 return nil
7375}
7476
77+ func (s * assertingService ) PingStream (stream pb.TestService_PingStreamServer ) error {
78+ stream .SendHeader (metadata .Pairs (serverHeaderMdKey , "I like turtles." ))
79+ counter := int32 (0 )
80+ for {
81+ ping , err := stream .Recv ()
82+ if err == io .EOF {
83+ break
84+ } else if err != nil {
85+ require .NoError (s .t , err , "can't fail reading stream" )
86+ return err
87+ }
88+ pong := & pb.PingResponse {Value : ping .Value , Counter : counter }
89+ if err := stream .Send (pong ); err != nil {
90+ require .NoError (s .t , err , "can't fail sending back a pong" )
91+ }
92+ counter += 1
93+ }
94+ stream .SetTrailer (metadata .Pairs (serverTrailerMdKey , "I like ending turtles." ))
95+ return nil
96+ }
97+
7598// ProxyHappySuite tests the "happy" path of handling: that everything works in absence of connection issues.
7699type ProxyHappySuite struct {
77100 suite.Suite
@@ -125,24 +148,28 @@ func (s *ProxyHappySuite) TestDirectorErrorIsPropagated() {
125148 assert .Equal (s .T (), "testing rejection" , grpc .ErrorDesc (err ))
126149}
127150
128- func (s * ProxyHappySuite ) TestPingListStreamsAll () {
129- stream , err := s .testClient .PingList (s .ctx (), & pb.PingRequest {Value : "foo" })
130- require .NoError (s .T (), err , "PingList request should be successful." )
131- // Check that the header arrives before all entries.
132- headerMd , err := stream .Header ()
133- require .NoError (s .T (), err , "PingList headers should not error." )
134- assert .Len (s .T (), headerMd , 1 , "PingList response headers user contain metadata" )
135- count := 0
136- for {
151+ func (s * ProxyHappySuite ) TestPingStream_FullDuplexWorks () {
152+ stream , err := s .testClient .PingStream (s .ctx ())
153+ require .NoError (s .T (), err , "PingStream request should be successful." )
154+
155+ for i := 0 ; i < countListResponses ; i ++ {
156+ ping := & pb.PingRequest {Value : fmt .Sprintf ("foo:%d" , i )}
157+ require .NoError (s .T (), stream .Send (ping ), "sending to PingStream must not fail" )
137158 resp , err := stream .Recv ()
138159 if err == io .EOF {
139160 break
140161 }
141- require .NoError (s .T (), err , "PingList stream should not be interrupted." )
142- require .Equal (s .T (), "foo" , resp .Value )
143- count = count + 1
162+ if i == 0 {
163+ // Check that the header arrives before all entries.
164+ headerMd , err := stream .Header ()
165+ require .NoError (s .T (), err , "PingStream headers should not error." )
166+ assert .Len (s .T (), headerMd , 1 , "PingStream response headers user contain metadata" )
167+ }
168+ assert .EqualValues (s .T (), i , resp .Counter , "ping roundtrip must succeed with the correct id" )
144169 }
145- assert .Equal (s .T (), countListResponses , count , "PingList must successfully return all outputs" )
170+ require .NoError (s .T (), stream .CloseSend (), "no error on close send" )
171+ _ , err = stream .Recv ()
172+ require .Equal (s .T (), io .EOF , err , "stream should close with io.EOF, meaining OK" )
146173 // Check that the trailer headers are here.
147174 trailerMd := stream .Trailer ()
148175 assert .Len (s .T (), trailerMd , 1 , "PingList trailer headers user contain metadata" )
@@ -183,12 +210,12 @@ func (s *ProxyHappySuite) SetupSuite() {
183210 "Ping" )
184211
185212 // Start the serving loops.
213+ s .T ().Logf ("starting grpc.Server at: %v" , s .serverListener .Addr ().String ())
186214 go func () {
187- s .T ().Logf ("starting grpc.Server at: %v" , s .serverListener .Addr ().String ())
188215 s .server .Serve (s .serverListener )
189216 }()
217+ s .T ().Logf ("starting grpc.Proxy at: %v" , s .proxyListener .Addr ().String ())
190218 go func () {
191- s .T ().Logf ("starting grpc.Proxy at: %v" , s .proxyListener .Addr ().String ())
192219 s .proxy .Serve (s .proxyListener )
193220 }()
194221
0 commit comments