forked from anrieff/libcpuid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun_tests.py
executable file
·134 lines (119 loc) · 3.86 KB
/
run_tests.py
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
#!/usr/bin/python
from __future__ import with_statement
import os, sys, re, random
### Constants:
fields = [ "family", "model", "stepping", "extfamily", "extmodel", "cores",
"logical", "l1d-cache", "l1i-cache", "l2-cache", "l3-cache", "l4-cache",
"l1d-assoc", "l2-assoc", "l3-assoc", "l4-assoc", "l1d-cacheline",
"l2-cacheline", "l3-cacheline", "l4-cacheline", "sse-size",
"codename", "flags" ]
args = sys.argv
fix = False
show_test_fast_warning = False
if len(args) < 3:
print """
Usage: run_tests.py <cpuid_tool binary> <test file/dir> [test file/dir ...] [OPTIONS]
If a test file is given, it is tested by itself.
If a directory is given, process all *.test files there, subdirectories included.
If the --fix option is given, the behaviour of the cpuid_tool binary is deemed correct
and any failing tests are updated.
"""
sys.exit(1)
filelist = []
cpuid_tool = args[1]
for arg in args[2:]:
if arg == "--fix":
fix = True
continue
if arg == "--show-test-fast-warning":
show_test_fast_warning = True
continue
if os.path.isdir(arg):
# gather all *.test files from subdirs amd and intel:
for dirpath, dirnames, filenames in os.walk(arg):
filelist += [os.path.join(dirpath, fn) for fn in filenames if fn[-5:] == ".test"]
else:
filelist.append(arg)
#f = open(args[1], "rt")
#lines = f.readlines()
#f.close()
# One would usually use os.tempnam, but libc gives off hell a lot of
# warnings when you attempt to use that :(
def make_tempname(prefix):
chars = ""
for i in xrange(26):
chars += chr(97+i)
chars += chr(65+i)
for i in xrange(10):
chars += chr(48+i)
for i in xrange(6):
prefix += random.choice(chars)
return prefix
def fmt_error(err):
pfix = " %s: " % err[0]
return "%sexpected `%s'\n%sgot `%s'" % (pfix, err[1], " "*len(pfix), err[2])
def fixFile(filename, input_lines, output_lines):
f = open(filename, "wt")
f.writelines(map(lambda s: s + "\n", input_lines))
f.write("--------------------------------------------------------------------------------\n")
f.writelines(map(lambda s: s + "\n", output_lines))
f.close()
def do_test(inp, expected_out, binary, test_file_name):
fninp = make_tempname("cpuidin")
fnoutp = make_tempname("cpuidout")
f = open(fninp, "wt")
f.writelines(map(lambda s: s + "\n", inp))
f.close()
cmd = "%s --load=%s --outfile=%s %s" % (binary, fninp, fnoutp, " ".join(map(lambda s: "--" + s, fields)))
os.system(cmd)
os.unlink(fninp)
real_out = []
try:
f = open(fnoutp, "rt")
real_out = map(lambda s: s.strip(), f.readlines())
f.close()
os.unlink(fnoutp)
except IOError:
return "Exception"
if len(real_out) != len(expected_out) or len(real_out) != len(fields):
return "Unexpected number of records returned"
err_fields = []
for i in range(len(real_out)):
if real_out[i] != expected_out[i]:
err_fields.append((fields[i], expected_out[i], real_out[i]))
if not err_fields:
return "OK"
else:
if fix:
fixFile(test_file_name, inp, real_out)
return "Mismatch, fixed."
else:
return "Mismatch in fields:\n%s" % "\n".join([fmt_error(err) for err in err_fields])
errors = False
print "Testing..."
for test_file_name in filelist:
current_input = []
current_output = []
build_output = False
with open(test_file_name, "rt") as f:
for line in f.readlines():
if line[:3] == "---":
build_output = True
else:
if build_output:
current_output.append(line.strip())
else:
current_input.append(line.strip())
#codename = current_output[len(current_output) - 2]
result = do_test(current_input, current_output, cpuid_tool, test_file_name)
print "Test [%s]: %s" % (test_file_name[:-5], result)
if result != "OK":
errors = True
build_output = False
if errors:
if show_test_fast_warning:
print """
You're running tests in fast mode; before taking any action on the errors
above, please confirm that the slow mode ('make test-old') also fails."""
else:
print "All successfull!"