summaryrefslogtreecommitdiff
path: root/xdelta3
diff options
context:
space:
mode:
authorJoshua MacDonald <josh.macdonald@gmail.com>2015-11-27 23:01:59 -0800
committerJoshua MacDonald <josh.macdonald@gmail.com>2015-11-27 23:01:59 -0800
commit4b74451f9e9b976a2a0984130662f58bd39e1478 (patch)
tree096fb32c01ee704fff69d6fec77d73604c412865 /xdelta3
parent21ec9031bf1703fd8f82a343f31f2964b9567428 (diff)
Regtest work
Diffstat (limited to 'xdelta3')
-rw-r--r--xdelta3/go/src/regtest.go13
-rw-r--r--xdelta3/go/src/xdelta/rstream.go12
-rw-r--r--xdelta3/go/src/xdelta/tgroup.go51
3 files changed, 64 insertions, 12 deletions
diff --git a/xdelta3/go/src/regtest.go b/xdelta3/go/src/regtest.go
index 76d253c..4507b8c 100644
--- a/xdelta3/go/src/regtest.go
+++ b/xdelta3/go/src/regtest.go
@@ -78,8 +78,11 @@ func offsetTest(r *xdelta.Runner, p *xdelta.Program, bufsize, offset, length int
78 t.CopyStreams(enc.Stdout, dec.Stdin) 78 t.CopyStreams(enc.Stdout, dec.Stdin)
79 t.CompareStreams(dec.Stdout, read, length) 79 t.CompareStreams(dec.Stdout, read, length)
80 80
81 xdelta.WriteRstreams(t, "encode", seed, offset, length, enc.Srcin, enc.Stdin) 81 // The decoder output ("read", above) is compared with the
82 xdelta.WriteRstreams(t, "decode", seed, offset, length, dec.Srcin, write) 82 // test-provided output ("write", below).
83 xdelta.WriteRstreams(t, seed, offset, length,
84 t.NewDualWriter(enc.Srcin, dec.Srcin),
85 t.NewDualWriter(dec.Srcin, write))
83 t.Wait(g, enc, dec) 86 t.Wait(g, enc, dec)
84} 87}
85 88
@@ -92,10 +95,8 @@ func main() {
92 95
93 prog := &xdelta.Program{xdelta3} 96 prog := &xdelta.Program{xdelta3}
94 97
95 smokeTest(r, prog) 98 //smokeTest(r, prog)
96 for { 99 offsetTest(r, prog, 4 << 20, 3 << 20, 5 << 20)
97 offsetTest(r, prog, 4 << 20, 3 << 20, 5 << 20)
98 }
99 100
100 //offsetTest(r, xdelta.NewTestGroup(), prog, 1 << 31, 1 << 32, 1 << 33) 101 //offsetTest(r, xdelta.NewTestGroup(), prog, 1 << 31, 1 << 32, 1 << 33)
101} 102}
diff --git a/xdelta3/go/src/xdelta/rstream.go b/xdelta3/go/src/xdelta/rstream.go
index 67d23e6..eafcfeb 100644
--- a/xdelta3/go/src/xdelta/rstream.go
+++ b/xdelta3/go/src/xdelta/rstream.go
@@ -7,15 +7,15 @@ import (
7) 7)
8 8
9const ( 9const (
10 blocksize = 16380 10 blocksize = 1<<20
11) 11)
12 12
13func WriteRstreams(t *TestGroup, desc string, seed, offset, len int64, 13func WriteRstreams(t *TestGroup, seed, offset, len int64,
14 src, tgt io.WriteCloser) { 14 src, tgt io.WriteCloser) {
15 t.Go("src-write:"+desc, func (g Goroutine) { 15 t.Go("src-write", func (g Goroutine) {
16 writeOne(g, seed, 0, len, src, false) 16 writeOne(g, seed, 0, len, src, false)
17 }) 17 })
18 t.Go("tgt-write:"+desc, func (g Goroutine) { 18 t.Go("tgt-write", func (g Goroutine) {
19 writeOne(g, seed, offset, len, tgt, true) 19 writeOne(g, seed, offset, len, tgt, true)
20 }) 20 })
21} 21}
@@ -60,9 +60,9 @@ func writeRand(r *rand.Rand, len int64, s io.Writer) error {
60} 60}
61 61
62func fillRand(r *rand.Rand, blk []byte) { 62func fillRand(r *rand.Rand, blk []byte) {
63 for p := 0; p < blocksize; { 63 for p := 0; p < len(blk); {
64 v := r.Int63() 64 v := r.Int63()
65 for i := 7; i != 0; i-- { 65 for i := 7; i != 0 && p < len(blk); i-- {
66 blk[p] = byte(v) 66 blk[p] = byte(v)
67 p++ 67 p++
68 v >>= 8 68 v >>= 8
diff --git a/xdelta3/go/src/xdelta/tgroup.go b/xdelta3/go/src/xdelta/tgroup.go
index c7337c6..1852bac 100644
--- a/xdelta3/go/src/xdelta/tgroup.go
+++ b/xdelta3/go/src/xdelta/tgroup.go
@@ -2,6 +2,7 @@ package xdelta
2 2
3import ( 3import (
4 "fmt" 4 "fmt"
5 "io"
5 "sync" 6 "sync"
6 "time" 7 "time"
7) 8)
@@ -109,3 +110,53 @@ func waitAll(t *TestGroup, wc chan bool) {
109 } 110 }
110 wc <- true 111 wc <- true
111} 112}
113
114type dualWriter struct {
115 e, d chan []byte
116}
117
118func (d *dualWriter) Write(p []byte) (int, error) {
119 if len(p) != 0 {
120 d.e <- p
121 d.d <- p
122 }
123 return len(p), nil
124}
125
126func (d *dualWriter) Close() error {
127 d.e <- nil
128 d.d <- nil
129 _ = <- d.e
130 _ = <- d.d
131 return nil
132}
133
134func newWriter(c chan []byte, a io.WriteCloser) func (Goroutine) {
135 return func (g Goroutine) {
136 for {
137 d := <- c
138 if d == nil {
139 if err := a.Close(); err != nil {
140 g.Panic(err)
141 }
142 c <- nil
143 g.OK()
144 return
145 }
146 if num, err := a.Write(d); err != nil {
147 g.Panic(err)
148 } else if num != len(d) {
149 g.Panic(fmt.Errorf("Invalid write: %v != %v", num, len(d)))
150 }
151 }
152 }
153}
154
155func (t *TestGroup) NewDualWriter(a1, a2 io.WriteCloser) io.WriteCloser {
156 c1 := make(chan []byte)
157 c2 := make(chan []byte)
158 r := &dualWriter{c1, c2}
159 t.Go("writer0", newWriter(c1, a1))
160 t.Go("writer1", newWriter(c2, a2))
161 return r
162}