Index: tools/telemetry/telemetry/unittest/output_formatter.py |
diff --git a/tools/telemetry/telemetry/unittest/output_formatter.py b/tools/telemetry/telemetry/unittest/output_formatter.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c69faa343bb44ce7636a902fb8fc9cfe5f9f2c0d |
--- /dev/null |
+++ b/tools/telemetry/telemetry/unittest/output_formatter.py |
@@ -0,0 +1,130 @@ |
+# 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 unittest |
+ |
+from telemetry.core import util |
+from telemetry.unittest import options_for_unittests |
+ |
+ |
+class OutputFormatter(object): |
+ def __init__(self, output_stream): |
+ self._output_stream = output_stream |
+ |
+ def StartTest(self, test): |
+ pass |
+ |
+ def StartTestSuite(self, suite): |
+ pass |
+ |
+ def StartTestRun(self): |
+ pass |
+ |
+ def StopTest(self, test): |
+ pass |
+ |
+ def StopTestSuite(self, suite): |
+ pass |
+ |
+ def StopTestRun(self, result): |
+ pass |
+ |
+ def Error(self, test, err): |
+ pass |
+ |
+ def Failure(self, test, err): |
+ pass |
+ |
+ def Success(self, test): |
+ pass |
+ |
+ def Skip(self, test, reason): |
+ pass |
+ |
+ |
+class TestSuite(unittest.TestSuite): |
+ """TestSuite that can delegate start and stop calls to a TestResult object.""" |
+ def run(self, result): # pylint: disable=W0221 |
+ if hasattr(result, 'startTestSuite'): |
+ result.startTestSuite(self) |
+ result = super(TestSuite, self).run(result) |
+ if hasattr(result, 'stopTestSuite'): |
+ result.stopTestSuite(self) |
+ return result |
+ |
+ |
+class TestRunner(object): |
+ def run(self, test, output_formatters, repeat_count, args): |
+ util.AddDirToPythonPath(util.GetUnittestDataDir()) |
+ result = TestResult(output_formatters) |
+ result.startTestRun() |
+ try: |
+ options_for_unittests.Push(args) |
+ for _ in xrange(repeat_count): |
+ test(result) |
+ finally: |
+ options_for_unittests.Pop() |
+ result.stopTestRun() |
+ |
+ return result |
+ |
+ |
+class TestResult(unittest.TestResult): |
+ def __init__(self, output_formatters): |
+ super(TestResult, self).__init__() |
+ self.successes = [] |
+ self._output_formatters = output_formatters |
+ |
+ @property |
+ def failures_and_errors(self): |
+ return self.failures + self.errors |
+ |
+ def startTest(self, test): |
+ super(TestResult, self).startTest(test) |
+ for output_formatter in self._output_formatters: |
+ output_formatter.StartTest(test) |
+ |
+ def startTestSuite(self, suite): |
+ for output_formatter in self._output_formatters: |
+ output_formatter.StartTestSuite(suite) |
+ |
+ def startTestRun(self): |
+ super(TestResult, self).startTestRun() |
+ for output_formatter in self._output_formatters: |
+ output_formatter.StartTestRun() |
+ |
+ def stopTest(self, test): |
+ super(TestResult, self).stopTest(test) |
+ for output_formatter in self._output_formatters: |
+ output_formatter.StopTest(test) |
+ |
+ def stopTestSuite(self, suite): |
+ for output_formatter in self._output_formatters: |
+ output_formatter.StopTestSuite(suite) |
+ |
+ def stopTestRun(self): |
+ super(TestResult, self).stopTestRun() |
+ for output_formatter in self._output_formatters: |
+ output_formatter.StopTestRun(self) |
+ |
+ def addError(self, test, err): |
+ super(TestResult, self).addError(test, err) |
+ for output_formatter in self._output_formatters: |
+ output_formatter.Error(test, err) |
+ |
+ def addFailure(self, test, err): |
+ super(TestResult, self).addFailure(test, err) |
+ for output_formatter in self._output_formatters: |
+ output_formatter.Failure(test, err) |
+ |
+ def addSuccess(self, test): |
+ super(TestResult, self).addSuccess(test) |
+ self.successes.append(test) |
+ for output_formatter in self._output_formatters: |
+ output_formatter.Success(test) |
+ |
+ def addSkip(self, test, reason): |
+ super(TestResult, self).addSkip(test, reason) |
+ for output_formatter in self._output_formatters: |
+ output_formatter.Skip(test, reason) |