diff --git a/errdefs/grpc_test.go b/errdefs/grpc_test.go new file mode 100644 index 000000000..ae047537c --- /dev/null +++ b/errdefs/grpc_test.go @@ -0,0 +1,65 @@ +package errdefs + +import ( + "testing" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + + "github.com/pkg/errors" +) + +func TestGRPCRoundTrip(t *testing.T) { + errShouldLeaveAlone := errors.New("unknown to package") + + for _, testcase := range []struct { + input error + cause error + str string + }{ + { + input: ErrAlreadyExists, + cause: ErrAlreadyExists, + }, + { + input: ErrNotFound, + cause: ErrNotFound, + }, + { + input: errors.Wrapf(ErrFailedPrecondition, "test test test"), + cause: ErrFailedPrecondition, + str: "test test test: failed precondition", + }, + { + input: grpc.Errorf(codes.Unavailable, "should be not available"), + cause: ErrUnavailable, + str: "should be not available: unavailable", + }, + { + input: errShouldLeaveAlone, + cause: ErrUnknown, + str: errShouldLeaveAlone.Error() + ": " + ErrUnknown.Error(), + }, + } { + t.Run(testcase.input.Error(), func(t *testing.T) { + t.Logf("input: %v", testcase.input) + gerr := ToGRPC(testcase.input) + t.Logf("grpc: %v", gerr) + ferr := FromGRPC(gerr) + t.Logf("recovered: %v", ferr) + + if errors.Cause(ferr) != testcase.cause { + t.Fatalf("unexpected cause: %v != %v", errors.Cause(ferr), testcase.cause) + } + + expected := testcase.str + if expected == "" { + expected = testcase.cause.Error() + } + if ferr.Error() != expected { + t.Fatalf("unexpected string: %q != %q", ferr.Error(), expected) + } + }) + } + +}