Merge pull request #21267 from mshabunin:fix-kw-2021-12
[platform/upstream/opencv.git] / modules / ts / misc / perf_tests_timing.py
1 #!/usr/bin/env python
2
3 from __future__ import print_function
4 import testlog_parser, sys, os, xml, glob, re
5 from table_formatter import *
6 from optparse import OptionParser
7 from operator import itemgetter, attrgetter
8 from summary import getSetName, alphanum_keyselector
9 import re
10
11 if __name__ == "__main__":
12     usage = "%prog <log_name>.xml [...]"
13     parser = OptionParser(usage = usage)
14
15     parser.add_option("-o", "--output", dest = "format",
16         help = "output results in text format (can be 'txt', 'html' or 'auto' - default)",
17         metavar = 'FMT', default = 'auto')
18
19     parser.add_option("--failed-only", action = "store_true", dest = "failedOnly",
20         help = "print only failed tests", default = False)
21
22     (options, args) = parser.parse_args()
23
24     options.generateHtml = detectHtmlOutputType(options.format)
25
26     files = []
27     testsuits = [] # testsuit module, name, time, num, flag for failed tests
28     overall_time = 0
29
30     seen = set()
31     for arg in args:
32         if ("*" in arg) or ("?" in arg):
33             flist = [os.path.abspath(f) for f in glob.glob(arg)]
34             flist = sorted(flist, key= lambda text: str(text).replace("M", "_"))
35             files.extend([ x for x in flist if x not in seen and not seen.add(x)])
36         else:
37             fname = os.path.abspath(arg)
38             if fname not in seen and not seen.add(fname):
39                 files.append(fname)
40
41             file = os.path.abspath(fname)
42             if not os.path.isfile(file):
43                 sys.stderr.write("IOError reading \"" + file + "\" - " + str(err) + os.linesep)
44                 parser.print_help()
45                 exit(0)
46
47             fname = os.path.basename(fname)
48             find_module_name = re.search(r'([^_]*)', fname)
49             module_name = find_module_name.group(0)
50
51             test_sets = []
52             try:
53                 tests = testlog_parser.parseLogFile(file)
54                 if tests:
55                     test_sets.append((os.path.basename(file), tests))
56             except IOError as err:
57                 sys.stderr.write("IOError reading \"" + file + "\" - " + str(err) + os.linesep)
58             except xml.parsers.expat.ExpatError as err:
59                 sys.stderr.write("ExpatError reading \"" + file + "\" - " + str(err) + os.linesep)
60
61             if not test_sets:
62                 continue
63
64             # find matches
65             setsCount = len(test_sets)
66             test_cases = {}
67
68             name_extractor = lambda name: str(name)
69
70             for i in range(setsCount):
71                 for case in test_sets[i][1]:
72                     name = name_extractor(case)
73                     if name not in test_cases:
74                         test_cases[name] = [None] * setsCount
75                     test_cases[name][i] = case
76
77             prevGroupName = None
78             suit_time = 0
79             suit_num = 0
80             fails_num = 0
81             for name in sorted(test_cases.iterkeys(), key=alphanum_keyselector):
82                 cases = test_cases[name]
83
84                 groupName = next(c for c in cases if c).shortName()
85                 if groupName != prevGroupName:
86                     if prevGroupName != None:
87                         suit_time = suit_time/60 #from seconds to minutes
88                         testsuits.append({'module': module_name, 'name': prevGroupName, \
89                             'time': suit_time, 'num': suit_num, 'failed': fails_num})
90                         overall_time += suit_time
91                         suit_time = 0
92                         suit_num = 0
93                         fails_num = 0
94                     prevGroupName = groupName
95
96                 for i in range(setsCount):
97                     case = cases[i]
98                     if not case is None:
99                         suit_num += 1
100                         if case.get('status') == 'run':
101                             suit_time += case.get('time')
102                         if case.get('status') == 'failed':
103                             fails_num += 1
104
105             # last testsuit processing
106             suit_time = suit_time/60
107             testsuits.append({'module': module_name, 'name': prevGroupName, \
108                 'time': suit_time, 'num': suit_num, 'failed': fails_num})
109             overall_time += suit_time
110
111     if len(testsuits)==0:
112         exit(0)
113
114     tbl = table()
115     rows = 0
116
117     if not options.failedOnly:
118         tbl.newColumn('module', 'Module', align = 'left', cssclass = 'col_name')
119         tbl.newColumn('name', 'Testsuit', align = 'left', cssclass = 'col_name')
120         tbl.newColumn('time', 'Time (min)', align = 'center', cssclass = 'col_name')
121         tbl.newColumn('num', 'Num of tests', align = 'center', cssclass = 'col_name')
122         tbl.newColumn('failed', 'Failed', align = 'center', cssclass = 'col_name')
123
124         # rows
125         for suit in sorted(testsuits, key = lambda suit: suit['time'], reverse = True):
126             tbl.newRow()
127             tbl.newCell('module', suit['module'])
128             tbl.newCell('name', suit['name'])
129             tbl.newCell('time', formatValue(suit['time'], '', ''), suit['time'])
130             tbl.newCell('num', suit['num'])
131             if (suit['failed'] != 0):
132                 tbl.newCell('failed', suit['failed'])
133             else:
134                 tbl.newCell('failed', ' ')
135             rows += 1
136
137     else:
138         tbl.newColumn('module', 'Module', align = 'left', cssclass = 'col_name')
139         tbl.newColumn('name', 'Testsuit', align = 'left', cssclass = 'col_name')
140         tbl.newColumn('failed', 'Failed', align = 'center', cssclass = 'col_name')
141
142         # rows
143         for suit in sorted(testsuits, key = lambda suit: suit['time'], reverse = True):
144             if (suit['failed'] != 0):
145                 tbl.newRow()
146                 tbl.newCell('module', suit['module'])
147                 tbl.newCell('name', suit['name'])
148                 tbl.newCell('failed', suit['failed'])
149                 rows += 1
150
151     # output table
152     if rows:
153         if options.generateHtml:
154             tbl.htmlPrintTable(sys.stdout)
155             htmlPrintFooter(sys.stdout)
156         else:
157             if not options.failedOnly:
158                 print('\nOverall time: %.2f min\n' % overall_time)
159             tbl.consolePrintTable(sys.stdout)
160             print(2 * '\n')