Show in a proposal's brief what stays held as each node holds it today (issue 1126)
mesh/delivery-group group fix/1126-seed-held rejected: composed together: the checker's verdict at the members' heads (2b8e3078c117): the composition
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: the composition: the manifest of mesh-delivery-assigner uses what mesh-controller at ba4d15657343d3116bd6657f85e53630a7dbabf2 (mesh…
mesh/delivery-group group fix/1126-seed-held rejected: composed together: the checker's verdict at the members' heads (2b8e3078c117): the composition
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: the composition: the manifest of mesh-delivery-assigner uses what mesh-controller at ba4d15657343d3116bd6657f85e53630a7dbabf2 (mesh…
This commit is contained in:
@@ -209,7 +209,7 @@ func JudgeAnswers(p delivery.PlacementProposal, intended map[string]map[string]b
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Brief is the verdict as the ask's brief shows it, by node (§5): what the proposal changes and what each node answered
|
// Brief is the verdict as the ask's brief shows it, by node (§5): what the proposal changes and what each node answered
|
||||||
// beside it, marked, with the proposal's why.
|
// beside it, marked, and what stays held as the node holds it today, with the proposal's why.
|
||||||
func Brief(p delivery.PlacementProposal, v delivery.PlacementVerdict) string {
|
func Brief(p delivery.PlacementProposal, v delivery.PlacementVerdict) string {
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
fmt.Fprintf(&b, "%s (proposed by %s)", p.Why, p.By)
|
fmt.Fprintf(&b, "%s (proposed by %s)", p.Why, p.By)
|
||||||
@@ -223,6 +223,11 @@ func Brief(p delivery.PlacementProposal, v delivery.PlacementVerdict) string {
|
|||||||
for _, n := range p.Nodes() {
|
for _, n := range p.Nodes() {
|
||||||
nodes[n] = true
|
nodes[n] = true
|
||||||
}
|
}
|
||||||
|
for n, a := range v.Answers {
|
||||||
|
if len(a.Held) > 0 {
|
||||||
|
nodes[n] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
names := make([]string, 0, len(nodes))
|
names := make([]string, 0, len(nodes))
|
||||||
for n := range nodes {
|
for n := range nodes {
|
||||||
names = append(names, n)
|
names = append(names, n)
|
||||||
@@ -238,6 +243,13 @@ func Brief(p delivery.PlacementProposal, v delivery.PlacementVerdict) string {
|
|||||||
if m := v.Unintended[n]; len(m) > 0 {
|
if m := v.Unintended[n]; len(m) > 0 {
|
||||||
fmt.Fprintf(&b, "; also differs, not computed: %s", strings.Join(m, ", "))
|
fmt.Fprintf(&b, "; also differs, not computed: %s", strings.Join(m, ", "))
|
||||||
}
|
}
|
||||||
|
if held := v.Answers[n].Held; len(held) > 0 {
|
||||||
|
var names []string
|
||||||
|
for _, h := range held {
|
||||||
|
names = append(names, h.Module)
|
||||||
|
}
|
||||||
|
fmt.Fprintf(&b, "; stays held as today: %s", strings.Join(names, ", "))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ func TestJudge(t *testing.T) {
|
|||||||
Refusals: []delivery.ModuleRefused{{Module: "web", Why: "no own secret"}}}}, nil, delivery.VerdictFail, "laptop refuses", ""},
|
Refusals: []delivery.ModuleRefused{{Module: "web", Why: "no own secret"}}}}, nil, delivery.VerdictFail, "laptop refuses", ""},
|
||||||
{"a node not answering, within its bound", false, map[string]*delivery.CandidateAnswer{"anchor": same(7)}, map[string]bool{"laptop": true}, delivery.VerdictWaits, "laptop (offline)", ""},
|
{"a node not answering, within its bound", false, map[string]*delivery.CandidateAnswer{"anchor": same(7)}, map[string]bool{"laptop": true}, delivery.VerdictWaits, "laptop (offline)", ""},
|
||||||
{"an answer of an earlier revision, past its bound", false, map[string]*delivery.CandidateAnswer{"anchor": same(6), "laptop": same(8)}, nil, delivery.VerdictFail, "anchor did not answer", ""},
|
{"an answer of an earlier revision, past its bound", false, map[string]*delivery.CandidateAnswer{"anchor": same(6), "laptop": same(8)}, nil, delivery.VerdictFail, "anchor did not answer", ""},
|
||||||
|
{"a module held as today passes, shown in the brief", false, map[string]*delivery.CandidateAnswer{"anchor": same(7), "laptop": {Proposal: "p-one", Revision: 8,
|
||||||
|
Verdict: delivery.CandidateSame, Held: []delivery.ModuleRefused{{Module: "spiegel", Why: "a required value is unset"}}}}, nil, delivery.VerdictPass, "", ""},
|
||||||
{"its later answer", false, map[string]*delivery.CandidateAnswer{"anchor": same(7), "laptop": same(8)}, nil, delivery.VerdictPass, "", ""},
|
{"its later answer", false, map[string]*delivery.CandidateAnswer{"anchor": same(7), "laptop": same(8)}, nil, delivery.VerdictPass, "", ""},
|
||||||
} {
|
} {
|
||||||
q := p
|
q := p
|
||||||
@@ -61,6 +63,9 @@ func TestJudge(t *testing.T) {
|
|||||||
if v.State != row.state || !strings.Contains(all, row.words) {
|
if v.State != row.state || !strings.Contains(all, row.words) {
|
||||||
t.Errorf("%s: %s, %q", row.name, v.State, all)
|
t.Errorf("%s: %s, %q", row.name, v.State, all)
|
||||||
}
|
}
|
||||||
|
if strings.HasPrefix(row.name, "a module held as today") && !strings.Contains(Brief(q, v), "stays held as today: spiegel") {
|
||||||
|
t.Errorf("%s: the brief does not show it: %s", row.name, Brief(q, v))
|
||||||
|
}
|
||||||
if row.marked != "" && (!slices.Contains(v.Unintended["anchor"], row.marked) || !strings.Contains(Brief(q, v), "not computed: "+row.marked)) {
|
if row.marked != "" && (!slices.Contains(v.Unintended["anchor"], row.marked) || !strings.Contains(Brief(q, v), "not computed: "+row.marked)) {
|
||||||
t.Errorf("%s: the difference is not marked: %+v, %s", row.name, v.Unintended, Brief(q, v))
|
t.Errorf("%s: the difference is not marked: %+v, %s", row.name, v.Unintended, Brief(q, v))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user