@@ -1738,10 +1738,6 @@ class FakeSock:
17381738 MyDatagramProto , flags = 1 , sock = FakeSock ())
17391739 self .assertRaises (ValueError , self .loop .run_until_complete , fut )
17401740
1741- fut = self .loop .create_datagram_endpoint (
1742- MyDatagramProto , reuse_address = True , sock = FakeSock ())
1743- self .assertRaises (ValueError , self .loop .run_until_complete , fut )
1744-
17451741 fut = self .loop .create_datagram_endpoint (
17461742 MyDatagramProto , reuse_port = True , sock = FakeSock ())
17471743 self .assertRaises (ValueError , self .loop .run_until_complete , fut )
@@ -1752,7 +1748,6 @@ class FakeSock:
17521748
17531749 def test_create_datagram_endpoint_sockopts (self ):
17541750 # Socket options should not be applied unless asked for.
1755- # SO_REUSEADDR defaults to on for UNIX.
17561751 # SO_REUSEPORT is not available on all platforms.
17571752
17581753 coro = self .loop .create_datagram_endpoint (
@@ -1761,18 +1756,8 @@ def test_create_datagram_endpoint_sockopts(self):
17611756 transport , protocol = self .loop .run_until_complete (coro )
17621757 sock = transport .get_extra_info ('socket' )
17631758
1764- reuse_address_default_on = (
1765- os .name == 'posix' and sys .platform != 'cygwin' )
17661759 reuseport_supported = hasattr (socket , 'SO_REUSEPORT' )
17671760
1768- if reuse_address_default_on :
1769- self .assertTrue (
1770- sock .getsockopt (
1771- socket .SOL_SOCKET , socket .SO_REUSEADDR ))
1772- else :
1773- self .assertFalse (
1774- sock .getsockopt (
1775- socket .SOL_SOCKET , socket .SO_REUSEADDR ))
17761761 if reuseport_supported :
17771762 self .assertFalse (
17781763 sock .getsockopt (
@@ -1788,13 +1773,12 @@ def test_create_datagram_endpoint_sockopts(self):
17881773 coro = self .loop .create_datagram_endpoint (
17891774 lambda : MyDatagramProto (create_future = True , loop = self .loop ),
17901775 local_addr = ('127.0.0.1' , 0 ),
1791- reuse_address = True ,
17921776 reuse_port = reuseport_supported ,
17931777 allow_broadcast = True )
17941778 transport , protocol = self .loop .run_until_complete (coro )
17951779 sock = transport .get_extra_info ('socket' )
17961780
1797- self .assertTrue (
1781+ self .assertFalse (
17981782 sock .getsockopt (
17991783 socket .SOL_SOCKET , socket .SO_REUSEADDR ))
18001784 if reuseport_supported :
@@ -1809,6 +1793,29 @@ def test_create_datagram_endpoint_sockopts(self):
18091793 self .loop .run_until_complete (protocol .done )
18101794 self .assertEqual ('CLOSED' , protocol .state )
18111795
1796+ def test_create_datagram_endpoint_reuse_address_error (self ):
1797+ # bpo-37228: Ensure that explicit passing of `reuse_address=True`
1798+ # raises an error, as it is not safe to use SO_REUSEADDR when using UDP
1799+
1800+ coro = self .loop .create_datagram_endpoint (
1801+ lambda : MyDatagramProto (create_future = True , loop = self .loop ),
1802+ local_addr = ('127.0.0.1' , 0 ),
1803+ reuse_address = True )
1804+
1805+ with self .assertRaises (ValueError ):
1806+ self .loop .run_until_complete (coro )
1807+
1808+ def test_create_datagram_endpoint_reuse_address_warning (self ):
1809+ # bpo-37228: Deprecate *reuse_address* parameter
1810+
1811+ coro = self .loop .create_datagram_endpoint (
1812+ lambda : MyDatagramProto (create_future = True , loop = self .loop ),
1813+ local_addr = ('127.0.0.1' , 0 ),
1814+ reuse_address = False )
1815+
1816+ with self .assertWarns (DeprecationWarning ):
1817+ self .loop .run_until_complete (coro )
1818+
18121819 @patch_socket
18131820 def test_create_datagram_endpoint_nosoreuseport (self , m_socket ):
18141821 del m_socket .SO_REUSEPORT
0 commit comments