Files
mesh-delivery/modules/mesh-delivery-assigner/internal/puts/puts_test.go
T

67 lines
2.3 KiB
Go

package puts
import (
"errors"
"strings"
"testing"
"time"
"git.novox.be/novox/mesh-sdk/go/keys"
)
// TestPut holds a put's bytes equal to what go/delivery's codec wrote for the same value (golden), its steps kept and its
// key, and the refusals it made.
func TestPut(t *testing.T) {
a := "src2:" + strings.Repeat("a", 64)
at := time.Date(2026, 11, 5, 10, 0, 0, 0, time.UTC)
p := Put{FP: a, Hold: true, Why: "why", By: "me", At: at, Composed: "sha256:" + strings.Repeat("c", 64), Ask: "k", Snapshot: "s"}
p = p.Said(at, Wanted, "w1")
p = p.Said(at, Wanted, "w1")
p = p.Said(at.Add(time.Minute), Holding, "w2")
golden := `{"v":1,"fp":"` + a + `","hold":true,"why":"why","by":"me","at":"2026-11-05T10:00:00Z","step":"holding","words":"w2","composed":"sha256:` + strings.Repeat("c", 64) + `","ask":"k","snapshot":"s","steps":[{"at":"2026-11-05T10:00:00Z","step":"wanted","words":"w1"},{"at":"2026-11-05T10:01:00Z","step":"holding","words":"w2"}]}`
raw, err := Encode(p)
if err != nil || string(raw) != golden {
t.Fatalf("wrote %s, %v", raw, err)
}
back, err := Decode(raw)
if err != nil || back.Step != Holding || len(back.Steps) != 2 {
t.Fatalf("read back %+v, %v", back, err)
}
for i := 0; i < 2*StepsKept; i++ {
p = p.Said(at, Build, strings.Repeat("x", i+1))
}
if len(p.Steps) != StepsKept {
t.Fatalf("%d steps kept", len(p.Steps))
}
if k, err := Key("ace", "novox.be"); err != nil || k != "ace.novox=2ebe" {
t.Fatalf("Key = %q %v", k, err)
}
if n, m, err := ParseKey("ace.novox=2ebe"); err != nil || n != "ace" || m != "novox.be" {
t.Fatalf("ParseKey = %q %q %v", n, m, err)
}
if _, _, err := ParseKey("ace.node"); err == nil {
t.Error("a node's own key is a put's")
}
for name, bad := range map[string]Put{
"old fingerprint": {FP: "src1:x", Why: "w", Step: Asked},
"no why": {FP: a, Step: Asked},
"unknown step": {FP: a, Why: "w", Step: "later"},
"bad digest": {FP: a, Why: "w", Step: Asked, Composed: "x"},
} {
if _, err := Encode(bad); err == nil {
t.Errorf("%s: written", name)
}
}
if _, err := Decode([]byte(`{"fp":"` + a + `","why":"w","step":"asked"}`)); !errors.Is(err, keys.ErrUnknownVersion) {
t.Errorf("no version: %v", err)
}
for _, s := range []string{Done, Released, Refused} {
if !Ended(s) {
t.Errorf("%s is not an end", s)
}
}
if Ended(Holding) {
t.Error("holding is an end")
}
}