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