package testutil
import (
- "fmt"
- "io"
"io/ioutil"
- "net/http"
"os"
"path/filepath"
- "strings"
- "github.com/anacrolix/missinggo"
-
- "github.com/anacrolix/torrent/bencode"
"github.com/anacrolix/torrent/metainfo"
)
+var Greeting = Torrent{
+ Files: []File{{
+ Data: GreetingFileContents,
+ }},
+ Name: GreetingFileName,
+}
+
const (
GreetingFileContents = "hello, world\n"
GreetingFileName = "greeting"
}
func GreetingMetaInfo() *metainfo.MetaInfo {
- info := metainfo.Info{
- Name: GreetingFileName,
- Length: int64(len(GreetingFileContents)),
- PieceLength: 5,
- }
- err := info.GeneratePieces(func(metainfo.FileInfo) (io.ReadCloser, error) {
- return ioutil.NopCloser(strings.NewReader(GreetingFileContents)), nil
- })
- if err != nil {
- panic(err)
- }
- mi := &metainfo.MetaInfo{}
- mi.InfoBytes, err = bencode.Marshal(info)
- if err != nil {
- panic(err)
- }
- return mi
+ return Greeting.Metainfo(5)
}
// Gives a temporary directory containing the completed "greeting" torrent,
metaInfo = GreetingMetaInfo()
return
}
-
-type StatusWriter interface {
- WriteStatus(io.Writer)
-}
-
-func ExportStatusWriter(sw StatusWriter, path string) {
- http.HandleFunc(
- fmt.Sprintf("/%s/%s", missinggo.GetTestName(), path),
- func(w http.ResponseWriter, r *http.Request) {
- sw.WriteStatus(w)
- },
- )
-}
--- /dev/null
+package testutil
+
+import (
+ "io"
+ "io/ioutil"
+ "strings"
+
+ "github.com/anacrolix/missinggo/assert"
+ "github.com/anacrolix/torrent/bencode"
+ "github.com/anacrolix/torrent/metainfo"
+)
+
+type File struct {
+ Name string
+ Data string
+}
+
+type Torrent struct {
+ Files []File
+ Name string
+}
+
+func (t *Torrent) IsDir() bool {
+ return len(t.Files) == 1 && t.Files[0].Name == ""
+}
+
+func (t *Torrent) GetFile(name string) *File {
+ if t.IsDir() && t.Name == name {
+ return &t.Files[0]
+ }
+ for _, f := range t.Files {
+ if f.Name == name {
+ return &f
+ }
+ }
+ return nil
+}
+
+func (t *Torrent) Info(pieceLength int64) metainfo.Info {
+ info := metainfo.Info{
+ Name: t.Name,
+ PieceLength: pieceLength,
+ }
+ if t.IsDir() {
+ info.Length = int64(len(t.Files[0].Data))
+ }
+ err := info.GeneratePieces(func(fi metainfo.FileInfo) (io.ReadCloser, error) {
+ return ioutil.NopCloser(strings.NewReader(t.GetFile(strings.Join(fi.Path, "/")).Data)), nil
+ })
+ assert.Nil(err)
+ return info
+}
+
+func (t *Torrent) Metainfo(pieceLength int64) *metainfo.MetaInfo {
+ mi := metainfo.MetaInfo{}
+ var err error
+ mi.InfoBytes, err = bencode.Marshal(t.Info(pieceLength))
+ assert.Nil(err)
+ return &mi
+}
--- /dev/null
+package testutil
+
+import (
+ "fmt"
+ "io"
+ "net/http"
+
+ "github.com/anacrolix/missinggo"
+)
+
+type StatusWriter interface {
+ WriteStatus(io.Writer)
+}
+
+func ExportStatusWriter(sw StatusWriter, path string) {
+ http.HandleFunc(
+ fmt.Sprintf("/%s/%s", missinggo.GetTestName(), path),
+ func(w http.ResponseWriter, r *http.Request) {
+ sw.WriteStatus(w)
+ },
+ )
+}