From: Matt Joiner <anacrolix@gmail.com>
Date: Tue, 9 Jan 2018 06:29:31 +0000 (+1100)
Subject: Begin restructuring testutil to support testing torrents with various properties
X-Git-Tag: v1.0.0~287
X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=6239a83bd6ae89ea195af31dd47e263766bbdab4;p=btrtrc.git

Begin restructuring testutil to support testing torrents with various properties
---

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)
+		},
+	)
+}