diff options
author | Sami Hiltunen <shiltunen@gitlab.com> | 2021-02-02 18:38:45 +0300 |
---|---|---|
committer | Sami Hiltunen <shiltunen@gitlab.com> | 2021-02-02 18:48:28 +0300 |
commit | 92d1d23b650739b52f79f4b49227310407bc867f (patch) | |
tree | 6d23de07a5f96180c9a9b6c77f51afe6e082d45e | |
parent | 9c2da9436f6a41a244a30deef6f48798f877e909 (diff) |
add additional test cases to assert proxy error propagation
This commit adds an additional test that asserts the error propagation
behavior of the grpc-proxy.
-rw-r--r-- | internal/praefect/grpc-proxy/proxy/handler_test.go | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/internal/praefect/grpc-proxy/proxy/handler_test.go b/internal/praefect/grpc-proxy/proxy/handler_test.go index 8244aedcd..85b3a61cf 100644 --- a/internal/praefect/grpc-proxy/proxy/handler_test.go +++ b/internal/praefect/grpc-proxy/proxy/handler_test.go @@ -14,6 +14,7 @@ import ( "net/http/httptest" "net/url" "os" + "path/filepath" "strings" "testing" "time" @@ -335,6 +336,93 @@ func TestProxyHappySuite(t *testing.T) { suite.Run(t, &ProxyHappySuite{}) } +func TestProxyErrorPropagation(t *testing.T) { + errBackend := status.Error(codes.InvalidArgument, "backend error") + errDirector := status.Error(codes.FailedPrecondition, "director error") + errRequestFinalizer := status.Error(codes.Internal, "request finalizer error") + + for _, tc := range []struct { + desc string + backendError error + directorError error + requestFinalizerError error + returnedError error + }{ + { + desc: "backend error is propagated", + backendError: errBackend, + returnedError: errBackend, + }, + { + desc: "director error is propagated", + directorError: errDirector, + returnedError: errDirector, + }, + { + desc: "request finalizer error is propagated", + requestFinalizerError: errRequestFinalizer, + returnedError: errRequestFinalizer, + }, + { + desc: "director error cancels proxying", + backendError: errBackend, + requestFinalizerError: errRequestFinalizer, + directorError: errDirector, + returnedError: errDirector, + }, + { + desc: "backend error prioritized over request finalizer error", + backendError: errBackend, + requestFinalizerError: errRequestFinalizer, + returnedError: errBackend, + }, + } { + tmpDir, clean := testhelper.TempDir(t) + defer clean() + + backendListener, err := net.Listen("unix", filepath.Join(tmpDir, "backend")) + require.NoError(t, err) + + backendServer := grpc.NewServer(grpc.UnknownServiceHandler(func(interface{}, grpc.ServerStream) error { + return tc.backendError + })) + go func() { backendServer.Serve(backendListener) }() + defer backendServer.Stop() + + ctx, cancel := testhelper.Context() + defer cancel() + + backendClientConn, err := grpc.DialContext(ctx, "unix://"+backendListener.Addr().String(), + grpc.WithInsecure(), grpc.WithDefaultCallOptions(grpc.ForceCodec(proxy.NewCodec()))) + require.NoError(t, err) + + proxyListener, err := net.Listen("unix", filepath.Join(tmpDir, "proxy")) + require.NoError(t, err) + + proxyServer := grpc.NewServer( + grpc.CustomCodec(proxy.NewCodec()), + grpc.UnknownServiceHandler(proxy.TransparentHandler(func(ctx context.Context, fullMethodName string, peeker proxy.StreamPeeker) (*proxy.StreamParameters, error) { + return proxy.NewStreamParameters( + proxy.Destination{Ctx: ctx, Conn: backendClientConn}, + nil, + func() error { return tc.requestFinalizerError }, + nil, + ), tc.directorError + })), + ) + + go func() { proxyServer.Serve(proxyListener) }() + defer proxyServer.Stop() + + proxyClientConn, err := grpc.DialContext(ctx, "unix://"+proxyListener.Addr().String(), grpc.WithInsecure()) + require.NoError(t, err) + + resp, err := pb.NewTestServiceClient(proxyClientConn).Ping(ctx, &pb.PingRequest{}) + require.Equal(t, tc.returnedError, err) + require.Nil(t, resp) + } +} + func TestRegisterStreamHandlers(t *testing.T) { directorCalledError := errors.New("director was called") |