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"}}, {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) } } }