Index: tools/telemetry/telemetry/unittest/gtest_output_formatter.py |
diff --git a/tools/telemetry/telemetry/unittest/gtest_output_formatter.py b/tools/telemetry/telemetry/unittest/gtest_output_formatter.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cdf1a52de90371324102229f5c0e859f9d3621eb |
--- /dev/null |
+++ b/tools/telemetry/telemetry/unittest/gtest_output_formatter.py |
@@ -0,0 +1,87 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import logging |
+import time |
+import unittest |
+ |
+from telemetry.unittest import output_formatter |
+from telemetry.util import exception_formatter |
+ |
+ |
+def _FormatTestName(test): |
+ chunks = test.id().split('.')[2:] |
+ return '.'.join(chunks) |
+ |
+ |
+class GTestOutputFormatter(output_formatter.OutputFormatter): |
+ def __init__(self, output_stream): |
+ super(GTestOutputFormatter, self).__init__(output_stream) |
+ self._suite_start_time = None |
+ self._test_start_time = None |
+ |
+ def _Print(self, *args): |
+ print >> self._output_stream, ' '.join(map(str, args)) |
+ self._output_stream.flush() |
+ |
+ def _TestTimeMs(self): |
+ return (time.time() - self._test_start_time) * 1000 |
+ |
+ def StartTest(self, test): |
+ self._Print('[ RUN ]', _FormatTestName(test)) |
+ self._test_start_time = time.time() |
+ |
+ def StartTestSuite(self, suite): |
+ contains_test_suites = any(isinstance(test, unittest.TestSuite) |
+ for test in suite) |
+ if not contains_test_suites: |
+ test_count = len([test for test in suite]) |
+ unit = 'test' if test_count == 1 else 'tests' |
+ self._Print('[----------]', test_count, unit) |
+ self._suite_start_time = time.time() |
+ |
+ def StopTestSuite(self, suite): |
+ contains_test_suites = any(isinstance(test, unittest.TestSuite) |
+ for test in suite) |
+ if not contains_test_suites: |
+ test_count = len([test for test in suite]) |
+ unit = 'test' if test_count == 1 else 'tests' |
+ elapsed_ms = (time.time() - self._suite_start_time) * 1000 |
+ self._Print('[----------]', test_count, unit, |
+ '(%d ms total)' % elapsed_ms) |
+ self._Print() |
+ |
+ def StopTestRun(self, result): |
+ unit = 'test' if len(result.successes) == 1 else 'tests' |
+ self._Print('[ PASSED ]', len(result.successes), '%s.' % unit) |
+ if result.errors or result.failures: |
+ all_errors = result.errors[:] |
+ all_errors.extend(result.failures) |
+ unit = 'test' if len(all_errors) == 1 else 'tests' |
+ self._Print('[ FAILED ]', len(all_errors), '%s, listed below:' % unit) |
+ for test, _ in all_errors: |
+ self._Print('[ FAILED ] ', _FormatTestName(test)) |
+ if not result.wasSuccessful(): |
+ self._Print() |
+ count = len(result.errors) + len(result.failures) |
+ unit = 'TEST' if count == 1 else 'TESTS' |
+ self._Print(count, 'FAILED', unit) |
+ self._Print() |
+ |
+ def Error(self, test, err): |
+ self.Failure(test, err) |
+ |
+ def Failure(self, test, err): |
+ exception_formatter.PrintFormattedException(*err) |
+ test_name = _FormatTestName(test) |
+ self._Print('[ FAILED ]', test_name, '(%0.f ms)' % self._TestTimeMs()) |
+ |
+ def Success(self, test): |
+ test_name = _FormatTestName(test) |
+ self._Print('[ OK ]', test_name, '(%0.f ms)' % self._TestTimeMs()) |
+ |
+ def Skip(self, test, reason): |
+ test_name = _FormatTestName(test) |
+ logging.warning('===== SKIPPING TEST %s: %s =====', test_name, reason) |
+ self.Success(test) |