The controller grants a read only from the owner's announcement (ADR 0495 clause 3). gitea announced `bound` unreadable, so mesh-provisioner bound no forge account; disk-load announced `readings` unreadable, refused to restic, nfs-server and mounts; restic announced `good` unreadable, which the self-check reads. Nothing in the catalogue compared readers with announcements since the gate's manifest check went (clause 5). Quick fix: mark those three states readable. Thorough fix: also checks/readable, which reads every owner's Go and TypeScript announcement and refuses any `reads` of a state it does not announce readable, so the next owner to announce cannot repeat it. Chose thorough: the same kind hit three owners at once. Reads of other repositories' owners (mesh-controller.lease, mesh-grants.accounts) are not judged here.
91 lines
3.9 KiB
Go
91 lines
3.9 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// A read of another module's state is refused here when the owner's code announces that state not readable, or not at
|
|
// all (the sweep of 2026-10-30, issue 774); an owner that announces nothing from code, or lives in another repository,
|
|
// is not judged.
|
|
func TestFindings(t *testing.T) {
|
|
const goOwner = "package main\n\nimport \"git.novox.be/novox/mesh-sdk/go/announce\"\n\n"
|
|
for _, row := range []struct {
|
|
name string
|
|
files map[string]string
|
|
want string // empty: clean
|
|
}{
|
|
{"go, readable by a constant", map[string]string{
|
|
"modules/r/module.json": `{"module":"r","reads":["o.s"]}`,
|
|
"modules/o/module.json": `{"module":"o"}`,
|
|
"modules/o/cmd/o/main.go": goOwner + "const S = \"s\"\n\nvar _ = announce.State{Name: S, Readable: true}\n",
|
|
"modules/o/cmd/o/main_test.go": goOwner + "var _ = announce.State{Name: \"s\"}\n"}, ""},
|
|
{"go, not readable", map[string]string{
|
|
"modules/r/module.json": `{"module":"r","reads":["o.s"]}`,
|
|
"modules/o/module.json": `{"module":"o"}`,
|
|
"modules/o/cmd/o/main.go": goOwner + "var Kept = []announce.State{{Name: \"t\", Readable: true}, {Name: \"s\"}}\n"},
|
|
"r reads o.s, which o's code announces not readable"},
|
|
{"go, a known mesh-sdk name and readers", map[string]string{
|
|
"modules/r/module.json": `{"module":"r","reads":["o.good","o.s"]}`,
|
|
"modules/o/module.json": `{"module":"o"}`,
|
|
"modules/o/cmd/o/main.go": goOwner + "var _ = []announce.State{{Name: health.GoodState, Readable: true}, {Name: \"s\", Readers: []string{\"r\"}}}\n"}, ""},
|
|
{"go, a name that cannot be read", map[string]string{
|
|
"modules/r/module.json": `{"module":"r","reads":["o.s"]}`,
|
|
"modules/o/module.json": `{"module":"o"}`,
|
|
"modules/o/cmd/o/main.go": goOwner + "var _ = announce.State{Name: other.S, Readable: true}\n"},
|
|
"the state's name other.S cannot be read"},
|
|
{"go, a state not announced", map[string]string{
|
|
"modules/r/module.json": `{"module":"r","reads":["o.s"]}`,
|
|
"modules/o/module.json": `{"module":"o"}`,
|
|
"modules/o/cmd/o/main.go": goOwner + "var _ = announce.State{Name: \"t\"}\n"},
|
|
"r reads o.s, which o's code does not announce"},
|
|
{"typescript, not readable", map[string]string{
|
|
"modules/r/module.json": `{"module":"r","reads":["o.bound"]}`,
|
|
"modules/o/module.json": `{"module":"o"}`,
|
|
"modules/o/kept.ts": `export const KEPT = [{ name: "announced" }, { name: "bound" }];`},
|
|
"r reads o.bound, which o's code announces not readable"},
|
|
{"typescript, readable", map[string]string{
|
|
"modules/r/module.json": `{"module":"r","reads":["o.bound"]}`,
|
|
"modules/o/module.json": `{"module":"o"}`,
|
|
"modules/o/index.ts": `await keeps([{ name: "bound", readable: true }]);`}, ""},
|
|
{"an owner that announces nothing, and one outside the catalogue", map[string]string{
|
|
"modules/r/module.json": `{"module":"r","reads":["o.s","mesh-controller.lease"]}`,
|
|
"modules/o/module.json": `{"module":"o"}`,
|
|
"modules/o/cmd/o/main.go": "package main\n\nvar _ = 1\n"}, ""},
|
|
} {
|
|
t.Run(row.name, func(t *testing.T) {
|
|
root := t.TempDir()
|
|
for path, text := range row.files {
|
|
p := filepath.Join(root, path)
|
|
if err := os.MkdirAll(filepath.Dir(p), 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(p, []byte(text), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
got, err := Findings(root)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
joined := strings.Join(got, "\n")
|
|
if row.want == "" && len(got) != 0 || row.want != "" && !strings.Contains(joined, row.want) {
|
|
t.Errorf("findings %q, want %q", joined, row.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// The catalogue itself: every state a module reads of another module that announces from code is announced readable.
|
|
func TestTheCatalogueReadsOnlyWhatItsOwnersAnnounceReadable(t *testing.T) {
|
|
got, err := Findings(filepath.Join("..", ".."))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, f := range got {
|
|
t.Error(f)
|
|
}
|
|
}
|