mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-29 01:12:24 +08:00
namesys/dns_test: Add DNS resolution tests with a mock resolver
This commit is contained in:
@ -1,9 +1,24 @@
|
|||||||
package namesys
|
package namesys
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type mockDNS struct {
|
||||||
|
entries map[string][]string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *mockDNS) lookupTXT(name string) (txt []string, err error) {
|
||||||
|
txt, ok := m.entries[name]
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("No TXT entry for %s", name)
|
||||||
|
}
|
||||||
|
return txt, nil
|
||||||
|
}
|
||||||
|
|
||||||
func TestDnsEntryParsing(t *testing.T) {
|
func TestDnsEntryParsing(t *testing.T) {
|
||||||
goodEntries := []string{
|
goodEntries := []string{
|
||||||
"QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD",
|
"QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD",
|
||||||
@ -40,3 +55,74 @@ func TestDnsEntryParsing(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newMockDNS() *mockDNS {
|
||||||
|
return &mockDNS{
|
||||||
|
entries: map[string][]string{
|
||||||
|
"multihash.example.com": []string{
|
||||||
|
"dnslink=QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD",
|
||||||
|
},
|
||||||
|
"ipfs.example.com": []string{
|
||||||
|
"dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD",
|
||||||
|
},
|
||||||
|
"dns1.example.com": []string{
|
||||||
|
"dnslink=/ipns/ipfs.example.com",
|
||||||
|
},
|
||||||
|
"dns2.example.com": []string{
|
||||||
|
"dnslink=/ipns/dns1.example.com",
|
||||||
|
},
|
||||||
|
"multi.example.com": []string{
|
||||||
|
"some stuff",
|
||||||
|
"dnslink=/ipns/dns1.example.com",
|
||||||
|
"masked dnslink=/ipns/example.invalid",
|
||||||
|
},
|
||||||
|
"equals.example.com": []string{
|
||||||
|
"dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals",
|
||||||
|
},
|
||||||
|
"loop1.example.com": []string{
|
||||||
|
"dnslink=/ipns/loop2.example.com",
|
||||||
|
},
|
||||||
|
"loop2.example.com": []string{
|
||||||
|
"dnslink=/ipns/loop1.example.com",
|
||||||
|
},
|
||||||
|
"bad.example.com": []string{
|
||||||
|
"dnslink=",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func testResolution(t *testing.T, resolver Resolver, name string, depth int, expected string, expError error) {
|
||||||
|
p, err := resolver.ResolveN(context.Background(), name, depth)
|
||||||
|
if err != expError {
|
||||||
|
t.Fatal(fmt.Errorf(
|
||||||
|
"Expected %s with a depth of %d to have a '%s' error, but got '%s'",
|
||||||
|
name, depth, expError, err))
|
||||||
|
}
|
||||||
|
if p.String() != expected {
|
||||||
|
t.Fatal(fmt.Errorf(
|
||||||
|
"%s with depth %d resolved to %s != %s",
|
||||||
|
name, depth, p.String(), expected))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDNSResolution(t *testing.T) {
|
||||||
|
mock := newMockDNS()
|
||||||
|
r := &DNSResolver{lookupTXT: mock.lookupTXT}
|
||||||
|
testResolution(t, r, "multihash.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil)
|
||||||
|
testResolution(t, r, "ipfs.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil)
|
||||||
|
testResolution(t, r, "dns1.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil)
|
||||||
|
testResolution(t, r, "dns1.example.com", 1, "/ipns/ipfs.example.com", ErrResolveRecursion)
|
||||||
|
testResolution(t, r, "dns2.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil)
|
||||||
|
testResolution(t, r, "dns2.example.com", 1, "/ipns/dns1.example.com", ErrResolveRecursion)
|
||||||
|
testResolution(t, r, "dns2.example.com", 2, "/ipns/ipfs.example.com", ErrResolveRecursion)
|
||||||
|
testResolution(t, r, "multi.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil)
|
||||||
|
testResolution(t, r, "multi.example.com", 1, "/ipns/dns1.example.com", ErrResolveRecursion)
|
||||||
|
testResolution(t, r, "multi.example.com", 2, "/ipns/ipfs.example.com", ErrResolveRecursion)
|
||||||
|
testResolution(t, r, "equals.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals", nil)
|
||||||
|
testResolution(t, r, "loop1.example.com", 1, "/ipns/loop2.example.com", ErrResolveRecursion)
|
||||||
|
testResolution(t, r, "loop1.example.com", 2, "/ipns/loop1.example.com", ErrResolveRecursion)
|
||||||
|
testResolution(t, r, "loop1.example.com", 3, "/ipns/loop2.example.com", ErrResolveRecursion)
|
||||||
|
testResolution(t, r, "loop1.example.com", DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion)
|
||||||
|
testResolution(t, r, "bad.example.com", DefaultDepthLimit, "", ErrResolveFailed)
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user