xref: /aosp_15_r20/external/capstone/suite/cstest/cstest_report.py (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi#!/usr/bin/python
2*9a0e4156SSadaf Ebrahimi
3*9a0e4156SSadaf Ebrahimiimport re
4*9a0e4156SSadaf Ebrahimiimport sys
5*9a0e4156SSadaf Ebrahimiimport getopt
6*9a0e4156SSadaf Ebrahimifrom subprocess import Popen, PIPE
7*9a0e4156SSadaf Ebrahimifrom pprint import pprint as ppr
8*9a0e4156SSadaf Ebrahimiimport os
9*9a0e4156SSadaf Ebrahimi
10*9a0e4156SSadaf Ebrahimi
11*9a0e4156SSadaf Ebrahimidef Usage(s):
12*9a0e4156SSadaf Ebrahimi	print 'Usage: {} -t <cstest_path> [-f <file_name.cs>] [-d <directory>]'.format(s)
13*9a0e4156SSadaf Ebrahimi	sys.exit(-1)
14*9a0e4156SSadaf Ebrahimi
15*9a0e4156SSadaf Ebrahimidef get_report_file(toolpath, filepath, getDetails, cmt_out):
16*9a0e4156SSadaf Ebrahimi	cmd = [toolpath, '-f', filepath]
17*9a0e4156SSadaf Ebrahimi	process = Popen(cmd, stdout=PIPE, stderr=PIPE)
18*9a0e4156SSadaf Ebrahimi	stdout, stderr = process.communicate()
19*9a0e4156SSadaf Ebrahimi
20*9a0e4156SSadaf Ebrahimi#	stdout
21*9a0e4156SSadaf Ebrahimi	failed_tests = []
22*9a0e4156SSadaf Ebrahimi#	print '---> stdout\n', stdout
23*9a0e4156SSadaf Ebrahimi#	print '---> stderr\n', stderr
24*9a0e4156SSadaf Ebrahimi	matches = re.finditer(r'\[\s+RUN\s+\]\s+(.*)\n\[\s+FAILED\s+\]', stdout)
25*9a0e4156SSadaf Ebrahimi	for match in matches:
26*9a0e4156SSadaf Ebrahimi		failed_tests.append(match.group(1))
27*9a0e4156SSadaf Ebrahimi#	stderr
28*9a0e4156SSadaf Ebrahimi	counter = 0
29*9a0e4156SSadaf Ebrahimi	details = []
30*9a0e4156SSadaf Ebrahimi	for line in stderr.split('\n'):
31*9a0e4156SSadaf Ebrahimi		if '[  PASSED  ] 0 test(s).' in line:
32*9a0e4156SSadaf Ebrahimi			break
33*9a0e4156SSadaf Ebrahimi		elif 'LINE' in line:
34*9a0e4156SSadaf Ebrahimi			continue
35*9a0e4156SSadaf Ebrahimi		elif 'ERROR' in line and ' --- ' in line:
36*9a0e4156SSadaf Ebrahimi			parts = line.split(' --- ')
37*9a0e4156SSadaf Ebrahimi			try:
38*9a0e4156SSadaf Ebrahimi				details.append((parts[1], failed_tests[counter], parts[2]))
39*9a0e4156SSadaf Ebrahimi			except IndexError:
40*9a0e4156SSadaf Ebrahimi				details.append(('', 'Unknown test', line.split(' --- ')[1]))
41*9a0e4156SSadaf Ebrahimi			counter += 1
42*9a0e4156SSadaf Ebrahimi		else:
43*9a0e4156SSadaf Ebrahimi			continue
44*9a0e4156SSadaf Ebrahimi	print '\n[-] There are/is {} failed test(s)'.format(len(details))
45*9a0e4156SSadaf Ebrahimi	if len(details) > 0 and getDetails:
46*9a0e4156SSadaf Ebrahimi		print '[-] Detailed report for {}:\n'.format(filepath)
47*9a0e4156SSadaf Ebrahimi		for c, f, d in details:
48*9a0e4156SSadaf Ebrahimi			print '\t[+] {}: {}\n\t\t{}\n'.format(f, c, d)
49*9a0e4156SSadaf Ebrahimi		print '\n'
50*9a0e4156SSadaf Ebrahimi		return 0
51*9a0e4156SSadaf Ebrahimi	elif len(details) > 0:
52*9a0e4156SSadaf Ebrahimi		for c, f, d in details:
53*9a0e4156SSadaf Ebrahimi			if len(f) > 0 and cmt_out is True:
54*9a0e4156SSadaf Ebrahimi				tmp_cmd = ['sed', '-E', '-i.bak', 's/({})(.*)/\/\/ \\1\\2/g'.format(c), filepath]
55*9a0e4156SSadaf Ebrahimi				sed_proc = Popen(tmp_cmd, stdout=PIPE, stderr=PIPE)
56*9a0e4156SSadaf Ebrahimi				sed_proc.communicate()
57*9a0e4156SSadaf Ebrahimi				tmp_cmd2 = ['rm', '-f', filepath + '.bak']
58*9a0e4156SSadaf Ebrahimi				rm_proc = Popen(tmp_cmd2, stdout=PIPE, stderr=PIPE)
59*9a0e4156SSadaf Ebrahimi				rm_proc.communicate()
60*9a0e4156SSadaf Ebrahimi
61*9a0e4156SSadaf Ebrahimi		return 0;
62*9a0e4156SSadaf Ebrahimi	return 1
63*9a0e4156SSadaf Ebrahimi
64*9a0e4156SSadaf Ebrahimidef get_report_folder(toolpath, folderpath, details, cmt_out):
65*9a0e4156SSadaf Ebrahimi	result = 1
66*9a0e4156SSadaf Ebrahimi	for root, dirs, files in os.walk(folderpath):
67*9a0e4156SSadaf Ebrahimi		path = root.split(os.sep)
68*9a0e4156SSadaf Ebrahimi		for f in files:
69*9a0e4156SSadaf Ebrahimi			if f.split('.')[-1] == 'cs':
70*9a0e4156SSadaf Ebrahimi				print '[-] Target:', f,
71*9a0e4156SSadaf Ebrahimi				result *= get_report_file(toolpath, os.sep.join(x for x in path) + os.sep + f, details, cmt_out)
72*9a0e4156SSadaf Ebrahimi
73*9a0e4156SSadaf Ebrahimi	sys.exit(result ^ 1)
74*9a0e4156SSadaf Ebrahimi
75*9a0e4156SSadaf Ebrahimiif __name__ == '__main__':
76*9a0e4156SSadaf Ebrahimi	Done = False
77*9a0e4156SSadaf Ebrahimi	details = False
78*9a0e4156SSadaf Ebrahimi	toolpath = ''
79*9a0e4156SSadaf Ebrahimi	cmt_out = False
80*9a0e4156SSadaf Ebrahimi	try:
81*9a0e4156SSadaf Ebrahimi		opts, args = getopt.getopt(sys.argv[1:], "ct:f:d:D")
82*9a0e4156SSadaf Ebrahimi		for opt, arg in opts:
83*9a0e4156SSadaf Ebrahimi			if opt == '-f':
84*9a0e4156SSadaf Ebrahimi				result = get_report_file(toolpath, arg, details, cmt_out)
85*9a0e4156SSadaf Ebrahimi				if result == 0:
86*9a0e4156SSadaf Ebrahimi					sys.exit(1)
87*9a0e4156SSadaf Ebrahimi				Done = True
88*9a0e4156SSadaf Ebrahimi			elif opt == '-d':
89*9a0e4156SSadaf Ebrahimi				get_report_folder(toolpath, arg, details, cmt_out)
90*9a0e4156SSadaf Ebrahimi				Done = True
91*9a0e4156SSadaf Ebrahimi			elif opt == '-t':
92*9a0e4156SSadaf Ebrahimi				toolpath = arg
93*9a0e4156SSadaf Ebrahimi			elif opt == '-D':
94*9a0e4156SSadaf Ebrahimi				details = True
95*9a0e4156SSadaf Ebrahimi			elif opt == '-c':
96*9a0e4156SSadaf Ebrahimi				cmt_out = True
97*9a0e4156SSadaf Ebrahimi
98*9a0e4156SSadaf Ebrahimi	except getopt.GetoptError:
99*9a0e4156SSadaf Ebrahimi		Usage(sys.argv[0])
100*9a0e4156SSadaf Ebrahimi
101*9a0e4156SSadaf Ebrahimi	if Done is False:
102*9a0e4156SSadaf Ebrahimi		Usage(sys.argv[0])
103