]> Sergey Matveev's repositories - btrtrc.git/blob - metainfo/metainfo_test.go
metainfo: Add alternative "builder" API
[btrtrc.git] / metainfo / metainfo_test.go
1 package metainfo
2
3 import (
4         "bytes"
5         "io"
6         "io/ioutil"
7         "path"
8         "testing"
9
10         "github.com/anacrolix/missinggo"
11         "github.com/stretchr/testify/assert"
12
13         "github.com/anacrolix/torrent/bencode"
14 )
15
16 func test_file(t *testing.T, filename string) {
17         mi, err := LoadFromFile(filename)
18         if err != nil {
19                 t.Fatal(err)
20         }
21
22         if len(mi.Info.Files) == 1 {
23                 t.Logf("Single file: %s (length: %d)\n", mi.Info.Name, mi.Info.Files[0].Length)
24         } else {
25                 t.Logf("Multiple files: %s\n", mi.Info.Name)
26                 for _, f := range mi.Info.Files {
27                         t.Logf(" - %s (length: %d)\n", path.Join(f.Path...), f.Length)
28                 }
29         }
30
31         for _, group := range mi.AnnounceList {
32                 for _, tracker := range group {
33                         t.Logf("Tracker: %s\n", tracker)
34                 }
35         }
36         // for _, url := range mi.WebSeedURLs {
37         //      t.Logf("URL: %s\n", url)
38         // }
39
40         b, err := bencode.Marshal(mi.Info)
41         if !bytes.Equal(b, mi.Info.Bytes) {
42                 t.Logf("\n%q\n%q", b[len(b)-20:], mi.Info.Bytes[len(mi.Info.Bytes)-20:])
43                 t.Fatal("encoded and decoded bytes don't match")
44         }
45 }
46
47 func TestFile(t *testing.T) {
48         test_file(t, "_testdata/archlinux-2011.08.19-netinstall-i686.iso.torrent")
49         test_file(t, "_testdata/continuum.torrent")
50         test_file(t, "_testdata/23516C72685E8DB0C8F15553382A927F185C4F01.torrent")
51         test_file(t, "_testdata/trackerless.torrent")
52 }
53
54 // Ensure that the correct number of pieces are generated when hashing files.
55 func TestNumPieces(t *testing.T) {
56         for _, _case := range []struct {
57                 PieceLength int64
58                 Files       []FileInfo
59                 NumPieces   int
60         }{
61                 {256 * 1024, []FileInfo{{Length: 1024*1024 + -1}}, 4},
62                 {256 * 1024, []FileInfo{{Length: 1024 * 1024}}, 4},
63                 {256 * 1024, []FileInfo{{Length: 1024*1024 + 1}}, 5},
64                 {5, []FileInfo{{Length: 1}, {Length: 12}}, 3},
65                 {5, []FileInfo{{Length: 4}, {Length: 12}}, 4},
66         } {
67                 info := Info{
68                         Files:       _case.Files,
69                         PieceLength: _case.PieceLength,
70                 }
71                 err := info.GeneratePieces(func(fi FileInfo) (io.ReadCloser, error) {
72                         return ioutil.NopCloser(missinggo.ZeroReader{}), nil
73                 })
74                 assert.NoError(t, err)
75                 assert.EqualValues(t, _case.NumPieces, info.NumPieces())
76         }
77 }