Add abstraction and tests for #387

This commit is contained in:
Matt Joiner 2020-03-24 11:19:11 +11:00
parent 378ccd0932
commit 3507ff1a69
2 changed files with 60 additions and 9 deletions

20
file.go
View File

@ -54,11 +54,9 @@ func (f *File) bytesCompleted() int64 {
return f.length - f.bytesLeft()
}
func (f *File) bytesLeft() (left int64) {
pieceSize := int64(f.t.usualPieceSize())
firstPieceIndex := f.firstPieceIndex()
endPieceIndex := f.endPieceIndex() - 1
bitmap.Flip(f.t._completedPieces, firstPieceIndex+1, endPieceIndex).IterTyped(func(piece int) bool {
func fileBytesLeft(pieceSize int64, firstPieceIndex int, endPieceIndex int, fileOffset int64, fileLength int64, completedPieces bitmap.Bitmap) (left int64) {
endPieceIndex--
bitmap.Flip(completedPieces, firstPieceIndex+1, endPieceIndex).IterTyped(func(piece int) bool {
if piece >= endPieceIndex {
return false
}
@ -67,15 +65,19 @@ func (f *File) bytesLeft() (left int64) {
}
return true
})
if !f.t.pieceComplete(firstPieceIndex) {
left += pieceSize - (f.offset % pieceSize)
if !completedPieces.Get(firstPieceIndex) {
left += pieceSize - (fileOffset % pieceSize)
}
if !f.t.pieceComplete(endPieceIndex) {
left += (f.offset + f.length) % pieceSize
if !completedPieces.Get(endPieceIndex) {
left += (fileOffset + fileLength) % pieceSize
}
return
}
func (f *File) bytesLeft() (left int64) {
return fileBytesLeft(int64(f.t.usualPieceSize()), f.firstPieceIndex(), f.endPieceIndex(), f.offset, f.length, f.t._completedPieces)
}
// The relative file path for a multi-file torrent, and the torrent name for a
// single-file torrent.
func (f *File) DisplayPath() string {

View File

@ -3,6 +3,7 @@ package torrent
import (
"testing"
"github.com/anacrolix/missinggo/v2/bitmap"
"github.com/stretchr/testify/assert"
)
@ -20,3 +21,51 @@ func TestFileExclusivePieces(t *testing.T) {
assert.EqualValues(t, _case.end, end)
}
}
type testFileBytesLeft struct {
usualPieceSize int64
firstPieceIndex int
endPieceIndex int
fileOffset int64
fileLength int64
completedPieces bitmap.Bitmap
expected int64
name string
}
func (me testFileBytesLeft) Run(t *testing.T) {
t.Run(me.name, func(t *testing.T) {
assert.EqualValues(t, me.expected, fileBytesLeft(me.usualPieceSize, me.firstPieceIndex, me.endPieceIndex, me.fileOffset, me.fileLength, me.completedPieces))
})
}
func TestFileBytesLeft(t *testing.T) {
testFileBytesLeft{
usualPieceSize: 2,
firstPieceIndex: 1,
endPieceIndex: 1,
fileOffset: 1,
fileLength: 1,
expected: 1,
}.Run(t)
testFileBytesLeft{
usualPieceSize: 3,
firstPieceIndex: 0,
endPieceIndex: 0,
fileOffset: 1,
fileLength: 1,
expected: 1,
name: "FileInFirstPiece",
}.Run(t)
testFileBytesLeft{
usualPieceSize: 3,
firstPieceIndex: 0,
endPieceIndex: 0,
fileOffset: 1,
fileLength: 1,
expected: 1,
name: "LandLocked",
}.Run(t)
}