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