015dd030668a200959d5168f9fd3cc8deb299c59
[barrelfish] / tools / harness / results.py
1 ##########################################################################
2 # Copyright (c) 2009, ETH Zurich.
3 # All rights reserved.
4 #
5 # This file is distributed under the terms in the attached LICENSE file.
6 # If you do not find this file, copies can be found by writing to:
7 # ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8 ##########################################################################
9
10 from stats import Stats
11
12 class ResultsBase(object):
13     def __init__(self, name=None):
14         self.name = name
15
16     def passed(self):
17         """Returns true iff the test is considered to have passed."""
18         raise NotImplementedError
19
20     def to_file(self, filehandle):
21         """May be used to write formatted results to a file."""
22         raise NotImplementedError
23
24
25 class PassFailResult(ResultsBase):
26     """Stores results of test that is purely pass/fail."""
27     def __init__(self, passed):
28         super(PassFailResult, self).__init__()
29         self.passfail = passed
30
31     def passed(self):
32         return self.passfail
33
34
35 class PassFailMultiResult(ResultsBase):
36     def __init__(self, name, errors=[]):
37         self.errors = errors
38         self.name = name
39
40     def passed(self):
41         return len(self.errors) == 0
42
43     def to_file(self, fh):
44         if len(self.errors) > 0:
45             fh.write('%d error(s) in %s\n' % (len(self.errors), self.name))
46             for error in self.errors:
47                 fh.write(error)
48
49 class RowResults(ResultsBase):
50     """Results class that maintains numeric values grouped by rows.
51     """
52     def __init__(self, colnames, name=None):
53         super(RowResults, self).__init__(name)
54         self.colnames = colnames
55         self.rows = []
56         self.failed = False
57
58     def passed(self):
59         if self.failed:
60             return False
61         return self.rows != []
62
63     def to_file(self, fh):
64         """Produce a file in a format suitable for gnuplot."""
65         fh.write('# %s\n' % '\t'.join(self.colnames))
66         for r in self.rows:
67             fh.write('\t'.join(map(str, r)) + '\n')
68
69     def mark_failed(self):
70         """Mark this test as having failed."""
71         self.failed = True
72
73     def add_row(self, row):
74         assert(len(row) == len(self.colnames))
75         self.rows.append(row)
76
77
78 class RawResults(RowResults):
79     """Results class suitable for processing statistics on raw data
80     (eg. microbenchmarks where we have each individual measurement)"""
81
82     def __init__(self, groupheader, name=None):
83         headers = 'nvalues median mean stddev min max'.split()
84         super(RawResults, self).__init__([groupheader] + headers, name=name)
85
86     def add_group(self, identifier, data):
87         st = Stats(data)
88         self.add_row([identifier, st.nvalues, st.median, st.mean, st.stddev,
89                       st.minimum, st.maximum])