diff options
Diffstat (limited to 'grpc_testing/grpc_test.go')
| -rw-r--r-- | grpc_testing/grpc_test.go | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/grpc_testing/grpc_test.go b/grpc_testing/grpc_test.go new file mode 100644 index 0000000..53e2eaa --- /dev/null +++ b/grpc_testing/grpc_test.go @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: CC0-1.0 + +package grpc_testing + +//go:generate protoc --go_opt=paths=source_relative --go_out=plugins=grpc:. echo.proto + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "go.awhk.org/pipeln" +) + +type impl struct{} + +var _ EchoServer = impl{} + +func (impl) Echo(_ context.Context, req *EchoRequest) (*EchoResponse, error) { + return &EchoResponse{Message: req.Message}, nil +} + +func Test(t *testing.T) { + ln := pipeln.New("test-backend-name") + + ret := make(chan error) + srv := grpc.NewServer() + RegisterEchoServer(srv, &impl{}) + go func() { ret <- srv.Serve(ln) }() + + opts := []grpc.DialOption{grpc.WithContextDialer(ln.DialContextAddr), grpc.WithInsecure()} + req := &EchoRequest{Message: "Hello World!"} + + t.Run("OK", func(t *testing.T) { + conn, err := grpc.Dial("test-backend-name", opts...) + require.NoError(t, err) + defer conn.Close() + + client := NewEchoClient(conn) + resp, err := client.Echo(context.Background(), req) + require.NoError(t, err) + assert.Equal(t, req.Message, resp.Message) + }) + + t.Run("Address Mismatch", func(t *testing.T) { + conn, err := grpc.Dial("bad-backend-name", opts...) + require.NoError(t, err) + defer conn.Close() + + client := NewEchoClient(conn) + _, err = client.Echo(context.Background(), req) + require.Error(t, err) + st := status.Convert(err) + require.NotNil(t, st) + assert.Equal(t, codes.Unavailable, st.Code()) + assert.Contains(t, st.Message(), "invalid argument") + }) + + srv.GracefulStop() + assert.NoError(t, <-ret) + + t.Run("Remote Connection Closed", func(t *testing.T) { + conn, err := grpc.Dial("test-backend-name", opts...) + require.NoError(t, err) + defer conn.Close() + + client := NewEchoClient(conn) + _, err = client.Echo(context.Background(), req) + require.Error(t, err) + st := status.Convert(err) + require.NotNil(t, st) + assert.Equal(t, codes.Unavailable, st.Code()) + assert.Contains(t, st.Message(), "connection refused") + }) +} |
