[Piglit] [PATCH 2/2] satus: Make use of the status objects
Dylan Baker
baker.dylan.c at gmail.com
Fri Sep 13 17:22:41 PDT 2013
This adds code in framework/summary.py and framework/core.py to make use
of the status classes in status.py. This makes comparisons between
statuses much simpler and cleaner
Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
---
framework/core.py | 18 ++++++++++-
framework/summary.py | 85 +++++++++++++---------------------------------------
2 files changed, 38 insertions(+), 65 deletions(-)
diff --git a/framework/core.py b/framework/core.py
index 150a70c..24b2145 100644
--- a/framework/core.py
+++ b/framework/core.py
@@ -39,6 +39,7 @@ from textwrap import dedent
from threads import ConcurrentTestPool
from threads import synchronized_self
import threading
+import status
__all__ = ['Environment',
'checkDir',
@@ -211,7 +212,22 @@ if 'PIGLIT_SOURCE_DIR' not in os.environ:
class TestResult(dict):
- pass
+ def __init__(self, *args):
+ dict.__init__(self, *args)
+
+ # Replace the result with a status object
+ if self['result'] == 'skip':
+ self['result'] = status.Skip()
+ elif self['result'] == 'pass':
+ self['result'] = status.Pass()
+ elif self['result'] == 'warn':
+ self['result'] = status.Fail()
+ elif self['result'] == 'crash':
+ self['result'] = status.Warn()
+ elif self['result'] == 'fail':
+ self['result'] = status.Crash()
+ else:
+ raise KeyError
class GroupResult(dict):
diff --git a/framework/summary.py b/framework/summary.py
index 1cdbab7..8ae7796 100644
--- a/framework/summary.py
+++ b/framework/summary.py
@@ -28,6 +28,7 @@ from json import loads
from mako.template import Template
import core
+from status import Skip, Pass, Warn, Fail, Crash
__all__ = [
'Summary',
@@ -290,7 +291,7 @@ class Summary:
# Since skip is the "lowest" status for HTML generation, if
# there is another status it will replace skip
- currentStatus.append('skip')
+ currentStatus.append(Skip())
def closeGroup(group_name):
# We're done with this group, record the number of pass/total
@@ -304,32 +305,10 @@ class Summary:
stack[-1] = (parent_pass + nr_pass, parent_total + nr_total)
# Add the status back to the group hierarchy
- if status_to_number(currentStatus[-2]) < \
- status_to_number(currentStatus[-1]):
+ if currentStatus[-2] < currentStatus[-1]:
currentStatus[-2] = currentStatus[-1]
status[group_name] = currentStatus.pop()
- def status_to_number(status):
- """
- like status_to_number in the constructor, this function
- converts statuses into numbers so they can be comapared
- logically/mathematically. The only difference between this and
- init::status_to_number is the values assigned. The reason for
- this is that here we are looking for the 'worst' status, while
- in init::status_to_number we are looking for regressions in
- status.
- """
- if status == 'skip':
- return 1
- elif status == 'pass':
- return 2
- elif status == 'warn':
- return 3
- elif status == 'fail':
- return 4
- elif status == 'crash':
- return 5
-
openGroup('fake')
openGroup('all')
@@ -354,15 +333,14 @@ class Summary:
# Add the current test
(pass_so_far, total_so_far) = stack[-1]
- if summary.tests[fulltest]['result'] == 'pass':
+ if summary.tests[fulltest]['result'] == 2:
pass_so_far += 1
- if summary.tests[fulltest]['result'] != 'skip':
+ if summary.tests[fulltest]['result'] != 1:
total_so_far += 1
stack[-1] = (pass_so_far, total_so_far)
# compare the status
- if status_to_number(summary.tests[fulltest]['result']) > \
- status_to_number(currentStatus[-1]):
+ if summary.tests[fulltest]['result'] > currentStatus[-1]:
currentStatus[-1] = summary.tests[fulltest]['result']
# Work back up the stack closing groups as we go until we reach the
@@ -411,60 +389,39 @@ class Summary:
file is provided), and for JUnit and text which only need a limited
subset of these lists
"""
- def find_regressions(status):
- """
- Helper function to convert named statuses into number, since number
- can more easily be compared using logical/mathematical operators.
- The use of this is to look for regressions in status.
- """
- if status == 'pass':
- return 1
- elif status == 'warn':
- return 2
- elif status == 'fail':
- return 3
- elif status == 'skip':
- return 4
- elif status == 'crash':
- return 5
- elif status == 'special':
- return 0
-
for test in self.tests['all']:
status = []
for each in self.results:
try:
- status.append(find_regressions(each.tests[test]['result']))
+ status.append(each.tests[test]['result'])
except KeyError:
- status.append(find_regressions("special"))
+ status.append(0)
if 'changes' in lists:
# Check and append self.tests['changes']
- # A set cannot contain duplicate entries, so creating a set
- # out the list will reduce it's length to 1 if all entries
- # are the same, meaning it is not a change
- if len(set(status)) > 1:
- self.tests['changes'].append(test)
+ for i in xrange(len(status) -1):
+ if status[i] != status[i +1]:
+ self.tests['changes'].append(test)
if 'problems' in lists:
- # If the result contains a value other than 1 (pass) or 4
+ # If the result contains a value other than 2 (pass) or 1
# (skip) it is a problem. Skips are not problems becasuse
# they have Their own page.
- if [i for e in [2, 3, 5] for i in status if e is i]:
+ if [i for i in status if i not in [Pass(), Skip()]]:
self.tests['problems'].append(test)
if 'skipped' in lists:
# Find all tests with a status of skip
- if 4 in status:
+ if Skip() in status:
self.tests['skipped'].append(test)
if 'fixes' in lists:
# Find both fixes and regressions, and append them to the
# proper lists
for i in xrange(len(status) - 1):
- if status[i] < status[i + 1] and status[i] != 0:
+ if status[i] == Pass() and status[i + 1] != Pass():
self.tests['regressions'].append(test)
- if status[i] > 1 and status[i + 1] == 1:
+ if status[i] != Pass() and status[i + 1] == Pass():
self.tests['fixes'].append(test)
# Remove duplicate entries from the status lists
@@ -483,7 +440,7 @@ class Summary:
self.totals = {'pass': 0, 'fail': 0, 'crash': 0, 'skip': 0, 'warn': 0}
for test in self.results[-1].tests.values():
- self.totals[test['result']] += 1
+ self.totals[str(test['result'])] += 1
def generateHTML(self, destination, exclude):
"""
@@ -610,13 +567,13 @@ class Summary:
if diff:
for test in self.tests['changes']:
print "%(test)s: %(statuses)s" % {'test': test, 'statuses':
- ' '.join([i.tests.get(test, {'result': 'skip'})
- ['result'] for i in self.results])}
+ ' '.join(map(str, [i.tests.get(test, {'result': Skip()})
+ ['result'] for i in self.results]))}
else:
for test in self.tests['all']:
print "%(test)s: %(statuses)s" % {'test': test, 'statuses':
- ' '.join([i.tests.get(test, {'result': 'skip'})
- ['result'] for i in self.results])}
+ ' '.join(map(str, [i.tests.get(test, {'result': Skip()})
+ ['result'] for i in self.results]))}
# Print the summary
print "summary:"
--
1.8.1.5
More information about the Piglit
mailing list