aos/tools/harness/results.py
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

98 lines
3.0 KiB
Python

##########################################################################
# Copyright (c) 2009, ETH Zurich.
# All rights reserved.
#
# This file is distributed under the terms in the attached LICENSE file.
# If you do not find this file, copies can be found by writing to:
# ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
##########################################################################
from stats import Stats
class ResultsBase(object):
def __init__(self, name=None, reason=""):
self.name = name
self.fail_reason = reason
def reason(self):
return self.fail_reason
def passed(self):
"""Returns true iff the test is considered to have passed."""
raise NotImplementedError
def to_file(self, filehandle):
"""May be used to write formatted results to a file."""
raise NotImplementedError
class PassFailResult(ResultsBase):
"""Stores results of test that is purely pass/fail."""
def __init__(self, passed, reason=""):
super(PassFailResult, self).__init__(reason=reason)
self.passfail = passed
def passed(self):
return self.passfail
class PassFailMultiResult(ResultsBase):
def __init__(self, name, errors=[]):
self.errors = errors
self.name = name
def reason(self):
return str(self.errors)
def passed(self):
return len(self.errors) == 0
def to_file(self, fh):
if len(self.errors) > 0:
fh.write('%d error(s) in %s\n' % (len(self.errors), self.name))
for error in self.errors:
fh.write(error)
class RowResults(ResultsBase):
"""Results class that maintains numeric values grouped by rows.
"""
def __init__(self, colnames, name=None):
super(RowResults, self).__init__(name)
self.colnames = colnames
self.rows = []
self.failed = False
def passed(self):
if self.failed:
return False
return self.rows != []
def to_file(self, fh):
"""Produce a file in a format suitable for gnuplot."""
fh.write('# %s\n' % '\t'.join(self.colnames))
for r in self.rows:
fh.write('\t'.join(map(str, r)) + '\n')
def mark_failed(self, reason):
"""Mark this test as having failed."""
self.failed = True
self.fail_reason = reason
def add_row(self, row):
assert(len(row) == len(self.colnames))
self.rows.append(row)
class RawResults(RowResults):
"""Results class suitable for processing statistics on raw data
(eg. microbenchmarks where we have each individual measurement)"""
def __init__(self, groupheader, name=None):
headers = 'nvalues median mean stddev min max'.split()
super(RawResults, self).__init__([groupheader] + headers, name=name)
def add_group(self, identifier, data):
st = Stats(data)
self.add_row([identifier, st.nvalues, st.median, st.mean, st.stddev,
st.minimum, st.maximum])