report-xfstests.py: Show test properties

I put these in a notebook with tabs based on how the server is mounted
(tcp-3, rdma-4.2, ...) so we can see extra test options that xfstests is
running with

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Anna Schumaker 2022-01-28 16:29:21 -05:00
parent 58b9083908
commit e2c8b731d7
1 changed files with 71 additions and 4 deletions

View File

@ -112,6 +112,42 @@ class ServerWindow(Gtk.ScrolledWindow):
def test_changed(self, file): pass
class TestProperty():
def __init__(self, name):
self.name = name
self.prop = dict()
def __lt__(self, rhs):
return self.name.upper() < rhs.name.upper()
def __getitem__(self, key):
return self.prop[key]
def __setitem__(self, key, val):
self.prop[key] = val
class PropertyPage(Gtk.ScrolledWindow):
def __init__(self, name, results):
Gtk.ScrolledWindow.__init__(self, vscrollbar_policy=Gtk.PolicyType.NEVER)
self.set_child(Gtk.Grid())
res = { p.name : p[name] for p in results.properties }
passed = int(res['tests']) - (int(res['skipped']) + int(res['failures']))
res["RESULTS"] = f"Ran {res['tests']} tests in {res['time']} seconds: " \
f"{passed} passed, {res['failures']} failed, {res['skipped']} skipped"
fields = [ "PLATFORM", "timestamp", "FSTYP", "MOUNT_OPTIONS", "CHECK_OPTIONS",
"TEST_DIR", "TEST_DEV", "SCRATCH_DEV", "SCRATCH_MNT", "RESULTS" ]
for i, field in enumerate(fields):
key = Gtk.Label.new(field.upper() + " = ")
key.set_xalign(100)
val = Gtk.Label.new(res[field])
val.set_xalign(0)
self.get_child().get_child().attach(key, 0, i, 1, 1)
self.get_child().get_child().attach(val, 1, i, 1, 1)
class TestCase(GObject.GObject):
def __init__(self, name):
GObject.GObject.__init__(self)
@ -149,6 +185,7 @@ class TestCase(GObject.GObject):
class TestResultsModel(GObject.GObject, Gio.ListModel):
def __init__(self):
GObject.GObject.__init__(self)
self.properties = [ ]
self.tests = [ ]
self.columns = [ "Test Name" ]
@ -158,6 +195,13 @@ class TestResultsModel(GObject.GObject, Gio.ListModel):
def get_n_columns(self): return len(self.columns)
def get_column_name(self, n): return self.columns[n]
def find_property(self, name):
for prop in self.properties:
if prop.name == name:
return prop
self.properties.append(TestProperty(name))
return self.properties[-1]
def find_testcase(self, name):
i = bisect.bisect(self.tests, name, key=str)
if i > 0 and self.tests[i-1].name == name:
@ -168,14 +212,24 @@ class TestResultsModel(GObject.GObject, Gio.ListModel):
def set_tests(self, path):
rm = len(self.tests)
self.columns = [ "Test Name" ]
self.properties.clear()
self.tests.clear()
for file in sorted(path.iterdir()):
self.columns.append(file.stem)
tree = xml.etree.ElementTree.parse(file)
for elm in tree.getroot():
root = xml.etree.ElementTree.parse(file).getroot()
for prop in root.attrib.keys():
self.find_property(prop)[file.stem] = root.attrib[prop]
for elm in root:
if elm.tag == "testcase":
testcase = self.find_testcase(elm.attrib["name"])
testcase[file.stem] = elm
elif elm.tag == "properties":
for prop in elm:
name = prop.attrib["name"]
value = prop.attrib["value"]
self.find_property(name)[file.stem] = value
self.emit("items-changed", 0, rm, len(self.tests))
@ -267,6 +321,7 @@ class TestWindow(Gtk.ScrolledWindow):
self.filter = Gtk.FilterListModel.new(self.results, TestResultsFilter())
self.selection = Gtk.NoSelection.new(self.filter)
self.view = Gtk.ColumnView.new(self.selection)
self.notebook = Gtk.Notebook()
self.set_child(self.view)
if len(sys.argv) > 1:
self.set_tests(pathlib.Path(sys.argv[1]))
@ -283,10 +338,17 @@ class TestWindow(Gtk.ScrolledWindow):
def set_tests(self, path):
for column in [ c for c in self.view.get_columns() ]:
self.view.remove_column(column)
for n in range(self.notebook.get_n_pages()):
self.notebook.remove_page(0)
self.results.set_tests(path)
for n in range(self.results.get_n_columns()):
name = self.results.get_column_name(n)
self.view.append_column(Gtk.ColumnViewColumn.new(name, TestResultsFactory(name)))
col = Gtk.ColumnViewColumn.new(name, TestResultsFactory(name))
col.set_expand(n > 0)
self.view.append_column(col)
if n > 0:
self.notebook.append_page(PropertyPage(name, self.results),
Gtk.Label.new(name))
class Window(Gtk.Window):
@ -301,6 +363,7 @@ class Window(Gtk.Window):
self.search = Gtk.SearchEntry(placeholder_text="Type To Filter Tests")
self.popover = FilterPopover(parent=self.search)
self.xfstests = TestWindow()
self.sz_group = Gtk.SizeGroup.new(Gtk.SizeGroupMode.VERTICAL)
self.left = Gtk.Grid(row_spacing=5)
self.left.attach(self.calendar, 0, 0, 2, 1)
@ -311,6 +374,7 @@ class Window(Gtk.Window):
self.left.attach(self.lskip, 1, 3, 1, 1)
self.right = Gtk.Box.new(Gtk.Orientation.VERTICAL, 5)
self.right.append(self.xfstests.notebook)
self.right.append(self.search)
self.right.append(self.xfstests)
@ -318,9 +382,12 @@ class Window(Gtk.Window):
self.child.append(self.left)
self.child.append(self.right)
self.sz_group.add_widget(self.calendar)
self.sz_group.add_widget(self.xfstests.notebook)
self.lskip.set_xalign(0)
self.lpass.set_xalign(0)
self.set_default_size(1000, 600)
self.set_default_size(1100, 750)
self.set_child(self.child)
self.calendar.connect("day-selected", self.date_changed)