9 "github.com/anacrolix/torrent/internal/testutil"
10 qt "github.com/frankban/quicktest"
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
15 // Check that after completing leeching, a leecher transitions to a seeding
16 // correctly. Connected in a chain like so: Seeder <-> Leecher <-> LeecherLeecher.
17 func TestHolepunchConnect(t *testing.T) {
18 greetingTempDir, mi := testutil.GreetingTestTorrent()
19 defer os.RemoveAll(greetingTempDir)
21 cfg := TestingConfig(t)
23 cfg.MaxAllocPeerRequestDataPerConn = 4
24 cfg.DataDir = greetingTempDir
27 cfg.AcceptPeerConnections = false
28 seeder, err := NewClient(cfg)
29 require.NoError(t, err)
31 defer testutil.ExportStatusWriter(seeder, "s", t)()
32 seederTorrent, ok, err := seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
33 require.NoError(t, err)
35 seederTorrent.VerifyData()
37 cfg = TestingConfig(t)
39 cfg.DataDir = t.TempDir()
40 cfg.AlwaysWantConns = true
41 // This way the leecher leecher will still try to use this peer as a relay, but won't be told
42 // about the seeder via PEX.
43 //cfg.DisablePEX = true
45 leecher, err := NewClient(cfg)
46 require.NoError(t, err)
48 defer testutil.ExportStatusWriter(leecher, "l", t)()
50 cfg = TestingConfig(t)
52 cfg.DataDir = t.TempDir()
53 cfg.MaxAllocPeerRequestDataPerConn = 4
55 //cfg.DisableUTP = true
56 leecherLeecher, _ := NewClient(cfg)
57 require.NoError(t, err)
58 defer leecherLeecher.Close()
59 defer testutil.ExportStatusWriter(leecherLeecher, "ll", t)()
60 leecherGreeting, ok, err := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
61 ret = TorrentSpecFromMetaInfo(mi)
66 require.NoError(t, err)
68 llg, ok, err := leecherLeecher.AddTorrentSpec(func() (ret *TorrentSpec) {
69 ret = TorrentSpecFromMetaInfo(mi)
73 require.NoError(t, err)
82 qt.Check(t, iotest.TestReader(r, []byte(testutil.GreetingFileContents)), qt.IsNil)
84 go seederTorrent.AddClientPeer(leecher)
85 waitForConns(seederTorrent)
86 go llg.AddClientPeer(leecher)
89 llg.initiateConn(PeerInfo{
90 Addr: seeder.ListenAddrs()[0],
96 func waitForConns(t *Torrent) {