Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Unified Diff: client/site_tests/factory_Review/factory_Review.py

Issue 3291011: Display summary and failed tests results (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/autotest.git
Patch Set: Dynamic widget size Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: client/site_tests/factory_Review/factory_Review.py
diff --git a/client/site_tests/factory_Review/factory_Review.py b/client/site_tests/factory_Review/factory_Review.py
index 13704856f97b669e2a5322f79395be30ac7c80c5..29f10480e6ca7c183e8c6aae000c50728f541fb4 100644
--- a/client/site_tests/factory_Review/factory_Review.py
+++ b/client/site_tests/factory_Review/factory_Review.py
@@ -18,58 +18,132 @@ import pango
import sys
from gtk import gdk
+from itertools import count, izip, product
from autotest_lib.client.bin import factory
from autotest_lib.client.bin import factory_ui_lib as ful
from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
+from factory import AutomatedSequence
+
+N_ROW = 15
+LABEL_EN_SIZE = (170, 35)
+LABEL_EN_SIZE_2 = (450, 25)
+LABEL_EN_FONT = pango.FontDescription('courier new extra-condensed 16')
+TAB_BORDER = 20
+
+def trim(text, length):
+ if len(text) > length:
+ text = text[:length-3] + '...'
+ return text
class factory_Review(test.test):
version = 1
- def run_once(self,
- status_file_path=None,
- test_list=None):
+ def make_summary_tab(self, status_map, tests):
+ n_test = len(tests)
+ N_COL = n_test / N_ROW + (n_test % N_ROW != 0)
+
+ info_box = gtk.HBox()
+ info_box.set_spacing(20)
+ for status in (ful.ACTIVE, ful.PASSED, ful.FAILED, ful.UNTESTED):
+ label = ful.make_label(status,
+ size=LABEL_EN_SIZE,
+ font=LABEL_EN_FONT,
+ alignment=(0.5, 0.5),
+ fg=ful.LABEL_COLORS[status])
+ info_box.pack_start(label, False, False)
+
+ status_table = gtk.Table(N_ROW, N_COL, True)
+ for (j, i), (t, p) in izip(product(xrange(N_COL), xrange(N_ROW)),
+ tests):
+ msg_en = t.label_en
+ if p is not None:
+ msg_en = ' ' + msg_en
+ msg_en = trim(msg_en, 12)
+ if t.label_zw:
+ msg = '{0:<12} ({1})'.format(msg_en, t.label_zw)
+ else:
+ msg = msg_en
+ status = status_map.lookup_status(t)
+ status_label = ful.make_label(msg,
+ size=LABEL_EN_SIZE_2,
+ font=LABEL_EN_FONT,
+ alignment=(0.0, 0.5),
+ fg=ful.LABEL_COLORS[status])
+ status_table.attach(status_label, j, j+1, i, i+1)
+
+ vbox = gtk.VBox()
+ vbox.set_spacing(20)
+ vbox.pack_start(info_box, False, False)
+ vbox.pack_start(status_table, False, False)
+ return vbox
+
+ def make_error_tab(self, status_map, t):
+ msg = '%s (%s)\n%s' % (t.label_en, t.label_zw,
+ status_map.lookup_error_msg(t))
+ label = ful.make_label(msg,
+ font=LABEL_EN_FONT,
+ alignment=(0.0, 0.0))
+ label.set_line_wrap(True)
+ frame = gtk.Frame()
+ frame.add(label)
+ return frame
+
+ def key_release_callback(self, widget, event):
+ factory.log('key_release_callback %s(%s)' %
+ (event.keyval, gdk.keyval_name(event.keyval)))
+ if event.keyval == ord('k'):
+ self.notebook.prev_page()
+ elif event.keyval == ord('j'):
+ self.notebook.next_page()
+ return True
+
+ def register_callback(self, window):
+ window.connect('key-release-event', self.key_release_callback)
+ window.add_events(gdk.KEY_RELEASE_MASK)
+
+ def run_once(self, status_file_path=None, test_list=None):
factory.log('%s run_once' % self.__class__)
status_map = factory.StatusMap(test_list, status_file_path)
- untested = status_map.filter(ful.UNTESTED)
- passed = status_map.filter(ful.PASSED)
- failed = status_map.filter(ful.FAILED)
-
- top_label = ful.make_label('UNTESTED=%d\t' % len(untested) +
- 'PASSED=%d\t' % len(passed) +
- 'FAILED=%d' % len(failed))
-
- # decompose automated sequence tests
- failure_report_list =[]
- for t in failed:
- t_name = t.label_en
- if not isinstance(t, factory.AutomatedSequence):
- # Simple Test
- err_msg = status_map.lookup_error_msg(t)
- failure_report_list.append('%s: %s' % (t_name, err_msg))
- continue
- # Complex Test
- for subtest in t.subtest_list:
- if status_map.lookup_status(subtest) != ful.FAILED:
- continue
- err_msg = status_map.lookup_error_msg(subtest)
- failure_report_list.append(
- '%s: (%s) %s' % (t_name, subtest.label_en, err_msg))
- failure_report = ful.make_label('\n'.join(failure_report_list))
+ tests = sum(([(t, None)] +
+ list(product(getattr(t, 'subtest_list', []), [t]))
+ for t in test_list), [])
+
+ self.notebook = gtk.Notebook()
+ self.notebook.modify_bg(gtk.STATE_NORMAL, ful.BLACK)
+
+ tab = self.make_summary_tab(status_map, tests)
+ tab.set_border_width(TAB_BORDER)
+ self.notebook.append_page(tab, ful.make_label('Summary'))
+
+ ts = (t for t, _ in tests
+ if not isinstance(t, AutomatedSequence) and \
+ status_map.lookup_status(t) == ful.FAILED)
+ for i, t in izip(count(1), ts):
+ if not isinstance(t, AutomatedSequence) and \
+ status_map.lookup_status(t) == ful.FAILED:
+ tab = self.make_error_tab(status_map, t)
+ tab.set_border_width(TAB_BORDER)
+ self.notebook.append_page(tab, ful.make_label('#%02d' % i))
+
+ control_label = ful.make_label('Press j/k to change tabs',
+ font=LABEL_EN_FONT,
+ alignment=(0.5, 0.5))
vbox = gtk.VBox()
vbox.set_spacing(20)
- vbox.pack_start(top_label, False, False)
- vbox.pack_start(failure_report, False, False)
+ vbox.pack_start(control_label, False, False)
+ vbox.pack_start(self.notebook, False, False)
test_widget = gtk.EventBox()
test_widget.modify_bg(gtk.STATE_NORMAL, ful.BLACK)
test_widget.add(vbox)
- ful.run_test_widget(self.job, test_widget)
+ ful.run_test_widget(self.job, test_widget,
+ window_registration_callback=self.register_callback)
factory.log('%s run_once finished' % self.__class__)
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698