]> arthur.barton.de Git - bup.git/blob - dev/sparse-test-data
HLinkDB.__del__: replace with context management
[bup.git] / dev / sparse-test-data
1 #!/bin/sh
2 """": # -*-python-*-
3 bup_exec="$(dirname "$0")/bup-exec" || exit $?
4 exec "$bup_exec" "$0" ${1+"$@"}
5 """
6
7 from __future__ import absolute_import, print_function
8 from random import randint
9 from sys import stderr, stdout
10 import os, sys
11
12 from bup.compat import get_argvb
13 from bup.io import byte_stream
14
15 def smaller_region(max_offset):
16     start = randint(0, max_offset)
17     return (start, min(max_offset, randint(start + 1, start + 5)))
18
19
20 def possibly_larger_region(max_offset, min_sparse_len):
21     start = randint(0, max_offset)
22     return (start, min(max_offset, randint(start + 1,
23                                            start + 3 * min_sparse_len)))
24
25
26 def initial_region(max_offset, min_sparse_len):
27     start = 0
28     return (start, min(max_offset, randint(start + 1,
29                                            start + 3 * min_sparse_len)))
30
31
32 def final_region(max_offset, min_sparse_len):
33     start = max(0, randint(max_offset - 3 * min_sparse_len,
34                            max_offset - 1))
35     return (start, max_offset)
36
37
38 def region_around_min_len(max_offset, min_sparse_len):
39     start = randint(0, max_offset)
40     return (start, min(max_offset, randint(start + min_sparse_len - 5,
41                                            start + min_sparse_len + 5)))
42
43
44 generators = []
45
46 def random_region():
47     global generators
48     return generators[randint(0, len(generators) - 1)]()
49
50 argv = get_argvb()
51
52 if len(argv) == 0:
53     stdout.flush()
54     out = byte_stream(stdout)
55 if len(argv) == 2:
56     out = open(argv[1], 'wb')
57 else:
58     print('Usage: sparse-test-data [FILE]', file=stderr)
59     sys.exit(2)
60
61 bup_read_size = 2 ** 16
62 bup_min_sparse_len = 512
63 out_size = randint(0, bup_read_size * 10)
64
65 generators = (lambda : smaller_region(out_size),
66               lambda : possibly_larger_region(out_size, bup_min_sparse_len),
67               lambda : initial_region(out_size, bup_min_sparse_len),
68               lambda : final_region(out_size, bup_min_sparse_len),
69               lambda : region_around_min_len(out_size, bup_min_sparse_len))
70
71 sparse = []
72 sparse.append(random_region())
73 sparse.append(random_region())
74
75 # Handle overlaps
76 if sparse[1][0] < sparse[0][0]:
77     sparse[0], sparse[1] = sparse[1], sparse[0]
78
79 sparse_offsets = []
80 sparse_offsets.append(sparse[0][0])
81 if sparse[1][0] <= sparse[0][1]:
82     sparse_offsets.append(max(sparse[0][1], sparse[1][1]))
83 else:
84     sparse_offsets.extend((sparse[0][1], sparse[1][0], sparse[1][1]))
85
86 if sparse[1][1] != out_size:
87     sparse_offsets.append(out_size)
88
89 # Now sparse_offsets indicates where to start/stop zero runs
90 data = b'x'
91 pos = 0
92 print('offsets:', sparse_offsets, file=stderr)
93 for offset in sparse_offsets:
94     count = offset - pos
95     print('write:', 'x' if data == 'x' else '0', count, file=stderr)
96     out.write(data * (offset - pos))
97     pos += count
98     data = b'\0' if data == b'x' else b'x'
99
100 out.close()