]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Begin restructuring testutil to support testing torrents with various properties
authorMatt Joiner <anacrolix@gmail.com>
Tue, 9 Jan 2018 06:29:31 +0000 (17:29 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 9 Jan 2018 06:29:31 +0000 (17:29 +1100)
internal/testutil/greeting.go [moved from internal/testutil/testutil.go with 56% similarity]
internal/testutil/spec.go [new file with mode: 0644]
internal/testutil/status_writer.go [new file with mode: 0644]

similarity index 56%
rename from internal/testutil/testutil.go
rename to internal/testutil/greeting.go
index 6431a1f187a6f6cab6a867732576136bdda29004..4523a9c20371fa6745385d6894640e30d06fb9fb 100644 (file)
@@ -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 (file)
index 0000000..c3e5cd8
--- /dev/null
@@ -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 (file)
index 0000000..06e2f66
--- /dev/null
@@ -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)
+               },
+       )
+}