9 "github.com/stretchr/testify/assert"
10 "github.com/tendermint/tmlibs/log"
13 func createTempFileName(prefix string) string {
14 f, err := ioutil.TempFile("", prefix)
26 func TestAddrBookSaveLoad(t *testing.T) {
27 fname := createTempFileName("addrbook_test")
30 book := NewAddrBook(fname, true)
31 book.SetLogger(log.TestingLogger())
32 book.saveToFile(fname)
34 book = NewAddrBook(fname, true)
35 book.SetLogger(log.TestingLogger())
36 book.loadFromFile(fname)
38 assert.Zero(t, book.Size())
41 randAddrs := randNetAddressPairs(t, 100)
43 for _, addrSrc := range randAddrs {
44 book.AddAddress(addrSrc.addr, addrSrc.src)
47 assert.Equal(t, 100, book.Size())
48 book.saveToFile(fname)
50 book = NewAddrBook(fname, true)
51 book.SetLogger(log.TestingLogger())
52 book.loadFromFile(fname)
54 assert.Equal(t, 100, book.Size())
57 func TestAddrBookLookup(t *testing.T) {
58 fname := createTempFileName("addrbook_test")
60 randAddrs := randNetAddressPairs(t, 100)
62 book := NewAddrBook(fname, true)
63 book.SetLogger(log.TestingLogger())
64 for _, addrSrc := range randAddrs {
67 book.AddAddress(addr, src)
69 ka := book.addrLookup[addr.String()]
70 assert.NotNil(t, ka, "Expected to find KnownAddress %v but wasn't there.", addr)
72 if !(ka.Addr.Equals(addr) && ka.Src.Equals(src)) {
73 t.Fatalf("KnownAddress doesn't match addr & src")
78 func TestAddrBookPromoteToOld(t *testing.T) {
79 fname := createTempFileName("addrbook_test")
81 randAddrs := randNetAddressPairs(t, 100)
83 book := NewAddrBook(fname, true)
84 book.SetLogger(log.TestingLogger())
85 for _, addrSrc := range randAddrs {
86 book.AddAddress(addrSrc.addr, addrSrc.src)
89 // Attempt all addresses.
90 for _, addrSrc := range randAddrs {
91 book.MarkAttempt(addrSrc.addr)
94 // Promote half of them
95 for i, addrSrc := range randAddrs {
97 book.MarkGood(addrSrc.addr)
101 // TODO: do more testing :)
103 selection := book.GetSelection()
104 t.Logf("selection: %v", selection)
106 if len(selection) > book.Size() {
107 t.Errorf("selection could not be bigger than the book")
111 func TestAddrBookHandlesDuplicates(t *testing.T) {
112 fname := createTempFileName("addrbook_test")
114 book := NewAddrBook(fname, true)
115 book.SetLogger(log.TestingLogger())
117 randAddrs := randNetAddressPairs(t, 100)
119 differentSrc := randIPv4Address(t)
120 for _, addrSrc := range randAddrs {
121 book.AddAddress(addrSrc.addr, addrSrc.src)
122 book.AddAddress(addrSrc.addr, addrSrc.src) // duplicate
123 book.AddAddress(addrSrc.addr, differentSrc) // different src
126 assert.Equal(t, 100, book.Size())
129 type netAddressPair struct {
134 func randNetAddressPairs(t *testing.T, n int) []netAddressPair {
135 randAddrs := make([]netAddressPair, n)
136 for i := 0; i < n; i++ {
137 randAddrs[i] = netAddressPair{addr: randIPv4Address(t), src: randIPv4Address(t)}
142 func randIPv4Address(t *testing.T) *NetAddress {
144 ip := fmt.Sprintf("%v.%v.%v.%v",
150 port := rand.Intn(65535-1) + 1
151 addr, err := NewNetAddressString(fmt.Sprintf("%v:%v", ip, port))
152 assert.Nil(t, err, "error generating rand network address")
159 func TestAddrBookRemoveAddress(t *testing.T) {
160 fname := createTempFileName("addrbook_test")
161 book := NewAddrBook(fname, true)
162 book.SetLogger(log.TestingLogger())
164 addr := randIPv4Address(t)
165 book.AddAddress(addr, addr)
166 assert.Equal(t, 1, book.Size())
168 book.RemoveAddress(addr)
169 assert.Equal(t, 0, book.Size())
171 nonExistingAddr := randIPv4Address(t)
172 book.RemoveAddress(nonExistingAddr)
173 assert.Equal(t, 0, book.Size())