@@ -1732,10 +1732,6 @@ class FakeSock:
17321732 MyDatagramProto , flags = 1 , sock = FakeSock ())
17331733 self .assertRaises (ValueError , self .loop .run_until_complete , fut )
17341734
1735- fut = self .loop .create_datagram_endpoint (
1736- MyDatagramProto , reuse_address = True , sock = FakeSock ())
1737- self .assertRaises (ValueError , self .loop .run_until_complete , fut )
1738-
17391735 fut = self .loop .create_datagram_endpoint (
17401736 MyDatagramProto , reuse_port = True , sock = FakeSock ())
17411737 self .assertRaises (ValueError , self .loop .run_until_complete , fut )
@@ -1746,7 +1742,6 @@ class FakeSock:
17461742
17471743 def test_create_datagram_endpoint_sockopts (self ):
17481744 # Socket options should not be applied unless asked for.
1749- # SO_REUSEADDR defaults to on for UNIX.
17501745 # SO_REUSEPORT is not available on all platforms.
17511746
17521747 coro = self .loop .create_datagram_endpoint (
@@ -1755,18 +1750,8 @@ def test_create_datagram_endpoint_sockopts(self):
17551750 transport , protocol = self .loop .run_until_complete (coro )
17561751 sock = transport .get_extra_info ('socket' )
17571752
1758- reuse_address_default_on = (
1759- os .name == 'posix' and sys .platform != 'cygwin' )
17601753 reuseport_supported = hasattr (socket , 'SO_REUSEPORT' )
17611754
1762- if reuse_address_default_on :
1763- self .assertTrue (
1764- sock .getsockopt (
1765- socket .SOL_SOCKET , socket .SO_REUSEADDR ))
1766- else :
1767- self .assertFalse (
1768- sock .getsockopt (
1769- socket .SOL_SOCKET , socket .SO_REUSEADDR ))
17701755 if reuseport_supported :
17711756 self .assertFalse (
17721757 sock .getsockopt (
@@ -1782,13 +1767,12 @@ def test_create_datagram_endpoint_sockopts(self):
17821767 coro = self .loop .create_datagram_endpoint (
17831768 lambda : MyDatagramProto (create_future = True , loop = self .loop ),
17841769 local_addr = ('127.0.0.1' , 0 ),
1785- reuse_address = True ,
17861770 reuse_port = reuseport_supported ,
17871771 allow_broadcast = True )
17881772 transport , protocol = self .loop .run_until_complete (coro )
17891773 sock = transport .get_extra_info ('socket' )
17901774
1791- self .assertTrue (
1775+ self .assertFalse (
17921776 sock .getsockopt (
17931777 socket .SOL_SOCKET , socket .SO_REUSEADDR ))
17941778 if reuseport_supported :
@@ -1803,6 +1787,29 @@ def test_create_datagram_endpoint_sockopts(self):
18031787 self .loop .run_until_complete (protocol .done )
18041788 self .assertEqual ('CLOSED' , protocol .state )
18051789
1790+ def test_create_datagram_endpoint_reuse_address_error (self ):
1791+ # bpo-37228: Ensure that explicit passing of `reuse_address=True`
1792+ # raises an error, as it is not safe to use SO_REUSEADDR when using UDP
1793+
1794+ coro = self .loop .create_datagram_endpoint (
1795+ lambda : MyDatagramProto (create_future = True , loop = self .loop ),
1796+ local_addr = ('127.0.0.1' , 0 ),
1797+ reuse_address = True )
1798+
1799+ with self .assertRaises (ValueError ):
1800+ self .loop .run_until_complete (coro )
1801+
1802+ def test_create_datagram_endpoint_reuse_address_warning (self ):
1803+ # bpo-37228: Deprecate *reuse_address* parameter
1804+
1805+ coro = self .loop .create_datagram_endpoint (
1806+ lambda : MyDatagramProto (create_future = True , loop = self .loop ),
1807+ local_addr = ('127.0.0.1' , 0 ),
1808+ reuse_address = False )
1809+
1810+ with self .assertWarns (DeprecationWarning ):
1811+ self .loop .run_until_complete (coro )
1812+
18061813 @patch_socket
18071814 def test_create_datagram_endpoint_nosoreuseport (self , m_socket ):
18081815 del m_socket .SO_REUSEPORT
0 commit comments