github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/namesys/dns_test.go (about) 1 package namesys 2 3 import ( 4 "fmt" 5 "testing" 6 ) 7 8 type mockDNS struct { 9 entries map[string][]string 10 } 11 12 func (m *mockDNS) lookupTXT(name string) (txt []string, err error) { 13 txt, ok := m.entries[name] 14 if !ok { 15 return nil, fmt.Errorf("No TXT entry for %s", name) 16 } 17 return txt, nil 18 } 19 20 func TestDnsEntryParsing(t *testing.T) { 21 goodEntries := []string{ 22 "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 23 "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 24 "dnslink=/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 25 "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/foo", 26 "dnslink=/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/bar", 27 "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/foo/bar/baz", 28 "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 29 } 30 31 badEntries := []string{ 32 "QmYhE8xgFCjGcz6PHgnvJz5NOTCORRECT", 33 "quux=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 34 "dnslink=", 35 "dnslink=/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/foo", 36 "dnslink=ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/bar", 37 } 38 39 for _, e := range goodEntries { 40 _, err := parseEntry(e) 41 if err != nil { 42 t.Log("expected entry to parse correctly!") 43 t.Log(e) 44 t.Fatal(err) 45 } 46 } 47 48 for _, e := range badEntries { 49 _, err := parseEntry(e) 50 if err == nil { 51 t.Log("expected entry parse to fail!") 52 t.Fatal(err) 53 } 54 } 55 } 56 57 func newMockDNS() *mockDNS { 58 return &mockDNS{ 59 entries: map[string][]string{ 60 "multihash.example.com": []string{ 61 "dnslink=QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 62 }, 63 "ipfs.example.com": []string{ 64 "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 65 }, 66 "dns1.example.com": []string{ 67 "dnslink=/ipns/ipfs.example.com", 68 }, 69 "dns2.example.com": []string{ 70 "dnslink=/ipns/dns1.example.com", 71 }, 72 "multi.example.com": []string{ 73 "some stuff", 74 "dnslink=/ipns/dns1.example.com", 75 "masked dnslink=/ipns/example.invalid", 76 }, 77 "equals.example.com": []string{ 78 "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals", 79 }, 80 "loop1.example.com": []string{ 81 "dnslink=/ipns/loop2.example.com", 82 }, 83 "loop2.example.com": []string{ 84 "dnslink=/ipns/loop1.example.com", 85 }, 86 "bad.example.com": []string{ 87 "dnslink=", 88 }, 89 }, 90 } 91 } 92 93 func TestDNSResolution(t *testing.T) { 94 mock := newMockDNS() 95 r := &DNSResolver{lookupTXT: mock.lookupTXT} 96 testResolution(t, r, "multihash.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) 97 testResolution(t, r, "ipfs.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) 98 testResolution(t, r, "dns1.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) 99 testResolution(t, r, "dns1.example.com", 1, "/ipns/ipfs.example.com", ErrResolveRecursion) 100 testResolution(t, r, "dns2.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) 101 testResolution(t, r, "dns2.example.com", 1, "/ipns/dns1.example.com", ErrResolveRecursion) 102 testResolution(t, r, "dns2.example.com", 2, "/ipns/ipfs.example.com", ErrResolveRecursion) 103 testResolution(t, r, "multi.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) 104 testResolution(t, r, "multi.example.com", 1, "/ipns/dns1.example.com", ErrResolveRecursion) 105 testResolution(t, r, "multi.example.com", 2, "/ipns/ipfs.example.com", ErrResolveRecursion) 106 testResolution(t, r, "equals.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals", nil) 107 testResolution(t, r, "loop1.example.com", 1, "/ipns/loop2.example.com", ErrResolveRecursion) 108 testResolution(t, r, "loop1.example.com", 2, "/ipns/loop1.example.com", ErrResolveRecursion) 109 testResolution(t, r, "loop1.example.com", 3, "/ipns/loop2.example.com", ErrResolveRecursion) 110 testResolution(t, r, "loop1.example.com", DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion) 111 testResolution(t, r, "bad.example.com", DefaultDepthLimit, "", ErrResolveFailed) 112 }