github.com/anacrolix/torrent@v1.61.0/storage/file-misc_test.go (about)

     1  package storage
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/go-quicktest/qt"
     7  
     8  	"github.com/anacrolix/torrent/metainfo"
     9  )
    10  
    11  type requiredLength struct {
    12  	FileIndex int
    13  	Length    int64
    14  }
    15  
    16  // The required file indices and file lengths for the given extent to be "complete". This is the
    17  // outdated interface used by some tests.
    18  func extentCompleteRequiredLengths(info *metainfo.Info, off, n int64) (ret []requiredLength) {
    19  	index := info.FileSegmentsIndex()
    20  	minFileLengthsForTorrentExtent(index, off, n, func(fileIndex int, length int64) bool {
    21  		ret = append(ret, requiredLength{fileIndex, length})
    22  		return true
    23  	})
    24  	return
    25  }
    26  
    27  func TestExtentCompleteRequiredLengthsV2InfoWithGaps(t *testing.T) {
    28  	info := &metainfo.Info{
    29  		MetaVersion: 2,
    30  		PieceLength: 2,
    31  		FileTree: metainfo.FileTree{
    32  			Dir: map[string]metainfo.FileTree{
    33  				"a": {
    34  					File: metainfo.FileTreeFile{
    35  						Length: 2,
    36  					},
    37  				},
    38  				"b": {
    39  					File: metainfo.FileTreeFile{Length: 3},
    40  				},
    41  				// Here there's a gap where v2 torrents piece align, so the next file offset starts
    42  				// at 6.
    43  				"c": {
    44  					File: metainfo.FileTreeFile{Length: 4},
    45  				},
    46  			},
    47  		},
    48  	}
    49  	check := func(off, n int64, expected ...requiredLength) {
    50  		qt.Check(t, qt.DeepEquals(extentCompleteRequiredLengths(info, off, n), expected))
    51  	}
    52  	check(0, 0)
    53  	check(0, 1, requiredLength{FileIndex: 0, Length: 1})
    54  	check(0, 2, requiredLength{FileIndex: 0, Length: 2})
    55  	check(0, 3, requiredLength{FileIndex: 0, Length: 2}, requiredLength{FileIndex: 1, Length: 1})
    56  	check(2, 2, requiredLength{FileIndex: 1, Length: 2})
    57  	check(4, 1, requiredLength{FileIndex: 1, Length: 3})
    58  	check(5, 0)
    59  	check(4, 2, requiredLength{FileIndex: 1, Length: 3})
    60  	check(5, 1)
    61  	check(6, 4, requiredLength{FileIndex: 2, Length: 4})
    62  }
    63  
    64  func TestExtentCompleteRequiredLengths(t *testing.T) {
    65  	info := &metainfo.Info{
    66  		Files: []metainfo.FileInfo{
    67  			{Path: []string{"a"}, Length: 2},
    68  			{Path: []string{"b"}, Length: 3},
    69  		},
    70  	}
    71  	check := func(off, n int64, expected ...requiredLength) {
    72  		qt.Assert(t, qt.DeepEquals(extentCompleteRequiredLengths(info, off, n), expected))
    73  	}
    74  	qt.Check(t, qt.HasLen(extentCompleteRequiredLengths(info, 0, 0), 0))
    75  	qt.Check(t, qt.DeepEquals(extentCompleteRequiredLengths(info, 0, 1), []requiredLength{
    76  		{FileIndex: 0, Length: 1},
    77  	}))
    78  	qt.Check(t, qt.DeepEquals(extentCompleteRequiredLengths(info, 0, 2), []requiredLength{
    79  		{FileIndex: 0, Length: 2},
    80  	}))
    81  	qt.Check(t, qt.DeepEquals(extentCompleteRequiredLengths(info, 0, 3), []requiredLength{
    82  		{FileIndex: 0, Length: 2},
    83  		{FileIndex: 1, Length: 1},
    84  	}))
    85  	qt.Check(t, qt.DeepEquals(extentCompleteRequiredLengths(info, 2, 2), []requiredLength{
    86  		{FileIndex: 1, Length: 2},
    87  	}))
    88  	qt.Check(t, qt.DeepEquals(extentCompleteRequiredLengths(info, 4, 1), []requiredLength{
    89  		{FileIndex: 1, Length: 3},
    90  	}))
    91  	qt.Check(t, qt.HasLen(extentCompleteRequiredLengths(info, 5, 0), 0))
    92  	check(6, 1)
    93  }