package catalogue import ( "slices" "strings" "testing" ) // Issue 1126 B1/AC1, B2/AC1 (ADR 0590 clause 5): the seat set holds no mesh-controller, and the dependence check refuses // every manifest that reads (the lease too), invokes, consumes, waits on, uses, claims, requires or is mesh-controller. func TestNothingMayNameTheController(t *testing.T) { for _, s := range DefaultSeats() { if s.Name == EndedControllerName { t.Errorf("the seat set still holds %s", s.Name) } } if _, ok := SeatNamed(EndedControllerName); ok { t.Errorf("SeatNamed still finds %s", EndedControllerName) } for _, row := range []struct { name, manifest string want []string // " " }{ {"a read of the lease", `{"module":"mod-l","version":"1","reads":["mesh-controller.lease"]}`, []string{"read mesh-controller.lease"}}, {"the controller's own manifest", `{"module":"mesh-controller","version":"1"}`, []string{"is mesh-controller"}}, {"a claim of its seat", `{"module":"a-controller","version":"1","claims":[{"name":"mesh-controller","scope":"mesh"}]}`, []string{"claims mesh-controller"}}, {"each declaration kind; every tool (*) is none", `{"module":"mod-i","version":"1","invokes":["seat:mesh-controller.root-free","mesh-controller.status","*","nats.nats_users"],` + `"consumes":["mesh-controller.artifacts-gone","mod-x.thing"],"uses":["mesh-controller"],"waits":["mesh-controller.checked"],` + `"requires":["mesh-controller"]}`, []string{"consume mesh-controller.artifacts-gone", "invoke mesh-controller.status", "invoke seat:mesh-controller.root-free", "requires mesh-controller", "uses mesh-controller", "waits mesh-controller.checked"}}, {"a process's own invoke", `{"module":"mod-p","version":"1","resources":[{"id":"account","type":"user","name":"mod-p"},` + `{"id":"worker","type":"process","run":["./w"],"user":"mod-p","bus":{"invokes":["seat:mesh-controller.held"]}}]}`, []string{"invoke seat:mesh-controller.held"}}, {"a module on its own seats", `{"module":"mod-ok","version":"1","reads":["mesh-grants.accounts"],"invokes":["*"]}`, nil}, } { m, err := Decode([]byte(row.manifest)) if err != nil { t.Fatalf("%s: %v", row.name, err) } var got []string for _, d := range Dependencies(map[string]Manifest{m.Module: m}) { got = append(got, d.Kind+" "+d.What) } if !slices.Equal(got, row.want) { t.Errorf("%s: dependencies %q, want %q", row.name, got, row.want) } refused := ManifestRefusals(map[string]Manifest{m.Module: m}) if len(refused) != len(row.want) || len(refused) > 0 && !strings.Contains(refused[0], "ADR 0590") { t.Errorf("%s: refused %q", row.name, refused) } } if got := ManifestRefusals(map[string]Manifest{}); len(got) != 1 || !strings.Contains(got[0], "no manifest") { t.Errorf("no manifest given: %q", got) } }