Change the info callback test to at least assert that the connection argument is a Connection instance.
Fix the implementation to make the test pass.
diff --git a/OpenSSL/SSL.py b/OpenSSL/SSL.py
index 81ec2e2..f21ad9d 100644
--- a/OpenSSL/SSL.py
+++ b/OpenSSL/SSL.py
@@ -699,7 +699,7 @@
"""
@wraps(callback)
def wrapper(ssl, where, return_code):
- callback(self, where, return_code)
+ callback(Connection._reverse_mapping[ssl], where, return_code)
self._info_callback = _ffi.callback(
"void (*)(const SSL *, int, int)", wrapper)
_lib.SSL_CTX_set_info_callback(self._context, self._info_callback)
diff --git a/OpenSSL/test/test_ssl.py b/OpenSSL/test/test_ssl.py
index e3518c5..712009b 100644
--- a/OpenSSL/test/test_ssl.py
+++ b/OpenSSL/test/test_ssl.py
@@ -700,15 +700,19 @@
serverSSL = Connection(context, server)
serverSSL.set_accept_state()
- while not called:
- for ssl in clientSSL, serverSSL:
- try:
- ssl.do_handshake()
- except WantReadError:
- pass
+ handshake(clientSSL, serverSSL)
- # Kind of lame. Just make sure it got called somehow.
- self.assertTrue(called)
+ # The callback must always be called with the connection it is a
+ # callback for as the first argument. It would probably be better to
+ # split this into separate tests for client and server side info
+ # callbacks. It would also be good to at least assert *something*
+ # about `where` and `ret`.
+ notConnections = [
+ conn for (conn, where, ret) in called
+ if not isinstance(conn, Connection)]
+ self.assertEqual(
+ [], notConnections,
+ "Some info callback arguments were not Connection instaces.")
def _load_verify_locations_test(self, *args):