69 lines
4.5 KiB
Go
69 lines
4.5 KiB
Go
package delivery
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func composedOf(module string, c byte, data bool, resources ...string) Composed {
|
|
out := Composed{Node: "ace", Module: module, FP: SourcePrefix2 + strings.Repeat(string(c), 64), Data: data}
|
|
for _, r := range resources {
|
|
out.Resources = append(out.Resources, json.RawMessage(r))
|
|
}
|
|
return out
|
|
}
|
|
|
|
// The pairs mesh-controller's composed_judge_test.go captured (issue 1945 AC12), and the bus's user list, judged as the
|
|
// controller judges them (ADR 0377 §3, ADR 0539 §7), by the node agent's function (ADR 0547 §3, issue 1126 S8).
|
|
func TestJudgeMove(t *testing.T) {
|
|
const (
|
|
container = `{"id":"mesh-mail.server","type":"container","module":"mesh-mail","name":"mail","image":"mail@sha256:1111111111111111111111111111111111111111111111111111111111111111","volumes":["/var/lib/mesh-mail/spool:/spool"]}`
|
|
container2 = `{"id":"mesh-mail.server","type":"container","module":"mesh-mail","name":"mail","image":"mail@sha256:2222222222222222222222222222222222222222222222222222222222222222","volumes":["/var/lib/mesh-mail/spool:/spool"]}`
|
|
spool = `{"id":"mesh-mail.spool","type":"directory","module":"mesh-mail","path":"/var/lib/mesh-mail/spool"}`
|
|
spoolMoved = `{"id":"mesh-mail.spool","type":"directory","module":"mesh-mail","path":"/srv/mesh-mail/spool"}`
|
|
tools = `{"id":"mesh-mail.tools","type":"file","module":"mesh-mail","path":"/usr/lib/mesh-mail/tools.json","content":"a"}`
|
|
tools2 = `{"id":"mesh-mail.tools","type":"file","module":"mesh-mail","path":"/usr/lib/mesh-mail/tools.json","content":"b"}`
|
|
config = `{"id":"mesh-mail.conf","type":"file","module":"mesh-mail","path":"/var/lib/mesh-mail/spool/conf","content":"a"}`
|
|
config2 = `{"id":"mesh-mail.conf","type":"file","module":"mesh-mail","path":"/var/lib/mesh-mail/spool/conf","content":"b"}`
|
|
process = `{"id":"mesh-mail.daemon","type":"process","module":"mesh-mail","exec":"/usr/bin/a"}`
|
|
process2 = `{"id":"mesh-mail.daemon","type":"process","module":"mesh-mail","exec":"/usr/bin/b"}`
|
|
users = `{"id":"nats.bus-users","type":"file","module":"nats","path":"/etc/nats/users","content":"a"}`
|
|
users2 = `{"id":"nats.bus-users","type":"file","module":"nats","path":"/etc/nats/users","content":"b"}`
|
|
natsConf = `{"id":"nats.conf","type":"file","module":"nats","path":"/etc/nats/conf","content":"a"}`
|
|
natsConf2 = `{"id":"nats.conf","type":"file","module":"nats","path":"/etc/nats/conf","content":"b"}`
|
|
)
|
|
mail := func(c byte, data bool, rs ...string) *Composed {
|
|
m := composedOf("mesh-mail", c, data, rs...)
|
|
return &m
|
|
}
|
|
bus := func(rs ...string) *Composed { m := composedOf("nats", 'b', false, rs...); return &m }
|
|
for _, c := range []struct {
|
|
name string
|
|
from, to *Composed
|
|
want Judgement
|
|
userList bool
|
|
}{
|
|
{"a new image", mail('a', true, container, spool, tools), mail('b', true, container2, spool, tools), JudgedRecreates, false},
|
|
{"a container gone", mail('a', true, container, spool), mail('b', true, spool), JudgedRecreates, false},
|
|
{"its spool moved", mail('a', true, container, spool), mail('b', true, container, spoolMoved), JudgedMovesData, false},
|
|
{"a file in its spool", mail('a', true, container, spool, config), mail('b', true, container, spool, config2), JudgedMovesData, false},
|
|
{"its data declaration", mail('a', false, container, spool), mail('b', true, container, spool), JudgedMovesData, false},
|
|
{"a process of a module with data", mail('a', true, spool, process), mail('b', true, spool, process2), JudgedMovesData, false},
|
|
{"a process of a module without", mail('a', false, process), mail('b', false, process2), JudgedNeither, false},
|
|
{"its tools only", mail('a', true, container, spool, tools), mail('b', true, container, spool, tools2), JudgedNeither, false},
|
|
{"never ran", nil, mail('b', true, container), JudgedNeither, false},
|
|
{"equal, written otherwise", mail('a', true, `{"type":"directory","id":"mesh-mail.spool","module":"mesh-mail","path":"/var/lib/mesh-mail/spool"}`), mail('b', true, spool), JudgedUnchanged, false},
|
|
{"only the user list", bus(natsConf, users), bus(natsConf, users2), JudgedNeither, true},
|
|
{"the user list and more", bus(natsConf, users), bus(natsConf2, users2), JudgedNeither, false},
|
|
} {
|
|
got := JudgeMove(c.from, *c.to)
|
|
if got.Judgement != c.want || got.UserListOnly != c.userList || got.Words == "" {
|
|
t.Errorf("%s: %+v, want %s (user list only %v)", c.name, got, c.want, c.userList)
|
|
}
|
|
}
|
|
if got := JudgeMove(nil, Composed{Node: "ace"}); got.Judgement != JudgedNeither {
|
|
t.Errorf("the node's own composition: %+v", got)
|
|
}
|
|
}
|