github.com/anacrolix/torrent@v1.61.0/file_test.go (about)

     1  package torrent
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/RoaringBitmap/roaring"
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func TestFileExclusivePieces(t *testing.T) {
    11  	for _, _case := range []struct {
    12  		off, size, pieceSize int64
    13  		begin, end           int
    14  	}{
    15  		{0, 2, 2, 0, 1},
    16  		{1, 2, 2, 1, 1},
    17  		{1, 4, 2, 1, 2},
    18  	} {
    19  		begin, end := byteRegionExclusivePieces(_case.off, _case.size, _case.pieceSize)
    20  		assert.EqualValues(t, _case.begin, begin)
    21  		assert.EqualValues(t, _case.end, end)
    22  	}
    23  }
    24  
    25  type testFileBytesLeft struct {
    26  	usualPieceSize  int64
    27  	firstPieceIndex int
    28  	endPieceIndex   int
    29  	fileOffset      int64
    30  	fileLength      int64
    31  	completedPieces roaring.Bitmap
    32  	expected        int64
    33  	name            string
    34  }
    35  
    36  func (me testFileBytesLeft) Run(t *testing.T) {
    37  	t.Run(me.name, func(t *testing.T) {
    38  		assert.EqualValues(t, me.expected, fileBytesLeft(me.usualPieceSize, me.firstPieceIndex, me.endPieceIndex, me.fileOffset, me.fileLength, &me.completedPieces, func(pieceIndex int) int64 {
    39  			return 0
    40  		}))
    41  	})
    42  }
    43  
    44  func TestFileBytesLeft(t *testing.T) {
    45  	testFileBytesLeft{
    46  		usualPieceSize:  3,
    47  		firstPieceIndex: 1,
    48  		endPieceIndex:   1,
    49  		fileOffset:      1,
    50  		fileLength:      0,
    51  		expected:        0,
    52  		name:            "ZeroLengthFile",
    53  	}.Run(t)
    54  
    55  	testFileBytesLeft{
    56  		usualPieceSize:  2,
    57  		firstPieceIndex: 1,
    58  		endPieceIndex:   2,
    59  		fileOffset:      1,
    60  		fileLength:      1,
    61  		expected:        1,
    62  		name:            "EndOfSecondPiece",
    63  	}.Run(t)
    64  
    65  	testFileBytesLeft{
    66  		usualPieceSize:  3,
    67  		firstPieceIndex: 0,
    68  		endPieceIndex:   1,
    69  		fileOffset:      1,
    70  		fileLength:      1,
    71  		expected:        1,
    72  		name:            "FileInFirstPiece",
    73  	}.Run(t)
    74  
    75  	testFileBytesLeft{
    76  		usualPieceSize:  3,
    77  		firstPieceIndex: 0,
    78  		endPieceIndex:   1,
    79  		fileOffset:      1,
    80  		fileLength:      1,
    81  		expected:        1,
    82  		name:            "LandLocked",
    83  	}.Run(t)
    84  
    85  	testFileBytesLeft{
    86  		usualPieceSize:  3,
    87  		firstPieceIndex: 1,
    88  		endPieceIndex:   3,
    89  		fileOffset:      4,
    90  		fileLength:      4,
    91  		expected:        4,
    92  		name:            "TwoPieces",
    93  	}.Run(t)
    94  
    95  	testFileBytesLeft{
    96  		usualPieceSize:  3,
    97  		firstPieceIndex: 1,
    98  		endPieceIndex:   4,
    99  		fileOffset:      5,
   100  		fileLength:      7,
   101  		expected:        7,
   102  		name:            "ThreePieces",
   103  	}.Run(t)
   104  
   105  	testFileBytesLeft{
   106  		usualPieceSize:  3,
   107  		firstPieceIndex: 1,
   108  		endPieceIndex:   4,
   109  		fileOffset:      5,
   110  		fileLength:      7,
   111  		expected:        0,
   112  		completedPieces: func() (ret roaring.Bitmap) {
   113  			ret.AddRange(0, 5)
   114  			return
   115  		}(),
   116  		name: "ThreePiecesCompletedAll",
   117  	}.Run(t)
   118  }