diff options
Diffstat (limited to 'internal/server/server_test.go')
| -rw-r--r-- | internal/server/server_test.go | 83 |
1 files changed, 36 insertions, 47 deletions
diff --git a/internal/server/server_test.go b/internal/server/server_test.go index eaf0190..6fc2092 100644 --- a/internal/server/server_test.go +++ b/internal/server/server_test.go @@ -1,12 +1,25 @@ package server import ( + "log/slog" "testing" + "time" "github.com/miekg/dns" + "sdns/internal/resolver" ) +func testServer(t *testing.T) *Server { + t.Helper() + r := resolver.New( + resolver.WithRootAddresses([]string{"127.0.0.1:1"}), + resolver.WithTimeout(50*time.Millisecond), + ) + return &Server{logger: slog.Default(), resolver: r} +} + func TestBuildResponse(t *testing.T) { + s := testServer(t) tests := []struct { name string req *dns.Msg @@ -15,39 +28,6 @@ func TestBuildResponse(t *testing.T) { wantEdns0 bool }{ { - name: "example.com A returns 127.0.0.1", - req: func() *dns.Msg { - m := new(dns.Msg) - m.SetQuestion("example.com.", dns.TypeA) - return m - }(), - wantRcode: dns.RcodeSuccess, - wantAnswers: 1, - wantEdns0: false, - }, - { - name: "google.com A returns NXDOMAIN", - req: func() *dns.Msg { - m := new(dns.Msg) - m.SetQuestion("google.com.", dns.TypeA) - return m - }(), - wantRcode: dns.RcodeNameError, - wantAnswers: 0, - wantEdns0: false, - }, - { - name: "other.com A returns NXDOMAIN", - req: func() *dns.Msg { - m := new(dns.Msg) - m.SetQuestion("other.com.", dns.TypeA) - return m - }(), - wantRcode: dns.RcodeNameError, - wantAnswers: 0, - wantEdns0: false, - }, - { name: "no questions returns FORMERR", req: func() *dns.Msg { return new(dns.Msg) @@ -56,23 +36,11 @@ func TestBuildResponse(t *testing.T) { wantAnswers: 0, wantEdns0: false, }, - { - name: "EDNS0 query preserved with 4096 buffer", - req: func() *dns.Msg { - m := new(dns.Msg) - m.SetQuestion("example.com.", dns.TypeA) - m.SetEdns0(1232, true) - return m - }(), - wantRcode: dns.RcodeSuccess, - wantAnswers: 1, - wantEdns0: true, - }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - resp := buildResponse(tt.req) + resp := s.buildResponse(tt.req) if resp.Rcode != tt.wantRcode { t.Errorf("rcode: got %d, want %d", resp.Rcode, tt.wantRcode) } @@ -90,7 +58,28 @@ func TestBuildResponse(t *testing.T) { } } +func TestBuildResponseWithQuery(t *testing.T) { + s := testServer(t) + // Valid query → must not panic, rcode must be valid + m := new(dns.Msg) + m.SetQuestion("example.com.", dns.TypeA) + resp := s.buildResponse(m) + if resp == nil { + t.Fatal("buildResponse returned nil") + } + if resp.Rcode != dns.RcodeSuccess && resp.Rcode != dns.RcodeServerFailure { + t.Errorf("expected success or server failure, got %d", resp.Rcode) + } +} + func FuzzBuildResponse(f *testing.F) { + s := &Server{logger: slog.Default()} + // For fuzz, use a resolver that won't make real network calls + s.resolver = resolver.New( + resolver.WithRootAddresses([]string{"127.0.0.1:1"}), + resolver.WithTimeout(10*time.Millisecond), + ) + seed := []byte{ 0x00, 0x00, // ID 0x01, 0x00, // flags: RD @@ -111,7 +100,7 @@ func FuzzBuildResponse(f *testing.F) { if err := msg.Unpack(data); err != nil { return } - resp := buildResponse(msg) + resp := s.buildResponse(msg) if resp == nil { t.Fatal("buildResponse returned nil") } |
