diff options
-rw-r--r-- | framework/backends/json.py | 18 | ||||
-rw-r--r-- | framework/results.py | 2 | ||||
-rw-r--r-- | framework/test/base.py | 2 | ||||
-rw-r--r-- | unittests/framework/backends/schema/piglit-9.json | 122 | ||||
-rw-r--r-- | unittests/framework/backends/shared.py | 4 | ||||
-rw-r--r-- | unittests/framework/backends/test_json_update.py | 85 |
6 files changed, 228 insertions, 5 deletions
diff --git a/framework/backends/json.py b/framework/backends/json.py index 69f531936..f279f2fb6 100644 --- a/framework/backends/json.py +++ b/framework/backends/json.py @@ -53,7 +53,7 @@ __all__ = [ ] # The current version of the JSON results -CURRENT_JSON_VERSION = 8 +CURRENT_JSON_VERSION = 9 # The level to indent a final file INDENT = 4 @@ -339,6 +339,7 @@ def _update_results(results, filepath): 5: _update_five_to_six, 6: _update_six_to_seven, 7: _update_seven_to_eight, + 8: _update_eight_to_nine, } while results.results_version < CURRENT_JSON_VERSION: @@ -636,6 +637,21 @@ def _update_seven_to_eight(result): return result +def _update_eight_to_nine(result): + """Update json results from version 8 to 9. + + This changes the PID feild of the TestResult object to alist of Integers or + null rather than a single integer or null. + + """ + for test in compat.viewvalues(result.tests): + test.pid = [test.pid] + + result.results_version = 9 + + return result + + REGISTRY = Registry( extensions=['', '.json'], backend=JSONBackend, diff --git a/framework/results.py b/framework/results.py index 756d26109..f9ddcb4cd 100644 --- a/framework/results.py +++ b/framework/results.py @@ -162,7 +162,7 @@ class TestResult(object): self.images = None self.traceback = None self.exception = None - self.pid = None + self.pid = [] if result: self.result = result else: diff --git a/framework/test/base.py b/framework/test/base.py index 63fcaf4c4..b667b1569 100644 --- a/framework/test/base.py +++ b/framework/test/base.py @@ -322,7 +322,7 @@ class Test(object): universal_newlines=True, **_EXTRA_POPEN_ARGS) - self.result.pid = proc.pid + self.result.pid.append(proc.pid) if not _SUPPRESS_TIMEOUT: out, err = proc.communicate(timeout=self.timeout) else: diff --git a/unittests/framework/backends/schema/piglit-9.json b/unittests/framework/backends/schema/piglit-9.json new file mode 100644 index 000000000..1d401ae61 --- /dev/null +++ b/unittests/framework/backends/schema/piglit-9.json @@ -0,0 +1,122 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "TestrunResult", + "description": "The collection of all results", + "type": "object", + "properties": { + "__type__": { "type": "string" }, + "clinfo": { "type": ["string", "null"] }, + "glxinfo": { "type": ["string", "null"] }, + "lspci": { "type": ["string", "null"] }, + "wglinfo": { "type": ["string", "null"] }, + "name": { "type": "string" }, + "results_version": { "type": "number" }, + "uname": { "type": [ "string", "null" ] }, + "time_elapsed": { "$ref": "#/definitions/timeAttribute" }, + "options": { + "descrption": "The options that were invoked with this run. These are implementation specific and not required.", + "type": "object", + "properties": { + "exclude_tests": { + "type": "array", + "items": { "type": "string" }, + "uniqueItems": true + }, + "include_filter": { + "type": "array", + "items": { "type": "string" } + }, + "exclude_filter": { + "type": "array", + "items": { "type": "string" } + }, + "sync": { "type": "boolean" }, + "valgrind": { "type": "boolean" }, + "monitored": { "type": "boolean" }, + "dmesg": { "type": "boolean" }, + "execute": { "type": "boolean" }, + "concurrent": { "enum": ["none", "all", "some"] }, + "platform": { "type": "string" }, + "log_level": { "type": "string" }, + "env": { + "description": "Environment variables that must be specified", + "type": "object", + "additionalProperties": { "type": "string" } + }, + "profile": { + "type": "array", + "items": { "type": "string" } + } + } + }, + "totals": { + "type": "object", + "description": "A calculation of the group totals.", + "additionalProperties": { + "type": "object", + "properties": { + "crash": { "type": "number" }, + "dmesg-fail": { "type": "number" }, + "dmesg-warn": { "type": "number" }, + "fail": { "type": "number" }, + "incomplete": { "type": "number" }, + "notrun": { "type": "number" }, + "pass": { "type": "number" }, + "skip": { "type": "number" }, + "timeout": { "type": "number" }, + "warn": { "type": "number" } + }, + "additionalProperties": false, + "required": [ "crash", "dmesg-fail", "dmesg-warn", "fail", "incomplete", "notrun", "pass", "skip", "timeout", "warn" ] + } + }, + "tests": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "__type__": { "type": "string" }, + "err": { "type": "string" }, + "exception": { "type": ["string", "null"] }, + "result": { + "type": "string", + "enum": [ "pass", "fail", "crash", "warn", "incomplete", "notrun", "skip", "dmesg-warn", "dmesg-fail" ] + }, + "environment": { "type": "string" }, + "command": { "type": "string" }, + "traceback": { "type": ["string", "null"] }, + "out": { "type": "string" }, + "dmesg": { "type": "string" }, + "pid": { + "type": "array", + "items": { "type": "number" } + }, + "returncode": { "type": [ "number", "null" ] }, + "time": { "$ref": "#/definitions/timeAttribute" }, + "subtests": { + "type": "object", + "properties": { "__type__": { "type": "string" } }, + "additionalProperties": { "type": "string" }, + "required": [ "__type__" ] + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "required": [ "__type__", "clinfo", "glxinfo", "lspci", "wglinfo", "name", "results_version", "uname", "time_elapsed", "tests" ], + "definitions": { + "timeAttribute": { + "type": "object", + "description": "An element containing a start and end time", + "properties": { + "__type__": { "type": "string" }, + "start": { "type": "number" }, + "end": { "type": "number" } + }, + "additionalProperties": false, + "required": [ "__type__", "start", "end" ] + } + } +} diff --git a/unittests/framework/backends/shared.py b/unittests/framework/backends/shared.py index dd90fc25d..ca2b478c0 100644 --- a/unittests/framework/backends/shared.py +++ b/unittests/framework/backends/shared.py @@ -42,7 +42,7 @@ INITIAL_METADATA = { # changes. This does not contain piglit specifc objects, only strings, floats, # ints, and Nones (instead of JSON's null) JSON = { - "results_version": 8, + "results_version": 9, "time_elapsed": { "start": 1469638791.2351687, "__type__": "TimeAttribute", @@ -67,7 +67,7 @@ JSON = { "__type__": "TimeAttribute", "end": 1469638791.2439244 }, - "pid": 11768, + "pid": [11768], "__type__": "TestResult", "returncode": 1, "result": "fail", diff --git a/unittests/framework/backends/test_json_update.py b/unittests/framework/backends/test_json_update.py index 33b4c0904..501a895a4 100644 --- a/unittests/framework/backends/test_json_update.py +++ b/unittests/framework/backends/test_json_update.py @@ -34,6 +34,7 @@ try: except ImportError: from unittest import mock +import jsonschema import pytest import six @@ -865,3 +866,87 @@ class TestV7toV8(object): """ assert result.time_elapsed.start == 0.0 assert result.time_elapsed.end == 1.2 + + def test_valid(self, result): + with open(os.path.join(os.path.dirname(__file__), 'schema', + 'piglit-8.json'), + 'r') as f: + schema = json.load(f) + jsonschema.validate( + json.loads(json.dumps(result, default=backends.json.piglit_encoder)), + schema) + + +class TestV8toV9(object): + """Tests for Version 8 to version 9.""" + + data = { + "results_version": 9, + "name": "test", + "options": { + "profile": ['quick'], + "dmesg": False, + "verbose": False, + "platform": "gbm", + "sync": False, + "valgrind": False, + "filter": [], + "concurrent": "all", + "test_count": 0, + "exclude_tests": [], + "exclude_filter": [], + "env": { + "lspci": "stuff", + "uname": "more stuff", + "glxinfo": "and stuff", + "wglinfo": "stuff" + } + }, + "tests": { + 'a@test': { + "time_elapsed": { + 'start': 1.2, + 'end': 1.8, + '__type__': 'TimeAttribute' + }, + 'dmesg': '', + 'result': 'fail', + '__type__': 'TestResult', + 'command': '/a/command', + 'traceback': None, + 'out': '', + 'environment': 'A=variable', + 'returncode': 0, + 'err': '', + 'pid': 5, + 'subtests': { + '__type__': 'Subtests', + }, + 'exception': None, + } + }, + "time_elapsed": { + 'start': 1.2, + 'end': 1.8, + '__type__': 'TimeAttribute' + } + } + + @pytest.fixture + def result(self, tmpdir): + p = tmpdir.join('result.json') + p.write(json.dumps(self.data, default=backends.json.piglit_encoder)) + with p.open('r') as f: + return backends.json._update_eight_to_nine(backends.json._load(f)) + + def test_pid(self, result): + assert result.tests['a@test'].pid == [5] + + def test_valid(self, result): + with open(os.path.join(os.path.dirname(__file__), 'schema', + 'piglit-9.json'), + 'r') as f: + schema = json.load(f) + jsonschema.validate( + json.loads(json.dumps(result, default=backends.json.piglit_encoder)), + schema) |