1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
#!/usr/bin/python
# This script confirms both that the register report "adds up", and that its
# final balance is the same as what the balance report shows.
import sys
import re
from difflib import ndiff
multiproc = False
try:
from multiprocessing import Pool
multiproc = True
except:
pass
args = sys.argv
jobs = 1
match = re.match('-j([0-9]+)?', args[1])
if match:
args = [args[0]] + args[2:]
if match.group(1):
jobs = int(match.group(1))
if jobs == 1:
multiproc = False
from LedgerHarness import LedgerHarness
harness = LedgerHarness(args)
#def normalize(line):
# match = re.match("((\s*)([A-Za-z]+)?(\s*)([-0-9.]+)(\s*)([A-Za-z]+)?)( (.+))?$", line)
# if match:
# if match.group(3):
# prefix = match.group(3) + " " + match.group(5)
# if match.group(8):
# return prefix + match.group(8)
# return prefix
# elif match.group(7):
# prefix = match.group(7) + " " + match.group(5)
# if match.group(8):
# return prefix + match.group(8)
# return prefix
# return line
def generation_test(seed):
p_gen = harness.run('$ledger --seed=%d generate' % seed)
cout = harness.read(p_gen.stdout)
if not harness.wait(p_gen, msg=("Generation for seed %d failed:" % seed)):
return False
p_print = harness.run('$ledger --actual -f - print')
p_print.stdin.write(cout)
p_print.stdin.close()
p_print_out = p_print.stdout.read()
if not harness.wait(p_print, msg=("Print for seed %d failed:" % seed)):
return False
#p_cerr_bal = Popen("%s --args-only -f - bal" % ledger, shell=True,
# stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
#p_cerr_bal.stdin.write(cerr)
#p_cerr_bal.stdin.close()
#
#cerr_lines = [normalize(line) for line in p_cerr_bal.stdout.readlines()]
#
#if p_cerr_bal.wait() != 0:
# print("Stderr balance for seed %d failed due to error:" % seed)
# print(p_cerr_bal.stderr.read())
# del p_cerr_bal
# return False
#del p_cerr_bal
p_cout_bal = harness.run('$ledger -f - bal')
p_cout_bal.stdin.write(cout)
p_cout_bal.stdin.close()
cout_lines = harness.readlines(p_cout_bal.stdout)
if len(cout_lines) == 0:
return False
#norm_cout_lines = [normalize(line) for line in cout_lines]
if not harness.wait(p_cout_bal, msg=("Stdout balance for seed %d failed:" % seed)):
return False
p_print_bal = harness.run('$ledger -f - bal')
p_print_bal.stdin.write(p_print_out)
p_print_bal.stdin.close()
print_lines = harness.readlines(p_print_bal.stdout)
if len(print_lines) == 0:
return False
if not harness.wait(p_print_bal, msg=("Print balance for seed %d failed:" % seed)):
return False
success = True
#printed = False
#for line in ndiff(cerr_lines, norm_cout_lines, charjunk=None):
# if line[:2] == " ":
# continue
# if not printed:
# if success: print()
# print("Generation failure in output from seed %d (cerr vs. cout):" % seed)
# if success: failed += 1
# success = False
# printed = True
# print(" ", line)
printed = False
for line in ndiff(cout_lines, print_lines, charjunk=None):
if line[:2] == " ":
continue
if not printed:
if success: print()
print("Generation failure in output from seed %d (cout vs. print):" % seed)
success = False
printed = True
print(" ", line)
return success
beg_range = 1
end_range = 20
if len(args) > 4:
beg_range = int(args[3])
end_range = int(args[4])
def run_gen_test(i):
if generation_test(i):
harness.success()
else:
harness.failure()
return harness.failed
if multiproc:
pool = Pool(jobs*2)
else:
pool = None
if pool:
pool.map(run_gen_test, range(beg_range, end_range))
else:
for i in range(beg_range, end_range):
run_gen_test(i)
if pool:
pool.close()
pool.join()
harness.exit()
|