progress_reporter.py revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import unittest 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import util 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom telemetry.unittest import options_for_unittests 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProgressReporter(object): 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, output_stream): 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._output_stream = output_stream 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def StartTest(self, test): 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def StartTestSuite(self, suite): 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def StartTestRun(self): 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def StopTest(self, test): 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def StopTestSuite(self, suite): 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def StopTestRun(self, result): 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33 def Error(self, test, err): 34 pass 35 36 def Failure(self, test, err): 37 pass 38 39 def Success(self, test): 40 pass 41 42 def Skip(self, test, reason): 43 pass 44 45 46class TestSuite(unittest.TestSuite): 47 """TestSuite that can delegate start and stop calls to a TestResult object.""" 48 def run(self, result): # pylint: disable=W0221 49 if hasattr(result, 'startTestSuite'): 50 result.startTestSuite(self) 51 result = super(TestSuite, self).run(result) 52 if hasattr(result, 'stopTestSuite'): 53 result.stopTestSuite(self) 54 return result 55 56 57class TestRunner(object): 58 def run(self, test, progress_reporters, repeat_count, args): 59 util.AddDirToPythonPath(util.GetUnittestDataDir()) 60 result = TestResult(progress_reporters) 61 result.startTestRun() 62 try: 63 options_for_unittests.Push(args) 64 for _ in xrange(repeat_count): 65 test(result) 66 finally: 67 options_for_unittests.Pop() 68 result.stopTestRun() 69 70 return result 71 72 73class TestResult(unittest.TestResult): 74 def __init__(self, progress_reporters): 75 super(TestResult, self).__init__() 76 self.successes = [] 77 self._progress_reporters = progress_reporters 78 79 @property 80 def failures_and_errors(self): 81 return self.failures + self.errors 82 83 def startTest(self, test): 84 super(TestResult, self).startTest(test) 85 for progress_reporter in self._progress_reporters: 86 progress_reporter.StartTest(test) 87 88 def startTestSuite(self, suite): 89 for progress_reporter in self._progress_reporters: 90 progress_reporter.StartTestSuite(suite) 91 92 def startTestRun(self): 93 super(TestResult, self).startTestRun() 94 for progress_reporter in self._progress_reporters: 95 progress_reporter.StartTestRun() 96 97 def stopTest(self, test): 98 super(TestResult, self).stopTest(test) 99 for progress_reporter in self._progress_reporters: 100 progress_reporter.StopTest(test) 101 102 def stopTestSuite(self, suite): 103 for progress_reporter in self._progress_reporters: 104 progress_reporter.StopTestSuite(suite) 105 106 def stopTestRun(self): 107 super(TestResult, self).stopTestRun() 108 for progress_reporter in self._progress_reporters: 109 progress_reporter.StopTestRun(self) 110 111 def addError(self, test, err): 112 super(TestResult, self).addError(test, err) 113 for progress_reporter in self._progress_reporters: 114 progress_reporter.Error(test, err) 115 116 def addFailure(self, test, err): 117 super(TestResult, self).addFailure(test, err) 118 for progress_reporter in self._progress_reporters: 119 progress_reporter.Failure(test, err) 120 121 def addSuccess(self, test): 122 super(TestResult, self).addSuccess(test) 123 self.successes.append(test) 124 for progress_reporter in self._progress_reporters: 125 progress_reporter.Success(test) 126 127 def addSkip(self, test, reason): 128 super(TestResult, self).addSkip(test, reason) 129 for progress_reporter in self._progress_reporters: 130 progress_reporter.Skip(test, reason) 131