PYTHON-2124 Assert no gc.garbage at test suite teardown and enable debug output

This commit is contained in:
Shane Harvey 2020-02-12 13:26:59 -08:00
parent a06a0e7aa6
commit 6ee80cecfa
5 changed files with 48 additions and 13 deletions

View File

@ -122,9 +122,9 @@ class test(Command):
suite = unittest.defaultTestLoader.loadTestsFromName(
self.test_suite)
if self.xunit_output:
from xmlrunner import XMLTestRunner
runner = XMLTestRunner(verbosity=2, failfast=self.failfast,
output=self.xunit_output)
from test import PymongoXMLTestRunner
runner = PymongoXMLTestRunner(verbosity=2, failfast=self.failfast,
output=self.xunit_output)
else:
runner = PymongoTestRunner(verbosity=2, failfast=self.failfast)
result = runner.run(suite)

View File

@ -15,6 +15,7 @@
"""Test suite for pymongo, bson, and gridfs.
"""
import gc
import os
import socket
import sys
@ -23,6 +24,12 @@ import time
import unittest
import warnings
try:
from xmlrunner import XMLTestRunner
HAVE_XML = True
except ImportError:
HAVE_XML = False
try:
import ipaddress
HAVE_IPADDRESS = True
@ -53,6 +60,13 @@ try:
except ImportError:
pass
# Enable debug output for uncollectable objects. PyPy does not have set_debug.
if hasattr(gc, 'set_debug'):
gc.set_debug(
gc.DEBUG_UNCOLLECTABLE |
getattr(gc, 'DEBUG_OBJECTS', 0) |
getattr(gc, 'DEBUG_INSTANCES', 0))
# The host and port of a single mongod or mongos, or the seed host
# for a replica set.
host = os.environ.get("DB_IP", 'localhost')
@ -779,22 +793,38 @@ def setup():
def teardown():
garbage = []
for g in gc.garbage:
garbage.append('GARBAGE: %r' % (g,))
garbage.append(' gc.get_referents: %r' % (gc.get_referents(g),))
garbage.append(' gc.get_referrers: %r' % (gc.get_referrers(g),))
if garbage:
assert False, '\n'.join(garbage)
c = client_context.client
c.drop_database("pymongo-pooling-tests")
c.drop_database("pymongo_test")
c.drop_database("pymongo_test1")
c.drop_database("pymongo_test2")
c.drop_database("pymongo_test_mike")
c.drop_database("pymongo_test_bernie")
if c:
c.drop_database("pymongo-pooling-tests")
c.drop_database("pymongo_test")
c.drop_database("pymongo_test1")
c.drop_database("pymongo_test2")
c.drop_database("pymongo_test_mike")
c.drop_database("pymongo_test_bernie")
c.close()
class PymongoTestRunner(unittest.TextTestRunner):
def run(self, test):
setup()
result = super(PymongoTestRunner, self).run(test)
try:
teardown()
return result
if HAVE_XML:
class PymongoXMLTestRunner(XMLTestRunner):
def run(self, test):
setup()
result = super(PymongoXMLTestRunner, self).run(test)
teardown()
finally:
return result

View File

@ -575,12 +575,13 @@ class ProseSpecTestsMixin(object):
change_stream._cursor.close()
raise OperationFailure('Mock server error', code=code)
original_try_next = change_stream._cursor._try_next
original_cursor = change_stream._cursor
change_stream._cursor._try_next = mock_try_next
try:
yield
finally:
change_stream._cursor._try_next = original_try_next
# Un patch the instance.
del original_cursor._try_next
for code in TEST_ERROR_CODES:
with self.change_stream() as change_stream:

View File

@ -1514,6 +1514,8 @@ class TestClient(IntegrationTest):
return original_connect(*args, **kwargs)
pool.connect = stall_connect
# Un-patch Pool.connect to break the cyclic reference.
self.addCleanup(delattr, pool, 'connect')
# Wait for the background thread to start creating connections
wait_until(lambda: len(pool.sockets) > 1, 'start creating connections')

View File

@ -376,6 +376,8 @@ class TestCMAP(IntegrationTest):
sock_info.check_auth = functools.partial(mock_check_auth, sock_info)
return sock_info
pool.connect = mock_connect
# Un-patch Pool.connect to break the cyclic reference.
self.addCleanup(delattr, pool, 'connect')
# Attempt to create a new connection.
with self.assertRaisesRegex(ConnectionFailure, 'auth failed'):