From 9261347a8f9108e68a0aa5763a99dcc9ea78df24 Mon Sep 17 00:00:00 2001 From: jochen Date: Fri, 23 Oct 2026 23:37:49 +0200 Subject: [PATCH] Read a level's digest from mesh-sdk's list form, so kept verdicts hold for a check whose end names a package like token (issue 1930) --- modules/mesh-delivery-checker/go.mod | 2 +- modules/mesh-delivery-checker/go.sum | 4 +- .../internal/check/digestform_test.go | 83 +++++++++++++++++++ .../internal/check/judge.go | 12 ++- 4 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 modules/mesh-delivery-checker/internal/check/digestform_test.go diff --git a/modules/mesh-delivery-checker/go.mod b/modules/mesh-delivery-checker/go.mod index c9e6d4a..e753fa3 100644 --- a/modules/mesh-delivery-checker/go.mod +++ b/modules/mesh-delivery-checker/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-checker go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261023150321-a2c813a6b468 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261023213200-403a5d72ab93 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-checker/go.sum b/modules/mesh-delivery-checker/go.sum index 2a3e9f3..744af4c 100644 --- a/modules/mesh-delivery-checker/go.sum +++ b/modules/mesh-delivery-checker/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261023150321-a2c813a6b468 h1:UcMee+IV2ii5E4dRZdQUaSaeh9IedTFYumuQbBiB0k0= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261023150321-a2c813a6b468/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261023213200-403a5d72ab93 h1:FAiFY2KBKEoZSH49OZTt7/zRBIQxyl5g/KhYrpggbN4= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261023213200-403a5d72ab93/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-checker/internal/check/digestform_test.go b/modules/mesh-delivery-checker/internal/check/digestform_test.go new file mode 100644 index 0000000..c06a2f9 --- /dev/null +++ b/modules/mesh-delivery-checker/internal/check/digestform_test.go @@ -0,0 +1,83 @@ +package check + +import ( + "encoding/json" + "strings" + "testing" + + "git.novox.be/novox/mesh-sdk/go/delivery" +) + +// 1930/AC3: given a check ask whose stored end keeps the digest's packages as a list of {package, digest} (issue 1930), +// or one stored before it with the packages a map keyed by package path, when the same heads are checked a second time, +// then the kept verdicts the first check wrote are read from it: every package it passed is kept, none run again. +func TestKeptVerdictsAreReadFromTheDigestsListForm(t *testing.T) { + for _, tc := range []struct { + name string + old bool + }{{"the list form", false}, {"a map stored before issue 1930", true}} { + t.Run(tc.name, func(t *testing.T) { + b := newBench(t) + var stored []string + b.asks.Answer = func(a delivery.StepAsk) delivery.Step { + s := b.answer(a) + if tc.old && s.State == delivery.StepPassed { + s.Result = oldDigestForm(t, s.Result) + } + stored = append(stored, string(s.Result)) + return s + } + first := b.judge(t, caseOf(t, pullOf(repoA, 7, head1))).Verdict + u := first.Levels[delivery.LevelUnit] + if first.State != delivery.VerdictPass || u.Run == 0 || u.Kept != 0 { + t.Fatalf("the first check = %+v", first) + } + if len(stored) == 0 { + t.Fatal("no ask's end was stored") + } + list := strings.Contains(stored[0], `"packages":[{"package":"fixture/slow"`) + if list == tc.old || strings.Contains(stored[0], `"fixture/slow":"`) != tc.old { + t.Fatalf("the stored end is not in the form under test: %s", stored[0]) + } + b.steps.calls = nil + second := b.judge(t, caseOf(t, pullOf(repoA, 7, head1))).Verdict + if s := second.Levels[delivery.LevelUnit]; second.State != delivery.VerdictPass || s.Kept != u.Run || s.Run != 0 { + t.Fatalf("the second check's unit level = %+v, want %d kept and none run", s, u.Run) + } + if n := len(b.steps.tool("test")); n != 0 { + t.Errorf("%d test steps ran on the second check", n) + } + }) + } +} + +// oldDigestForm rewrites a check answer's level digests to the form stored before issue 1930: packages as a map keyed by +// package path. +func oldDigestForm(t *testing.T, result json.RawMessage) json.RawMessage { + t.Helper() + var a struct { + Fetch json.RawMessage `json:"fetch"` + Levels []map[string]any `json:"levels"` + } + if err := json.Unmarshal(result, &a); err != nil { + t.Fatal(err) + } + for _, l := range a.Levels { + d, ok := l["digest"].(map[string]any) + if !ok { + continue + } + m := map[string]any{} + list, _ := d["packages"].([]any) + for _, p := range list { + pd := p.(map[string]any) + m[pd["package"].(string)] = pd["digest"] + } + d["packages"] = m + } + raw, err := json.Marshal(a) + if err != nil { + t.Fatal(err) + } + return raw +} diff --git a/modules/mesh-delivery-checker/internal/check/judge.go b/modules/mesh-delivery-checker/internal/check/judge.go index a6f134c..4a383fc 100644 --- a/modules/mesh-delivery-checker/internal/check/judge.go +++ b/modules/mesh-delivery-checker/internal/check/judge.go @@ -447,13 +447,11 @@ func (st *state) level(ctx context.Context, t *target, la delivery.LevelAnswer) return fail(t.node, fmt.Sprintf("the check of %s#%d answered the level %q, which is no level", t.pull.Repository, t.pull.Number, level)), 0 } var digests map[string]string - if t.module == buildrun.GoBuildModule && len(la.Digest) > 0 { - var d Digested - if err := json.Unmarshal(la.Digest, &d); err == nil { - digests = d.Packages - if t.runner != "" { - t.judgedBy(d.JudgedBy) // the installed module judged it: the runner is not used again - } + if t.module == buildrun.GoBuildModule && la.Digest != nil { + // The packages come as a list, never keyed by a package path (issue 1930); an answer stored before reads too. + digests = la.Digest.Map() + if t.runner != "" { + t.judgedBy(la.Digest.JudgedBy) // the installed module judged it: the runner is not used again } } if t.runner != "" && la.Judged != "" {