1 package request_strategy
7 pp "github.com/anacrolix/torrent/peer_protocol"
8 qt "github.com/frankban/quicktest"
11 func r(i pieceIndex, begin int) Request {
12 return Request{pp.Integer(i), ChunkSpec{pp.Integer(begin), 1}}
15 func chunkIter(offsets ...int) func(func(ChunkSpec)) {
16 return func(f func(ChunkSpec)) {
17 for _, offset := range offsets {
18 f(ChunkSpec{pp.Integer(offset), 1})
23 func requestSetFromSlice(rs ...Request) (ret map[Request]struct{}) {
24 ret = make(map[Request]struct{}, len(rs))
25 for _, r := range rs {
33 func (i intPeerId) Uintptr() uintptr {
37 func TestStealingFromSlowerPeer(t *testing.T) {
39 order := ClientPieceOrder{}
41 HasPiece: func(i pieceIndex) bool {
44 MaxRequests: math.MaxInt16,
47 // Slower than the stealers, but has all requests already.
49 stealee.DownloadRate = 1
50 stealee.HasExistingRequest = func(r Request) bool {
53 stealee.Id = intPeerId(1)
54 firstStealer := basePeer
55 firstStealer.Id = intPeerId(2)
56 secondStealer := basePeer
57 secondStealer.Id = intPeerId(3)
58 results := order.DoRequests([]*Torrent{{
62 IterPendingChunks: chunkIter(0, 1, 2, 3, 4),
70 c.Assert(results, qt.HasLen, 3)
71 check := func(p PeerId, l int) {
72 c.Check(results[p].Requests, qt.HasLen, l)
73 c.Check(results[p].Interested, qt.Equals, l > 0)
76 check(firstStealer.Id, 2)
77 check(secondStealer.Id, 2)
80 func TestStealingFromSlowerPeersBasic(t *testing.T) {
82 order := ClientPieceOrder{}
84 HasPiece: func(i pieceIndex) bool {
87 MaxRequests: math.MaxInt16,
91 stealee.DownloadRate = 1
92 stealee.HasExistingRequest = func(r Request) bool {
95 stealee.Id = intPeerId(1)
96 firstStealer := basePeer
97 firstStealer.Id = intPeerId(2)
98 secondStealer := basePeer
99 secondStealer.Id = intPeerId(3)
100 c.Assert(order.DoRequests([]*Torrent{{
104 IterPendingChunks: chunkIter(0, 1),
111 }}), qt.ContentEquals, map[PeerId]PeerNextRequestState{
114 Requests: requestSetFromSlice(r(0, 0)),
118 Requests: requestSetFromSlice(r(0, 1)),
122 Requests: requestSetFromSlice(),
127 func TestPeerKeepsExistingIfReasonable(t *testing.T) {
129 order := ClientPieceOrder{}
131 HasPiece: func(i pieceIndex) bool {
134 MaxRequests: math.MaxInt16,
137 // Slower than the stealers, but has all requests already.
139 stealee.DownloadRate = 1
141 stealee.HasExistingRequest = func(r Request) bool {
144 stealee.Id = intPeerId(1)
145 firstStealer := basePeer
146 firstStealer.Id = intPeerId(2)
147 secondStealer := basePeer
148 secondStealer.Id = intPeerId(3)
149 results := order.DoRequests([]*Torrent{{
153 IterPendingChunks: chunkIter(0, 1, 3, 4),
161 c.Assert(results, qt.HasLen, 3)
162 check := func(p PeerId, l int) {
163 c.Check(results[p].Requests, qt.HasLen, l)
164 c.Check(results[p].Interested, qt.Equals, l > 0)
166 check(firstStealer.Id, 2)
167 check(secondStealer.Id, 1)
168 c.Check(results[stealee.Id], qt.ContentEquals, PeerNextRequestState{
170 Requests: requestSetFromSlice(keepReq),