Home | History | Annotate | Download | only in base
      1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """Module containing base test results classes."""
      6 
      7 class ResultType(object):
      8   """Class enumerating test types."""
      9   PASS = 'PASS'
     10   FAIL = 'FAIL'
     11   CRASH = 'CRASH'
     12   TIMEOUT = 'TIMEOUT'
     13   UNKNOWN = 'UNKNOWN'
     14 
     15   @staticmethod
     16   def GetTypes():
     17     """Get a list of all test types."""
     18     return [ResultType.PASS, ResultType.FAIL, ResultType.CRASH,
     19             ResultType.TIMEOUT, ResultType.UNKNOWN]
     20 
     21 
     22 class BaseTestResult(object):
     23   """Base class for a single test result."""
     24 
     25   def __init__(self, name, test_type, log=''):
     26     """Construct a BaseTestResult.
     27 
     28     Args:
     29       name: Name of the test which defines uniqueness.
     30       test_type: Type of the test result as defined in ResultType.
     31       log: An optional string listing any errors.
     32     """
     33     assert name
     34     assert test_type in ResultType.GetTypes()
     35     self._name = name
     36     self._test_type = test_type
     37     self._log = log
     38 
     39   def __str__(self):
     40     return self._name
     41 
     42   def __repr__(self):
     43     return self._name
     44 
     45   def __cmp__(self, other):
     46     # pylint: disable=W0212
     47     return cmp(self._name, other._name)
     48 
     49   def __hash__(self):
     50     return hash(self._name)
     51 
     52   def SetName(self, name):
     53     """Set the test name.
     54 
     55     Because we're putting this into a set, this should only be used if moving
     56     this test result into another set.
     57     """
     58     self._name = name
     59 
     60   def GetName(self):
     61     """Get the test name."""
     62     return self._name
     63 
     64   def GetType(self):
     65     """Get the test result type."""
     66     return self._test_type
     67 
     68   def GetLog(self):
     69     """Get the test log."""
     70     return self._log
     71 
     72 
     73 class TestRunResults(object):
     74   """Set of results for a test run."""
     75 
     76   def __init__(self):
     77     self._results = set()
     78 
     79   def GetLogs(self):
     80     """Get the string representation of all test logs."""
     81     s = []
     82     for test_type in ResultType.GetTypes():
     83       if test_type != ResultType.PASS:
     84         for t in sorted(self._GetType(test_type)):
     85           log = t.GetLog()
     86           if log:
     87             s.append('[%s] %s:' % (test_type, t))
     88             s.append(log)
     89     return '\n'.join(s)
     90 
     91   def GetLongForm(self):
     92     """Get the long string representation of this object."""
     93     s = []
     94     s.append('ALL (%d tests)' % len(self._results))
     95     for test_type in ResultType.GetTypes():
     96       tests = sorted(self._GetType(test_type))
     97       if test_type == ResultType.PASS:
     98         s.append('%s (%d tests)' % (test_type, len(tests)))
     99       else:
    100         s.append('%s (%d tests): %s' % (test_type, len(tests), tests))
    101     return '\n'.join(s)
    102 
    103   def GetShortForm(self):
    104     """Get the short string representation of this object."""
    105     s = []
    106     s.append('ALL: %d' % len(self._results))
    107     for test_type in ResultType.GetTypes():
    108       s.append('%s: %d' % (test_type, len(self._GetType(test_type))))
    109     return ''.join([x.ljust(15) for x in s])
    110 
    111   def __str__(self):
    112     return self.GetLongForm()
    113 
    114   def AddResult(self, result):
    115     """Add |result| to the set.
    116 
    117     Args:
    118       result: An instance of BaseTestResult.
    119     """
    120     assert isinstance(result, BaseTestResult)
    121     self._results.add(result)
    122 
    123   def AddResults(self, results):
    124     """Add |results| to the set.
    125 
    126     Args:
    127       results: An iterable of BaseTestResult objects.
    128     """
    129     for t in results:
    130       self.AddResult(t)
    131 
    132   def AddTestRunResults(self, results):
    133     """Add the set of test results from |results|.
    134 
    135     Args:
    136       results: An instance of TestRunResults.
    137     """
    138     assert isinstance(results, TestRunResults)
    139     # pylint: disable=W0212
    140     self._results.update(results._results)
    141 
    142   def GetAll(self):
    143     """Get the set of all test results."""
    144     return self._results.copy()
    145 
    146   def _GetType(self, test_type):
    147     """Get the set of test results with the given test type."""
    148     return set(t for t in self._results if t.GetType() == test_type)
    149 
    150   def GetPass(self):
    151     """Get the set of all passed test results."""
    152     return self._GetType(ResultType.PASS)
    153 
    154   def GetFail(self):
    155     """Get the set of all failed test results."""
    156     return self._GetType(ResultType.FAIL)
    157 
    158   def GetCrash(self):
    159     """Get the set of all crashed test results."""
    160     return self._GetType(ResultType.CRASH)
    161 
    162   def GetTimeout(self):
    163     """Get the set of all timed out test results."""
    164     return self._GetType(ResultType.TIMEOUT)
    165 
    166   def GetUnknown(self):
    167     """Get the set of all unknown test results."""
    168     return self._GetType(ResultType.UNKNOWN)
    169 
    170   def GetNotPass(self):
    171     """Get the set of all non-passed test results."""
    172     return self.GetAll() - self.GetPass()
    173 
    174   def DidRunPass(self):
    175     """Return whether the test run was successful."""
    176     return not self.GetNotPass()
    177