11 "github.com/stretchr/testify/assert"
12 "github.com/tendermint/tmlibs/log"
15 func createTempFileName(prefix string) string {
16 f, err := ioutil.TempFile("", prefix)
28 func TestAddrBookSaveLoad(t *testing.T) {
29 fname := createTempFileName("addrbook_test")
32 book := NewAddrBook(fname, true)
33 book.SetLogger(log.TestingLogger())
34 book.saveToFile(fname)
36 book = NewAddrBook(fname, true)
37 book.SetLogger(log.TestingLogger())
38 book.loadFromFile(fname)
40 assert.Zero(t, book.Size())
43 randAddrs := randNetAddressPairs(t, 100)
45 for _, addrSrc := range randAddrs {
46 book.AddAddress(addrSrc.addr, addrSrc.src)
49 assert.Equal(t, 100, book.Size())
50 book.saveToFile(fname)
52 book = NewAddrBook(fname, true)
53 book.SetLogger(log.TestingLogger())
54 book.loadFromFile(fname)
56 assert.Equal(t, 100, book.Size())
59 func TestAddrBookLookup(t *testing.T) {
60 fname := createTempFileName("addrbook_test")
62 randAddrs := randNetAddressPairs(t, 100)
64 book := NewAddrBook(fname, true)
65 book.SetLogger(log.TestingLogger())
66 for _, addrSrc := range randAddrs {
69 book.AddAddress(addr, src)
71 ka := book.addrLookup[addr.String()]
72 assert.NotNil(t, ka, "Expected to find KnownAddress %v but wasn't there.", addr)
74 if !(ka.Addr.Equals(addr) && ka.Src.Equals(src)) {
75 t.Fatalf("KnownAddress doesn't match addr & src")
80 func TestAddrBookPromoteToOld(t *testing.T) {
81 fname := createTempFileName("addrbook_test")
83 randAddrs := randNetAddressPairs(t, 100)
85 book := NewAddrBook(fname, true)
86 book.SetLogger(log.TestingLogger())
87 for _, addrSrc := range randAddrs {
88 book.AddAddress(addrSrc.addr, addrSrc.src)
91 // Attempt all addresses.
92 for _, addrSrc := range randAddrs {
93 book.MarkAttempt(addrSrc.addr)
96 // Promote half of them
97 for i, addrSrc := range randAddrs {
99 book.MarkGood(addrSrc.addr)
103 // TODO: do more testing :)
105 selection := book.GetSelection()
106 t.Logf("selection: %v", selection)
108 if len(selection) > book.Size() {
109 t.Errorf("selection could not be bigger than the book")
113 func TestAddrBookHandlesDuplicates(t *testing.T) {
114 fname := createTempFileName("addrbook_test")
116 book := NewAddrBook(fname, true)
117 book.SetLogger(log.TestingLogger())
119 randAddrs := randNetAddressPairs(t, 100)
121 differentSrc := randIPv4Address(t)
122 for _, addrSrc := range randAddrs {
123 book.AddAddress(addrSrc.addr, addrSrc.src)
124 book.AddAddress(addrSrc.addr, addrSrc.src) // duplicate
125 book.AddAddress(addrSrc.addr, differentSrc) // different src
128 assert.Equal(t, 100, book.Size())
131 type netAddressPair struct {
136 func randNetAddressPairs(t *testing.T, n int) []netAddressPair {
137 randAddrs := make([]netAddressPair, n)
138 for i := 0; i < n; i++ {
139 randAddrs[i] = netAddressPair{addr: randIPv4Address(t), src: randIPv4Address(t)}
144 func randIPv4Address(t *testing.T) *NetAddress {
146 ip := fmt.Sprintf("%v.%v.%v.%v",
152 port := rand.Intn(65535-1) + 1
153 addr, err := NewNetAddressString(fmt.Sprintf("%v:%v", ip, port))
154 assert.Nil(t, err, "error generating rand network address")
161 func TestAddrBookRemoveAddress(t *testing.T) {
162 fname := createTempFileName("addrbook_test")
163 book := NewAddrBook(fname, true)
164 book.SetLogger(log.TestingLogger())
166 addr := randIPv4Address(t)
167 book.AddAddress(addr, addr)
168 assert.Equal(t, 1, book.Size())
170 book.RemoveAddress(addr)
171 assert.Equal(t, 0, book.Size())
173 nonExistingAddr := randIPv4Address(t)
174 book.RemoveAddress(nonExistingAddr)
175 assert.Equal(t, 0, book.Size())