diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-02-03 10:09:14 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-02-03 10:09:14 +0300 |
commit | 23bc89b893818558feb4cc4175bf7f6e609f57e7 (patch) | |
tree | 676839217fc2889c74689b5fc2744f3c5e6f8eef | |
parent | a876a1f300121f3b66ed74c4294c19f548d7d9d2 (diff) | |
parent | 92d1d23b650739b52f79f4b49227310407bc867f (diff) |
Merge branch 'smh-add-error-propagation-tests' into 'master'
Add additional test cases to assert proxy error propagation
See merge request gitlab-org/gitaly!3090
-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") |