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