Skip to content

Commit 52cdf46

Browse files
committed
test(dns): add tests against local http:// DoH resolver
1 parent 2424537 commit 52cdf46

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

gateway/dns_test.go

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package gateway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"net"
8+
"net/http"
9+
"strings"
10+
"testing"
11+
12+
"github.com/miekg/dns"
13+
"github.com/stretchr/testify/require"
14+
)
15+
16+
func TestAddNewDNSResolver(t *testing.T) {
17+
ctx := context.Background()
18+
ctx, cancel := context.WithCancel(ctx)
19+
defer cancel()
20+
21+
l, err := net.Listen("tcp", "127.0.0.1:0")
22+
require.NoError(t, err)
23+
defer l.Close()
24+
25+
dnslinkName := "dnslink-test.foobar"
26+
dnslinkValue := "/ipfs/bafkqaaa"
27+
28+
go func() {
29+
_ = http.Serve(l, http.HandlerFunc(dnslinkServerHandlerFunc(t, dnslinkName, dnslinkValue)))
30+
}()
31+
32+
listenAddr := l.Addr().(*net.TCPAddr)
33+
r, err := NewDNSResolver(map[string]string{
34+
"foobar.": fmt.Sprintf("http://%s:%d", listenAddr.IP, listenAddr.Port),
35+
})
36+
require.NoError(t, err)
37+
38+
res, err := r.LookupTXT(ctx, fmt.Sprintf("_dnslink.%s.", dnslinkName))
39+
require.NoError(t, err)
40+
require.Len(t, res, 1)
41+
require.Equal(t, dnslinkValue, res[0])
42+
}
43+
44+
func TestOverrideDNSDefaults(t *testing.T) {
45+
ctx := context.Background()
46+
ctx, cancel := context.WithCancel(ctx)
47+
defer cancel()
48+
49+
l, err := net.Listen("tcp", "127.0.0.1:0")
50+
require.NoError(t, err)
51+
defer l.Close()
52+
53+
dnslinkName := "dnslink-test.eth"
54+
dnslinkValue := "/ipfs/bafkqaaa"
55+
56+
go func() {
57+
_ = http.Serve(l, http.HandlerFunc(dnslinkServerHandlerFunc(t, dnslinkName, dnslinkValue)))
58+
}()
59+
60+
listenAddr := l.Addr().(*net.TCPAddr)
61+
r, err := NewDNSResolver(map[string]string{
62+
"eth.": fmt.Sprintf("http://%s:%d", listenAddr.IP, listenAddr.Port),
63+
})
64+
require.NoError(t, err)
65+
66+
res, err := r.LookupTXT(ctx, fmt.Sprintf("_dnslink.%s.", dnslinkName))
67+
require.NoError(t, err)
68+
require.Len(t, res, 1)
69+
require.Equal(t, dnslinkValue, res[0])
70+
}
71+
72+
func dnslinkServerHandlerFunc(t *testing.T, dnslinkName string, txtResponse string) func(w http.ResponseWriter, req *http.Request) {
73+
return func(w http.ResponseWriter, req *http.Request) {
74+
b, err := io.ReadAll(req.Body)
75+
if err != nil {
76+
http.Error(w, err.Error(), http.StatusInternalServerError)
77+
return
78+
}
79+
msg := &dns.Msg{}
80+
err = msg.Unpack(b)
81+
require.NoError(t, err)
82+
var answers []dns.RR
83+
for _, q := range msg.Question {
84+
if strings.ToLower(q.Name) != fmt.Sprintf("_dnslink.%s.", dnslinkName) || q.Qtype != dns.TypeTXT {
85+
answers = append(answers, &dns.RR_Header{
86+
Name: q.Name,
87+
Rrtype: dns.RcodeServerFailure,
88+
Class: q.Qclass,
89+
Ttl: 0,
90+
})
91+
} else {
92+
answers = append(answers, &dns.TXT{
93+
Hdr: dns.RR_Header{
94+
Name: q.Name,
95+
Rrtype: dns.TypeTXT,
96+
Class: dns.ClassINET,
97+
Ttl: uint32(3600),
98+
},
99+
Txt: []string{txtResponse},
100+
})
101+
}
102+
}
103+
var m dns.Msg
104+
m.SetReply(msg)
105+
m.Authoritative = true
106+
m.Answer = answers
107+
encoded, err := m.Pack()
108+
if err != nil {
109+
http.Error(w, err.Error(), http.StatusInternalServerError)
110+
return
111+
}
112+
w.Header().Set("Content-Type", "application/dns-message")
113+
w.WriteHeader(http.StatusOK)
114+
if _, err := w.Write(encoded); err != nil {
115+
http.Error(w, err.Error(), http.StatusInternalServerError)
116+
return
117+
}
118+
}
119+
}

0 commit comments

Comments
 (0)