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{peer: peer{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{peer: peer{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{peer: peer{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{peer: peer{RemoteAddr: addrs[0], pex: pexConnState{Listed: true}}})
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{peer: peer{RemoteAddr: addrs[0], pex: pexConnState{Listed: true}}})
89 ev: []pexEvent{pexEvent{pexDrop, addrs[0], 0}},
92 require.EqualValues(t, targ, s)
94 t.Run("aboveTargNotListed", func(t *testing.T) {
95 s := &pexState{nc: pexTargAdded + 1}
96 s.Drop(&PeerConn{peer: peer{RemoteAddr: addrs[0], pex: pexConnState{Listed: false}}})
97 targ := &pexState{nc: pexTargAdded + 1}
98 require.EqualValues(t, targ, s)
102 func TestPexReset(t *testing.T) {
104 hold: []pexEvent{pexEvent{pexDrop, addrs[0], 0}},
105 ev: []pexEvent{pexEvent{pexAdd, addrs[1], 0}},
109 targ := new(pexState)
110 require.EqualValues(t, targ, s)
113 var testcases = []struct {
131 pexEvent{pexAdd, addrs[0], f},
132 pexEvent{pexAdd, addrs[1], f},
133 pexEvent{pexAdd, addrs[2], f},
134 pexEvent{pexAdd, addrs[3], f},
139 Added: krpc.CompactIPv4NodeAddrs{
143 AddedFlags: []pp.PexPeerFlags{f, f},
144 Added6: krpc.CompactIPv6NodeAddrs{
148 Added6Flags: []pp.PexPeerFlags{f, f},
157 pexEvent{pexDrop, addrs[0], f},
158 pexEvent{pexDrop, addrs[2], f},
162 Dropped: krpc.CompactIPv4NodeAddrs{
165 Dropped6: krpc.CompactIPv6NodeAddrs{
176 pexEvent{pexAdd, addrs[0], f},
177 pexEvent{pexAdd, addrs[1], f},
178 pexEvent{pexDrop, addrs[0], f},
182 Added6: krpc.CompactIPv6NodeAddrs{
185 Added6Flags: []pp.PexPeerFlags{f},
194 pexEvent{pexAdd, addrs[0], f},
195 pexEvent{pexAdd, addrs[1], f},
196 pexEvent{pexAdd, addrs[2], f},
199 pexEvent{pexDrop, addrs[0], f},
200 pexEvent{pexDrop, addrs[2], f},
201 pexEvent{pexDrop, addrs[1], f},
205 Added: krpc.CompactIPv4NodeAddrs{
208 AddedFlags: []pp.PexPeerFlags{f},
209 Added6: krpc.CompactIPv6NodeAddrs{
213 Added6Flags: []pp.PexPeerFlags{f, f},
222 pexEvent{pexAdd, addrs[0], f},
223 pexEvent{pexAdd, addrs[1], f},
227 Added6: krpc.CompactIPv6NodeAddrs{
230 Added6Flags: []pp.PexPeerFlags{f},
236 func TestPexGenmsg(t *testing.T) {
237 for _, tc := range testcases {
238 t.Run(tc.name, func(t *testing.T) {
240 m, seen := s.Genmsg(tc.arg)
241 require.EqualValues(t, tc.targM, m)
242 require.EqualValues(t, tc.targS, seen)