ADR 0593 §7: the composer with its refusals leaves mesh-sdk, so mesh-sdk carries no composition rule. The catalogue functions only the node-engine's composition reaches (Resolve, Resolution's Compose, Declaration, DataItems, LeftOut, Rules and the rest, the settings, placeholder and template refusals, the rendering helpers) are copied with their tests into internal/compose/resolution; a method of a mesh-sdk shape becomes a function taking it first. The composition calls its own copies, and the captured catalogue its tests read lives here now, shared by mesh-compose's tests. Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
58 lines
2.0 KiB
Go
58 lines
2.0 KiB
Go
package resolution
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
mcat "git.novox.be/novox/mesh-sdk/go/catalogue"
|
|
)
|
|
|
|
func TestTheResolverConfigSeatIsGone(t *testing.T) {
|
|
if _, known := mcat.SeatNamed("node-resolver-config"); known {
|
|
t.Error("node-resolver-config is still in the mesh's set; the uplink's holder writes the resolver file")
|
|
}
|
|
// An uplink's holder needs no seat beside it for the file: it is its own.
|
|
if got := DependsOn(nil, mod("networkmanager", nil, nil, nil, mcat.Claim{Name: "node-uplink"})); len(got) != 0 {
|
|
t.Errorf("an uplink holder with nothing declared depends on %v", got)
|
|
}
|
|
}
|
|
|
|
// The catalogue as it is: nothing claims the retired seat, and every manager the mesh knows holds the
|
|
// uplink and writes the resolver file; beside them only a holder of node-resolver does (ADR 0247).
|
|
func TestTheCataloguesUplinksWriteTheResolverFileAndNothingElseDoes(t *testing.T) {
|
|
cat := map[string]mcat.Manifest{}
|
|
for _, m := range theCatalogue(t) {
|
|
cat[m.Module] = m
|
|
}
|
|
if got := PossibleHolders(cat, "node-uplink"); !reflect.DeepEqual(got, uplinks) {
|
|
t.Errorf("node-uplink can be held by %v, not %v", got, uplinks)
|
|
}
|
|
for name, m := range cat {
|
|
for _, c := range m.Claims {
|
|
if c.Name == "node-resolver-config" {
|
|
t.Errorf("%s still claims node-resolver-config", name)
|
|
}
|
|
}
|
|
_, writes := m.Facts["resolvers"]
|
|
isUplink := false
|
|
for _, u := range uplinks {
|
|
isUplink = isUplink || u == name
|
|
}
|
|
for _, f := range m.Facts {
|
|
// Or the machine's own resolver's, where it is held (novox/hq ADR 0247): the uplink's holder
|
|
// steps back from the file there, and nowhere else.
|
|
if f.Path == "/etc/resolv.conf" && !isUplink && !holdsSeat(m, mcat.ResolverSeat) {
|
|
t.Errorf("%s writes /etc/resolv.conf and holds neither the uplink nor the machine's resolver", name)
|
|
}
|
|
}
|
|
for _, r := range m.Resources {
|
|
if r["path"] == "/etc/resolv.conf" {
|
|
t.Errorf("%s declares /etc/resolv.conf as a file of its own", name)
|
|
}
|
|
}
|
|
if isUplink && !writes {
|
|
t.Errorf("%s holds the uplink and does not write the resolver file", name)
|
|
}
|
|
}
|
|
}
|