[tor-commits] [stem/master] Always test for lingering threads
atagar at torproject.org
atagar at torproject.org
Thu Jul 16 01:29:00 UTC 2020
commit f4b77a2c9194aa964aec0e633255e549186b7f2d
Author: Damian Johnson <atagar at torproject.org>
Date: Tue Jul 14 14:54:01 2020 -0700
Always test for lingering threads
Our unit tests are just as liable to orphan threads as our integration tests.
It's confusing to only detect unit test leaks when running them along side our
integration tests, so making this check independent of which test suite we run.
---
run_tests.py | 15 ++++++---------
stem/descriptor/remote.py | 3 +++
test/unit/util/synchronous.py | 4 ++++
3 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/run_tests.py b/run_tests.py
index fd46211f..c738f9b8 100755
--- a/run_tests.py
+++ b/run_tests.py
@@ -321,18 +321,15 @@ def main():
integ_runner.stop()
println()
- # We should have joined on all threads. If not then that indicates a
- # leak that could both likely be a bug and disrupt further targets.
+ # ensure that we join all our threads
- active_threads = threading.enumerate()
+ active_threads = threading.enumerate()
- if len(active_threads) > 1:
- println('Threads lingering after test run:', ERROR)
+ if len(active_threads) > 1:
+ println('Threads lingering after test run:', ERROR)
- for lingering_thread in active_threads:
- println(' %s' % lingering_thread, ERROR)
-
- break
+ for lingering_thread in active_threads:
+ println(' %s' % lingering_thread, ERROR)
static_check_issues = {}
diff --git a/stem/descriptor/remote.py b/stem/descriptor/remote.py
index ad6a02ab..942d81e9 100644
--- a/stem/descriptor/remote.py
+++ b/stem/descriptor/remote.py
@@ -369,6 +369,7 @@ class Query(Synchronous):
super(Query, self).__init__()
if not resource.startswith('/'):
+ self.stop()
raise ValueError("Resources should start with a '/': %s" % resource)
if resource.endswith('.z'):
@@ -379,6 +380,7 @@ class Query(Synchronous):
elif isinstance(compression, stem.descriptor._Compression):
compression = [compression] # caller provided only a single option
else:
+ self.stop()
raise ValueError('Compression should be a list of stem.descriptor.Compression, was %s (%s)' % (compression, type(compression).__name__))
if Compression.ZSTD in compression and not Compression.ZSTD.available:
@@ -402,6 +404,7 @@ class Query(Synchronous):
if isinstance(endpoint, (stem.ORPort, stem.DirPort)):
self.endpoints.append(endpoint)
else:
+ self.stop()
raise ValueError("Endpoints must be an stem.ORPort or stem.DirPort. '%s' is a %s." % (endpoint, type(endpoint).__name__))
self.resource = resource
diff --git a/test/unit/util/synchronous.py b/test/unit/util/synchronous.py
index d99da922..602d81f4 100644
--- a/test/unit/util/synchronous.py
+++ b/test/unit/util/synchronous.py
@@ -189,6 +189,8 @@ class TestSynchronous(unittest.TestCase):
self.assertTrue(instance.called_enter)
self.assertTrue(instance.called_exit)
+ instance.stop()
+
async def async_test():
instance = Demo()
@@ -202,6 +204,8 @@ class TestSynchronous(unittest.TestCase):
self.assertTrue(instance.called_enter)
self.assertTrue(instance.called_exit)
+ instance.stop()
+
sync_test()
asyncio.run(async_test())
More information about the tor-commits
mailing list