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 }