package link import ( "encoding/json" "testing" ) // A report's word on the assignment generation (novox/hq issue 234), as mesh-host's report writes it: // `reads_generation` on every report of a node-engine that reads one, and `older_generation` on a refusal // of a declaration composed from an older generation than the machine applied. func TestTheGenerationOnTheWire(t *testing.T) { raw := []byte(`{"node":"anchor","refused":"older generation","declared":"d12","epoch":57,"sequence":12,` + `"report_sequence":8,"reads_generation":true,"older_generation":{"generation":38,"applied":40}}`) var r Report if err := json.Unmarshal(raw, &r); err != nil { t.Fatal(err) } if !r.ReadsGeneration || r.OlderGeneration == nil || *r.OlderGeneration != (GenerationRefusal{38, 40}) || r.Sequence != 12 { t.Fatalf("a node-engine's generation refusal reads as %+v", r) } // Not a refusal by the lease's epoch: S13 counts those, and this one is raised naming its sender. if r.StaleRefusalOf() { t.Errorf("a generation refusal reads as a stale writer's") } var older Report if err := json.Unmarshal([]byte(`{"node":"anchor","applied":["a"],"report_sequence":3}`), &older); err != nil { t.Fatal(err) } if older.ReadsGeneration || older.OlderGeneration != nil { t.Fatalf("a node-engine that never said it reads a generation reads as one that does: %+v", older) } }