Files
mesh-controller/internal/inventory/streams_test.go
T
jochen f75cd0239d Hear a restricted stream only from a module's own account, never the tool runner's (issue 727)
The tool runner's bus account carried the heard grants, consumer and bind word of every module it runs, and every agent session on that machine reaches the bus as that account, so any session could pull a granted module's consumer on MAIL. Per ADR 0376 §1 the controller now composes a restricted stream's consumer, grants and bind word only for a module that declares runs-as; registration refuses a consumes of a restricted stream without runs-as (§2), and a grant that composes nothing is said in doctor (D-heard) and in the controller's log on every raise and send.
2026-10-15 14:11:37 +02:00

46 lines
1.9 KiB
Go

package inventory
import (
"encoding/json"
"slices"
"testing"
"github.com/novox/mesh-controller/internal/catalogue"
)
// A machine's layer wins over the mesh's for the setting that restricts a stream (novox/hq ADR 0363 §5).
func TestARestrictingSettingIsReadMachineOverMesh(t *testing.T) {
layers := []catalogue.Layer{
{From: catalogue.MeshWideLayer, Values: map[string]any{"grants": "mesh", "other": 1}},
{From: "novox", Values: map[string]any{"grants": "novox"}},
}
if v, set := settingValue(layers, "grants"); !set || v != "novox" {
t.Fatalf("read %v, %v", v, set)
}
if _, set := settingValue(layers[:1], "absent"); set {
t.Fatal("a key no layer sets read as set")
}
}
// What a consumer hears is composed into the bus's subjects, and what a stream carries leaves EVENTS.
func TestWhatAModuleHearsIsComposedOntoTheStreamsSubjects(t *testing.T) {
provider := catalogue.Manifest{Module: "mesh-mail", Streams: []catalogue.StreamDeclaration{{Name: "mail",
Events: []string{"mail.*.message.added"}, Grant: &catalogue.StreamGrant{Config: "grants", Events: "mail.{key}.**"}}}}
var value any
_ = json.Unmarshal([]byte(`{"mesh":["reader"]}`), &value)
grants := grantValues{"mesh-mail/grants": {value}}
reader := catalogue.Manifest{Module: "reader"}
hears, touches, onEvents := hearsOf(reader, map[string]catalogue.Manifest{"mesh-mail": provider}, "ace", grants,
[]string{"mesh-mail.mail.**", "billing.paid"})
if !touches || len(hears) != 1 || hears[0].Stream != "MAIL" || !hears[0].Restricted ||
!slices.Equal(hears[0].Filters, []string{"mesh.stream.mesh-mail.event.mail.mesh.message.added"}) {
t.Fatalf("heard %+v", hears)
}
if !slices.Equal(onEvents, []string{"billing.paid"}) {
t.Fatalf("left on EVENTS: %v", onEvents)
}
if got := streamsOf(provider); len(got) != 1 || got[0].Name != "MAIL" || got[0].MaxAgeDays != 7 || !got[0].Restricted {
t.Fatalf("the provider's stream: %+v", got)
}
}