diff options
author | Joshua MacDonald <josh.macdonald@gmail.com> | 2015-01-25 23:17:17 -0800 |
---|---|---|
committer | Joshua MacDonald <josh.macdonald@gmail.com> | 2015-01-25 23:17:17 -0800 |
commit | b55fcf3dc4c775ef35dce116ab23d35a5f9ff326 (patch) | |
tree | 47a160fb2855434f17689a9028081b29bff8f1d8 /xdelta3/go/src/xdelta/rstream.go | |
parent | 57c7df665788bbb524c544ce5dea66b1aade63d3 (diff) |
regtest.go tests a random stream and an offset copy
Diffstat (limited to 'xdelta3/go/src/xdelta/rstream.go')
-rw-r--r-- | xdelta3/go/src/xdelta/rstream.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/xdelta3/go/src/xdelta/rstream.go b/xdelta3/go/src/xdelta/rstream.go new file mode 100644 index 0000000..1666934 --- /dev/null +++ b/xdelta3/go/src/xdelta/rstream.go | |||
@@ -0,0 +1,56 @@ | |||
1 | package xdelta | ||
2 | |||
3 | |||
4 | import ( | ||
5 | "io" | ||
6 | "math/rand" | ||
7 | ) | ||
8 | |||
9 | const ( | ||
10 | blocksize = 16380 // A factor of 7 | ||
11 | ) | ||
12 | |||
13 | func WriteRstreams(seed, offset, len int64, | ||
14 | first, second io.WriteCloser) { | ||
15 | go writeOne(seed, 0, len, first) | ||
16 | go writeOne(seed, offset, len, second) | ||
17 | } | ||
18 | |||
19 | func writeOne(seed, offset, len int64, stream io.WriteCloser) { | ||
20 | if offset != 0 { | ||
21 | // Fill with other random data until the offset | ||
22 | writeRand(rand.New(rand.NewSource(^seed)), | ||
23 | offset, stream) | ||
24 | } | ||
25 | writeRand(rand.New(rand.NewSource(seed)), | ||
26 | len - offset, stream) | ||
27 | if err := stream.Close(); err != nil { | ||
28 | panic(err) | ||
29 | } | ||
30 | } | ||
31 | |||
32 | func writeRand(r *rand.Rand, len int64, s io.Writer) { | ||
33 | blk := make([]byte, blocksize) | ||
34 | for len > 0 { | ||
35 | fillRand(r, blk) | ||
36 | c := blocksize | ||
37 | if len < blocksize { | ||
38 | c = int(len) | ||
39 | } | ||
40 | if _, err := s.Write(blk[0:c]); err != nil { | ||
41 | panic(err) | ||
42 | } | ||
43 | len -= int64(c) | ||
44 | } | ||
45 | } | ||
46 | |||
47 | func fillRand(r *rand.Rand, blk []byte) { | ||
48 | for p := 0; p < blocksize; { | ||
49 | v := r.Int63() | ||
50 | for i := 7; i != 0; i-- { | ||
51 | blk[p] = byte(v) | ||
52 | p++ | ||
53 | v >>= 8 | ||
54 | } | ||
55 | } | ||
56 | } | ||