Tests that read ../../../mesh-catalog or ../../../mesh-host gave a verdict that depended on what sat beside the checkout: a stale or dirty sibling failed them on a desktop, and a missing one skipped them unseen. They now read the clone the build seat puts in MESH_CHECK_BESIDE, failing when it is absent there, and elsewhere a copy captured at a named commit. The skip had hidden that the builder test read a module retired by ADR 0190. The systemd reading test no longer counts the machine's own environment.d.
71 lines
2.5 KiB
Go
71 lines
2.5 KiB
Go
package catalogue
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/novox/mesh-controller/internal/beside"
|
|
)
|
|
|
|
// The module holding mesh-broker is the bus, and its account is granted the bus's snapshot API and
|
|
// nothing else (novox/hq ADR 0235). Anything it declared to say or hear on the bus would be granted
|
|
// nothing, so it is refused at the parser rather than silently dropped.
|
|
func TestTheBussAccountSaysNothingOnTheBus(t *testing.T) {
|
|
raw := []byte(`{"module":"bus","version":"1","provides":[{"name":"mesh-bus","scope":"mesh"}],
|
|
"claims":[{"name":"mesh-broker","scope":"mesh"}],"own-secrets":{"broker":"/run/broker"},
|
|
"emits":["something.happened"]}`)
|
|
_, err := ParseManifest(raw)
|
|
if err == nil || !strings.Contains(err.Error(), "granted the bus's snapshot API and nothing else") {
|
|
t.Fatalf("a bus module declaring what it emits was not refused, or not for the reason: %v", err)
|
|
}
|
|
|
|
quiet := []byte(`{"module":"bus","version":"1","provides":[{"name":"mesh-bus","scope":"mesh"}],
|
|
"claims":[{"name":"mesh-broker","scope":"mesh"}],"own-secrets":{"broker":"/run/broker"},
|
|
"tools":["bus_streams"]}`)
|
|
m, err := ParseManifest(quiet)
|
|
if err != nil {
|
|
t.Fatalf("a bus module with an account and tools was refused: %v", err)
|
|
}
|
|
if !m.ClaimsSeat(BrokerSeat) {
|
|
t.Fatal("it does not read as holding the broker seat")
|
|
}
|
|
}
|
|
|
|
// The catalogue's bus protects its streams by the snapshot, not as live files: its streams' item is a
|
|
// dump into its snapshots, it has the account the dump runs as, and the dump runs the snapshot
|
|
// program in the bus's own container.
|
|
func TestTheCataloguesBusIsBackedUpBySnapshot(t *testing.T) {
|
|
raw, err := os.ReadFile(filepath.Join(beside.Catalogue(t), "nats", "module.json"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m, err := ParseManifest(raw)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, account := m.OwnSecrets["broker"]; !account {
|
|
t.Fatal("the bus declares no account, so its snapshot could not reach it")
|
|
}
|
|
var found bool
|
|
if m.Data == nil {
|
|
t.Fatal("the bus declares no data")
|
|
}
|
|
for _, it := range m.Data.Own {
|
|
if it.ID != "jetstream" {
|
|
continue
|
|
}
|
|
found = true
|
|
if !it.Backup.IsDump() || it.Backup.Into != "snapshots" {
|
|
t.Fatalf("the bus's streams are protected by %+v, not a snapshot into its snapshots", it.Backup)
|
|
}
|
|
if !strings.Contains(it.Backup.Dump, "mesh-nats-snapshot snapshot") {
|
|
t.Fatalf("the dump does not run the snapshot program: %s", it.Backup.Dump)
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatal("the bus declares no item for its streams")
|
|
}
|
|
}
|