diff --git a/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/integration_test.go b/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/integration_test.go index 6b39ca3..be4d4da 100644 --- a/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/integration_test.go +++ b/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/integration_test.go @@ -89,6 +89,8 @@ type fakeBuildModules struct { // beside is, by workspace, the siblings the fetch placed in it as ` `, sorted: a digest echoes them // (1929/AC2; mesh-sdk buildstep.besideOf), or the level runs whole and keeps nothing. beside map[string][]string + // names are the nodes' names the last check ask carried, for the names check (ADR 0567 §12). + names []string } func (f *fakeBuildModules) count(tool string) int { @@ -191,7 +193,14 @@ func (f *fakeBuildModules) serve(t *testing.T, module string, kept jetstream.Key } p := &buildstep.Puller{Source: &buildstep.JetStreamAsks{JS: f.js, Language: language}, Language: language, Node: "n1", Put: put, Capacity: func() int { return 2 }, PullWait: 200 * time.Millisecond, - Run: func(ctx context.Context, a delivery.StepAsk) (any, error) { return buildstep.RunAsk(ctx, steps, a) }} + Run: func(ctx context.Context, a delivery.StepAsk) (any, error) { + if a.Check != nil { + f.mu.Lock() + f.names = a.Check.NodeNames + f.mu.Unlock() + } + return buildstep.RunAsk(ctx, steps, a) + }} go func() { _ = p.Pull(f.ctx) }() } @@ -334,6 +343,7 @@ func startBed(t *testing.T) *bed { t.Fatal(err) } b.setOnline(t, "n1", true) + b.setNode(t, "n1") for _, module := range []string{"mesh-build-go", "mesh-build-node"} { b.setHealth(t, "n1", module) } @@ -366,6 +376,20 @@ func (b *bed) setOnline(t *testing.T, node string, online bool) { } } +// setNode writes the node's record in the node-engine's have, as the node-engine does, so the checker names it in each +// check ask (ADR 0567 §12); with no record the checker asks no check. +func (b *bed) setNode(t *testing.T, node string) { + t.Helper() + data, err := delivery.EncodeNodeRecord(delivery.NodeRecord{V: 1, Node: node}) + if err != nil { + t.Fatal(err) + } + key, _ := delivery.HaveNodeKey(node) + if _, err := b.buckets[delivery.HaveBucket].Put(b.ctx, key, data); err != nil { + t.Fatal(err) + } +} + func (b *bed) setHealth(t *testing.T, node, module string) { t.Helper() data, err := delivery.EncodeHave(delivery.Have{Phase: delivery.PhaseRunning, Health: delivery.HealthOK}) @@ -493,6 +517,12 @@ func TestCheckerJudgesACandidateAndOwesItsStatus(t *testing.T) { // N6/AC5, 1300 if v.Composition == nil || v.Composition.State != delivery.CompositionNotRun || len(v.Machines) != 1 || v.Machines[0] != "n1" { t.Errorf("composition %+v machines %v", v.Composition, v.Machines) } + b.fake.mu.Lock() + names := b.fake.names + b.fake.mu.Unlock() + if len(names) != 1 || names[0] != "n1" { + t.Errorf("the check ask named the nodes %v, want [n1] from the have's node record", names) + } o := b.owed(t, 7, head1, "success") if o.Context != delivery.StatusContextCheck || !strings.HasPrefix(o.Text, "pass 111111111111 on aaaaaaaaaaaa") || !strings.Contains(o.Text, "unit 2 run") { t.Errorf("owed = %+v", o)