summaryrefslogtreecommitdiff
path: root/xdelta3/go/src/xdelta
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
parente605f2ff802f80e68b96f26151e06e50212bbbc5 (diff)
Test refactoring (still no output, hung subprocess)
Diffstat (limited to 'xdelta3/go/src/xdelta')
-rw-r--r--xdelta3/go/src/xdelta/rstream.go12
-rw-r--r--xdelta3/go/src/xdelta/test.go99
2 files changed, 106 insertions, 5 deletions
diff --git a/xdelta3/go/src/xdelta/rstream.go b/xdelta3/go/src/xdelta/rstream.go
index 1d56031..3e7265f 100644
--- a/xdelta3/go/src/xdelta/rstream.go
+++ b/xdelta3/go/src/xdelta/rstream.go
@@ -7,16 +7,17 @@ import (
7) 7)
8 8
9const ( 9const (
10 blocksize = 16380 // A factor of 7 10 blocksize = 16380
11) 11)
12 12
13func WriteRstreams(seed, offset, len int64, 13func WriteRstreams(t *TestGroup, seed, offset, len int64,
14 first, second io.WriteCloser) { 14 first, second io.WriteCloser) {
15 go writeOne(seed, 0, len, first) 15 go writeOne(t, seed, 0, len, first)
16 go writeOne(seed, offset, len, second) 16 go writeOne(t, seed, offset, len, second)
17} 17}
18 18
19func writeOne(seed, offset, len int64, stream io.WriteCloser) error { 19func writeOne(t *TestGroup, seed, offset, len int64, stream io.WriteCloser) error {
20 t.WaitGroup.Add(1)
20 if offset != 0 { 21 if offset != 0 {
21 // Fill with other random data until the offset 22 // Fill with other random data until the offset
22 if err := writeRand(rand.New(rand.NewSource(^seed)), offset, stream); err != nil { 23 if err := writeRand(rand.New(rand.NewSource(^seed)), offset, stream); err != nil {
@@ -27,6 +28,7 @@ func writeOne(seed, offset, len int64, stream io.WriteCloser) error {
27 len - offset, stream); err != nil { 28 len - offset, stream); err != nil {
28 return err 29 return err
29 } 30 }
31 t.WaitGroup.Done()
30 return stream.Close() 32 return stream.Close()
31} 33}
32 34
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