From b47955fe5a00bfca8d367635ab3649dadd2b7df8 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Tue, 1 Feb 2022 15:59:50 -0500 Subject: [PATCH] report-xfstests.py: Create an object that reads xfstests results Splitting this out of the UI code should help clean things up. Signed-off-by: Anna Schumaker --- report-xfstests.py | 2 ++ reporter/__init__.py | 1 + reporter/testresults.py | 67 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 reporter/testresults.py diff --git a/report-xfstests.py b/report-xfstests.py index 8615d06..c94183e 100755 --- a/report-xfstests.py +++ b/report-xfstests.py @@ -296,6 +296,8 @@ class Window(Gtk.Window): def test_changed(self, window, file): self.xfstests.set_tests(file.path if file else None) + if file and file.get_is_test_result(): + results = reporter.testresults.TestResults(file.path) def show_passing(self, passing, param): self.xfstests.set_show_passing(passing.get_active()) diff --git a/reporter/__init__.py b/reporter/__init__.py index 3c71025..ee7ef1d 100644 --- a/reporter/__init__.py +++ b/reporter/__init__.py @@ -1,6 +1,7 @@ #!/usr/bin/python from . import common from . import testchooser +from . import testresults from gi.repository import GObject from gi.repository import Gtk diff --git a/reporter/testresults.py b/reporter/testresults.py new file mode 100644 index 0000000..8a3eb43 --- /dev/null +++ b/reporter/testresults.py @@ -0,0 +1,67 @@ +#!/usr/bin/python +from gi.repository import GObject +import xml.etree.ElementTree + +class PassingTest: + def __init__(self, elm): + self.time = elm.attrib["time"] + + +class SkippedTest: + def __init__(self, elm): + self.time = elm.attrib["time"] + self.message = elm[0].attrib["message"] + + +class FailedTest: + def __init__(self, elm): + self.time = elm.attrib["time"] + for e in elm: + match e.tag: + case "failure": self.message = e.attrib["message"] + case "system-out": self.system_out = e.text + case "system-err": self.system_err = e.text + + +class TestCase(GObject.GObject): + def __init__(self, name): + GObject.GObject.__init__(self) + self.name = name + self.versions = dict() + + def __getitem__(self, key): return self.versions.get(key, None) + def __setitem__(self, key, value): self.versions[key] = None + + +class TestResults: + def __init__(self, testdir): + self.versions = [ ] + self.tests = dict() + self.properties = dict() + + for file in sorted(testdir.iterdir()): + self.versions.append(file.stem) + + root = xml.etree.ElementTree.parse(file).getroot() + for prop in root.attrib.keys(): + self.set_property(prop, file.stem, root.attrib[prop]) + + for elm in root: + if elm.tag == "properties": + for prop in elm: + self.set_property(prop.attrib["name"], file.stem, + prop.attrib["value"]) + elif elm.tag == "testcase": + if len(elm) == 0: + result = PassingTest(elm) + elif elm[0].tag == "skipped": + result = SkippedTest(elm) + elif elm[0].tag == "failure": + result = FailedTest(elm) + self.add_testcase(elm.attrib["name"], file.stem, result) + + def set_property(self, name, vers, value): + self.properties.setdefault(name.upper(), dict())[vers] = value + + def add_testcase(self, name, vers, result): + self.tests.setdefault(name, TestCase(name))[vers] = result