From 6239a83bd6ae89ea195af31dd47e263766bbdab4 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 9 Jan 2018 17:29:31 +1100 Subject: [PATCH] Begin restructuring testutil to support testing torrents with various properties --- .../testutil/{testutil.go => greeting.go} | 45 +++----------- internal/testutil/spec.go | 60 +++++++++++++++++++ internal/testutil/status_writer.go | 22 +++++++ 3 files changed, 90 insertions(+), 37 deletions(-) rename internal/testutil/{testutil.go => greeting.go} (56%) create mode 100644 internal/testutil/spec.go create mode 100644 internal/testutil/status_writer.go diff --git a/internal/testutil/testutil.go b/internal/testutil/greeting.go similarity index 56% rename from internal/testutil/testutil.go rename to internal/testutil/greeting.go index 6431a1f1..4523a9c2 100644 --- a/internal/testutil/testutil.go +++ b/internal/testutil/greeting.go @@ -6,20 +6,20 @@ 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" @@ -33,23 +33,7 @@ func CreateDummyTorrentData(dirName string) string { } 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, @@ -64,16 +48,3 @@ func GreetingTestTorrent() (tempDir string, metaInfo *metainfo.MetaInfo) { 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) - }, - ) -} diff --git a/internal/testutil/spec.go b/internal/testutil/spec.go new file mode 100644 index 00000000..c3e5cd88 --- /dev/null +++ b/internal/testutil/spec.go @@ -0,0 +1,60 @@ +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 +} diff --git a/internal/testutil/status_writer.go b/internal/testutil/status_writer.go new file mode 100644 index 00000000..06e2f662 --- /dev/null +++ b/internal/testutil/status_writer.go @@ -0,0 +1,22 @@ +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) + }, + ) +} -- 2.44.0