summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--framework/programs/run.py2
-rw-r--r--framework/results.py23
-rw-r--r--unittests/framework/backends/shared.py4
-rw-r--r--unittests/framework/backends/test_json.py3
-rw-r--r--unittests/framework/test_results.py77
5 files changed, 51 insertions, 58 deletions
diff --git a/framework/programs/run.py b/framework/programs/run.py
index ecfc36faf..5a2fcd054 100644
--- a/framework/programs/run.py
+++ b/framework/programs/run.py
@@ -339,7 +339,7 @@ def run(input_):
profile.run(args.log_level, backend)
results.time_elapsed.end = time.time()
- backend.finalize({'time_elapsed': results.time_elapsed})
+ backend.finalize({'time_elapsed': results.time_elapsed.to_json()})
print('Thank you for running Piglit!\n'
'Results have been written to ' + args.results_path)
diff --git a/framework/results.py b/framework/results.py
index 5634df1c6..3c2bb2a39 100644
--- a/framework/results.py
+++ b/framework/results.py
@@ -262,7 +262,9 @@ class Totals(dict):
def __init__(self, *args, **kwargs):
super(Totals, self).__init__(*args, **kwargs)
for each in status.ALL:
- self[str(each)] = 0
+ each = six.text_type(each)
+ if each not in self:
+ self[each] = 0
def __bool__(self):
# Since totals are prepopulated, calling 'if not <Totals instance>'
@@ -282,7 +284,10 @@ class Totals(dict):
@classmethod
def from_dict(cls, dict_):
"""Convert a dictionary into a Totals object."""
- return cls(dict_)
+ tots = cls(dict_)
+ if '__type__' in tots:
+ del tots['__type__']
+ return tots
class TestrunResult(object):
@@ -362,16 +367,24 @@ class TestrunResult(object):
"""
res = cls()
for name in ['name', 'uname', 'options', 'glxinfo', 'wglinfo', 'lspci',
- 'time_elapsed', 'totals', 'results_version',
- 'clinfo']:
+ 'results_version', 'clinfo']:
value = dict_.get(name)
if value:
setattr(res, name, value)
+ # Since this is used to load partial metadata when writing final test
+ # results there is no guarantee that this will have a "time_elapsed"
+ # key
+ if 'time_elapsed' in dict_:
+ setattr(res, 'time_elapsed',
+ TimeAttribute.from_dict(dict_['time_elapsed']))
res.tests = {n: TestResult.from_dict(t)
for n, t in six.iteritems(dict_['tests'])}
- if not res.totals and not _no_totals:
+ if not 'totals' in dict_ and not _no_totals:
res.calculate_group_totals()
+ else:
+ res.totals = {n: Totals.from_dict(t) for n, t in
+ six.iteritems(dict_['totals'])}
return res
diff --git a/unittests/framework/backends/shared.py b/unittests/framework/backends/shared.py
index ca2b478c0..d9f5790af 100644
--- a/unittests/framework/backends/shared.py
+++ b/unittests/framework/backends/shared.py
@@ -105,6 +105,7 @@ JSON = {
"glxinfo": None,
"totals": {
"spec": {
+ '__type__': 'Totals',
"warn": 0,
"timeout": 0,
"skip": 0,
@@ -117,6 +118,7 @@ JSON = {
"dmesg-fail": 0
},
"": {
+ '__type__': 'Totals',
"warn": 0,
"timeout": 0,
"skip": 0,
@@ -129,6 +131,7 @@ JSON = {
"dmesg-fail": 0
},
"spec@!opengl 1.0": {
+ '__type__': 'Totals',
"warn": 0,
"timeout": 0,
"skip": 0,
@@ -141,6 +144,7 @@ JSON = {
"dmesg-fail": 0
},
"root": {
+ '__type__': 'Totals',
"warn": 0,
"timeout": 0,
"skip": 0,
diff --git a/unittests/framework/backends/test_json.py b/unittests/framework/backends/test_json.py
index da1015c9f..e23bc29f9 100644
--- a/unittests/framework/backends/test_json.py
+++ b/unittests/framework/backends/test_json.py
@@ -113,7 +113,8 @@ class TestJSONBackend(object):
with test.write_test(self.name) as t:
t(self.result)
test.finalize(
- {'time_elapsed': results.TimeAttribute(start=0.0, end=1.0)})
+ {'time_elapsed':
+ results.TimeAttribute(start=0.0, end=1.0).to_json()})
def test_metadata_removed(self, tmpdir):
assert not tmpdir.join('metadata.json').check()
diff --git a/unittests/framework/test_results.py b/unittests/framework/test_results.py
index 9fce9d5e5..52257e03c 100644
--- a/unittests/framework/test_results.py
+++ b/unittests/framework/test_results.py
@@ -33,6 +33,8 @@ from framework import grouptools
from framework import results
from framework import status
+from .backends import shared
+
# pylint: disable=no-self-use
@@ -169,6 +171,7 @@ class TestTestResult(object):
def test_pid(self):
"""sets pid properly."""
assert self.test.pid == self.dict['pid']
+
class TestResult(object):
"""Tests for TestResult.result getter and setter methods."""
@@ -519,71 +522,43 @@ class TestTestrunResult(object):
class TestFromDict(object):
"""Tests for TestrunResult.from_dict."""
- @classmethod
- def setup_class(cls):
- """Setup values used by all tests."""
- subtest = results.TestResult('fail')
- subtest.subtests['foo'] = 'pass'
-
- test = results.TestrunResult()
- test.name = 'name'
- test.uname = 'this is uname'
- test.options = {'some': 'option'}
- test.glxinfo = 'glxinfo'
- test.wglinfo = 'wglinfo'
- test.clinfo = 'clinfo'
- test.lspci = 'this is lspci'
- test.time_elapsed.end = 1.23
- test.tests = {
- 'a test': results.TestResult('pass'),
- 'subtest': subtest,
- }
- # This will (hopefully) never be less than current
- test.results_version = 100000
-
- cls.baseline = test
- cls.test = results.TestrunResult.from_dict(test.to_json())
+ @pytest.fixture(scope="module")
+ def inst(self):
+ return results.TestrunResult.from_dict(shared.JSON)
@pytest.mark.parametrize("attrib", [
'name', 'uname', 'glxinfo', 'wglinfo', 'lspci', 'results_version',
- 'clinfo'
+ 'clinfo', 'options',
])
- def test_attribs_restored(self, attrib):
+ def test_attribs_restored(self, attrib, inst):
"""tests for basic attributes."""
- assert getattr(self.baseline, attrib) == getattr(self.test, attrib)
+ assert shared.JSON[attrib] == getattr(inst, attrib)
- def test_tests(self):
+ def test_tests(self, inst):
"""tests is restored correctly."""
- assert self.test.tests['a test'].result == \
- self.baseline.tests['a test'].result
+ assert inst.tests.keys() == shared.JSON['tests'].keys()
- def test_test_type(self):
+ def test_test_type(self, inst):
"""tests is restored correctly."""
- assert isinstance(self.test.tests['a test'].result, status.Status)
+ assert isinstance(
+ inst.tests['spec@!opengl 1.0@gl-1.0-readpixsanity'],
+ results.TestResult)
- def test_totals(self):
+ def test_totals(self, inst):
"""totals is restored correctly."""
- assert dict(self.baseline.totals) == dict(self.test.totals)
+ baseline = shared.JSON['totals'].copy()
+ for s in six.itervalues(baseline):
+ del s['__type__']
+ assert baseline == dict(inst.totals)
- def test_subtests(self):
- """subtests are restored correctly."""
- assert self.test.tests['subtest'].subtests['foo'] == \
- self.baseline.tests['subtest'].subtests['foo']
-
- def test_subtest_type(self):
- """subtests are Status instances."""
- assert isinstance(self.test.tests['subtest'].subtests['foo'],
- status.Status)
-
- def test_time_elapsed(self):
+ def test_time_elapsed(self, inst):
"""time_elapsed is restored correctly."""
- assert self.baseline.time_elapsed.end == self.test.time_elapsed.end
-
- def test_time(self):
- """time_elapsed is TimeAttribute instance."""
- assert isinstance(self.test.time_elapsed, results.TimeAttribute)
+ assert inst.time_elapsed.start == \
+ shared.JSON['time_elapsed']['start']
+ assert inst.time_elapsed.end == \
+ shared.JSON['time_elapsed']['end']
- class TestGetResul(object):
+ class TestGetResult(object):
"""Tests for TestrunResult.get_result."""
@classmethod