fix memory leak on SSL failure. Add leak checking in unit tests.

This commit is contained in:
Kenneth Giusti 2014-06-25 14:50:40 -04:00
parent 367bbe4b65
commit 5969fe83c8
5 changed files with 31 additions and 5 deletions
python/pyngus
tests/python/unit_tests

@ -172,13 +172,18 @@ class Connection(Endpoint):
self._user_context = None
self._in_process = False
self._remote_session_id = 0
self._pn_ssl = self._configure_ssl(properties)
# TODO(kgiusti) sasl configuration and handling
self._pn_sasl = None
self._sasl_done = False
# intercept any SSL failures and cleanup resources before propagating
# the exception:
try:
self._pn_ssl = self._configure_ssl(properties)
except:
self.destroy()
raise
@property
def container(self):
return self._container

@ -17,6 +17,7 @@
# under the License.
#
import gc
import time
import pyngus
@ -38,10 +39,13 @@ class Test(object):
return self.config.defines.get(name, default)
def setup(self):
pass
gc.enable()
gc.collect()
assert not gc.garbage, "Object leak: %s" % str(gc.garbage)
def teardown(self):
pass
gc.collect()
assert not gc.garbage, "Object leak: %s" % str(gc.garbage)
@property
def delay(self):

@ -30,6 +30,7 @@ import pyngus
class APITest(common.Test):
def setup(self):
super(APITest, self).setup()
# logging.getLogger("pyngus").setLevel(logging.DEBUG)
self.container1 = pyngus.Container("test-container-1")
self.container2 = pyngus.Container("test-container-2")
@ -39,6 +40,7 @@ class APITest(common.Test):
self.container1.destroy()
if self.container2:
self.container2.destroy()
super(APITest, self).teardown()
def test_create_destroy(self):
"""Verify Connection construction/destruction."""

@ -25,11 +25,17 @@ import pyngus
class APITest(common.Test):
def test_create_destroy(self):
gc.enable()
gc.collect()
assert not gc.garbage, "Object leak: %s" % str(gc.garbage)
container = pyngus.Container("My-Container")
assert container.name == "My-Container"
container.destroy()
def test_create_connection(self):
gc.enable()
gc.collect()
assert not gc.garbage, "Object leak: %s" % str(gc.garbage)
container = pyngus.Container("A123")
container.create_connection("c1")
container.create_connection("c2")
@ -42,6 +48,8 @@ class APITest(common.Test):
def test_cleanup(self):
gc.enable()
gc.collect()
assert not gc.garbage, "Object leak: %s" % str(gc.garbage)
container = pyngus.Container("abc")
c1 = container.create_connection("c1")
c2 = container.create_connection("c2")
@ -62,6 +70,9 @@ class APITest(common.Test):
assert not gc.garbage, "Object leak: %s" % str(gc.garbage)
def test_need_processing(self):
gc.enable()
gc.collect()
assert not gc.garbage, "Object leak: %s" % str(gc.garbage)
container = pyngus.Container("abc")
c1 = container.create_connection("c1")
c2 = container.create_connection("c2")

@ -30,6 +30,7 @@ import pyngus
class APITest(common.Test):
def setup(self, conn1_props=None, conn2_props=None):
super(APITest, self).setup()
# logging.getLogger("pyngus").setLevel(logging.DEBUG)
self.container1 = pyngus.Container("test-container-1")
self.conn1_handler = common.ConnCallback()
@ -60,6 +61,7 @@ class APITest(common.Test):
self.conn2.destroy()
if self.container2:
self.container2.destroy()
super(APITest, self).teardown()
def _setup_sender_sync(self):
"""Create links, initiated by sender."""
@ -456,6 +458,7 @@ class APITest(common.Test):
def test_send_deadline_idle(self):
"""Validate the connection's deadline processing."""
self.teardown()
self.setup(conn1_props={"idle-time-out": 99})
sender1 = self.conn1.create_sender("src1", "tgt1")
@ -556,6 +559,7 @@ class APITest(common.Test):
def test_multi_frame_message(self):
"""Verify multi-frame message send/receive."""
self.teardown()
props = {"max-frame-size": 512}
self.setup(conn1_props=props, conn2_props=props)