package link import ( "encoding/json" "testing" ) func TestTheWireFormatIsExactlyTheseFieldNames(t *testing.T) { // The contract with the host, which defines these separately because it requires nothing // present and does not import this. A matching test lives there; rename a field on either // side and both fail, rather than the mismatch surfacing on a real machine. for _, c := range []struct { value any expect []string }{ {Signed{Declaration: []byte("{}"), Signature: []byte("x")}, []string{"declaration", "signature"}}, {Report{Node: "n", Applied: []string{"a"}, Failed: map[string]string{"k": "v"}, Refused: "r"}, []string{"node", "applied", "failed", "refused"}}, {Report{Node: "n", Held: []Held{{ID: "m.f"}}, Firewall: "ufw", Reachable: []Reach{{Port: 1}}}, []string{"node", "held", "firewall", "reachable"}}, {Held{ID: "m.f", Module: "m", Kind: "file", Target: "/f", Changed: "rewritten", Kept: "/k"}, []string{"id", "module", "kind", "target", "since", "changed", "kept"}}, {Reach{Protocol: "tcp", Address: "0.0.0.0", Port: 8080, By: "hello-web", Published: true, ContainerPort: 80}, []string{"protocol", "address", "port", "by", "published", "container-port"}}, {EnrolRequest{Node: "n", Secret: "s", PublicKey: []byte("k")}, []string{"node", "secret", "public_key"}}, } { raw, err := json.Marshal(c.value) if err != nil { t.Fatal(err) } var fields map[string]any if err := json.Unmarshal(raw, &fields); err != nil { t.Fatal(err) } for _, want := range c.expect { if _, ok := fields[want]; !ok { t.Errorf("%T has no %q field; the host reads that name", c.value, want) } } if len(fields) != len(c.expect) { t.Errorf("%T has %d fields, expected %d: %v", c.value, len(fields), len(c.expect), fields) } } }