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