package checker import ( "context" "encoding/json" "strings" "testing" sdk "git.happydns.org/checker-sdk-go/checker" ) type stubObs struct { data *MatrixFederationData err error } func (s stubObs) Get(_ context.Context, _ sdk.ObservationKey, dest any) error { if s.err != nil { return s.err } b, err := json.Marshal(s.data) if err != nil { return err } return json.Unmarshal(b, dest) } func (s stubObs) GetRelated(_ context.Context, _ sdk.ObservationKey) ([]sdk.RelatedObservation, error) { return nil, nil } func eval(t *testing.T, rule sdk.CheckRule, data *MatrixFederationData, opts sdk.CheckerOptions) []sdk.CheckState { t.Helper() return rule.Evaluate(context.Background(), stubObs{data: data}, opts) } func TestFederationOKRulePass(t *testing.T) { data := &MatrixFederationData{FederationOK: true} data.Version.Name = "Synapse" data.Version.Version = "1.100.0" got := eval(t, &federationOKRule{}, data, sdk.CheckerOptions{"serviceDomain": "example.org."}) if len(got) != 1 || got[0].Status != sdk.StatusOK { t.Fatalf("expected single OK state, got %+v", got) } if !strings.Contains(got[0].Message, "Synapse 1.100.0") { t.Errorf("expected version in message, got %q", got[0].Message) } } func TestFederationOKRuleFailDeterministicOrder(t *testing.T) { data := &MatrixFederationData{} data.ConnectionErrors = map[string]struct { Message string `json:"Message"` }{ "z.example:8448": {Message: "boom z"}, "a.example:8448": {Message: "boom a"}, "m.example:8448": {Message: "boom m"}, } first := eval(t, &federationOKRule{}, data, nil)[0].Message for range 5 { if eval(t, &federationOKRule{}, data, nil)[0].Message != first { t.Fatal("federation_ok message not stable across runs") } } idxA := strings.Index(first, "a.example") idxM := strings.Index(first, "m.example") idxZ := strings.Index(first, "z.example") if !(idxA < idxM && idxM < idxZ) { t.Errorf("expected sorted order a