summaryrefslogtreecommitdiff
path: root/xdelta3/go/src/xdelta/test.go
diff options
context:
space:
mode:
authorJosh MacDonald <josh.macdonald@gmail.com>2015-10-06 22:57:08 -0700
committerJosh MacDonald <josh.macdonald@gmail.com>2015-10-06 22:57:08 -0700
commitd027be92ad992370c431a5507db1c792fd8562da (patch)
treed422745cd77117a8b9d28da8b4c1be5d59d0490f /xdelta3/go/src/xdelta/test.go
parente605f2ff802f80e68b96f26151e06e50212bbbc5 (diff)
Test refactoring (still no output, hung subprocess)
Diffstat (limited to 'xdelta3/go/src/xdelta/test.go')
-rw-r--r--xdelta3/go/src/xdelta/test.go99
1 files changed, 99 insertions, 0 deletions
diff --git a/xdelta3/go/src/xdelta/test.go b/xdelta3/go/src/xdelta/test.go
index 3143dfa..50ddeae 100644
--- a/xdelta3/go/src/xdelta/test.go
+++ b/xdelta3/go/src/xdelta/test.go
@@ -1,6 +1,9 @@
1package xdelta 1package xdelta
2 2
3import ( 3import (
4 "bufio"
5 "bytes"
6 "errors"
4 "fmt" 7 "fmt"
5 "io" 8 "io"
6 "io/ioutil" 9 "io/ioutil"
@@ -8,6 +11,7 @@ import (
8 "os/exec" 11 "os/exec"
9 "path" 12 "path"
10 "sync/atomic" 13 "sync/atomic"
14 "sync"
11 15
12 "golang.org/x/sys/unix" 16 "golang.org/x/sys/unix"
13) 17)
@@ -25,6 +29,10 @@ type Runner struct {
25 Testdir string 29 Testdir string
26} 30}
27 31
32type TestGroup struct {
33 sync.WaitGroup
34}
35
28type Run struct { 36type Run struct {
29 Cmd exec.Cmd 37 Cmd exec.Cmd
30 Srcfile string 38 Srcfile string
@@ -34,6 +42,97 @@ type Run struct {
34 Stderr io.ReadCloser 42 Stderr io.ReadCloser
35} 43}
36 44
45func (t *TestGroup) Panic(err error) {
46 t.WaitGroup.Done() // For the caller
47 t.WaitGroup.Wait()
48 panic(err)
49}
50
51func NewTestGroup() *TestGroup {
52 return &TestGroup{}
53}
54
55func (t *TestGroup) Drain(f io.ReadCloser) <-chan []byte {
56 c := make(chan []byte)
57 go func() {
58 t.WaitGroup.Add(1)
59 if b, err := ioutil.ReadAll(f); err != nil {
60 t.Panic(err)
61 } else {
62 c <- b
63 }
64 t.WaitGroup.Done()
65 }()
66 return c
67}
68
69func (t *TestGroup) Empty(f io.ReadCloser, desc string) {
70 go func() {
71 t.WaitGroup.Add(1)
72 s := bufio.NewScanner(f)
73 for s.Scan() {
74 os.Stderr.Write([]byte(fmt.Sprint(desc, ": ", s.Text(), "\n")))
75 }
76 if err := s.Err(); err != nil {
77 t.Panic(err)
78 }
79 t.WaitGroup.Done()
80 }()
81}
82
83func (t *TestGroup) Write(what string, f io.WriteCloser, b []byte) {
84 if _, err := f.Write(b); err != nil {
85 t.Panic(errors.New(fmt.Sprint(what, ":", err)))
86 }
87 if err := f.Close(); err != nil {
88 t.Panic(errors.New(fmt.Sprint(what, ":", err)))
89 }
90}
91
92func (t *TestGroup) CopyStreams(r io.ReadCloser, w io.WriteCloser) {
93 t.Add(1)
94 _, err := io.Copy(w, r)
95 if err != nil {
96 t.Panic(err)
97 }
98 err = r.Close()
99 if err != nil {
100 t.Panic(err)
101 }
102 err = w.Close()
103 if err != nil {
104 t.Panic(err)
105 }
106 t.Done()
107}
108
109func (t *TestGroup) CompareStreams(r1 io.ReadCloser, r2 io.ReadCloser, length int64) {
110 t.Add(1)
111 b1 := make([]byte, blocksize)
112 b2 := make([]byte, blocksize)
113 var idx int64
114 for length > 0 {
115 c := blocksize
116 if length < blocksize {
117 c = int(length)
118 }
119 if _, err := io.ReadFull(r1, b1[0:c]); err != nil {
120 t.Panic(err)
121 }
122 if _, err := io.ReadFull(r2, b2[0:c]); err != nil {
123 t.Panic(err)
124 }
125 if bytes.Compare(b1[0:c], b2[0:c]) != 0 {
126 fmt.Println("B1 is", string(b1[0:c]))
127 fmt.Println("B2 is", string(b2[0:c]))
128 t.Panic(errors.New(fmt.Sprint("Bytes do not compare at ", idx)))
129 }
130 length -= int64(c)
131 idx += int64(c)
132 }
133 t.Done()
134}
135
37func NewRunner() (*Runner, error) { 136func NewRunner() (*Runner, error) {
38 if dir, err := ioutil.TempDir(tmpDir, "xrt"); err != nil { 137 if dir, err := ioutil.TempDir(tmpDir, "xrt"); err != nil {
39 return nil, err 138 return nil, err