aboutsummaryrefslogtreecommitdiff
path: root/grpc_testing/grpc_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'grpc_testing/grpc_test.go')
-rw-r--r--grpc_testing/grpc_test.go80
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")
+ })
+}