97 lines
3.5 KiB
Python
97 lines
3.5 KiB
Python
#!/usr/bin/python
|
|
from gi.repository import GObject
|
|
from gi.repository import Gtk
|
|
import html
|
|
import pathlib
|
|
import tarfile
|
|
import xml.etree.ElementTree
|
|
|
|
class PassingTest:
|
|
def __init__(self, elm):
|
|
self.time = elm.attrib["time"]
|
|
|
|
def timestr(self):
|
|
(m, s) = divmod(int(self.time), 60)
|
|
res = [ f"{s} second{'' if s == 1 else 's'}" ]
|
|
if m > 0: res.insert(0, f"{m} minute{'' if m == 1 else 's'}")
|
|
return ' and '.join(res)
|
|
|
|
|
|
class SkippedTest:
|
|
def __init__(self, elm, test_dev, test_dir, scratch_dev, scratch_mnt):
|
|
self.time = elm.attrib["time"]
|
|
self.message = elm[0].attrib["message"]
|
|
self.message = self.message.replace(test_dev, "$TEST_DEV")
|
|
self.message = self.message.replace(test_dir, "$TEST_DIR")
|
|
self.message = self.message.replace(scratch_dev, "$SCRATCH_DEV")
|
|
self.message = self.message.replace(scratch_mnt, "$SCRATCH_MNT")
|
|
|
|
|
|
class FailedTest:
|
|
def __init__(self, elm):
|
|
self.time = elm.attrib["time"]
|
|
self.system_out = Gtk.TextBuffer()
|
|
self.system_err = Gtk.TextBuffer()
|
|
for e in elm:
|
|
match e.tag:
|
|
case "failure": self.message = e.attrib["message"]
|
|
case "system-out": self.system_out.set_text(html.unescape(e.text))
|
|
case "system-err": self.system_err.set_text(html.unescape(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] = value
|
|
|
|
|
|
class TestResults:
|
|
def __init__(self, testtar):
|
|
self.versions = [ ]
|
|
self.tests = dict()
|
|
self.properties = dict()
|
|
self.skipped = set()
|
|
|
|
with tarfile.open(testtar, "r:*") as tf:
|
|
for member in [ m for m in tf.getmembers() if m.isfile() ]:
|
|
self.read_file(member.name, tf.extractfile(member))
|
|
self.versions.sort()
|
|
|
|
def read_file(self, name, file):
|
|
root = xml.etree.ElementTree.parse(file).getroot()
|
|
self.versions.append(pathlib.Path(name).stem)
|
|
passed = 0
|
|
|
|
for prop in root.attrib.keys():
|
|
self.set_property(prop, root.attrib[prop])
|
|
|
|
for elm in root:
|
|
if elm.tag == "properties":
|
|
for prop in elm:
|
|
self.set_property(prop.attrib["name"], prop.attrib["value"])
|
|
elif elm.tag == "testcase":
|
|
if len(elm) == 0:
|
|
result = PassingTest(elm)
|
|
passed += 1
|
|
elif elm[0].tag == "skipped":
|
|
result = SkippedTest(elm,
|
|
self.properties[self.versions[-1]]["TEST_DEV"],
|
|
self.properties[self.versions[-1]]["TEST_DIR"],
|
|
self.properties[self.versions[-1]]["SCRATCH_DEV"],
|
|
self.properties[self.versions[-1]]["SCRATCH_MNT"])
|
|
self.skipped.add(result.message)
|
|
elif elm[0].tag == "failure":
|
|
result = FailedTest(elm)
|
|
self.add_testcase(elm.attrib["name"], result)
|
|
self.set_property("passed", str(passed))
|
|
|
|
def set_property(self, name, value):
|
|
self.properties.setdefault(self.versions[-1], dict())[name.upper()] = value
|
|
|
|
def add_testcase(self, name, result):
|
|
self.tests.setdefault(name, TestCase(name))[self.versions[-1]] = result
|