116 lines
4.5 KiB
Go
116 lines
4.5 KiB
Go
package assign
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/asks"
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
// 1297/B9 (the assigner's half): the ask about a held fingerprint is a valid ask of the router and of mesh-sdk's layout at
|
|
// its key, of a kind the view may answer.
|
|
func TestTheHoldAskIsValid(t *testing.T) {
|
|
key, err := delivery.HoldAskKey("mail", fNew)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
now := time.Now()
|
|
a := HoldAsk(key, "mail", fNew, now)
|
|
if err := a.Ask.Check(now); err != nil {
|
|
t.Errorf("the router refuses the ask: %v", err)
|
|
}
|
|
if _, err := delivery.EncodeAssignerAsk(key, a); err != nil {
|
|
t.Errorf("the ask cannot be written: %v", err)
|
|
}
|
|
if _, err := delivery.ViewAnswerKey(key); err != nil {
|
|
t.Errorf("the view may not answer it: %v", err)
|
|
}
|
|
}
|
|
|
|
// 1906/D3 (ADR 0539 §19): the ask about a data module held on a node is a valid ask of the router and of mesh-sdk's layout at
|
|
// its restore key, of a kind the view may answer; it offers restoring (losing the newer writes) and leaving it stopped.
|
|
func TestTheRestoreAskIsValid(t *testing.T) {
|
|
key, err := delivery.RestoreAskKey("ace", "mail", fNew)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
now := time.Now()
|
|
a := RestoreAsk(key, "ace", "mail", fNew, "connection refused", now)
|
|
if err := a.Ask.Check(now); err != nil {
|
|
t.Errorf("the router refuses the ask: %v", err)
|
|
}
|
|
if _, err := delivery.EncodeAssignerAsk(key, a); err != nil {
|
|
t.Errorf("the ask cannot be written: %v", err)
|
|
}
|
|
if _, err := delivery.ViewAnswerKey(key); err != nil {
|
|
t.Errorf("the view may not answer it: %v", err)
|
|
}
|
|
var ids []string
|
|
for _, o := range a.Ask.Options {
|
|
ids = append(ids, o.ID)
|
|
}
|
|
if len(ids) != 2 || ids[0] != OptionRestore || ids[1] != OptionLeaveStopped {
|
|
t.Errorf("options = %v", ids)
|
|
}
|
|
if !strings.Contains(a.Ask.Explanation, "connection refused") || !strings.Contains(a.Ask.Explanation, "ace") {
|
|
t.Errorf("the ask does not name the node and the check's words: %q", a.Ask.Explanation)
|
|
}
|
|
}
|
|
|
|
// 1906/D3: the condition for a held fingerprint names the module, the node and the check's words, under the assigner's own
|
|
// name (ADR 0437 clause 9), and is cleared under the same key.
|
|
func TestTheHeldConditionNamesModuleNodeAndWords(t *testing.T) {
|
|
c := HeldCondition("mail", fNew, "ace", "connection refused", true, true)
|
|
if _, err := asks.EncodeCondition(c); err != nil {
|
|
t.Fatalf("the condition is refused: %v", err)
|
|
}
|
|
if c.State != asks.StateRaised || c.Subject.ID != "mail" || c.Subject.Machine != "ace" || !strings.Contains(c.Explanation, "connection refused") || !strings.Contains(c.Key, "mail") {
|
|
t.Errorf("condition = %+v", c)
|
|
}
|
|
if got := HeldCondition("mail", fNew, "", "", false, false); got.State != asks.StateCleared || got.Key != c.Key {
|
|
t.Errorf("cleared = %+v", got)
|
|
}
|
|
}
|
|
|
|
// 1906/D4: the record ask and the backup ask are valid asks of the router and of mesh-sdk's layout at their keys, answerable in
|
|
// the view, and name the move and the node.
|
|
func TestTheRecordAndBackupAsksAreValid(t *testing.T) {
|
|
now := time.Now()
|
|
rkey, err := delivery.RecordAskKey("ace", "mail", "sha256:"+strings.Repeat("b", 64))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r := RecordAsk(rkey, "ace", "mail", fNew, RecordNeed{Node: "ace", Digest: "sha256:" + strings.Repeat("b", 64), Judgement: delivery.JudgedCannot, Words: "the composition it runs is gone"}, now)
|
|
bkey, err := delivery.BackupAskKey("ace", "mail", fNew)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b := BackupAsk(bkey, "ace", "mail", fNew, "no space left", 0, now)
|
|
for key, a := range map[string]delivery.AssignerAsk{rkey: r, bkey: b} {
|
|
if err := a.Ask.Check(now); err != nil {
|
|
t.Errorf("%s: the router refuses the ask: %v", key, err)
|
|
}
|
|
if _, err := delivery.EncodeAssignerAsk(key, a); err != nil {
|
|
t.Errorf("%s: cannot be written: %v", key, err)
|
|
}
|
|
if _, err := delivery.ViewAnswerKey(key); err != nil {
|
|
t.Errorf("%s: the view may not answer it: %v", key, err)
|
|
}
|
|
}
|
|
if !strings.Contains(r.Ask.Explanation, "gone") || r.Ask.Options[0].ID != OptionYes {
|
|
t.Errorf("the record ask = %+v", r.Ask)
|
|
}
|
|
if !strings.Contains(b.Ask.Explanation, "no space left") || b.Ask.Options[0].ID != delivery.BackupAgain || b.Ask.Options[1].ID != delivery.BackupSkip {
|
|
t.Errorf("the backup ask = %+v", b.Ask)
|
|
}
|
|
if again := BackupAsk(bkey, "ace", "mail", fNew, "x", 2, now); again.Ask.ID == b.Ask.ID {
|
|
t.Errorf("asked again under the same id")
|
|
}
|
|
c := BackupCondition("ace", "mail", fNew, "no space left", true)
|
|
if _, err := asks.EncodeCondition(c); err != nil {
|
|
t.Errorf("the backup condition is refused: %v", err)
|
|
}
|
|
}
|