@@ -2630,6 +2630,51 @@ def test_get_verified_chain_unconnected(self):
26302630 server = Connection (ctx , None )
26312631 assert None is server .get_verified_chain ()
26322632
2633+ def test_set_verify_overrides_context (self ):
2634+ context = Context (SSLv23_METHOD )
2635+ context .set_verify (VERIFY_PEER )
2636+ conn = Connection (context , None )
2637+ conn .set_verify (VERIFY_NONE )
2638+
2639+ assert context .get_verify_mode () == VERIFY_PEER
2640+ assert conn .get_verify_mode () == VERIFY_NONE
2641+
2642+ with pytest .raises (TypeError ):
2643+ conn .set_verify (None )
2644+
2645+ with pytest .raises (TypeError ):
2646+ conn .set_verify (VERIFY_PEER , "not a callable" )
2647+
2648+ def test_set_verify_callback_reference (self ):
2649+ """
2650+ The callback for certificate verification should only be forgotten if the context and all connections
2651+ created by it do not use it anymore.
2652+ """
2653+ def callback (conn , cert , errnum , depth , ok ): # pragma: no cover
2654+ return ok
2655+
2656+ tracker = ref (callback )
2657+
2658+ context = Context (SSLv23_METHOD )
2659+ context .set_verify (VERIFY_PEER , callback )
2660+ del callback
2661+
2662+ conn = Connection (context , None )
2663+ context .set_verify (VERIFY_NONE )
2664+
2665+ collect ()
2666+ collect ()
2667+ assert tracker ()
2668+
2669+ conn .set_verify (VERIFY_PEER , lambda conn , cert , errnum , depth , ok : ok )
2670+ collect ()
2671+ collect ()
2672+ callback = tracker ()
2673+ if callback is not None : # pragma: nocover
2674+ referrers = get_referrers (callback )
2675+ if len (referrers ) > 1 :
2676+ pytest .fail ("Some references remain: %r" % (referrers ,))
2677+
26332678 def test_get_session_unconnected (self ):
26342679 """
26352680 `Connection.get_session` returns `None` when used with an object
0 commit comments