Skip to content

Commit 6ee80ce

Browse files
committed
PYTHON-2124 Assert no gc.garbage at test suite teardown and enable debug output
1 parent a06a0e7 commit 6ee80ce

File tree

5 files changed

+48
-13
lines changed

5 files changed

+48
-13
lines changed

setup.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@ def run(self):
122122
suite = unittest.defaultTestLoader.loadTestsFromName(
123123
self.test_suite)
124124
if self.xunit_output:
125-
from xmlrunner import XMLTestRunner
126-
runner = XMLTestRunner(verbosity=2, failfast=self.failfast,
127-
output=self.xunit_output)
125+
from test import PymongoXMLTestRunner
126+
runner = PymongoXMLTestRunner(verbosity=2, failfast=self.failfast,
127+
output=self.xunit_output)
128128
else:
129129
runner = PymongoTestRunner(verbosity=2, failfast=self.failfast)
130130
result = runner.run(suite)

test/__init__.py

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"""Test suite for pymongo, bson, and gridfs.
1616
"""
1717

18+
import gc
1819
import os
1920
import socket
2021
import sys
@@ -23,6 +24,12 @@
2324
import unittest
2425
import warnings
2526

27+
try:
28+
from xmlrunner import XMLTestRunner
29+
HAVE_XML = True
30+
except ImportError:
31+
HAVE_XML = False
32+
2633
try:
2734
import ipaddress
2835
HAVE_IPADDRESS = True
@@ -53,6 +60,13 @@
5360
except ImportError:
5461
pass
5562

63+
# Enable debug output for uncollectable objects. PyPy does not have set_debug.
64+
if hasattr(gc, 'set_debug'):
65+
gc.set_debug(
66+
gc.DEBUG_UNCOLLECTABLE |
67+
getattr(gc, 'DEBUG_OBJECTS', 0) |
68+
getattr(gc, 'DEBUG_INSTANCES', 0))
69+
5670
# The host and port of a single mongod or mongos, or the seed host
5771
# for a replica set.
5872
host = os.environ.get("DB_IP", 'localhost')
@@ -779,22 +793,38 @@ def setup():
779793

780794

781795
def teardown():
796+
garbage = []
797+
for g in gc.garbage:
798+
garbage.append('GARBAGE: %r' % (g,))
799+
garbage.append(' gc.get_referents: %r' % (gc.get_referents(g),))
800+
garbage.append(' gc.get_referrers: %r' % (gc.get_referrers(g),))
801+
if garbage:
802+
assert False, '\n'.join(garbage)
782803
c = client_context.client
783-
c.drop_database("pymongo-pooling-tests")
784-
c.drop_database("pymongo_test")
785-
c.drop_database("pymongo_test1")
786-
c.drop_database("pymongo_test2")
787-
c.drop_database("pymongo_test_mike")
788-
c.drop_database("pymongo_test_bernie")
804+
if c:
805+
c.drop_database("pymongo-pooling-tests")
806+
c.drop_database("pymongo_test")
807+
c.drop_database("pymongo_test1")
808+
c.drop_database("pymongo_test2")
809+
c.drop_database("pymongo_test_mike")
810+
c.drop_database("pymongo_test_bernie")
811+
c.close()
789812

790813

791814
class PymongoTestRunner(unittest.TextTestRunner):
792815
def run(self, test):
793816
setup()
794817
result = super(PymongoTestRunner, self).run(test)
795-
try:
818+
teardown()
819+
return result
820+
821+
822+
if HAVE_XML:
823+
class PymongoXMLTestRunner(XMLTestRunner):
824+
def run(self, test):
825+
setup()
826+
result = super(PymongoXMLTestRunner, self).run(test)
796827
teardown()
797-
finally:
798828
return result
799829

800830

test/test_change_stream.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,12 +575,13 @@ def mock_try_next(*args, **kwargs):
575575
change_stream._cursor.close()
576576
raise OperationFailure('Mock server error', code=code)
577577

578-
original_try_next = change_stream._cursor._try_next
578+
original_cursor = change_stream._cursor
579579
change_stream._cursor._try_next = mock_try_next
580580
try:
581581
yield
582582
finally:
583-
change_stream._cursor._try_next = original_try_next
583+
# Un patch the instance.
584+
del original_cursor._try_next
584585

585586
for code in TEST_ERROR_CODES:
586587
with self.change_stream() as change_stream:

test/test_client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,6 +1514,8 @@ def stall_connect(*args, **kwargs):
15141514
return original_connect(*args, **kwargs)
15151515

15161516
pool.connect = stall_connect
1517+
# Un-patch Pool.connect to break the cyclic reference.
1518+
self.addCleanup(delattr, pool, 'connect')
15171519

15181520
# Wait for the background thread to start creating connections
15191521
wait_until(lambda: len(pool.sockets) > 1, 'start creating connections')

test/test_cmap.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ def mock_connect(*args, **kwargs):
376376
sock_info.check_auth = functools.partial(mock_check_auth, sock_info)
377377
return sock_info
378378
pool.connect = mock_connect
379+
# Un-patch Pool.connect to break the cyclic reference.
380+
self.addCleanup(delattr, pool, 'connect')
379381

380382
# Attempt to create a new connection.
381383
with self.assertRaisesRegex(ConnectionFailure, 'auth failed'):

0 commit comments

Comments
 (0)