File: addrbook_test.go

package info (click to toggle)
tendermint-go-p2p 0.0~git20170113.0.3d98f67-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 248 kB
  • ctags: 425
  • sloc: sh: 23; makefile: 4
file content (163 lines) | stat: -rw-r--r-- 3,362 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package p2p

import (
	"fmt"
	"io/ioutil"
	"math/rand"
	"testing"
)

const addrBookStrict = true

func createTempFileName(prefix string) string {
	f, err := ioutil.TempFile("", prefix)
	if err != nil {
		panic(err)
	}
	fname := f.Name()
	err = f.Close()
	if err != nil {
		panic(err)
	}
	return fname
}

func TestEmpty(t *testing.T) {
	fname := createTempFileName("addrbook_test")
	// t.Logf("New tempfile name: %v", fname)

	// Save an empty book & load it
	book := NewAddrBook(fname, addrBookStrict)
	book.saveToFile(fname)

	book = NewAddrBook(fname, addrBookStrict)
	book.loadFromFile(fname)

	if book.Size() != 0 {
		t.Errorf("Expected 0 addresses, found %v", book.Size())
	}
}

func randIPv4Address() *NetAddress {
	for {
		ip := fmt.Sprintf("%v.%v.%v.%v",
			rand.Intn(254)+1,
			rand.Intn(255),
			rand.Intn(255),
			rand.Intn(255),
		)
		port := rand.Intn(65535-1) + 1
		addr := NewNetAddressString(fmt.Sprintf("%v:%v", ip, port))
		if addr.Routable() {
			return addr
		}
	}
}

func TestSaveAddresses(t *testing.T) {
	fname := createTempFileName("addrbook_test")
	//t.Logf("New tempfile name: %v", fname)

	// Create some random addresses
	randAddrs := []struct {
		addr *NetAddress
		src  *NetAddress
	}{}
	for i := 0; i < 100; i++ {
		addr := randIPv4Address()
		src := randIPv4Address()
		randAddrs = append(randAddrs, struct {
			addr *NetAddress
			src  *NetAddress
		}{
			addr: addr,
			src:  src,
		})
	}

	// Create the book & populate & save
	book := NewAddrBook(fname, addrBookStrict)
	for _, addrSrc := range randAddrs {
		book.AddAddress(addrSrc.addr, addrSrc.src)
	}
	if book.Size() != 100 {
		t.Errorf("Expected 100 addresses, found %v", book.Size())
	}
	book.saveToFile(fname)

	// Reload the book
	book = NewAddrBook(fname, addrBookStrict)
	book.loadFromFile(fname)

	// Test ...

	if book.Size() != 100 {
		t.Errorf("Expected 100 addresses, found %v", book.Size())
	}

	for _, addrSrc := range randAddrs {
		addr := addrSrc.addr
		src := addrSrc.src
		ka := book.addrLookup[addr.String()]
		if ka == nil {
			t.Fatalf("Expected to find KnownAddress %v but wasn't there.", addr)
		}
		if !(ka.Addr.Equals(addr) && ka.Src.Equals(src)) {
			t.Fatalf("KnownAddress doesn't match addr & src")
		}
	}
}

func TestPromoteToOld(t *testing.T) {
	fname := createTempFileName("addrbook_test")
	t.Logf("New tempfile name: %v", fname)

	// Create some random addresses
	randAddrs := []struct {
		addr *NetAddress
		src  *NetAddress
	}{}
	for i := 0; i < 100; i++ {
		addr := randIPv4Address()
		src := randIPv4Address()
		randAddrs = append(randAddrs, struct {
			addr *NetAddress
			src  *NetAddress
		}{
			addr: addr,
			src:  src,
		})
	}

	// Create the book & populate & save
	book := NewAddrBook(fname, addrBookStrict)
	for _, addrSrc := range randAddrs {
		book.AddAddress(addrSrc.addr, addrSrc.src)
	}
	// Attempt all addresses.
	for _, addrSrc := range randAddrs {
		book.MarkAttempt(addrSrc.addr)
	}
	// Promote half of them
	for i, addrSrc := range randAddrs {
		if i%2 == 0 {
			book.MarkGood(addrSrc.addr)
		}
	}
	book.saveToFile(fname)

	// Reload the book
	book = NewAddrBook(fname, addrBookStrict)
	book.loadFromFile(fname)

	// Test ...

	if book.Size() != 100 {
		t.Errorf("Expected 100 addresses, found %v", book.Size())
	}

	// TODO: do more testing :)

	selection := book.GetSelection()
	t.Logf("selection: %v", selection)
}