2020-04-09 00:03:29 +08:00
|
|
|
package torrent
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/anacrolix/dht/v2/krpc"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
|
|
|
"github.com/anacrolix/torrent/metainfo"
|
|
|
|
pp "github.com/anacrolix/torrent/peer_protocol"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestPexConnState(t *testing.T) {
|
|
|
|
cl := Client{
|
2021-02-22 11:30:09 +08:00
|
|
|
config: TestingConfig(t),
|
2020-04-09 00:03:29 +08:00
|
|
|
}
|
|
|
|
cl.initLogger()
|
|
|
|
torrent := cl.newTorrent(metainfo.Hash{}, nil)
|
|
|
|
addr := &net.TCPAddr{IP: net.IPv6loopback, Port: 4747}
|
2021-01-25 12:43:28 +08:00
|
|
|
c := cl.newConnection(nil, false, addr, addr.Network(), "")
|
2020-04-09 00:03:29 +08:00
|
|
|
c.PeerExtensionIDs = make(map[pp.ExtensionName]pp.ExtensionNumber)
|
|
|
|
c.PeerExtensionIDs[pp.ExtensionNamePex] = pexExtendedId
|
|
|
|
c.writerCond.L.Lock()
|
|
|
|
c.setTorrent(torrent)
|
|
|
|
torrent.addConnection(c)
|
|
|
|
|
|
|
|
c.pex.Init(c)
|
|
|
|
require.True(t, c.pex.IsEnabled(), "should get enabled")
|
|
|
|
defer c.pex.Close()
|
|
|
|
|
|
|
|
var out pp.Message
|
|
|
|
writerCalled := false
|
|
|
|
testWriter := func(m pp.Message) bool {
|
|
|
|
writerCalled = true
|
|
|
|
out = m
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
c.writerCond.Wait()
|
|
|
|
c.pex.Share(testWriter)
|
|
|
|
require.True(t, writerCalled)
|
|
|
|
require.EqualValues(t, pp.Extended, out.Type)
|
|
|
|
require.EqualValues(t, pexExtendedId, out.ExtendedID)
|
|
|
|
|
|
|
|
x, err := pp.LoadPexMsg(out.ExtendedPayload)
|
|
|
|
require.NoError(t, err)
|
2020-10-23 05:58:55 +08:00
|
|
|
targx := pp.PexMsg{
|
2020-04-09 00:03:29 +08:00
|
|
|
Added: krpc.CompactIPv4NodeAddrs(nil),
|
|
|
|
AddedFlags: []pp.PexPeerFlags{},
|
|
|
|
Added6: krpc.CompactIPv6NodeAddrs{
|
2020-10-23 05:58:55 +08:00
|
|
|
mustNodeAddr(addr),
|
2020-04-09 00:03:29 +08:00
|
|
|
},
|
|
|
|
Added6Flags: []pp.PexPeerFlags{0},
|
|
|
|
}
|
|
|
|
require.EqualValues(t, targx, x)
|
|
|
|
}
|