Compare commits

...

3 Commits

Author SHA1 Message Date
Anna Schumaker 2ef3eea690 report-xfstests: Preserve the current property page when switching runs
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
2022-02-09 11:58:06 -05:00
Anna Schumaker e5a8e46cd9 report-xfstests.py: Count the number of passing tests
Rather than relying on the `tests` field, which may be inaccurate for
some reason.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
2022-02-08 13:41:07 -05:00
Anna Schumaker 31166081bf report-xfstests.py: Show why tests were skipped
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
2022-02-08 13:33:27 -05:00
4 changed files with 80 additions and 13 deletions

View File

@ -39,9 +39,9 @@ class TestViewer(Gtk.Box):
SizeGroup.add_widget(self.switcher)
def set_test_result(self, file):
self.stack.clear()
current = self.stack.clear()
self.viewer.clear()
if file and file.get_is_test_result():
results = testresults.TestResults(file.path)
self.stack.show_properties(results)
self.stack.show_properties(results, current)
self.viewer.show_results(results)

View File

@ -14,13 +14,22 @@ class Property(GObject.GObject):
self.value = value
class NotRun(GObject.GObject):
def __init__(self, message):
GObject.GObject.__init__(self)
self.message = message
def __lt__(self, rhs):
return self.message < rhs.message
class Results(Property):
def __init__(self, properties):
total = properties["TESTS"]
time = properties["TIME"]
passed = properties["PASSED"]
failed = properties["FAILURES"]
skipped = properties["SKIPPED"]
passed = int(total) - (int(skipped) + int(failed))
total = int(passed) + int(failed) + int(skipped)
Property.__init__(self, "RESULTS",
f"Ran {total} tests in {time} seconds: " \
f"{passed} passed, {failed} failed, {skipped} skipped")
@ -37,6 +46,17 @@ class Model(GObject.GObject, Gio.ListModel):
def do_get_item(self, i): return self.properties[i]
class NotRunModel(GObject.GObject, Gio.ListModel):
def __init__(self, notrun):
GObject.GObject.__init__(self)
self.notrun = [ NotRun(m) for m in notrun ]
self.notrun.sort()
def do_get_item_type(self): return GObject.TYPE_PYOBJECT
def do_get_n_items(self): return len(self.notrun)
def do_get_item(self, i): return self.notrun[i]
class Factory(Gtk.SignalListItemFactory):
def __init__(self, column):
Gtk.SignalListItemFactory.__init__(self)
@ -63,6 +83,27 @@ class Factory(Gtk.SignalListItemFactory):
listitem.set_child(None)
class NotRunFactory(Gtk.SignalListItemFactory):
def __init__(self):
Gtk.SignalListItemFactory.__init__(self)
self.connect("setup", self.on_setup)
self.connect("bind", self.on_bind)
self.connect("unbind", self.on_unbind)
self.connect("teardown", self.on_teardown)
def on_setup(self, factory, listitem):
listitem.set_child(Gtk.Label(xalign=0))
def on_bind(self, factory, listitem):
listitem.get_child().set_text(listitem.get_item().message)
def on_unbind(self, factory, listitem):
listitem.get_child().set_text("")
def on_teardown(self, factory, listitem):
listitem.set_child(None)
class View(Gtk.ColumnView):
def __init__(self, properties):
self.selection = Gtk.NoSelection.new(Model(properties))
@ -72,19 +113,35 @@ class View(Gtk.ColumnView):
self.append_column(Gtk.ColumnViewColumn.new(title, Factory(title)))
class NotRunView(Gtk.ListView):
def __init__(self, notrun):
self.selection = Gtk.NoSelection.new(NotRunModel(notrun))
Gtk.ListView.__init__(self, model=self.selection, factory=NotRunFactory())
self.add_css_class("data-table")
class Stack(Gtk.Stack):
def __init__(self):
Gtk.Stack.__init__(self, transition_type=Gtk.StackTransitionType.OVER_LEFT_RIGHT)
Gtk.Stack.__init__(self)
common.SizeGroup.add_widget(self)
def clear(self):
current = self.get_visible_child_name()
pages = self.get_pages()
children = [ pages.get_item(i).get_child() for i in range(pages.get_n_items()) ]
for child in children:
self.remove(child)
return current
def show_properties(self, results):
def show_properties(self, results, current):
self.set_transition_type(Gtk.StackTransitionType.NONE)
for version in results.versions:
window = Gtk.ScrolledWindow(vscrollbar_policy=Gtk.PolicyType.NEVER,
child=View(results.properties[version]))
self.add_titled(window, version, version)
self.add_page(View(results.properties[version]), version, Gtk.PolicyType.NEVER, current)
self.add_page(NotRunView(results.skipped), "[not run]", Gtk.PolicyType.AUTOMATIC, current)
self.set_transition_type(Gtk.StackTransitionType.OVER_LEFT_RIGHT)
def add_page(self, child, name, policy, current):
window = Gtk.ScrolledWindow(vscrollbar_policy=policy, child=child)
self.add_titled(window, name, name)
if current == name:
self.set_visible_child(window)

View File

@ -48,9 +48,11 @@ class TestResults:
self.versions = [ ]
self.tests = dict()
self.properties = dict()
self.skipped = set()
for file in sorted(testdir.iterdir()):
self.versions.append(file.stem)
passed = 0
root = xml.etree.ElementTree.parse(file).getroot()
for prop in root.attrib.keys():
@ -64,11 +66,14 @@ class TestResults:
elif elm.tag == "testcase":
if len(elm) == 0:
result = PassingTest(elm)
passed += 1
elif elm[0].tag == "skipped":
result = SkippedTest(elm)
self.skipped.add(result.message)
elif elm[0].tag == "failure":
result = FailedTest(elm)
self.add_testcase(elm.attrib["name"], file.stem, result)
self.set_property("passed", file.stem, str(passed))
def set_property(self, name, vers, value):
self.properties.setdefault(vers, dict())[name.upper()] = value

View File

@ -120,11 +120,16 @@ class Filter(Gtk.Filter):
def do_match(self, testcase):
search = [ f"name={testcase.name}" ]
for key in sorted(testcase.versions.keys()):
keys = [ key ] + key.split("-")
keys = [ "status", key ] + key.split("-")
match type(testcase[key]):
case testresults.PassingTest: res = [ "passing", "passed" ]
case testresults.SkippedTest: res = [ "skipped" ]
case testresults.FailedTest: res = [ "failed", "failing" ]
case testresults.PassingTest:
res = [ "passing", "passed" ]
case testresults.SkippedTest:
res = [ "skipped" ]
search.append(f"message={testcase[key].message}")
case testresults.FailedTest:
res = [ "failed", "failing" ]
search.append(f"message={testcase[key].message}")
case _: res = [ "missing" ]
for k in keys:
for r in res: