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:
parent
58b9083908
commit
e2c8b731d7
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue