3 bup_python="$(dirname "$0")/../cmd/bup-python" || exit $?
4 exec "$bup_python" "$0" ${1+"$@"}
7 from __future__ import absolute_import, print_function
8 from random import randint
9 from sys import stderr, stdout
12 from bup.io import byte_stream
14 def smaller_region(max_offset):
15 start = randint(0, max_offset)
16 return (start, min(max_offset, randint(start + 1, start + 5)))
19 def possibly_larger_region(max_offset, min_sparse_len):
20 start = randint(0, max_offset)
21 return (start, min(max_offset, randint(start + 1,
22 start + 3 * min_sparse_len)))
25 def initial_region(max_offset, min_sparse_len):
27 return (start, min(max_offset, randint(start + 1,
28 start + 3 * min_sparse_len)))
31 def final_region(max_offset, min_sparse_len):
32 start = max(0, randint(max_offset - 3 * min_sparse_len,
34 return (start, max_offset)
37 def region_around_min_len(max_offset, min_sparse_len):
38 start = randint(0, max_offset)
39 return (start, min(max_offset, randint(start + min_sparse_len - 5,
40 start + min_sparse_len + 5)))
47 return generators[randint(0, len(generators) - 1)]()
49 if len(sys.argv) == 0:
51 out = byte_stream(stdout)
52 if len(sys.argv) == 2:
53 out = open(sys.argv[1], 'wb')
55 print('Usage: sparse-test-data [FILE]', file=stderr)
58 bup_read_size = 2 ** 16
59 bup_min_sparse_len = 512
60 out_size = randint(0, bup_read_size * 10)
62 generators = (lambda : smaller_region(out_size),
63 lambda : possibly_larger_region(out_size, bup_min_sparse_len),
64 lambda : initial_region(out_size, bup_min_sparse_len),
65 lambda : final_region(out_size, bup_min_sparse_len),
66 lambda : region_around_min_len(out_size, bup_min_sparse_len))
69 sparse.append(random_region())
70 sparse.append(random_region())
73 if sparse[1][0] < sparse[0][0]:
74 sparse[0], sparse[1] = sparse[1], sparse[0]
77 sparse_offsets.append(sparse[0][0])
78 if sparse[1][0] <= sparse[0][1]:
79 sparse_offsets.append(max(sparse[0][1], sparse[1][1]))
81 sparse_offsets.extend((sparse[0][1], sparse[1][0], sparse[1][1]))
83 if sparse[1][1] != out_size:
84 sparse_offsets.append(out_size)
86 # Now sparse_offsets indicates where to start/stop zero runs
89 print('offsets:', sparse_offsets, file=stderr)
90 for offset in sparse_offsets:
92 print('write:', 'x' if data == 'x' else '0', count, file=stderr)
93 out.write(data * (offset - pos))
95 data = b'\0' if data == b'x' else b'x'