9 "github.com/stretchr/testify/require"
11 "github.com/anacrolix/dht/v2/krpc"
12 "github.com/anacrolix/torrent/bencode"
15 func TestUnmarshalPex(t *testing.T) {
17 err := bencode.Unmarshal([]byte("d5:added12:\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0ce"), &pem)
18 require.NoError(t, err)
19 require.EqualValues(t, 2, len(pem.Added))
20 require.EqualValues(t, 1286, pem.Added[0].Port)
21 require.EqualValues(t, 0x100*0xb+0xc, pem.Added[1].Port)
24 func TestEmptyPexMsg(t *testing.T) {
26 b, err := bencode.Marshal(pm)
28 require.NoError(t, err)
29 require.NoError(t, bencode.Unmarshal(b, &pm))
32 func TestPexAdd(t *testing.T) {
33 addrs4 := []krpc.NodeAddr{
34 krpc.NodeAddr{IP: net.IPv4(127, 0, 0, 1), Port: 4747}, // 0
35 krpc.NodeAddr{IP: net.IPv4(127, 0, 0, 1), Port: 4748}, // 1
36 krpc.NodeAddr{IP: net.IPv4(127, 0, 0, 2), Port: 4747}, // 2
37 krpc.NodeAddr{IP: net.IPv4(127, 0, 0, 2), Port: 4748}, // 3
39 addrs6 := []krpc.NodeAddr{
40 krpc.NodeAddr{IP: net.IPv6loopback, Port: 4747}, // 0
41 krpc.NodeAddr{IP: net.IPv6loopback, Port: 4748}, // 1
42 krpc.NodeAddr{IP: net.IPv6loopback, Port: 4749}, // 2
43 krpc.NodeAddr{IP: net.IPv6loopback, Port: 4750}, // 3
45 f := PexPrefersEncryption | PexOutgoingConn
47 t.Run("ipv4", func(t *testing.T) {
52 for _, addr := range addrs {
56 Added: krpc.CompactIPv4NodeAddrs{
61 AddedFlags: []PexPeerFlags{f, f, f},
62 Dropped: krpc.CompactIPv4NodeAddrs{},
64 require.EqualValues(t, targ, m)
66 t.Run("ipv6", func(t *testing.T) {
71 for _, addr := range addrs {
75 Added6: krpc.CompactIPv6NodeAddrs{
80 Added6Flags: []PexPeerFlags{f, f, f},
81 Dropped6: krpc.CompactIPv6NodeAddrs{},
83 require.EqualValues(t, targ, m)
85 t.Run("empty", func(t *testing.T) {
86 addr := krpc.NodeAddr{}
89 require.EqualValues(t, 0, len(xm.Added))
90 require.EqualValues(t, 0, len(xm.AddedFlags))
91 require.EqualValues(t, 0, len(xm.Added6))
92 require.EqualValues(t, 0, len(xm.Added6Flags))
96 func TestPexDrop(t *testing.T) {
97 addrs4 := []krpc.NodeAddr{
98 krpc.NodeAddr{IP: net.IPv4(127, 0, 0, 1), Port: 4747}, // 0
99 krpc.NodeAddr{IP: net.IPv4(127, 0, 0, 1), Port: 4748}, // 1
100 krpc.NodeAddr{IP: net.IPv4(127, 0, 0, 2), Port: 4747}, // 2
101 krpc.NodeAddr{IP: net.IPv4(127, 0, 0, 2), Port: 4748}, // 3
103 addrs6 := []krpc.NodeAddr{
104 krpc.NodeAddr{IP: net.IPv6loopback, Port: 4747}, // 0
105 krpc.NodeAddr{IP: net.IPv6loopback, Port: 4748}, // 1
106 krpc.NodeAddr{IP: net.IPv6loopback, Port: 4749}, // 2
107 krpc.NodeAddr{IP: net.IPv6loopback, Port: 4750}, // 3
109 f := PexPrefersEncryption | PexOutgoingConn
111 t.Run("ipv4", func(t *testing.T) {
116 for _, addr := range addrs {
120 AddedFlags: []PexPeerFlags{},
121 Added: krpc.CompactIPv4NodeAddrs{},
122 Dropped: krpc.CompactIPv4NodeAddrs{
128 require.EqualValues(t, targ, m)
130 t.Run("ipv6", func(t *testing.T) {
135 for _, addr := range addrs {
139 Added6Flags: []PexPeerFlags{},
140 Added6: krpc.CompactIPv6NodeAddrs{},
141 Dropped6: krpc.CompactIPv6NodeAddrs{
147 require.EqualValues(t, targ, m)
149 t.Run("empty", func(t *testing.T) {
150 addr := krpc.NodeAddr{}
153 require.EqualValues(t, 0, len(xm.Dropped))
154 require.EqualValues(t, 0, len(xm.Dropped6))
158 func TestMarshalPexMessage(t *testing.T) {
159 addr := krpc.NodeAddr{IP: net.IP{127, 0, 0, 1}, Port: 0x55aa}
160 f := PexPrefersEncryption | PexOutgoingConn
162 pm.Added = append(pm.Added, addr)
163 pm.AddedFlags = append(pm.AddedFlags, f)
165 b, err := bencode.Marshal(pm)
166 require.NoError(t, err)
168 pexExtendedId := ExtensionNumber(7)
169 msg := pm.Message(pexExtendedId)
170 expected := []byte("\x00\x00\x00\x4c\x14\x07d5:added6:\x7f\x00\x00\x01\x55\xaa7:added.f1:\x116:added60:8:added6.f0:7:dropped0:8:dropped60:e")
171 b, err = msg.MarshalBinary()
172 require.NoError(t, err)
173 require.EqualValues(t, b, expected)
177 R: bufio.NewReader(bytes.NewBuffer(b)),
181 err = dec.Decode(&msg)
182 require.NoError(t, err)
183 require.EqualValues(t, Extended, msg.Type)
184 require.EqualValues(t, pexExtendedId, msg.ExtendedID)
185 err = bencode.Unmarshal(msg.ExtendedPayload, &pmOut)
186 require.NoError(t, err)
187 require.EqualValues(t, len(pm.Added), len(pmOut.Added))
188 require.EqualValues(t, pm.Added[0].IP, pmOut.Added[0].IP)
189 require.EqualValues(t, pm.Added[0].Port, pmOut.Added[0].Port)