From b55fcf3dc4c775ef35dce116ab23d35a5f9ff326 Mon Sep 17 00:00:00 2001 From: Joshua MacDonald Date: Sun, 25 Jan 2015 23:17:17 -0800 Subject: regtest.go tests a random stream and an offset copy --- xdelta3/go/src/xdelta/rstream.go | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 xdelta3/go/src/xdelta/rstream.go (limited to 'xdelta3/go/src/xdelta/rstream.go') 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 @@ +package xdelta + + +import ( + "io" + "math/rand" +) + +const ( + blocksize = 16380 // A factor of 7 +) + +func WriteRstreams(seed, offset, len int64, + first, second io.WriteCloser) { + go writeOne(seed, 0, len, first) + go writeOne(seed, offset, len, second) +} + +func writeOne(seed, offset, len int64, stream io.WriteCloser) { + if offset != 0 { + // Fill with other random data until the offset + writeRand(rand.New(rand.NewSource(^seed)), + offset, stream) + } + writeRand(rand.New(rand.NewSource(seed)), + len - offset, stream) + if err := stream.Close(); err != nil { + panic(err) + } +} + +func writeRand(r *rand.Rand, len int64, s io.Writer) { + blk := make([]byte, blocksize) + for len > 0 { + fillRand(r, blk) + c := blocksize + if len < blocksize { + c = int(len) + } + if _, err := s.Write(blk[0:c]); err != nil { + panic(err) + } + len -= int64(c) + } +} + +func fillRand(r *rand.Rand, blk []byte) { + for p := 0; p < blocksize; { + v := r.Int63() + for i := 7; i != 0; i-- { + blk[p] = byte(v) + p++ + v >>= 8 + } + } +} -- cgit v1.2.3