]>
Commit | Line | Data |
---|---|---|
1d506c26 | 1 | # Copyright (C) 2013-2024 Free Software Foundation, Inc. |
f27a1236 YQ |
2 | |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
5 | # the Free Software Foundation; either version 3 of the License, or | |
6 | # (at your option) any later version. | |
7 | # | |
8 | # This program is distributed in the hope that it will be useful, | |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
12 | # | |
13 | # You should have received a copy of the GNU General Public License | |
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
15 | ||
af061d3e DE |
16 | # Text reports are written here. |
17 | # This is the perftest counterpart to gdb.sum. | |
18 | SUM_FILE_NAME = "perftest.sum" | |
19 | ||
20 | # Raw data that went into the report is written here. | |
21 | # This is the perftest counterpart to gdb.log. | |
22 | LOG_FILE_NAME = "perftest.log" | |
23 | ||
24 | ||
f27a1236 YQ |
25 | class Reporter(object): |
26 | """Base class of reporter to report test results in a certain format. | |
27 | ||
28 | Subclass, which is specific to a report format, should overwrite | |
29 | methods report, start and end. | |
30 | """ | |
31 | ||
32 | def __init__(self, append): | |
33 | """Constructor of Reporter. | |
34 | ||
35 | attribute append is used to determine whether to append or | |
36 | overwrite log file. | |
37 | """ | |
38 | self.append = append | |
39 | ||
40 | def report(self, *args): | |
41 | raise NotImplementedError("Abstract Method:report.") | |
42 | ||
43 | def start(self): | |
44 | """Invoked when reporting is started.""" | |
45 | raise NotImplementedError("Abstract Method:start.") | |
46 | ||
47 | def end(self): | |
48 | """Invoked when reporting is done. | |
49 | ||
50 | It must be overridden to do some cleanups, such as closing file | |
51 | descriptors. | |
52 | """ | |
53 | raise NotImplementedError("Abstract Method:end.") | |
54 | ||
af061d3e | 55 | |
f27a1236 YQ |
56 | class TextReporter(Reporter): |
57 | """Report results in a plain text file 'perftest.log'.""" | |
58 | ||
59 | def __init__(self, append): | |
13123da8 | 60 | super(TextReporter, self).__init__(Reporter(append)) |
af061d3e | 61 | self.txt_sum = None |
f27a1236 YQ |
62 | self.txt_log = None |
63 | ||
af061d3e DE |
64 | def report(self, test_name, measurement_name, data_points): |
65 | if len(data_points) == 0: | |
13123da8 SM |
66 | self.txt_sum.write( |
67 | "%s %s *no data recorded*\n" % (test_name, measurement_name) | |
68 | ) | |
af061d3e DE |
69 | return |
70 | average = sum(data_points) / len(data_points) | |
71 | data_min = min(data_points) | |
72 | data_max = max(data_points) | |
13123da8 SM |
73 | self.txt_sum.write("%s %s %s\n" % (test_name, measurement_name, average)) |
74 | self.txt_log.write( | |
75 | "%s %s %s, min %s, max %s, data %s\n" | |
76 | % (test_name, measurement_name, average, data_min, data_max, data_points) | |
77 | ) | |
f27a1236 YQ |
78 | |
79 | def start(self): | |
af061d3e | 80 | mode = "a+" if self.append else "w" |
13123da8 SM |
81 | self.txt_sum = open(SUM_FILE_NAME, mode) |
82 | self.txt_log = open(LOG_FILE_NAME, mode) | |
f27a1236 YQ |
83 | |
84 | def end(self): | |
13123da8 SM |
85 | self.txt_sum.close() |
86 | self.txt_log.close() |