Chromium Code Reviews| Index: testing_support/thread_watcher.py |
| diff --git a/testing_support/thread_watcher.py b/testing_support/thread_watcher.py |
| index ca5180bad59f101c4da41700586ec3b6663d86b5..52007949c2a94d58e9f1f0d14efd3c77bddf0af9 100644 |
| --- a/testing_support/thread_watcher.py |
| +++ b/testing_support/thread_watcher.py |
| @@ -3,6 +3,7 @@ |
| # found in the LICENSE file. |
| +import logging |
| import sys |
| import threading |
| import traceback |
| @@ -14,6 +15,12 @@ class ThreadWatcherMixIn(object): |
| self._pre_test_threads = [t.ident for t in threading.enumerate()] |
| def tearDown(self): |
| + # If test failed before this check, don't raise another exception |
| + # overwriting the original one, and making it harder to debug. |
| + # Besides, that exception might be the reason cleanup didn't happen. |
| + if not self._test_likely_passed(): |
|
Michael Achenbach
2016/07/07 12:30:41
readability nit: Maybe negate the logic in the met
tandrii(chromium)
2016/07/07 12:56:39
Good idea! Done.
|
| + return |
| + |
| post_test_threads = threading.enumerate() |
| new_threads = [t for t in post_test_threads |
| if t.ident not in self._pre_test_threads] |
| @@ -31,8 +38,25 @@ class ThreadWatcherMixIn(object): |
| details = ''.join(details) |
| self.fail('Found %d running thread(s) after the test.\n%s' % ( |
| - len(new_threads), details)) |
| + len(new_threads), details)) |
| + |
| + def _test_likely_passed(self): |
|
Michael Achenbach
2016/07/07 12:30:41
I'm not so happy about the method name. Doesn't lo
tandrii(chromium)
2016/07/07 12:56:39
That's fair. I've renamed it.
|
| + """Conservatively returns True if current test has likely not failed yet. |
| + This is necessary to determine whether we should fail the test when finding |
| + stray threads. If the test has failed in some other way, we should avoid |
| + throwing an exception because it will mask the original error. |
| + """ |
| + # When run using unittest runner, |
| + # self._resultForDoCleanups is set to internal unittest object. |
| + if hasattr(self, '_resultForDoCleanups') and self._resultForDoCleanups: |
| + return self._resultForDoCleanups.wasSuccessful() |
| + # expect_tests runner does so differently (see |
| + # https://codereview.chromium.org/2121343004). |
| + if hasattr(self, '_test_failed_with_exception'): |
| + return not self._test_failed_with_exception |
| + # Default case - be conservative. |
| + return True |
| class TestCase(unittest.TestCase, ThreadWatcherMixIn): |