Files

76 lines
2.0 KiB
Go

package resolver_test
import (
"context"
"ekdns/resolver"
"net"
"testing"
"time"
)
// ---------------------------------------------------------------------------
// UDPQuery tests
// ---------------------------------------------------------------------------
func TestUDPQuery_Success(t *testing.T) {
wantResponse := []byte("fake-dns-response-bytes")
// Fake server that echoes back a fixed payload regardless of query content.
addr := startFakeDNS(t, func(_ []byte) []byte {
return wantResponse
})
ctx := context.Background()
resp, err := resolver.UDPQuery(ctx, addr, []byte("query"), 3*time.Second)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if string(resp) != string(wantResponse) {
t.Errorf("response: got %q, want %q", resp, wantResponse)
}
}
func TestUDPQuery_Timeout(t *testing.T) {
// Fake server that reads but never responds.
conn, err := net.ListenPacket("udp", "127.0.0.1:0")
if err != nil {
t.Fatalf("ListenPacket: %v", err)
}
t.Cleanup(func() { conn.Close() })
go func() {
buf := make([]byte, 1232)
for {
_, _, err := conn.ReadFrom(buf)
if err != nil {
return
}
// Deliberately do not respond.
}
}()
ctx := context.Background()
_, err = resolver.UDPQuery(ctx, conn.LocalAddr().String(), []byte("query"), 50*time.Millisecond)
if err == nil {
t.Fatal("expected timeout error, got nil")
}
}
func TestUDPQuery_ContextCancel(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
cancel() // Cancel immediately before making the call.
_, err := resolver.UDPQuery(ctx, "127.0.0.1:53", []byte("query"), 3*time.Second)
if err == nil {
t.Fatal("expected error for cancelled context, got nil")
}
}
func TestUDPQuery_InvalidAddress(t *testing.T) {
ctx := context.Background()
// Use a syntactically invalid address to provoke a dial error.
_, err := resolver.UDPQuery(ctx, ":::invalid:::", []byte("query"), 3*time.Second)
if err == nil {
t.Fatal("expected error for invalid address, got nil")
}
}