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  }