diff options
-rw-r--r-- | xdelta3/go/src/regtest.go | 13 | ||||
-rw-r--r-- | xdelta3/go/src/xdelta/rstream.go | 12 | ||||
-rw-r--r-- | xdelta3/go/src/xdelta/tgroup.go | 51 |
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 | ||
9 | const ( | 9 | const ( |
10 | blocksize = 16380 | 10 | blocksize = 1<<20 |
11 | ) | 11 | ) |
12 | 12 | ||
13 | func WriteRstreams(t *TestGroup, desc string, seed, offset, len int64, | 13 | func 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 | ||
62 | func fillRand(r *rand.Rand, blk []byte) { | 62 | func 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 | ||
3 | import ( | 3 | import ( |
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 | |||
114 | type dualWriter struct { | ||
115 | e, d chan []byte | ||
116 | } | ||
117 | |||
118 | func (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 | |||
126 | func (d *dualWriter) Close() error { | ||
127 | d.e <- nil | ||
128 | d.d <- nil | ||
129 | _ = <- d.e | ||
130 | _ = <- d.d | ||
131 | return nil | ||
132 | } | ||
133 | |||
134 | func 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 | |||
155 | func (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 | } | ||