diff --git a/report-xfstests.py b/report-xfstests.py index 04c7fcc..da41666 100755 --- a/report-xfstests.py +++ b/report-xfstests.py @@ -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)