1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport logging
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport time
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport unittest
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.unittest import progress_reporter
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.util import exception_formatter
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdef _FormatTestName(test):
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chunks = test.id().split('.')[2:]
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return '.'.join(chunks)
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class GTestProgressReporter(progress_reporter.ProgressReporter):
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def __init__(self, output_stream):
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    super(GTestProgressReporter, self).__init__(output_stream)
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._suite_start_time = None
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._test_start_time = None
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def _Print(self, *args):
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    print >> self._output_stream, ' '.join(map(str, args))
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._output_stream.flush()
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def _TestTimeMs(self):
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return (time.time() - self._test_start_time) * 1000
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def StartTest(self, test):
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._Print('[ RUN      ]', _FormatTestName(test))
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._test_start_time = time.time()
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def StartTestSuite(self, suite):
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    contains_test_suites = any(isinstance(test, unittest.TestSuite)
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               for test in suite)
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if not contains_test_suites:
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      test_count = len([test for test in suite])
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      unit = 'test' if test_count == 1 else 'tests'
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._Print('[----------]', test_count, unit)
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._suite_start_time = time.time()
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def StopTestSuite(self, suite):
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    contains_test_suites = any(isinstance(test, unittest.TestSuite)
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               for test in suite)
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if not contains_test_suites:
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      test_count = len([test for test in suite])
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      unit = 'test' if test_count == 1 else 'tests'
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      elapsed_ms = (time.time() - self._suite_start_time) * 1000
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._Print('[----------]', test_count, unit,
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  '(%d ms total)' % elapsed_ms)
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._Print()
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def StopTestRun(self, result):
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    unit = 'test' if len(result.successes) == 1 else 'tests'
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._Print('[  PASSED  ]', len(result.successes), '%s.' % unit)
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if result.errors or result.failures:
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      all_errors = result.errors[:]
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      all_errors.extend(result.failures)
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      unit = 'test' if len(all_errors) == 1 else 'tests'
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._Print('[  FAILED  ]', len(all_errors), '%s, listed below:' % unit)
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      for test, _ in all_errors:
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self._Print('[  FAILED  ] ', _FormatTestName(test))
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if not result.wasSuccessful():
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._Print()
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      count = len(result.errors) + len(result.failures)
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      unit = 'TEST' if count == 1 else 'TESTS'
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self._Print(count, 'FAILED', unit)
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._Print()
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def Error(self, test, err):
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.Failure(test, err)
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def Failure(self, test, err):
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    exception_formatter.PrintFormattedException(*err)
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    test_name = _FormatTestName(test)
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._Print('[  FAILED  ]', test_name, '(%0.f ms)' % self._TestTimeMs())
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def Success(self, test):
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    test_name = _FormatTestName(test)
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._Print('[       OK ]', test_name, '(%0.f ms)' % self._TestTimeMs())
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def Skip(self, test, reason):
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    test_name = _FormatTestName(test)
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    logging.warning('===== SKIPPING TEST %s: %s =====', test_name, reason)
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.Success(test)
88