diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-08-12 16:21:47 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-08-12 16:21:47 +0900 |
| commit | a431f16e6fad74c459f627ef29afc139df0168e4 (patch) | |
| tree | a8deee7ef04421ae142ba7404da20a5ff631dda7 /internal/pkg/pkg_test.go | |
| parent | 1f45d44e7f4af8b7a8b2b5b0933c5ee872759883 (diff) | |
internal/pkg: in-flight error resolution
The DCE is a slow and overcomplicated solution to a simple problem. This change replaces the DCE by resolving errors in-flight.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pkg/pkg_test.go')
| -rw-r--r-- | internal/pkg/pkg_test.go | 108 |
1 files changed, 44 insertions, 64 deletions
diff --git a/internal/pkg/pkg_test.go b/internal/pkg/pkg_test.go index 1313d42c..a6964798 100644 --- a/internal/pkg/pkg_test.go +++ b/internal/pkg/pkg_test.go @@ -11,6 +11,7 @@ import ( "io" "io/fs" "log" + "maps" "net/http" "os" "path/filepath" @@ -861,14 +862,11 @@ func TestCache(t *testing.T) { cure: func(f *pkg.FContext) error { panic("attempting to cure impossible artifact") }, - }, nil, nil, pkg.WNew, &pkg.DependencyCureError{ - { - A: failingFile, - Err: struct { - _ []byte - stub.UniqueError - }{UniqueError: 0xbad}, - }, + }, nil, nil, pkg.WNew, pkg.InputError{ + failingFile: struct { + _ []byte + stub.UniqueError + }{UniqueError: 0xbad}, }}, }) @@ -1949,7 +1947,7 @@ errors during scrub: } } -func TestDependencyCureError(t *testing.T) { +func TestInputError(t *testing.T) { t.Parallel() makeIdent := func(ident ...byte) pkg.Artifact { @@ -1962,56 +1960,24 @@ func TestDependencyCureError(t *testing.T) { testCases := []struct { name string - err pkg.DependencyCureError + err pkg.InputError want string unwrap []error }{ - {"simple", pkg.DependencyCureError{ - {A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)}, - {A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)}, - {A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)}, - {A: makeIdent(0xff, 1), Err: stub.UniqueError(0xbad01)}, - }, `errors curing dependencies: - _wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765184 injected by the test suite - _wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765185 injected by the test suite - _wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765193 injected by the test suite - _w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765199 injected by the test suite`, []error{ - &pkg.CureError{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)}, - &pkg.CureError{A: makeIdent(0xff, 1), Err: stub.UniqueError(0xbad01)}, - &pkg.CureError{A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)}, - &pkg.CureError{A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)}, - }}, - - {"dedup", pkg.DependencyCureError{ - {A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)}, - {A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)}, - {A: makeIdent(0xff, 0xfd), Err: &pkg.DependencyCureError{ - {A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)}, - {A: makeIdent(0xff, 0xc), Err: &pkg.DependencyCureError{ - {A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)}, - {A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)}, - }}, - {A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)}, - {A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)}, - }}, - {A: makeIdent(0xff, 0xff), Err: &pkg.DependencyCureError{ - {A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)}, - {A: makeIdent(0xff, 0xc), Err: &pkg.DependencyCureError{ - {A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)}, - }}, - {A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)}, - }}, - {A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)}, - {A: makeIdent(0xff, 1), Err: stub.UniqueError(0xbad01)}, - }, `errors curing dependencies: + {"simple", pkg.InputError{ + makeIdent(0xff, 9): stub.UniqueError(0xbad09), + makeIdent(0xff, 0): stub.UniqueError(0xbad00), + makeIdent(0xff, 0xf): stub.UniqueError(0xbad0f), + makeIdent(0xff, 1): stub.UniqueError(0xbad01), + }, `errors curing inputs: _wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765184 injected by the test suite _wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765185 injected by the test suite _wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765193 injected by the test suite _w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765199 injected by the test suite`, []error{ - &pkg.CureError{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)}, - &pkg.CureError{A: makeIdent(0xff, 1), Err: stub.UniqueError(0xbad01)}, - &pkg.CureError{A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)}, - &pkg.CureError{A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)}, + stub.UniqueError(0xbad00), + stub.UniqueError(0xbad01), + stub.UniqueError(0xbad09), + stub.UniqueError(0xbad0f), }}, } for _, tc := range testCases { @@ -2022,7 +1988,19 @@ func TestDependencyCureError(t *testing.T) { t.Errorf("Error:\n%s\nwant\n%s", got, tc.want) } - if unwrap := tc.err.Unwrap(); !reflect.DeepEqual(unwrap, tc.unwrap) { + unwrap, unwrapM := tc.err.Unwrap(), make(map[error]struct{}) + for _, a := range unwrap { + unwrapM[a] = struct{}{} + } + + wantUnwrapM := make(map[error]struct{}) + for _, a := range tc.unwrap { + wantUnwrapM[a] = struct{}{} + } + + if len(unwrap) != len(unwrapM) || + len(tc.unwrap) != len(wantUnwrapM) || + !maps.Equal(unwrapM, wantUnwrapM) { t.Errorf("Unwrap: %#v, want %#v", unwrap, tc.unwrap) } }) @@ -2055,19 +2033,21 @@ func (a earlyFailureF) Cure(*pkg.FContext) error { func BenchmarkEarlyDCE(b *testing.B) { msg := message.New(log.New(os.Stderr, "dce: ", 0)) msg.SwapVerbose(testing.Verbose()) - c, err := pkg.Open(b.Context(), msg, check.MustAbs(b.TempDir()), nil) - if err != nil { - b.Fatal(err) - } - _, _, err = c.Cure(earlyFailureF(8)) - if !errors.Is(err, stub.UniqueError(0xcafe)) { - b.Fatalf("Cure: error = %v", err) - } - c.Close() - dce := err.(*pkg.DependencyCureError) for b.Loop() { - dce.Unwrap() + b.StopTimer() + c, err := pkg.Open(b.Context(), msg, check.MustAbs(b.TempDir()), nil) + if err != nil { + b.Fatal(err) + } + b.StartTimer() + _, _, err = c.Cure(earlyFailureF(8)) + b.StopTimer() + if !errors.Is(err, stub.UniqueError(0xcafe)) { + b.Fatalf("Cure: error = %v", err) + } + c.Close() + b.StartTimer() } } |
