The agreement check knows the mesh's own roles, and was passing vacuously without them
It read the roles modules declare and not the mesh's own, so the first consumer of a role's event was skipped as "the emitter is not installed" — which is exactly the silence the check exists to break. It passed, and it was checking nothing. Now it is handed the mesh's own roles too, and there is a case pinning that a consumer of a role event the role does not emit is caught. A check that cannot fail is worse than no check, because it reads as evidence.
This commit is contained in:
@@ -6,6 +6,8 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/novox/mesh-controller/internal/catalogue"
|
||||||
)
|
)
|
||||||
|
|
||||||
// **Do the catalogue's emitters and consumers agree?**
|
// **Do the catalogue's emitters and consumers agree?**
|
||||||
@@ -53,6 +55,14 @@ func TestTheAgreementCheckCatchesASubscriptionThatMatchesNothing(t *testing.T) {
|
|||||||
t.Fatalf("a wildcard over emitters was reported: %v", bad)
|
t.Fatalf("a wildcard over emitters was reported: %v", bad)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A consumer of a role's event whose role does not emit it is caught, which is what stops the
|
||||||
|
// catalogue check above from passing by knowing nothing about roles.
|
||||||
|
if bad := Disagreements(nil,
|
||||||
|
[]AConsumer{{Module: "mesh-catalog", Consumes: []string{"mesh-build-machine.finished"}}},
|
||||||
|
[]DeclaredSeat{{Name: "mesh-build-machine", Emits: []string{"built"}}}); len(bad) != 1 {
|
||||||
|
t.Fatalf("a consumer of a role event the role does not emit was not caught: %v", bad)
|
||||||
|
}
|
||||||
|
|
||||||
// An event published under a seat's name is real even though no module declares it as its own.
|
// An event published under a seat's name is real even though no module declares it as its own.
|
||||||
if bad := Disagreements(nil,
|
if bad := Disagreements(nil,
|
||||||
[]AConsumer{{Module: "watcher", Consumes: []string{"mesh-artifact-store.image.pushed"}}},
|
[]AConsumer{{Module: "watcher", Consumes: []string{"mesh-artifact-store.image.pushed"}}},
|
||||||
@@ -70,7 +80,13 @@ func theCataloguesEvents(t *testing.T) ([]AnEmitter, []AConsumer, []DeclaredSeat
|
|||||||
}
|
}
|
||||||
var emitters []AnEmitter
|
var emitters []AnEmitter
|
||||||
var consumers []AConsumer
|
var consumers []AConsumer
|
||||||
|
// The mesh's own roles, which emit under the seat's name rather than any module's (novox/hq
|
||||||
|
// ADR 0121). Without these the check skips every consumer of a role's event as "the emitter is
|
||||||
|
// not installed" — which is how it passed vacuously the first time one existed.
|
||||||
var seats []DeclaredSeat
|
var seats []DeclaredSeat
|
||||||
|
for _, own := range catalogue.SeatsWithAProtocol() {
|
||||||
|
seats = append(seats, DeclaredSeat{Name: own.Name, Accepts: own.Accepts, Emits: own.Emits})
|
||||||
|
}
|
||||||
for _, e := range entries {
|
for _, e := range entries {
|
||||||
if !e.IsDir() {
|
if !e.IsDir() {
|
||||||
continue
|
continue
|
||||||
|
|||||||
Reference in New Issue
Block a user