14 "bitbucket.org/anacrolix/go.torrent/data/blob"
15 "github.com/anacrolix/libtorgo/metainfo"
17 "github.com/bradfitz/iter"
19 "bitbucket.org/anacrolix/go.torrent/internal/testutil"
20 "bitbucket.org/anacrolix/go.torrent/util"
21 "bitbucket.org/anacrolix/utp"
22 "github.com/anacrolix/libtorgo/bencode"
25 var TestingConfig = Config{
28 DisableTrackers: true,
29 NoDefaultBlocklist: true,
30 DisableMetainfoCache: true,
33 func TestClientDefault(t *testing.T) {
34 cl, err := NewClient(&Config{
35 NoDefaultBlocklist: true,
44 func TestAddDropTorrent(t *testing.T) {
45 cl, err := NewClient(&Config{
46 ListenAddr: "localhost:0",
52 dir, mi := testutil.GreetingTestTorrent()
53 defer os.RemoveAll(dir)
54 tt, err := cl.AddTorrent(mi)
61 func TestAddTorrentNoSupportedTrackerSchemes(t *testing.T) {
65 func TestAddTorrentNoUsableURLs(t *testing.T) {
69 func TestAddPeersToUnknownTorrent(t *testing.T) {
73 func TestPieceHashSize(t *testing.T) {
74 if pieceHash.Size() != 20 {
79 func TestTorrentInitialState(t *testing.T) {
80 dir, mi := testutil.GreetingTestTorrent()
81 defer os.RemoveAll(dir)
82 tor, err := newTorrent(func() (ih InfoHash) {
83 util.CopyExact(ih[:], mi.Info.Hash)
89 err = tor.setMetadata(mi.Info.Info, mi.Info.Bytes, nil)
93 if len(tor.Pieces) != 3 {
94 t.Fatal("wrong number of pieces")
97 tor.pendAllChunkSpecs(0)
98 if len(p.PendingChunkSpecs) != 1 {
99 t.Fatalf("should only be 1 chunk: %v", p.PendingChunkSpecs)
101 // TODO: Set chunkSize to 2, to test odd/even silliness.
103 if _, ok := p.PendingChunkSpecs[chunkSpec{
106 t.Fatal("pending chunk spec is incorrect")
111 func TestUnmarshalPEXMsg(t *testing.T) {
112 var m peerExchangeMessage
113 if err := bencode.Unmarshal([]byte("d5:added12:\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0ce"), &m); err != nil {
116 if len(m.Added) != 2 {
119 if m.Added[0].Port != 0x506 {
124 func TestReducedDialTimeout(t *testing.T) {
125 for _, _case := range []struct {
129 ExpectedReduced time.Duration
131 {nominalDialTimeout, 40, 0, nominalDialTimeout},
132 {nominalDialTimeout, 40, 1, nominalDialTimeout},
133 {nominalDialTimeout, 40, 39, nominalDialTimeout},
134 {nominalDialTimeout, 40, 40, nominalDialTimeout / 2},
135 {nominalDialTimeout, 40, 80, nominalDialTimeout / 3},
136 {nominalDialTimeout, 40, 4000, nominalDialTimeout / 101},
138 reduced := reducedDialTimeout(_case.Max, _case.HalfOpenLimit, _case.PendingPeers)
139 expected := _case.ExpectedReduced
140 if expected < minDialTimeout {
141 expected = minDialTimeout
143 if reduced != expected {
144 t.Fatalf("expected %s, got %s", _case.ExpectedReduced, reduced)
149 func TestUTPRawConn(t *testing.T) {
150 l, err := utp.NewSocket("")
163 // Connect a UTP peer to see if the RawConn will still work.
164 utpPeer, err := func() *utp.Socket {
165 s, _ := utp.NewSocket("")
167 }().Dial(fmt.Sprintf("localhost:%d", util.AddrPort(l.Addr())))
169 t.Fatalf("error dialing utp listener: %s", err)
171 defer utpPeer.Close()
172 peer, err := net.ListenPacket("udp", ":0")
179 const N = 5000 // How many messages to send.
180 readerStopped := make(chan struct{})
181 // The reader goroutine.
183 defer close(readerStopped)
184 b := make([]byte, 500)
185 for i := 0; i < N; i++ {
186 n, _, err := l.PacketConn().ReadFrom(b)
188 t.Fatalf("error reading from raw conn: %s", err)
192 fmt.Sscan(string(b[:n]), &d)
194 log.Printf("got wrong number: expected %d, got %d", i, d)
198 udpAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("localhost:%d", util.AddrPort(l.Addr())))
202 for i := 0; i < N; i++ {
203 _, err := peer.WriteTo([]byte(fmt.Sprintf("%d", i)), udpAddr)
207 time.Sleep(time.Microsecond)
210 case <-readerStopped:
211 case <-time.After(time.Second):
212 t.Fatal("reader timed out")
214 if msgsReceived != N {
215 t.Fatalf("messages received: %d", msgsReceived)
219 func TestTwoClientsArbitraryPorts(t *testing.T) {
220 for i := 0; i < 2; i++ {
221 cl, err := NewClient(&Config{
231 func TestAddDropManyTorrents(t *testing.T) {
232 cl, _ := NewClient(&TestingConfig)
235 for i := range iter.N(1000) {
236 binary.PutVarint(m.InfoHash[:], int64(i))
237 cl.AddMagnet(m.String())
241 func TestClientTransfer(t *testing.T) {
242 greetingTempDir, mi := testutil.GreetingTestTorrent()
243 defer os.RemoveAll(greetingTempDir)
245 cfg.DataDir = greetingTempDir
246 seeder, err := NewClient(&cfg)
251 seeder.AddTorrent(mi)
252 leecherDataDir, err := ioutil.TempDir("", "")
256 defer os.RemoveAll(leecherDataDir)
257 cfg.TorrentDataOpener = func(info *metainfo.Info) (StatelessData, error) {
258 return blob.TorrentData(info, leecherDataDir), nil
260 leecher, _ := NewClient(&cfg)
262 leecherGreeting, _ := leecher.AddTorrent(mi)
263 leecherGreeting.AddPeers([]Peer{
265 IP: util.AddrIP(seeder.ListenAddr()),
266 Port: util.AddrPort(seeder.ListenAddr()),
269 _greeting, err := ioutil.ReadAll(io.NewSectionReader(leecherGreeting, 0, leecherGreeting.Length()))
273 greeting := string(_greeting)
274 if greeting != testutil.GreetingFileContents {