summaryrefslogtreecommitdiff
path: root/internal/server/server_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/server/server_test.go')
-rw-r--r--internal/server/server_test.go83
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")
}