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