--- /dev/null
+#!/usr/bin/env python
+
+from random import randint
+from sys import stderr, stdout
+import sys
+
+
+def smaller_region(max_offset):
+ start = randint(0, max_offset)
+ return (start, min(max_offset, randint(start + 1, start + 5)))
+
+
+def possibly_larger_region(max_offset, min_sparse_len):
+ start = randint(0, max_offset)
+ return (start, min(max_offset, randint(start + 1,
+ start + 3 * min_sparse_len)))
+
+
+def initial_region(max_offset, min_sparse_len):
+ start = 0
+ return (start, min(max_offset, randint(start + 1,
+ start + 3 * min_sparse_len)))
+
+
+def final_region(max_offset, min_sparse_len):
+ start = max(0, randint(max_offset - 3 * min_sparse_len,
+ max_offset - 1))
+ return (start, max_offset)
+
+
+def region_around_min_len(max_offset, min_sparse_len):
+ start = randint(0, max_offset)
+ return (start, min(max_offset, randint(start + min_sparse_len - 5,
+ start + min_sparse_len + 5)))
+
+
+generators = []
+
+def random_region():
+ global generators
+ return generators[randint(0, len(generators) - 1)]()
+
+
+out = stdout
+
+if len(sys.argv) == 2:
+ out = open(sys.argv[1], 'wb')
+elif len(sys.argv):
+ print >> stderr, "Usage: sparse-test-data [FILE]"
+
+bup_read_size = 2 ** 16
+bup_min_sparse_len = 512
+out_size = randint(0, bup_read_size * 10)
+
+generators = (lambda : smaller_region(out_size),
+ lambda : possibly_larger_region(out_size, bup_min_sparse_len),
+ lambda : initial_region(out_size, bup_min_sparse_len),
+ lambda : final_region(out_size, bup_min_sparse_len),
+ lambda : region_around_min_len(out_size, bup_min_sparse_len))
+
+sparse = []
+sparse.append(random_region())
+sparse.append(random_region())
+
+# Handle overlaps
+if sparse[1][0] < sparse[0][0]:
+ sparse[0], sparse[1] = sparse[1], sparse[0]
+
+sparse_offsets = []
+sparse_offsets.append(sparse[0][0])
+if sparse[1][0] <= sparse[0][1]:
+ sparse_offsets.append(max(sparse[0][1], sparse[1][1]))
+else:
+ sparse_offsets.extend((sparse[0][1], sparse[1][0], sparse[1][1]))
+
+if sparse[1][1] != out_size:
+ sparse_offsets.append(out_size)
+
+# Now sparse_offsets indicates where to start/stop zero runs
+data = 'x'
+pos = 0
+print >> stderr, 'offsets:', sparse_offsets
+for offset in sparse_offsets:
+ count = offset - pos
+ print >> stderr, 'write:', 'x' if data == 'x' else '0', count
+ out.write(data * (offset - pos))
+ pos += count
+ data = '\0' if data == 'x' else 'x'
+
+out.close()