package traverse import ( "testing" "github.com/miekg/dns" ) func TestEventStageStrings(t *testing.T) { tests := map[EventStage]string{ StageNew: "new", StageStart: "start", StageNewReferralSet: "new_referral_set", StageNewFast: "new_fast", StageResolve: "resolve", StageAnswer: "answer", StageAnswerFast: "answer_fast", EventStage(99): "unknown", } for stage, want := range tests { if got := stage.String(); got != want { t.Errorf("EventStage(%d).String() = %q, want %q", stage, got, want) } } } func TestHooksEmitNilSafe(t *testing.T) { var h *TraverserHooks h.emit(StageNew, newTestReferral("ns1.example.com", nil), "") // must not panic (&TraverserHooks{}).emit(StageNew, newTestReferral("ns1.example.com", nil), "") (&TraverserHooks{OnEvent: func(TraversalEvent) { t.Fatal("emitted for nil referral") }}).emit(StageNew, nil, "") } func TestHooksEventSequenceSimpleAnswer(t *testing.T) { m := newMockExchange() m.on("198.41.0.4", "example.com", dns.TypeA, answerMsg(aRR("example.com", "9.9.9.9"))) var got []string cfg := testConfig(false) cfg.Hooks = &TraverserHooks{OnEvent: func(ev TraversalEvent) { got = append(got, ev.Stage.String()+":"+ev.RefID) }} runTraversal(t, cfg, m, "example.com") want := []string{"new:", "start:", "new:1", "start:1", "answer:1", "answer:"} if len(got) != len(want) { t.Fatalf("events = %v, want %v", got, want) } for i := range want { if got[i] != want[i] { t.Fatalf("events = %v, want %v", got, want) } } } func TestHooksEventCarriesStatus(t *testing.T) { m := newMockExchange() m.on("198.41.0.4", "example.com", dns.TypeA, answerMsg(aRR("example.com", "9.9.9.9"))) var answerStatus Status cfg := testConfig(false) cfg.Hooks = &TraverserHooks{OnEvent: func(ev TraversalEvent) { if ev.Stage == StageAnswer && ev.RefID == "1" { answerStatus = ev.Status } }} runTraversal(t, cfg, m, "example.com") if answerStatus != StatusAnswered { t.Errorf("answer event status = %q, want answered", answerStatus) } }