7 "github.com/stretchr/testify/require"
9 "github.com/anacrolix/dht/v2/krpc"
10 pp "github.com/anacrolix/torrent/peer_protocol"
15 &net.TCPAddr{IP: net.IPv6loopback, Port: 4747},
16 &net.TCPAddr{IP: net.IPv6loopback, Port: 4748},
17 &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 4747},
18 &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 4748},
20 f = pp.PexOutgoingConn
23 func TestPexAdded(t *testing.T) {
24 t.Run("noHold", func(t *testing.T) {
26 s.Add(&PeerConn{remoteAddr: addrs[0], outgoing: true})
29 pexEvent{pexAdd, addrs[0], pp.PexOutgoingConn},
33 require.EqualValues(t, targ, s)
35 t.Run("belowTarg", func(t *testing.T) {
38 pexEvent{pexDrop, addrs[1], 0},
42 s.Add(&PeerConn{remoteAddr: addrs[0]})
45 pexEvent{pexDrop, addrs[1], 0},
48 pexEvent{pexAdd, addrs[0], 0},
52 require.EqualValues(t, targ, s)
54 t.Run("aboveTarg", func(t *testing.T) {
55 holdAddr := &net.TCPAddr{IP: net.IPv6loopback, Port: 4848}
58 pexEvent{pexDrop, holdAddr, 0},
62 s.Add(&PeerConn{remoteAddr: addrs[0]})
66 pexEvent{pexDrop, holdAddr, 0},
67 pexEvent{pexAdd, addrs[0], 0},
71 require.EqualValues(t, targ, s)
75 func TestPexDropped(t *testing.T) {
76 t.Run("belowTarg", func(t *testing.T) {
78 s.Drop(&PeerConn{remoteAddr: addrs[0]})
80 hold: []pexEvent{pexEvent{pexDrop, addrs[0], 0}},
83 require.EqualValues(t, targ, s)
85 t.Run("aboveTarg", func(t *testing.T) {
86 s := &pexState{nc: pexTargAdded + 1}
87 s.Drop(&PeerConn{remoteAddr: addrs[0]})
89 ev: []pexEvent{pexEvent{pexDrop, addrs[0], 0}},
92 require.EqualValues(t, targ, s)
96 func TestPexReset(t *testing.T) {
98 hold: []pexEvent{pexEvent{pexDrop, addrs[0], 0}},
99 ev: []pexEvent{pexEvent{pexAdd, addrs[1], 0}},
103 targ := new(pexState)
104 require.EqualValues(t, targ, s)
107 var testcases = []struct {
125 pexEvent{pexAdd, addrs[0], f},
126 pexEvent{pexAdd, addrs[1], f},
127 pexEvent{pexAdd, addrs[2], f},
128 pexEvent{pexAdd, addrs[3], f},
133 Added: krpc.CompactIPv4NodeAddrs{
137 AddedFlags: []pp.PexPeerFlags{f, f},
138 Added6: krpc.CompactIPv6NodeAddrs{
142 Added6Flags: []pp.PexPeerFlags{f, f},
151 pexEvent{pexDrop, addrs[0], f},
152 pexEvent{pexDrop, addrs[2], f},
156 Dropped: krpc.CompactIPv4NodeAddrs{
159 Dropped6: krpc.CompactIPv6NodeAddrs{
170 pexEvent{pexAdd, addrs[0], f},
171 pexEvent{pexAdd, addrs[1], f},
172 pexEvent{pexDrop, addrs[0], f},
176 Added6: krpc.CompactIPv6NodeAddrs{
179 Added6Flags: []pp.PexPeerFlags{f},
188 pexEvent{pexAdd, addrs[0], f},
189 pexEvent{pexAdd, addrs[1], f},
190 pexEvent{pexAdd, addrs[2], f},
193 pexEvent{pexDrop, addrs[0], f},
194 pexEvent{pexDrop, addrs[2], f},
195 pexEvent{pexDrop, addrs[1], f},
199 Added: krpc.CompactIPv4NodeAddrs{
202 AddedFlags: []pp.PexPeerFlags{f},
203 Added6: krpc.CompactIPv6NodeAddrs{
207 Added6Flags: []pp.PexPeerFlags{f, f},
216 pexEvent{pexAdd, addrs[0], f},
217 pexEvent{pexAdd, addrs[1], f},
221 Added6: krpc.CompactIPv6NodeAddrs{
224 Added6Flags: []pp.PexPeerFlags{f},
230 func TestPexGenmsg(t *testing.T) {
231 for _, tc := range testcases {
232 t.Run(tc.name, func(t *testing.T) {
234 m, seen := s.Genmsg(tc.arg)
235 require.EqualValues(t, tc.targM, m)
236 require.EqualValues(t, tc.targS, seen)