Initial commit
This commit is contained in:
commit
2d98ed1b5d
33 changed files with 4644 additions and 0 deletions
128
checker/report_test.go
Normal file
128
checker/report_test.go
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
package checker
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
sdk "git.happydns.org/checker-sdk-go/checker"
|
||||
)
|
||||
|
||||
func TestStatesToFindings(t *testing.T) {
|
||||
states := []sdk.CheckState{
|
||||
{Status: sdk.StatusOK, Code: "ok"},
|
||||
{Status: sdk.StatusInfo, Code: "i", Subject: "ex./A", Message: "info"},
|
||||
{Status: sdk.StatusWarn, Code: "w", Subject: "ex./A", Message: "warn"},
|
||||
{Status: sdk.StatusCrit, Code: "c", Subject: "ex./A", Message: "crit"},
|
||||
}
|
||||
got := statesToFindings(states)
|
||||
if len(got) != 3 {
|
||||
t.Errorf("expected 3 findings (OK skipped), got %d: %+v", len(got), got)
|
||||
}
|
||||
severities := map[Severity]bool{}
|
||||
for _, f := range got {
|
||||
severities[f.Severity] = true
|
||||
}
|
||||
if !severities[SeverityCrit] || !severities[SeverityWarn] || !severities[SeverityInfo] {
|
||||
t.Errorf("missing some severities: %+v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSeverityFromStatus(t *testing.T) {
|
||||
cases := []struct {
|
||||
in sdk.Status
|
||||
want Severity
|
||||
wantOK bool
|
||||
}{
|
||||
{sdk.StatusCrit, SeverityCrit, true},
|
||||
{sdk.StatusWarn, SeverityWarn, true},
|
||||
{sdk.StatusInfo, SeverityInfo, true},
|
||||
{sdk.StatusOK, "", false},
|
||||
}
|
||||
for _, c := range cases {
|
||||
got, ok := severityFromStatus(c.in)
|
||||
if got != c.want || ok != c.wantOK {
|
||||
t.Errorf("severityFromStatus(%v) = (%v,%v), want (%v,%v)", c.in, got, ok, c.want, c.wantOK)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSeverityRank(t *testing.T) {
|
||||
if severityRank(SeverityCrit) <= severityRank(SeverityWarn) {
|
||||
t.Errorf("crit should outrank warn")
|
||||
}
|
||||
if severityRank(SeverityWarn) <= severityRank(SeverityInfo) {
|
||||
t.Errorf("warn should outrank info")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRemedyFor(t *testing.T) {
|
||||
// known code returns a non-empty hint
|
||||
if r := remedyFor(CodeAnswerDrift); r == "" {
|
||||
t.Errorf("expected remedy for %q", CodeAnswerDrift)
|
||||
}
|
||||
// unknown code is allowed to be empty
|
||||
_ = remedyFor("totally-bogus-code-xyz")
|
||||
}
|
||||
|
||||
func TestIsResolverScopedCode(t *testing.T) {
|
||||
if !isResolverScopedCode(CodeResolverUnreachable) {
|
||||
t.Errorf("resolver code should be scoped")
|
||||
}
|
||||
if isResolverScopedCode(CodeAnswerDrift) {
|
||||
t.Errorf("rrset code should not be scoped")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetHTMLReport_Smoke(t *testing.T) {
|
||||
key := "ex./A"
|
||||
data := &ResolverPropagationData{
|
||||
Zone: "ex.",
|
||||
Names: []string{"ex."},
|
||||
Types: []string{"A"},
|
||||
Resolvers: map[string]*ResolverView{
|
||||
"a": mkResolver("a", "eu", false, true, map[string]*RRProbe{
|
||||
key: {Rcode: "NOERROR", Signature: "1.1.1.1", Records: []string{"1.1.1.1"}, LatencyMs: 30, Transport: TransportUDP},
|
||||
}),
|
||||
"b": mkResolver("b", "global", false, true, map[string]*RRProbe{
|
||||
key: {Rcode: "NOERROR", Signature: "1.1.1.1", Records: []string{"1.1.1.1"}, LatencyMs: 40, Transport: TransportUDP},
|
||||
}),
|
||||
},
|
||||
RRsets: map[string]*RRsetView{key: {Name: "ex.", Type: "A"}},
|
||||
Stats: Stats{TotalResolvers: 2, ReachableResolvers: 2, UnfilteredProbed: 2},
|
||||
}
|
||||
raw, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
t.Fatalf("marshal: %v", err)
|
||||
}
|
||||
ctx := sdk.NewReportContext(raw, nil, []sdk.CheckState{
|
||||
{Status: sdk.StatusOK, Code: "ok", Message: "fine"},
|
||||
})
|
||||
|
||||
prov := &resolverPropagationProvider{}
|
||||
html, err := prov.GetHTMLReport(ctx)
|
||||
if err != nil {
|
||||
t.Fatalf("GetHTMLReport: %v", err)
|
||||
}
|
||||
for _, want := range []string{"ex.", "1.1.1.1", "Europe", "Global"} {
|
||||
if !strings.Contains(html, want) {
|
||||
t.Errorf("HTML report missing %q", want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetHTMLReport_BadPayload(t *testing.T) {
|
||||
ctx := sdk.StaticReportContext(json.RawMessage(`not-json`))
|
||||
prov := &resolverPropagationProvider{}
|
||||
if _, err := prov.GetHTMLReport(ctx); err == nil {
|
||||
t.Errorf("want decode error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetHTMLReport_EmptyPayload(t *testing.T) {
|
||||
ctx := sdk.StaticReportContext(nil)
|
||||
prov := &resolverPropagationProvider{}
|
||||
if _, err := prov.GetHTMLReport(ctx); err != nil {
|
||||
t.Errorf("empty payload should not error, got %v", err)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue