Pin the json names of manifests, locks and inputs2 by the encoded bytes (issue 1442, review round 1)
mesh/merge-gate head 6f9a83646ab7 merged into trunk ab0c16ddad26 — pass, with a note: builds mesh-sdk (+41 dependent(s)) → ace, g14, novox, shanks; no bus …
mesh/repo-check head 6f9a83646ab7 merged into trunk ab0c16ddad26 — pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript)…
mesh/delivery delivered

Go decodes keys case-insensitively, so a round trip could not see a dropped tag; the encoded bytes now name each field and an older message re-encodes to its own bytes.
This commit is contained in:
2026-10-20 18:22:58 +00:00
parent 31c3b6cedc
commit 6f9a83646a
+11 -2
View File
@@ -21,6 +21,11 @@ func TestForgeMergedCarriesManifestsAndLocks(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
for _, frag := range []string{`"manifests":{"a":`, `"locks":{"a":{"go.sum":`} {
if !strings.Contains(string(data), frag) {
t.Errorf("the encoding lacks %s: %s", frag, data)
}
}
got, err := DecodeForge(data) got, err := DecodeForge(data)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@@ -97,8 +102,9 @@ func TestForgeFromAnOlderBridge(t *testing.T) {
t.Fatalf("%+v, %v", f, err) t.Fatalf("%+v, %v", f, err)
} }
data, err := EncodeForge(f) data, err := EncodeForge(f)
if err != nil || strings.Contains(string(data), "manifests") || strings.Contains(string(data), "locks") { // the older message is written with the struct's key order, so the bytes compare as they are
t.Errorf("%s, %v", data, err) if err != nil || string(data) != old {
t.Errorf("%s, %v, want exactly %s", data, err, old)
} }
} }
@@ -113,6 +119,9 @@ func TestModuleKeepsInputs2(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if !strings.Contains(string(data), `"inputs2":{"tree":"t1"`) {
t.Errorf("the encoding lacks inputs2: %s", data)
}
got, err := DecodeModule(data) got, err := DecodeModule(data)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)