Skip to content

Commit bbd8366

Browse files
committed
added test
1 parent c3ca09b commit bbd8366

File tree

2 files changed

+80
-6
lines changed

2 files changed

+80
-6
lines changed

stream.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -542,8 +542,6 @@ type clientStream struct {
542542

543543
sentLast bool // sent an end stream
544544

545-
recvFirstMsg bool // received first msg from server
546-
547545
methodConfig *MethodConfig
548546

549547
ctx context.Context // the application's context, wrapped by stats/tracing
@@ -1137,17 +1135,14 @@ func (a *csAttempt) recvMsg(m any, payInfo *payloadInfo) (err error) {
11371135
return statusErr
11381136
}
11391137
// received no msg and status ok for non-server streaming rpcs.
1140-
if !cs.desc.ServerStreams && !cs.recvFirstMsg {
1138+
if !cs.desc.ServerStreams {
11411139
return status.Errorf(codes.Internal, "client streaming cardinality violation")
11421140
}
11431141
return io.EOF // indicates successful end of stream.
11441142
}
11451143

11461144
return toRPCErr(err)
11471145
}
1148-
if !cs.desc.ServerStreams {
1149-
cs.recvFirstMsg = true
1150-
}
11511146
if a.trInfo != nil {
11521147
a.mu.Lock()
11531148
if a.trInfo.tr != nil {

test/end2end_test.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
37393818
func (s) TestExceedMaxStreamsLimit(t *testing.T) {
37403819
for _, e := range listTestEnv() {
37413820
testExceedMaxStreamsLimit(t, e)

0 commit comments

Comments
 (0)