diff --git a/internal/errors/errors.go b/internal/errors/errors.go index 4fddf39d..377d2ab1 100644 --- a/internal/errors/errors.go +++ b/internal/errors/errors.go @@ -116,7 +116,7 @@ func (invalidUTF8Error) InvalidUTF8() bool { return true } // returns an error that has a "proto" prefix. func New(f string, x ...interface{}) error { for i := 0; i < len(x); i++ { - if e, ok := x[i].(prefixError); ok { + if e, ok := x[i].(*prefixError); ok { x[i] = e.s // avoid "proto: " prefix when chaining } } diff --git a/internal/errors/errors_test.go b/internal/errors/errors_test.go index 8dd635ec..1d6464df 100644 --- a/internal/errors/errors_test.go +++ b/internal/errors/errors_test.go @@ -7,6 +7,7 @@ package errors import ( "errors" "reflect" + "strings" "testing" ) @@ -91,3 +92,24 @@ type customRequiredNotSetError struct{} func (customRequiredNotSetError) Error() string { return "required field not set" } func (customRequiredNotSetError) RequiredNotSet() bool { return true } + +func TestNewPrefix(t *testing.T) { + e1 := New("abc") + got := e1.Error() + if !strings.HasPrefix(got, "proto:") { + t.Errorf("missing \"proto:\" prefix in %q", got) + } + if !strings.Contains(got, "abc") { + t.Errorf("missing text \"abc\" in %q", got) + } + + e2 := New("%v", e1) + got = e2.Error() + if !strings.HasPrefix(got, "proto:") { + t.Errorf("missing \"proto:\" prefix in %q", got) + } + // Test to make sure prefix is removed from the embedded error. + if strings.Contains(strings.TrimPrefix(got, "proto:"), "proto:") { + t.Errorf("prefix \"proto:\" not elided in embedded error: %q", got) + } +}