Files
mesh-sdk/go/delivery/namedtree_layouts_test.go
T
jschoubben 8d65cb3016 Carry each named path's git object beside a module's other inputs (issue 1758, S3, ADR 0499 §2-§3)
Forge.Paths, PreviewModule.Paths, KeptInputs2.Paths and buildstep.ModuleTree.Paths,
each optional and read as absent by older readers; a kept or previewed tree that its
named paths do not compute to is refused, so a recompute gives the merge's value.
2026-10-22 17:27:58 +02:00

80 lines
3.6 KiB
Go

package delivery
import (
"strings"
"testing"
)
// The named paths' git objects travel beside a module's other new-form inputs (novox/hq ADR 0499 clauses 2 and 3): in
// the forge bridge's messages (Forge.Paths), in the merge preview (PreviewModule.Paths) and in what the indexer keeps
// (KeptInputs2.Paths), so a computation from kept inputs gives the merge's value. Each is read as absent by an older
// reader, and an older value, without them, still decodes.
func TestTheNamedPathsObjectsRoundTripBesideTheOtherInputs(t *testing.T) {
manifest := sha256Of(`{"module":"mesh-sdk"}`)
paths := map[string]string{"src": strings.Repeat("a", 40), "package.json": strings.Repeat("b", 40)}
tree, err := NamedTree(manifest, paths)
if err != nil {
t.Fatal(err)
}
m := Module{FP2: SourcePrefix2 + strings.Repeat("1", 64), Manifest: manifest, Repository: "novox/mesh-sdk",
Commit: strings.Repeat("c", 40), Inputs2: &KeptInputs2{Tree: tree, Paths: paths}}
m.FP = SourcePrefix + strings.Repeat("0", 64)
data, err := EncodeModule(m)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(string(data), `"paths":{`) {
t.Fatalf("the kept inputs carry no paths: %s", data)
}
back, err := DecodeModule(data)
if err != nil || back.Inputs2.Paths["src"] != paths["src"] || back.Inputs2.Tree != tree {
t.Fatalf("decoded %+v, %v", back.Inputs2, err)
}
// What the indexer keeps must compute to the tree it kept: a mismatch is a value no recompute could give.
bad := m
bad.Inputs2 = &KeptInputs2{Tree: tree, Paths: map[string]string{"src": strings.Repeat("d", 40)}}
if _, err := EncodeModule(bad); err == nil || !strings.Contains(err.Error(), "named tree") {
t.Fatalf("kept paths that do not compute to the kept tree were accepted: %v", err)
}
// An older value has no paths, and its directory tree stays its tree.
old := `{"v":1,"fp":"` + m.FP + `","manifest":"` + manifest + `","inputs2":{"tree":"` + strings.Repeat("e", 40) +
`"},"repository":"novox/x","commit":"` + strings.Repeat("c", 40) + `"}`
if o, err := DecodeModule([]byte(old)); err != nil || o.Inputs2.Paths != nil {
t.Fatalf("an older value: %+v, %v", o, err)
}
f := Forge{Kind: ForgeMerged, Repository: "novox/mesh-sdk", Number: 1, Head: strings.Repeat("h", 40),
Merge: strings.Repeat("m", 40), Root: strings.Repeat("r", 40), Trees: map[string]string{".": strings.Repeat("r", 40)},
Paths: map[string]map[string]string{".": paths}}
data, err = EncodeForge(f)
if err != nil {
t.Fatal(err)
}
if fb, err := DecodeForge(data); err != nil || fb.Paths["."]["package.json"] != paths["package.json"] {
t.Fatalf("decoded forge %+v, %v", fb.Paths, err)
}
f.Paths = map[string]map[string]string{"other": paths}
if _, err := EncodeForge(f); err == nil {
t.Fatal("named paths of a directory the message has no tree of were accepted")
}
f.Paths = map[string]map[string]string{".": {"src": ""}}
if _, err := EncodeForge(f); err == nil {
t.Fatal("a named path with no object was accepted")
}
p := Preview{Repository: "novox/mesh-sdk", Head: strings.Repeat("a", 40), Trunk: strings.Repeat("b", 40),
Merge: strings.Repeat("c", 40), Modules: map[string]PreviewModule{".": {Tree: tree, Manifest: manifest, Paths: paths}}}
data, err = EncodePreview(p)
if err != nil {
t.Fatal(err)
}
if pb, err := DecodePreview(data); err != nil || pb.Modules["."].Paths["src"] != paths["src"] {
t.Fatalf("decoded preview %+v, %v", pb.Modules, err)
}
p.Modules["."] = PreviewModule{Tree: strings.Repeat("e", 40), Manifest: manifest, Paths: paths}
if _, err := EncodePreview(p); err == nil || !strings.Contains(err.Error(), "named tree") {
t.Fatalf("a preview whose tree is not its paths' named tree was accepted: %v", err)
}
}