A build module that fills a request re-marshals it, and without the field it dropped the seat list the trunk's manifest validator reads, so the validator never got one (milestone 47/B0, ADR 0636 §4, ADR 0644). Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
53 lines
2.0 KiB
Go
53 lines
2.0 KiB
Go
package composer
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
const demo = `{"module": "demo", "version": "1", "claims": [{"name": "node-files"}]}`
|
|
|
|
// A manifest named by its digest goes on the wire as {"digest": ...}, and Fill puts the bytes the indexer keeps in its
|
|
// place; a raw manifest goes as itself.
|
|
func TestAManifestIsItsBytesOrItsDigest(t *testing.T) {
|
|
// 1921 (B0): the seat list rides whole through the wire, the decode and the fill.
|
|
seats := []json.RawMessage{json.RawMessage(`{"name":"node-files","verbs":["read"]}`)}
|
|
r := Request{V: Version, Seats: seats, Cases: []Case{{Name: "change", Manifests: map[string]Manifest{
|
|
"demo": {Digest: "d1"}, "raw": {Raw: json.RawMessage(`{"module":"raw","version":"1"}`)}},
|
|
Kept: map[string]map[string]Manifest{"laptop": {"demo": {Digest: "d1"}}}}}}
|
|
wire, err := json.Marshal(r)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !strings.Contains(string(wire), `"demo":{"digest":"d1"}`) || !strings.Contains(string(wire), `"raw":{"module":"raw","version":"1"}`) {
|
|
t.Fatalf("on the wire: %s", wire)
|
|
}
|
|
back, err := Decode(wire)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
asked := 0
|
|
if err := Fill(&back, func(d string) ([]byte, error) {
|
|
asked++
|
|
if d != "d1" {
|
|
return nil, errors.New("no such digest")
|
|
}
|
|
return []byte(demo), nil
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
refilled, err := json.Marshal(back)
|
|
if err != nil || !strings.Contains(string(refilled), `"seats":[{"name":"node-files","verbs":["read"]}]`) {
|
|
t.Fatalf("the seats after the fill: %s %v", refilled, err)
|
|
}
|
|
if asked != 2 || string(back.Cases[0].Manifests["demo"].Raw) != demo || string(back.Cases[0].Kept["laptop"]["demo"].Raw) != demo {
|
|
t.Fatalf("filled %d times: %+v", asked, back.Cases[0])
|
|
}
|
|
bad := Request{V: Version, Cases: []Case{{Name: "c", Manifests: map[string]Manifest{"x": {Digest: "nope"}}}}}
|
|
if err := Fill(&bad, func(string) ([]byte, error) { return nil, errors.New("not there") }); err == nil || !strings.Contains(err.Error(), "nope") {
|
|
t.Fatalf("a digest the indexer does not hold: %v", err)
|
|
}
|
|
}
|