spec.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package testutil
  2. import (
  3. "io"
  4. "strings"
  5. "github.com/anacrolix/missinggo/expect"
  6. "github.com/anacrolix/torrent/bencode"
  7. "github.com/anacrolix/torrent/metainfo"
  8. )
  9. type File struct {
  10. Name string
  11. Data string
  12. }
  13. type Torrent struct {
  14. Files []File
  15. Name string
  16. }
  17. func (t *Torrent) IsDir() bool {
  18. return len(t.Files) == 1 && t.Files[0].Name == ""
  19. }
  20. func (t *Torrent) GetFile(name string) *File {
  21. if t.IsDir() && t.Name == name {
  22. return &t.Files[0]
  23. }
  24. for _, f := range t.Files {
  25. if f.Name == name {
  26. return &f
  27. }
  28. }
  29. return nil
  30. }
  31. func (t *Torrent) Info(pieceLength int64) metainfo.Info {
  32. info := metainfo.Info{
  33. Name: t.Name,
  34. PieceLength: pieceLength,
  35. }
  36. if t.IsDir() {
  37. info.Length = int64(len(t.Files[0].Data))
  38. } else {
  39. for _, f := range t.Files {
  40. info.Files = append(info.Files, metainfo.FileInfo{
  41. Path: []string{f.Name},
  42. Length: int64(len(f.Data)),
  43. })
  44. }
  45. }
  46. err := info.GeneratePieces(func(fi metainfo.FileInfo) (io.ReadCloser, error) {
  47. return io.NopCloser(strings.NewReader(t.GetFile(strings.Join(fi.BestPath(), "/")).Data)), nil
  48. })
  49. expect.Nil(err)
  50. return info
  51. }
  52. func (t *Torrent) Metainfo(pieceLength int64) *metainfo.MetaInfo {
  53. mi := metainfo.MetaInfo{}
  54. var err error
  55. mi.InfoBytes, err = bencode.Marshal(t.Info(pieceLength))
  56. expect.Nil(err)
  57. return &mi
  58. }