9 "github.com/anacrolix/log"
11 "github.com/anacrolix/torrent/internal/testutil"
12 qt "github.com/frankban/quicktest"
13 "github.com/stretchr/testify/assert"
14 "github.com/stretchr/testify/require"
17 // Check that after completing leeching, a leecher transitions to a seeding
18 // correctly. Connected in a chain like so: Seeder <-> Leecher <-> LeecherLeecher.
19 func TestHolepunchConnect(t *testing.T) {
20 greetingTempDir, mi := testutil.GreetingTestTorrent()
21 defer os.RemoveAll(greetingTempDir)
23 cfg := TestingConfig(t)
25 cfg.MaxAllocPeerRequestDataPerConn = 4
26 cfg.DataDir = greetingTempDir
29 cfg.AcceptPeerConnections = false
30 //cfg.DisableUTP = true
31 seeder, err := NewClient(cfg)
32 require.NoError(t, err)
34 defer testutil.ExportStatusWriter(seeder, "s", t)()
35 seederTorrent, ok, err := seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
36 require.NoError(t, err)
38 seederTorrent.VerifyData()
40 cfg = TestingConfig(t)
42 cfg.DataDir = t.TempDir()
43 cfg.AlwaysWantConns = true
44 // This way the leecher leecher will still try to use this peer as a relay, but won't be told
45 // about the seeder via PEX.
46 //cfg.DisablePEX = true
48 leecher, err := NewClient(cfg)
49 require.NoError(t, err)
51 defer testutil.ExportStatusWriter(leecher, "l", t)()
53 cfg = TestingConfig(t)
55 cfg.DataDir = t.TempDir()
56 cfg.MaxAllocPeerRequestDataPerConn = 4
58 //cfg.DisableUTP = true
59 leecherLeecher, _ := NewClient(cfg)
60 require.NoError(t, err)
61 defer leecherLeecher.Close()
62 defer testutil.ExportStatusWriter(leecherLeecher, "ll", t)()
63 leecherGreeting, ok, err := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
64 ret = TorrentSpecFromMetaInfo(mi)
69 require.NoError(t, err)
71 llg, ok, err := leecherLeecher.AddTorrentSpec(func() (ret *TorrentSpec) {
72 ret = TorrentSpecFromMetaInfo(mi)
76 require.NoError(t, err)
85 qt.Check(t, iotest.TestReader(r, []byte(testutil.GreetingFileContents)), qt.IsNil)
87 go seederTorrent.AddClientPeer(leecher)
88 waitForConns(seederTorrent)
89 go llg.AddClientPeer(leecher)
91 //time.Sleep(time.Second)
93 targetAddr := seeder.ListenAddrs()[1]
94 log.Printf("trying to initiate to %v", targetAddr)
95 llg.initiateConn(PeerInfo{
102 func waitForConns(t *Torrent) {