From d7ac54924b9433991f283957af1b7a9d462f7f86 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 30 Jun 2016 14:57:30 -0700 Subject: [PATCH] Add status_code_and_message interop test. (Does not yet work, because the server does not yet support the response_status field.) --- interop/client/client.go | 6 +++++- interop/test_utils.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/interop/client/client.go b/interop/client/client.go index 98f6cfec..9eb6f305 100644 --- a/interop/client/client.go +++ b/interop/client/client.go @@ -70,7 +70,8 @@ var ( per_rpc_creds: large_unary with per rpc token; oauth2_auth_token: large_unary with oauth2 token auth; cancel_after_begin: cancellation after metadata has been sent but before payloads are sent; - cancel_after_first_response: cancellation after receiving 1st message from the server.`) + cancel_after_first_response: cancellation after receiving 1st message from the server; + status_code_and_message: status code propagated back to client.`) // The test CA root cert file testCAFile = "testdata/ca.pem" @@ -180,6 +181,9 @@ func main() { case "cancel_after_first_response": interop.DoCancelAfterFirstResponse(tc) grpclog.Println("CancelAfterFirstResponse done") + case "status_code_and_message": + interop.DoStatusCodeAndMessage(tc) + grpclog.Println("StatusCodeAndMessage done") default: grpclog.Fatal("Unsupported test case: ", *testCase) } diff --git a/interop/test_utils.go b/interop/test_utils.go index 23340ab8..c9813ba5 100644 --- a/interop/test_utils.go +++ b/interop/test_utils.go @@ -454,6 +454,45 @@ func DoCancelAfterFirstResponse(tc testpb.TestServiceClient) { } } +// DoStatusCodeAndMessage checks that the status code is propagated back to the client. +func DoStatusCodeAndMessage(tc testpb.TestServiceClient) { + // Test UnaryCall. + var code int32 = 2 + msg := "test status message" + respStatus := &testpb.EchoStatus{ + Code: &code, + Message: &msg, + } + req := &testpb.SimpleRequest{ + ResponseStatus: respStatus, + } + _, err := tc.UnaryCall(context.Background(), req) + if grpc.Code(err) != 2 { + grpclog.Fatalf("/TestService/UnaryCall RPC compleled with error code %d, want %d", grpc.Code(err), code) + } + if err.Error() != msg { + grpclog.Fatal("/TestService/UnaryCall unexpected RPC error message: ", err) + } + // Test FullDuplexCall. + stream, err := tc.FullDuplexCall(context.Background()) + if err != nil { + grpclog.Fatalf("%v.FullDuplexCall(_) = _, %v", tc, err) + } + stream_req := &testpb.StreamingOutputCallRequest{ + ResponseStatus: respStatus, + } + if err := stream.Send(stream_req); err != nil { + grpclog.Fatalf("%v.Send(%v) = %v", stream, stream_req, err) + } + err = stream.CloseSend() + if grpc.Code(err) != 2 { + grpclog.Fatalf("%v compleled with error code %d, want %d", stream, grpc.Code(err), code) + } + if err.Error() != msg { + grpclog.Fatalf("%v unexpected RPC error message: %v", stream, err) + } +} + type testServer struct { }