aboutsummaryrefslogtreecommitdiff
path: root/src/errors/wrap_test.go
diff options
context:
space:
mode:
authorJulien Cretel <jub0bsinthecloud@gmail.com>2025-09-29 16:57:53 +0000
committerDamien Neil <dneil@google.com>2025-09-30 10:22:08 -0700
commita846bb0aa523c8781248161b63bc2ab6a245cec1 (patch)
treec43a403c0e8fde2fd9c6019428cddc74710cf4e5 /src/errors/wrap_test.go
parent7c8166d02d36a5dfcdbe3dd1b148412cceacf9f2 (diff)
downloadgo-a846bb0aa523c8781248161b63bc2ab6a245cec1.tar.xz
errors: add AsType
Fixes #51945 Change-Id: Icda169782e796578eba728938134a85b5827d3b6 GitHub-Last-Rev: c6ff335ee1ffb6b7975141795a4632a55247299d GitHub-Pull-Request: golang/go#75621 Reviewed-on: https://go-review.googlesource.com/c/go/+/707235 Reviewed-by: Carlos Amedee <carlos@golang.org> Reviewed-by: Damien Neil <dneil@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Sean Liao <sean@liao.dev>
Diffstat (limited to 'src/errors/wrap_test.go')
-rw-r--r--src/errors/wrap_test.go126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/errors/wrap_test.go b/src/errors/wrap_test.go
index 58ed95fd9a..81c795a6bb 100644
--- a/src/errors/wrap_test.go
+++ b/src/errors/wrap_test.go
@@ -239,6 +239,123 @@ func TestAsValidation(t *testing.T) {
}
}
+func TestAsType(t *testing.T) {
+ var errT errorT
+ var errP *fs.PathError
+ type timeout interface {
+ Timeout() bool
+ error
+ }
+ _, errF := os.Open("non-existing")
+ poserErr := &poser{"oh no", nil}
+
+ testAsType(t,
+ nil,
+ errP,
+ false,
+ )
+ testAsType(t,
+ wrapped{"pitied the fool", errorT{"T"}},
+ errorT{"T"},
+ true,
+ )
+ testAsType(t,
+ errF,
+ errF,
+ true,
+ )
+ testAsType(t,
+ errT,
+ errP,
+ false,
+ )
+ testAsType(t,
+ wrapped{"wrapped", nil},
+ errT,
+ false,
+ )
+ testAsType(t,
+ &poser{"error", nil},
+ errorT{"poser"},
+ true,
+ )
+ testAsType(t,
+ &poser{"path", nil},
+ poserPathErr,
+ true,
+ )
+ testAsType(t,
+ poserErr,
+ poserErr,
+ true,
+ )
+ testAsType(t,
+ errors.New("err"),
+ timeout(nil),
+ false,
+ )
+ testAsType(t,
+ errF,
+ errF.(timeout),
+ true)
+ testAsType(t,
+ wrapped{"path error", errF},
+ errF.(timeout),
+ true,
+ )
+ testAsType(t,
+ multiErr{},
+ errT,
+ false,
+ )
+ testAsType(t,
+ multiErr{errors.New("a"), errorT{"T"}},
+ errorT{"T"},
+ true,
+ )
+ testAsType(t,
+ multiErr{errorT{"T"}, errors.New("a")},
+ errorT{"T"},
+ true,
+ )
+ testAsType(t,
+ multiErr{errorT{"a"}, errorT{"b"}},
+ errorT{"a"},
+ true,
+ )
+ testAsType(t,
+ multiErr{multiErr{errors.New("a"), errorT{"a"}}, errorT{"b"}},
+ errorT{"a"},
+ true,
+ )
+ testAsType(t,
+ multiErr{wrapped{"path error", errF}},
+ errF.(timeout),
+ true,
+ )
+ testAsType(t,
+ multiErr{nil},
+ errT,
+ false,
+ )
+}
+
+type compError interface {
+ comparable
+ error
+}
+
+func testAsType[E compError](t *testing.T, err error, want E, wantOK bool) {
+ t.Helper()
+ name := fmt.Sprintf("AsType[%T](Errorf(..., %v))", want, err)
+ t.Run(name, func(t *testing.T) {
+ got, gotOK := errors.AsType[E](err)
+ if gotOK != wantOK || got != want {
+ t.Fatalf("got %v, %t; want %v, %t", got, gotOK, want, wantOK)
+ }
+ })
+}
+
func BenchmarkIs(b *testing.B) {
err1 := errors.New("1")
err2 := multiErr{multiErr{multiErr{err1, errorT{"a"}}, errorT{"b"}}}
@@ -260,6 +377,15 @@ func BenchmarkAs(b *testing.B) {
}
}
+func BenchmarkAsType(b *testing.B) {
+ err := multiErr{multiErr{multiErr{errors.New("a"), errorT{"a"}}, errorT{"b"}}}
+ for range b.N {
+ if _, ok := errors.AsType[errorT](err); !ok {
+ b.Fatal("AsType failed")
+ }
+ }
+}
+
func TestUnwrap(t *testing.T) {
err1 := errors.New("1")
erra := wrapped{"wrap 2", err1}