14 "bitbucket.org/anacrolix/go.torrent/data/blob"
16 "github.com/bradfitz/iter"
18 "bitbucket.org/anacrolix/go.torrent/internal/testutil"
19 "bitbucket.org/anacrolix/go.torrent/util"
20 "bitbucket.org/anacrolix/utp"
21 "github.com/anacrolix/libtorgo/bencode"
25 log.SetFlags(log.LstdFlags | log.Lshortfile)
28 var TestingConfig = Config{
29 ListenAddr: "localhost:0",
31 DisableTrackers: true,
32 NoDefaultBlocklist: true,
33 DisableMetainfoCache: true,
36 func TestClientDefault(t *testing.T) {
37 cl, err := NewClient(&TestingConfig)
44 func TestAddDropTorrent(t *testing.T) {
45 cl, err := NewClient(&TestingConfig)
50 dir, mi := testutil.GreetingTestTorrent()
51 defer os.RemoveAll(dir)
52 tt, new, err := cl.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
62 func TestAddTorrentNoSupportedTrackerSchemes(t *testing.T) {
66 func TestAddTorrentNoUsableURLs(t *testing.T) {
70 func TestAddPeersToUnknownTorrent(t *testing.T) {
74 func TestPieceHashSize(t *testing.T) {
75 if pieceHash.Size() != 20 {
80 func TestTorrentInitialState(t *testing.T) {
81 dir, mi := testutil.GreetingTestTorrent()
82 defer os.RemoveAll(dir)
83 tor, err := newTorrent(func() (ih InfoHash) {
84 util.CopyExact(ih[:], mi.Info.Hash)
90 err = tor.setMetadata(&mi.Info.Info, mi.Info.Bytes, nil)
94 if len(tor.Pieces) != 3 {
95 t.Fatal("wrong number of pieces")
98 tor.pendAllChunkSpecs(0)
99 if len(p.PendingChunkSpecs) != 1 {
100 t.Fatalf("should only be 1 chunk: %v", p.PendingChunkSpecs)
102 // TODO: Set chunkSize to 2, to test odd/even silliness.
104 if _, ok := p.PendingChunkSpecs[chunkSpec{
107 t.Fatal("pending chunk spec is incorrect")
112 func TestUnmarshalPEXMsg(t *testing.T) {
113 var m peerExchangeMessage
114 if err := bencode.Unmarshal([]byte("d5:added12:\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0ce"), &m); err != nil {
117 if len(m.Added) != 2 {
120 if m.Added[0].Port != 0x506 {
125 func TestReducedDialTimeout(t *testing.T) {
126 for _, _case := range []struct {
130 ExpectedReduced time.Duration
132 {nominalDialTimeout, 40, 0, nominalDialTimeout},
133 {nominalDialTimeout, 40, 1, nominalDialTimeout},
134 {nominalDialTimeout, 40, 39, nominalDialTimeout},
135 {nominalDialTimeout, 40, 40, nominalDialTimeout / 2},
136 {nominalDialTimeout, 40, 80, nominalDialTimeout / 3},
137 {nominalDialTimeout, 40, 4000, nominalDialTimeout / 101},
139 reduced := reducedDialTimeout(_case.Max, _case.HalfOpenLimit, _case.PendingPeers)
140 expected := _case.ExpectedReduced
141 if expected < minDialTimeout {
142 expected = minDialTimeout
144 if reduced != expected {
145 t.Fatalf("expected %s, got %s", _case.ExpectedReduced, reduced)
150 func TestUTPRawConn(t *testing.T) {
151 l, err := utp.NewSocket("")
164 // Connect a UTP peer to see if the RawConn will still work.
165 utpPeer, err := func() *utp.Socket {
166 s, _ := utp.NewSocket("")
168 }().Dial(fmt.Sprintf("localhost:%d", util.AddrPort(l.Addr())))
170 t.Fatalf("error dialing utp listener: %s", err)
172 defer utpPeer.Close()
173 peer, err := net.ListenPacket("udp", ":0")
180 const N = 5000 // How many messages to send.
181 readerStopped := make(chan struct{})
182 // The reader goroutine.
184 defer close(readerStopped)
185 b := make([]byte, 500)
186 for i := 0; i < N; i++ {
187 n, _, err := l.PacketConn().ReadFrom(b)
189 t.Fatalf("error reading from raw conn: %s", err)
193 fmt.Sscan(string(b[:n]), &d)
195 log.Printf("got wrong number: expected %d, got %d", i, d)
199 udpAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("localhost:%d", util.AddrPort(l.Addr())))
203 for i := 0; i < N; i++ {
204 _, err := peer.WriteTo([]byte(fmt.Sprintf("%d", i)), udpAddr)
208 time.Sleep(time.Microsecond)
211 case <-readerStopped:
212 case <-time.After(time.Second):
213 t.Fatal("reader timed out")
215 if msgsReceived != N {
216 t.Fatalf("messages received: %d", msgsReceived)
220 func TestTwoClientsArbitraryPorts(t *testing.T) {
221 for i := 0; i < 2; i++ {
222 cl, err := NewClient(&TestingConfig)
230 func TestAddDropManyTorrents(t *testing.T) {
231 cl, _ := NewClient(&TestingConfig)
233 for i := range iter.N(1000) {
235 binary.PutVarint(spec.InfoHash[:], int64(i))
236 tt, new, err := cl.AddTorrentSpec(&spec)
247 func TestClientTransfer(t *testing.T) {
248 greetingTempDir, mi := testutil.GreetingTestTorrent()
249 defer os.RemoveAll(greetingTempDir)
251 cfg.DataDir = greetingTempDir
252 seeder, err := NewClient(&cfg)
257 seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
258 leecherDataDir, err := ioutil.TempDir("", "")
262 defer os.RemoveAll(leecherDataDir)
263 // cfg.TorrentDataOpener = func(info *metainfo.Info) (data.Data, error) {
264 // return blob.TorrentData(info, leecherDataDir), nil
266 cfg.TorrentDataOpener = blob.NewStore(leecherDataDir).OpenTorrent
267 leecher, _ := NewClient(&cfg)
268 defer leecher.Close()
269 leecherGreeting, _, _ := leecher.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
270 leecherGreeting.AddPeers([]Peer{
272 IP: util.AddrIP(seeder.ListenAddr()),
273 Port: util.AddrPort(seeder.ListenAddr()),
276 _greeting, err := ioutil.ReadAll(io.NewSectionReader(leecherGreeting, 0, leecherGreeting.Length()))
280 greeting := string(_greeting)
281 if greeting != testutil.GreetingFileContents {
286 func TestReadaheadPieces(t *testing.T) {
287 for _, case_ := range []struct {
288 readaheadBytes, pieceLength int64
291 {5 * 1024 * 1024, 256 * 1024, 19},
292 {5 * 1024 * 1024, 5 * 1024 * 1024, 0},
293 {5*1024*1024 - 1, 5 * 1024 * 1024, 0},
294 {5 * 1024 * 1024, 5*1024*1024 - 1, 1},
295 {0, 5 * 1024 * 1024, -1},
296 {5 * 1024 * 1024, 1048576, 4},
298 if readaheadPieces(case_.readaheadBytes, case_.pieceLength) != case_.readaheadPieces {
299 t.Fatalf("case failed: %v", case_)