69 lines
2.6 KiB
Go
69 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
// placementsOf is the seat mesh-placement's placement of each node, as the vault reads it.
|
|
func placementsOf(t *testing.T, nodes map[string][]string) PlacementReader {
|
|
t.Helper()
|
|
values := map[string][]byte{}
|
|
for node, modules := range nodes {
|
|
p := delivery.Placement{V: delivery.Version, Node: node}
|
|
for _, m := range modules {
|
|
p.Modules = append(p.Modules, delivery.PlacedModule{Module: m})
|
|
}
|
|
// Research 072 row 37: the node key and a key per module.
|
|
kv, err := delivery.PlacementValues(p)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for k, raw := range kv {
|
|
values[k] = raw
|
|
}
|
|
}
|
|
return PlacementReader{
|
|
Keys: func() ([]string, error) {
|
|
var out []string
|
|
for k := range values {
|
|
out = append(out, k)
|
|
}
|
|
return out, nil
|
|
},
|
|
Read: func(key string) ([]byte, error) { return values[key], nil },
|
|
}
|
|
}
|
|
|
|
// 774/AC11 (novox/hq ADR 0561, ADR 0549 §3, §5): with no assignments to read, the vault tells from the seat's
|
|
// placement which node holds the bus and whether a consumer's module stands on its node; while both stand, a module
|
|
// either names stands.
|
|
func TestTheVaultReadsWhereModulesStandFromPlacement(t *testing.T) {
|
|
v := newVault(t, nil)
|
|
v.Placement = placementsOf(t, map[string][]string{"novox": {"nats", "web"}, "ace": {"shop"}})
|
|
if node, err := v.busNode(); err != nil || node != "novox" {
|
|
t.Errorf("the bus node from placement: %q, %v", node, err)
|
|
}
|
|
asked := func(node, module string) CredentialAsked {
|
|
return CredentialAsked{Role: "consumer", Provision: "postgres", Consumer: node, ConsumerModule: module, Provider: "novox"}
|
|
}
|
|
if why := v.credentialRefusal("ace", asked("ace", "shop"), v.plansOf("ace")); why != "" {
|
|
t.Errorf("shop stands on ace by placement, refused: %s", why)
|
|
}
|
|
if why := v.credentialRefusal("ace", asked("ace", "web"), v.plansOf("ace")); !strings.Contains(why, "is not on ace") {
|
|
t.Errorf("web is not placed on ace, and is answered %q", why)
|
|
}
|
|
// While both stand, an assignment still names a module placement does not yet.
|
|
v.Askers = Declared{Read: assignments{"ace.web": `{"node":"ace","module":"web"}`}.read, Store: v.Store}
|
|
if why := v.credentialRefusal("ace", asked("ace", "web"), v.plansOf("ace")); why != "" {
|
|
t.Errorf("web assigned on ace, refused: %s", why)
|
|
}
|
|
// Two nodes placed with the bus: the vault adopts from neither.
|
|
v.Placement = placementsOf(t, map[string][]string{"novox": {"nats"}, "ace": {"nats"}})
|
|
if _, err := v.busNode(); err == nil || !strings.Contains(err.Error(), "2 nodes") {
|
|
t.Errorf("two bus nodes: %v", err)
|
|
}
|
|
}
|