@@ -3736,6 +3736,85 @@ func (s) TestClientStreaming_ReturnErrorAfterSendAndClose(t *testing.T) {
37363736 }
37373737}
37383738
3739+ func (s ) TestUnaryRPC_ServerSendsOnlyTrailersWithOK (t * testing.T ) {
3740+ lis , err := testutils .LocalTCPListener ()
3741+ if err != nil {
3742+ t .Fatal (err )
3743+ }
3744+ defer lis .Close ()
3745+
3746+ ctx , cancel := context .WithTimeout (context .Background (), defaultTestTimeout )
3747+ defer cancel ()
3748+ cc , err := grpc .NewClient (lis .Addr ().String (), grpc .WithTransportCredentials (insecure .NewCredentials ()))
3749+ if err != nil {
3750+ t .Fatalf ("grpc.NewClient(%s) = %v" , lis .Addr ().String (), err )
3751+ }
3752+ defer cc .Close ()
3753+
3754+ go func () {
3755+ conn , err := lis .Accept ()
3756+ if err != nil {
3757+ t .Errorf ("lis.Accept() = %v" , err )
3758+ return
3759+ }
3760+ defer conn .Close ()
3761+ framer := http2 .NewFramer (conn , conn )
3762+
3763+ if _ , err := io .ReadFull (conn , make ([]byte , len (clientPreface ))); err != nil {
3764+ t .Errorf ("Error reading client preface: %v" , err )
3765+ return
3766+ }
3767+ if err := framer .WriteSettings (); err != nil {
3768+ t .Errorf ("Error writing server settings: %v" , err )
3769+ return
3770+ }
3771+ if err := framer .WriteSettingsAck (); err != nil {
3772+ t .Errorf ("Error writing settings ack: %v" , err )
3773+ return
3774+ }
3775+
3776+ for ctx .Err () == nil {
3777+ frame , err := framer .ReadFrame ()
3778+ if err != nil {
3779+ t .Errorf ("Error reading frame: %v" , err )
3780+ return
3781+ }
3782+
3783+ switch frame := frame .(type ) {
3784+ case * http2.HeadersFrame :
3785+ if frame .Header ().StreamID != 1 {
3786+ t .Errorf ("Expected stream ID 1, got %d" , frame .Header ().StreamID )
3787+ return
3788+ }
3789+
3790+ var buf bytes.Buffer
3791+ enc := hpack .NewEncoder (& buf )
3792+ _ = enc .WriteField (hpack.HeaderField {Name : ":status" , Value : "200" })
3793+ _ = enc .WriteField (hpack.HeaderField {Name : "content-type" , Value : "application/grpc" })
3794+ _ = enc .WriteField (hpack.HeaderField {Name : "grpc-status" , Value : "0" })
3795+
3796+ if err := framer .WriteHeaders (http2.HeadersFrameParam {
3797+ StreamID : 1 ,
3798+ BlockFragment : buf .Bytes (),
3799+ EndHeaders : true ,
3800+ EndStream : true ,
3801+ }); err != nil {
3802+ t .Errorf ("Error while writing headers: %v" , err )
3803+ return
3804+ }
3805+ time .Sleep (50 * time .Millisecond )
3806+ default :
3807+ t .Logf ("Server received frame: %v" , frame )
3808+ }
3809+ }
3810+ }()
3811+
3812+ client := testgrpc .NewTestServiceClient (cc )
3813+ if _ , err = client .EmptyCall (ctx , & testpb.Empty {}); status .Code (err ) != codes .Internal {
3814+ t .Errorf ("stream.RecvMsg() = %v, want error %v" , status .Code (err ), codes .Internal )
3815+ }
3816+ }
3817+
37393818func (s ) TestExceedMaxStreamsLimit (t * testing.T ) {
37403819 for _ , e := range listTestEnv () {
37413820 testExceedMaxStreamsLimit (t , e )
0 commit comments