diff --git a/grpc_client.go b/grpc_client.go index fadc044a..5a5ef36d 100644 --- a/grpc_client.go +++ b/grpc_client.go @@ -126,9 +126,14 @@ func (c *GRPCClient) Dispense(name string) (interface{}, error) { // ClientProtocol impl. func (c *GRPCClient) Ping() error { client := grpc_health_v1.NewHealthClient(c.Conn) - _, err := client.Check(context.Background(), &grpc_health_v1.HealthCheckRequest{ + resp, err := client.Check(context.Background(), &grpc_health_v1.HealthCheckRequest{ Service: GRPCServiceName, }) - - return err + if err != nil { + return err + } + if resp.Status != grpc_health_v1.HealthCheckResponse_SERVING { + return fmt.Errorf("plugin %q is not healthy: status=%v", GRPCServiceName, resp.Status) + } + return nil } diff --git a/grpc_client_ping_test.go b/grpc_client_ping_test.go new file mode 100644 index 00000000..7bcbe283 --- /dev/null +++ b/grpc_client_ping_test.go @@ -0,0 +1,47 @@ +package plugin + +import ( + "context" + "net" + "testing" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + grpc_health_v1 "google.golang.org/grpc/health/grpc_health_v1" +) + +type notServingHealthServer struct { + grpc_health_v1.UnimplementedHealthServer +} + +func (h *notServingHealthServer) Check(ctx context.Context, in *grpc_health_v1.HealthCheckRequest) (*grpc_health_v1.HealthCheckResponse, error) { + return &grpc_health_v1.HealthCheckResponse{ + Status: grpc_health_v1.HealthCheckResponse_NOT_SERVING, + }, nil +} + +func TestGRPC_Ping_ChecksServingStatus(t *testing.T) { + lis, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("err: %s", err) + } + + server := grpc.NewServer() + grpc_health_v1.RegisterHealthServer(server, ¬ServingHealthServer{}) + + go server.Serve(lis) + defer server.Stop() + + conn, err := grpc.Dial(lis.Addr().String(), grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + t.Fatalf("err: %s", err) + } + defer conn.Close() + + client := &GRPCClient{Conn: conn} + + err = client.Ping() + if err == nil { + t.Fatal("expected Ping() to fail when health check returns NOT_SERVING") + } +}