]> Sergey Matveev's repositories - btrtrc.git/blobdiff - request-strategy/order_test.go
New tests and fixes for them
[btrtrc.git] / request-strategy / order_test.go
index c972b301f3de022f7851bef2d08ac640a4b01a28..2096140386078b533ffaf2fa2f3c14d163f238e1 100644 (file)
@@ -34,7 +34,50 @@ func (i intPeerId) Uintptr() uintptr {
        return uintptr(i)
 }
 
-func TestStealingFromSlowerPeers(t *testing.T) {
+func TestStealingFromSlowerPeer(t *testing.T) {
+       c := qt.New(t)
+       order := ClientPieceOrder{}
+       basePeer := Peer{
+               HasPiece: func(i pieceIndex) bool {
+                       return true
+               },
+               MaxRequests:  math.MaxInt16,
+               DownloadRate: 2,
+       }
+       // Slower than the stealers, but has all requests already.
+       stealee := basePeer
+       stealee.DownloadRate = 1
+       stealee.HasExistingRequest = func(r Request) bool {
+               return true
+       }
+       stealee.Id = intPeerId(1)
+       firstStealer := basePeer
+       firstStealer.Id = intPeerId(2)
+       secondStealer := basePeer
+       secondStealer.Id = intPeerId(3)
+       results := order.DoRequests([]*Torrent{{
+               Pieces: []Piece{{
+                       Request:           true,
+                       NumPendingChunks:  5,
+                       IterPendingChunks: chunkIter(0, 1, 2, 3, 4),
+               }},
+               Peers: []Peer{
+                       stealee,
+                       firstStealer,
+                       secondStealer,
+               },
+       }})
+       c.Assert(results, qt.HasLen, 3)
+       check := func(p PeerId, l int) {
+               c.Check(results[p].Requests, qt.HasLen, l)
+               c.Check(results[p].Interested, qt.Equals, l > 0)
+       }
+       check(stealee.Id, 1)
+       check(firstStealer.Id, 2)
+       check(secondStealer.Id, 2)
+}
+
+func TestStealingFromSlowerPeersBasic(t *testing.T) {
        c := qt.New(t)
        order := ClientPieceOrder{}
        basePeer := Peer{
@@ -80,3 +123,50 @@ func TestStealingFromSlowerPeers(t *testing.T) {
                },
        })
 }
+
+func TestPeerKeepsExistingIfReasonable(t *testing.T) {
+       c := qt.New(t)
+       order := ClientPieceOrder{}
+       basePeer := Peer{
+               HasPiece: func(i pieceIndex) bool {
+                       return true
+               },
+               MaxRequests:  math.MaxInt16,
+               DownloadRate: 2,
+       }
+       // Slower than the stealers, but has all requests already.
+       stealee := basePeer
+       stealee.DownloadRate = 1
+       keepReq := r(0, 0)
+       stealee.HasExistingRequest = func(r Request) bool {
+               return r == keepReq
+       }
+       stealee.Id = intPeerId(1)
+       firstStealer := basePeer
+       firstStealer.Id = intPeerId(2)
+       secondStealer := basePeer
+       secondStealer.Id = intPeerId(3)
+       results := order.DoRequests([]*Torrent{{
+               Pieces: []Piece{{
+                       Request:           true,
+                       NumPendingChunks:  4,
+                       IterPendingChunks: chunkIter(0, 1, 3, 4),
+               }},
+               Peers: []Peer{
+                       stealee,
+                       firstStealer,
+                       secondStealer,
+               },
+       }})
+       c.Assert(results, qt.HasLen, 3)
+       check := func(p PeerId, l int) {
+               c.Check(results[p].Requests, qt.HasLen, l)
+               c.Check(results[p].Interested, qt.Equals, l > 0)
+       }
+       check(firstStealer.Id, 2)
+       check(secondStealer.Id, 1)
+       c.Check(results[stealee.Id], qt.ContentEquals, PeerNextRequestState{
+               Interested: true,
+               Requests:   requestSetFromSlice(keepReq),
+       })
+}