@@ -2618,6 +2618,51 @@ def test_get_verified_chain_unconnected(self):
26182618 server = Connection (ctx , None )
26192619 assert None is server .get_verified_chain ()
26202620
2621+ def test_set_verify_overrides_context (self ):
2622+ context = Context (SSLv23_METHOD )
2623+ context .set_verify (VERIFY_PEER )
2624+ conn = Connection (context , None )
2625+ conn .set_verify (VERIFY_NONE )
2626+
2627+ assert context .get_verify_mode () == VERIFY_PEER
2628+ assert conn .get_verify_mode () == VERIFY_NONE
2629+
2630+ with pytest .raises (TypeError ):
2631+ conn .set_verify (None )
2632+
2633+ with pytest .raises (TypeError ):
2634+ conn .set_verify (VERIFY_PEER , "not a callable" )
2635+
2636+ def test_set_verify_callback_reference (self ):
2637+ """
2638+ The callback for certificate verification should only be forgotten if the context and all connections
2639+ created by it do not use it anymore.
2640+ """
2641+ def callback (conn , cert , errnum , depth , ok ): # pragma: no cover
2642+ return ok
2643+
2644+ tracker = ref (callback )
2645+
2646+ context = Context (SSLv23_METHOD )
2647+ context .set_verify (VERIFY_PEER , callback )
2648+ del callback
2649+
2650+ conn = Connection (context , None )
2651+ context .set_verify (VERIFY_NONE )
2652+
2653+ collect ()
2654+ collect ()
2655+ assert tracker ()
2656+
2657+ conn .set_verify (VERIFY_PEER , lambda conn , cert , errnum , depth , ok : ok )
2658+ collect ()
2659+ collect ()
2660+ callback = tracker ()
2661+ if callback is not None : # pragma: nocover
2662+ referrers = get_referrers (callback )
2663+ if len (referrers ) > 1 :
2664+ pytest .fail ("Some references remain: %r" % (referrers ,))
2665+
26212666 def test_get_session_unconnected (self ):
26222667 """
26232668 `Connection.get_session` returns `None` when used with an object
0 commit comments