Ë
    ojðA  ã                   óØ  — d Z ddlZddlmZ ddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlmZmZ ddl m!Z!m"Z" ddl#m$Z$ d„ Z% e%«       Z&d„ Z' G d„ de«      Z( G d„ d«      Z) G d„ dee)e(«      Z* G d„ dee)e(«      Z+ e,«       j[                  e*j]                  «       «        e,«       j[                  e+j]                  «       «       y)zU
Tests for implementations of L{IReactorUDP} and the UDP parts of
L{IReactorSocket}.
é    N)Úimplementer)ÚverifyObject)ÚdeferÚerror)ÚIPv4AddressÚIPv6Address)ÚDeferredÚmaybeDeferred)ÚIListeningPortÚILoggingContextÚIReactorSocketÚIReactorUDP)ÚDatagramProtocol)ÚLogObserverMixinÚfindFreePort)ÚReactorBuilder)Úcontext)ÚILogContextÚerr)Ú
GoodClientÚServer)ÚSkipTestc                  ó¾   — d} d}	 t        j                   t         j                  «      } | j                  d«       d}| r| j	                  «        |S # t        $ r Y Œw xY w)z4Returns True if the system can bind an IPv6 address.NF)ú::1r   T)ÚsocketÚAF_INET6ÚbindÚOSErrorÚclose)ÚsockÚhas_ipv6s     ú@/usr/lib/python3/dist-packages/twisted/internet/test/test_udp.pyÚ	_has_ipv6r#   !   s[   € à€DØ€HðÜ�}‰}œVŸ_™_Ó-ˆØ�	‰	�*ÔØˆñ Ø�
‰
ŒØ€Oøô ò Ùðús   †6A Á	AÁAc                 ó    — t         sd| _        | S )Nz.Does not work on systems without IPv6 support.)ÚHAS_IPV6Úskip)Úfs    r"   ÚskipWithoutIPv6r(   5   s   € ÝØAˆŒØ€Hó    c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚDatagramTransportTestsMixinzP
    Mixin defining tests which apply to any port/datagram based transport.
    c                 ó&  — | j                  «       }| j                  «       }t        t        «       G d„ dt        «      «       } |«       }| j                  ||«      }d|j                  «       j                  fz  }| j                  |f|d   d   «       y)zu
        When a port starts, a message including a description of the associated
        protocol is logged.
        c                   ó   — e Zd Zd„ Zy)úQDatagramTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeProtocolc                  ó   — y)NzCrazy Protocol© ©Úselfs    r"   Ú	logPrefixz[DatagramTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeProtocol.logPrefixJ   s   € Ø'r)   N)Ú__name__Ú
__module__Ú__qualname__r3   r0   r)   r"   ÚSomeProtocolr.   H   s   „ ó(r)   r7   zCrazy Protocol starting on %dr   ÚmessageN)	ÚobserveÚbuildReactorr   r   r   ÚgetListeningPortÚgetHostÚportÚassertEqual)r2   ÚloggedMessagesÚreactorr7   ÚprotocolÚpÚexpectedMessages          r"   Útest_startedListeningLogMessagez;DatagramTransportTestsMixin.test_startedListeningLogMessage@   s�   € ð
 Ÿ™›ˆØ×#Ñ#Ó%ˆä	”_Ó	%ô	(Ô+ó 	(ó 
&ð	(ñ  “>ˆà×!Ñ! '¨8Ó4ˆØ9¸Q¿Y¹Y»[×=MÑ=MÐ<OÑOˆØ×Ñ˜/Ð+¨^¸AÑ->¸yÑ-IÕJr)   c                 óJ  ‡‡‡‡— | j                  «       Š| j                  «       Š| j                  ‰t        «       «      Šd‰j	                  «       j
                  › d�}ˆfd„Šˆˆˆfd„}‰j                  |«       | j                  ‰«       | j                  |f‰d   d   «       y)z“
        When a connection is lost a message is logged containing an
        address identifying the port and the fact that it was closed.
        z
(UDP Port z Closed)c                 ó&   •— ‰j                  «        y ©N©Ústop©Úignoredr@   s    €r"   ÚstopReactorzNDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.stopReactor]   s   ø€ Ø�L‰L�Nr)   c                  óX   •— ‰ d d …= t        ‰j                  «      j                  ‰«       y rG   )r
   ÚstopListeningÚaddCallback)r?   rB   rL   s   €€€r"   ÚdoStopListeningzRDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.doStopListening`   s"   ø€ ØšqÐ!Ü˜!Ÿ/™/Ó*×6Ñ6°{ÕCr)   r   r8   N)	r9   r:   r;   r   r<   r=   ÚcallWhenRunningÚ
runReactorr>   )r2   rC   rP   r?   rB   r@   rL   s      @@@@r"   Útest_connectionLostLogMessagez9DatagramTransportTestsMixin.test_connectionLostLogMessageS   s“   û€ ð
 Ÿ™›ˆØ×#Ñ#Ó%ˆØ×!Ñ! 'Ô+;Ó+=Ó>ˆØ& q§y¡y£{×'7Ñ'7Ð&8¸ÐAˆô	ö	Dð 	×Ñ Ô0Ø�‰˜Ô à×Ñ˜/Ð+¨^¸AÑ->¸yÑ-IÕJr)   c                 ó>  ‡—  G ˆfd„dt         «      }| j                  «       Š |«       }| j                  ‰|«       | j                  ‰«       | j	                  |j
                  «       | j	                  |j                  «       | j                  |j                  «       y)z°
        L{DatagramProtocol.stopProtocol} is called asynchronously (ie, not
        re-entrantly) when C{stopListening} is used to stop the datagram
        transport.
        c                   ó.   •— e Zd ZdZdZdZdZd„ Zˆ fd„Zy)úVDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocolFc                 ób   — d| _         d| _        | j                  j                  «        d| _        y )NTF)ÚstartedÚinStartProtocolÚ	transportrN   r1   s    r"   ÚstartProtocolzdDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.startProtocolv   s)   € Ø#�”Ø'+�Ô$Ø—‘×,Ñ,Ô.Ø',�Õ$r)   c                 óV   •— d| _         | j                  | _        ‰j                  «        y )NT)ÚstoppedrY   ÚstoppedInStartrI   ©r2   r@   s    €r"   ÚstopProtocolzcDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.stopProtocol|   s!   ø€ Ø#�”Ø&*×&:Ñ&:�Ô#Ø—‘•r)   N)	r4   r5   r6   rX   r]   rY   r^   r[   r`   )r@   s   €r"   ÚDisconnectingProtocolrV   p   s!   ø„ ØˆGØˆGØ#ˆOØ"ˆNò-õr)   ra   N)	r   r:   r;   rR   Ú
assertTruerX   r]   ÚassertFalser^   )r2   ra   rA   r@   s      @r"   Útest_stopProtocolSchedulingz7DatagramTransportTestsMixin.test_stopProtocolSchedulingi   s|   ø€ ö	Ô$4ô 	ð" ×#Ñ#Ó%ˆÙ(Ó*ˆØ×Ñ˜g xÔ0Ø�‰˜Ô à�‰˜×(Ñ(Ô)Ø�‰˜×(Ñ(Ô)Ø×Ñ˜×0Ñ0Õ1r)   N)r4   r5   r6   Ú__doc__rD   rS   rd   r0   r)   r"   r+   r+   ;   s   „ ñòKò&Kó,2r)   r+   c                   óœ   — e Zd ZdZd„ Zd„ Zed„ «       Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zed
„ «       Zed„ «       Zd„ Zed„ «       Zed„ «       Zd„ Zd„ Zy)ÚUDPPortTestsMixinzY
    Tests for L{IReactorUDP.listenUDP} and
    L{IReactorSocket.adoptDatagramPort}.
    c                 ó–   — | j                  «       }| j                  |t        «       «      }| j                  t	        t
        |«      «       y)zY
        L{IReactorUDP.listenUDP} returns an object providing L{IListeningPort}.
        N)r:   r;   r   rb   r   r   ©r2   r@   r=   s      r"   Útest_interfacez UDPPortTestsMixin.test_interface‘   s;   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ�‰œ¤^°TÓ:Õ;r)   c                 óî   — t        t        j                  ¬«      \  }}| j                  «       }| j	                  |t        «       ||¬«      }| j                  |j                  «       t        d||«      «       y)z³
        L{IListeningPort.getHost} returns an L{IPv4Address} giving a
        dotted-quad of the IPv4 address the port is listening on as well as
        the port number.
        )Útype)r=   Ú	interfaceÚUDPN)	r   r   Ú
SOCK_DGRAMr:   r;   r   r>   r<   r   )r2   ÚhostÚ
portNumberr@   r=   s        r"   Útest_getHostzUDPPortTestsMixin.test_getHost™   sj   € ô (¬V×->Ñ->Ô?ÑˆˆjØ×#Ñ#Ó%ˆØ×$Ñ$ØÔ%Ó'¨jÀDð %ó 
ˆð 	×Ñ˜Ÿ™›¬°U¸DÀ*Ó)MÕNr)   c                 óà   — | j                  «       }| j                  |t        «       d¬«      }|j                  «       }| j	                  |j
                  d«       | j                  |t        «       y)zr
        L{IListeningPort.getHost} returns an L{IPv6Address} when listening on
        an IPv6 interface.
        r   ©rm   N)r:   r;   r   r<   r>   rp   ÚassertIsInstancer   )r2   r@   r=   Úaddrs       r"   Útest_getHostIPv6z"UDPPortTestsMixin.test_getHostIPv6¦   s\   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÈEÐ$ÓRˆØ�|‰|‹~ˆØ×Ñ˜Ÿ™ EÔ*Ø×Ñ˜d¤KÕ0r)   c                 ó�   — | j                  «       }| j                  t        j                  |j                  t        «       dd¬«       y)zŠ
        An L{InvalidAddressError} is raised when trying to listen on an address
        that isn't a valid IPv4 or IPv6 address.
        r   zexample.comrt   N)r:   ÚassertRaisesr   ÚInvalidAddressErrorÚ	listenUDPr   r_   s     r"   Útest_invalidInterfacez'UDPPortTestsMixin.test_invalidInterface²   sC   € ð
 ×#Ñ#Ó%ˆØ×ÑÜ×%Ñ%Ø×ÑÜÓØØ#ð 	õ 	
r)   c                 óŽ  ‡ ‡—  G d„ dt         «      }‰ j                  «       Š |d«      }|j                  }‰ j                  ‰|«      }|j	                  «       }ˆ fd„}|j                  |«       |j                  t        «       |j                  ˆfd„«       |j                  dd|j                  f«       ‰ j                  ‰«       y)	z’
        Datagram transports implement L{ILoggingContext.logPrefix} to return a
        message reflecting the protocol they are running.
        c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)úIUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocolc                 ó0   — || _         t        «       | _        y rG   )Ú_prefixr	   Úsystem)r2   Úprefixs     r"   Ú__init__zRUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.__init__Ç   s   € Ø%�”Ü&›j�•r)   c                 ó   — | j                   S rG   )r�   r1   s    r"   r3   zSUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.logPrefixË   s   € Ø—|‘|Ð#r)   c                 óš   — | j                   �?| j                   }d | _         |j                  t        j                  t        «      d   «       y y )Nr‚   )r‚   Úcallbackr   Úgetr   )r2   Úbytesrv   r‚   s       r"   ÚdatagramReceivedzZUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.datagramReceivedÎ   s;   € Ø—;‘;Ð*Ø!Ÿ[™[�FØ"&�D”KØ—O‘O¤G§K¡K´Ó$<¸XÑ$FÕGð +r)   N)r4   r5   r6   r„   r3   rŠ   r0   r)   r"   ÚCustomLogPrefixDatagramProtocolr   Æ   s   „ ò)ò$óHr)   r‹   zCustom Datagramsc                 ó*   •— ‰j                  d| «       y )NzCustom Datagrams (UDP))r>   )r‚   r2   s    €r"   Ú	gotSystemz3UDPPortTestsMixin.test_logPrefix.<locals>.gotSystemÚ   s   ø€ Ø×ÑÐ5°vÕ>r)   c                 ó$   •— ‰j                  «       S rG   rH   rJ   s    €r"   ú<lambda>z2UDPPortTestsMixin.test_logPrefix.<locals>.<lambda>ß   s   ø€  g§l¡l£n€ r)   s
   some bytesú	127.0.0.1N)r   r:   r‚   r;   r<   rO   Ú
addErrbackr   Úwriter=   rR   )r2   r‹   rA   Údr=   Úaddressr�   r@   s   `      @r"   Útest_logPrefixz UDPPortTestsMixin.test_logPrefixÀ   s¢   ù€ ô	HÔ.>ô 	Hð ×#Ñ#Ó%ˆÙ2Ð3EÓFˆØ�O‰OˆØ×$Ñ$ W¨hÓ7ˆØ—,‘,“.ˆô	?ð 	
�‰�iÔ Ø	�‰”SÔØ	�‰Ó4Ô5à�
‰
�= ;°·±Ð"=Ô>Ø�‰˜Õ r)   c                 óš  ‡ ‡‡—  G d„ dt         «      }‰ j                  «       Š |«       }|j                  }‰ j                  ‰|«      }|j	                  «       }dŠˆˆ fd„} |j
                  |«        |j                  t        «        |j
                  ˆfd„«       |j                  ‰d|j                  f«       ‰ j                  ‰«       y)zH
        Write a sequence of L{bytes} to a L{DatagramProtocol}.
        c                   ó   — e Zd Zd„ Zd„ Zy)úDUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocolc                 ó"   — t        «       | _        y rG   )r	   r   r1   s    r"   r„   zMUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.__init__ê   s   € Ü%›Z�•
r)   c                 ó:   — | j                   j                  |«       y rG   )r   r‡   )r2   Údatarv   s      r"   rŠ   zUUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.datagramReceivedí   s   € Ø—
‘
×#Ñ# DÕ)r)   N)r4   r5   r6   r„   rŠ   r0   r)   r"   ÚSimpleDatagramProtocolr˜   é   s   „ ò(ó*r)   rœ   )s   somes   bytess   tos   writec                 óH   •— ‰j                  dj                  ‰«      | «       y )Nr)   )r>   Újoin)r›   ÚdataToWriter2   s    €€r"   ÚgotDataz5UDPPortTestsMixin.test_writeSequence.<locals>.gotData÷   s   ø€ Ø×Ñ˜SŸX™X kÓ2°DÕ9r)   c                 ó$   •— ‰j                  «       S rG   rH   rJ   s    €r"   r�   z6UDPPortTestsMixin.test_writeSequence.<locals>.<lambda>ü   s   ø€ ¨'¯,©,«.€ r)   r�   N)r   r:   r   r;   r<   rO   r‘   r   ÚwriteSequencer=   rR   )	r2   rœ   rA   r   r=   r”   r    rŸ   r@   s	   `      @@r"   Útest_writeSequencez$UDPPortTestsMixin.test_writeSequenceä   s°   ú€ ô
	*Ô%5ô 	*ð ×#Ñ#Ó%ˆÙ)Ó+ˆØ—‘ˆØ×$Ñ$ W¨hÓ7ˆØ—,‘,“.ˆØ:ˆõ	:ð 	ˆ×Ñ˜'Ô"Øˆ×ÑœÔØˆ×ÑÓ8Ô9Ø×Ñ˜;¨°g·l±lÐ(CÔDØ�‰˜Õ r)   c                 óÐ   — | j                  «       }| j                  |t        «       «      }| j                  t	        |j                  «       j                  «      t	        |«      «       y)zQ
        C{str()} on the listening port object includes the port number.
        N)r:   r;   r   ÚassertInÚstrr<   r=   ri   s      r"   Útest_strzUDPPortTestsMixin.test_str   sK   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ�‰”c˜$Ÿ,™,›.×-Ñ-Ó.´°D³	Õ:r)   c                 óÐ   — | j                  «       }| j                  |t        «       «      }| j                  t	        |j                  «       j                  «      t        |«      «       y)zR
        C{repr()} on the listening port object includes the port number.
        N)r:   r;   r   r¥   Úreprr<   r=   r¦   ri   s      r"   Ú	test_reprzUDPPortTestsMixin.test_repr  sK   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ�‰”d˜4Ÿ<™<›>×.Ñ.Ó/´°T³Õ;r)   c                 óˆ  ‡‡	‡
— | j                  «       Š	t        «       Š
t        j                  «       x}‰
_        | j                  ‰	‰
d¬«       t        «       Št        j                  «       x}‰_        | j                  ‰	‰d¬«       ‰j                  j                  «       }ˆˆ
fd„}ˆ	fd„}t        j                  ||g«      }|j                  |«       |j                  |«       |j                  t        «       | j                  ‰	«       ‰
j                  d   }| j                  |d|j                   |j"                  ff«       y)zS
        Writing to an IPv6 UDP socket on the loopback interface succeeds.
        r   rt   c                 ó¾   •— ‰j                   j                  dd‰j                   j                  «       j                  f«       t	        j
                  «       x}‰_        |S )úû
            Send a datagram from the client once it's started.

            @param ignored: a list of C{[None, None]}, which is ignored
            @returns: a deferred which fires when the server has received a
                datagram.
            ó   spamr   )rZ   r’   r<   r=   r   r	   ÚpacketReceived©rK   ÚserverReceivedÚclientÚservers     €€r"   ÚcbClientStartedzDUDPPortTestsMixin.test_writeToIPv6Interface.<locals>.cbClientStarted  sO   ø€ ð ×Ñ×"Ñ" 7¨U°F×4DÑ4D×4LÑ4LÓ4N×4SÑ4SÐ,TÔUÜ5:·^±^Ó5EÐEˆN˜VÔ2Ø!Ð!r)   c                 ó&   •— ‰j                  «        y©z�
            Stop the reactor after a datagram is received.

            @param ignored: L{None}, which is ignored
            @returns: L{None}
            NrH   rJ   s    €r"   ÚcbServerReceivedzEUDPPortTestsMixin.test_writeToIPv6Interface.<locals>.cbServerReceived+  s   ø€ ð �L‰L�Nr)   r   r®   N©r:   r   r   r	   ÚstartedDeferredr;   r   rZ   r<   ÚgatherResultsrO   r‘   r   rR   Úpacketsr>   rp   r=   ©r2   ÚserverStartedÚclientStartedÚcAddrr´   r·   r“   Úpacketr²   r@   r³   s           @@@r"   Útest_writeToIPv6Interfacez+UDPPortTestsMixin.test_writeToIPv6Interface  s	  ú€ ð
 ×#Ñ#Ó%ˆÜ“ˆÜ16·±Ó1AÐAˆ˜Ô.Ø×Ñ˜g v¸ÐÔ?ä“ˆÜ16·±Ó1AÐAˆ˜Ô.Ø×Ñ˜g v¸ÐÔ?Ø× Ñ ×(Ñ(Ó*ˆõ
	"ô	ô ×Ñ °Ð >Ó?ˆØ	�‰�oÔ&Ø	�‰Ð&Ô'Ø	�‰”SÔØ�‰˜Ô à—‘ Ñ"ˆØ×Ñ˜ '¨E¯J©J¸¿
¹
Ð+CÐ!DÕEr)   c                 óˆ  ‡‡	‡
— | j                  «       Š	t        «       Š
t        j                  «       x}‰
_        | j                  ‰	‰
d¬«       t        «       Št        j                  «       x}‰_        | j                  ‰	‰d¬«       ‰j                  j                  «       }ˆˆ
fd„}ˆ	fd„}t        j                  ||g«      }|j                  |«       |j                  |«       |j                  t        «       | j                  ‰	«       ‰
j                  d   }| j                  |d|j                   |j"                  ff«       y)z�
        An IPv6 address can be passed as the C{interface} argument to
        L{listenUDP}. The resulting Port accepts IPv6 datagrams.
        r   rt   c                 óð   •— ‰j                   j                  d‰j                   j                  «       j                  «       ‰j                   j	                  d«       t        j                  «       x}‰_        |S )r­   r   r®   )rZ   Úconnectr<   r=   r’   r   r	   r¯   r°   s     €€r"   r´   zMUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbClientStartedM  s^   ø€ ð ×Ñ×$Ñ$ U¨F×,<Ñ,<×,DÑ,DÓ,F×,KÑ,KÔLØ×Ñ×"Ñ" 7Ô+Ü5:·^±^Ó5EÐEˆN˜VÔ2Ø!Ð!r)   c                 ó&   •— ‰j                  «        yr¶   rH   rJ   s    €r"   r·   zNUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbServerReceived[  s   ø€ ð �L‰L�Nr)   r   r®   Nr¸   r¼   s           @@@r"   Ú"test_connectedWriteToIPv6Interfacez4UDPPortTestsMixin.test_connectedWriteToIPv6Interface=  s	  ú€ ð ×#Ñ#Ó%ˆÜ“ˆÜ16·±Ó1AÐAˆ˜Ô.Ø×Ñ˜g v¸ÐÔ?ä“ˆÜ16·±Ó1AÐAˆ˜Ô.Ø×Ñ˜g v¸ÐÔ?Ø× Ñ ×(Ñ(Ó*ˆõ	"ô	ô ×Ñ °Ð >Ó?ˆØ	�‰�oÔ&Ø	�‰Ð&Ô'Ø	�‰”SÔØ�‰˜Ô à—‘ Ñ"ˆØ×Ñ˜ '¨E¯J©J¸¿
¹
Ð+CÐ!DÕEr)   c                 ó°   — | j                  «       }| j                  |t        «       «      }| j                  t        j
                  |j                  dd«       y)zn
        Writing to a hostname instead of an IP address will raise an
        L{InvalidAddressError}.
        Úspam)úexample.invalidé   N©r:   r;   r   ry   r   rz   r’   ri   s      r"   Ú/test_writingToHostnameRaisesInvalidAddressErrorzAUDPPortTestsMixin.test_writingToHostnameRaisesInvalidAddressErrorn  sJ   € ð
 ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ×ÑÜ×%Ñ% t§z¡z°6Ð;Qõ	
r)   c                 ó´   — | j                  «       }| j                  |t        «       d¬«      }| j                  t        j
                  |j                  dd«       y)úl
        Writing to an IPv6 address on an IPv4 socket will raise an
        L{InvalidAddressError}.
        r�   rt   rÈ   )r   rÊ   NrË   ri   s      r"   Ú1test_writingToIPv6OnIPv4RaisesInvalidAddressErrorzCUDPPortTestsMixin.test_writingToIPv6OnIPv4RaisesInvalidAddressErrory  sK   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÈKÐ$ÓXˆØ×Ñœ%×3Ñ3°T·Z±ZÀÈÕTr)   c                 ó´   — | j                  «       }| j                  |t        «       d¬«      }| j                  t        j
                  |j                  dd«       y)rÎ   r   rt   rÈ   )r�   rÊ   NrË   ri   s      r"   Ú1test_writingToIPv4OnIPv6RaisesInvalidAddressErrorzCUDPPortTestsMixin.test_writingToIPv4OnIPv6RaisesInvalidAddressErrorƒ  sO   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÈEÐ$ÓRˆØ×ÑÜ×%Ñ% t§z¡z°6Ð;Kõ	
r)   c                 ó°   — | j                  «       }| j                  |t        «       «      }| j                  t        j
                  |j                  dd«       y)zq
        Connecting to a hostname instead of an IP address will raise an
        L{InvalidAddressError}.
        rÉ   rÊ   N)r:   r;   r   ry   r   rz   rÄ   ri   s      r"   Ú2test_connectingToHostnameRaisesInvalidAddressErrorzDUDPPortTestsMixin.test_connectingToHostnameRaisesInvalidAddressError�  sH   € ð
 ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ×Ñœ%×3Ñ3°T·\±\ÐCTÐVWÕXr)   c                 ó¸   — | j                  «       }| j                  |t        «       «      }|j                  d«       | j	                  |j                  «       «       y)zk
        L{IListeningPort.setBroadcastAllowed} sets broadcast to be allowed
        on the socket.
        TN)r:   r;   r   ÚsetBroadcastAllowedrb   ÚgetBroadcastAllowedri   s      r"   Útest_allowBroadcastz%UDPPortTestsMixin.test_allowBroadcast˜  sK   € ð
 ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ× Ñ  Ô&Ø�‰˜×0Ñ0Ó2Õ3r)   N)r4   r5   r6   re   rj   rr   r(   rw   r|   r•   r£   r§   rª   rÁ   rÆ   rÌ   rÏ   rÑ   rÓ   r×   r0   r)   r"   rg   rg   ‹   s¨   „ ñò
<òOð ñ	1ó ð	1ò
ò"!òH!ò8;ò<ð ñ*Fó ð*FðX ñ.Fó ð.Fò`	
ð ñUó ðUð ñ	
ó ð	
òYó4r)   rg   c                   ó    — e Zd ZdZefZ	 dd„Zy)ÚUDPServerTestsBuilderzM
    Run L{UDPPortTestsMixin} tests using newly created UDP
    sockets.
    c                 ó,   — |j                  ||||¬«      S )aB  
        Get a UDP port from a reactor.

        @param reactor: A reactor used to build the returned
            L{IListeningPort} provider.
        @type reactor: L{twisted.internet.interfaces.IReactorUDP}

        @see: L{twisted.internet.IReactorUDP.listenUDP} for other
            argument and return types.
        )rm   ÚmaxPacketSize)r{   )r2   r@   rA   r=   rm   rÛ   s         r"   r;   z&UDPServerTestsBuilder.getListeningPort­  s%   € ð × Ñ Ø�( i¸}ð !ó 
ð 	
r)   N©r   Ú i    )r4   r5   r6   re   r   ÚrequiredInterfacesr;   r0   r)   r"   rÙ   rÙ   £  s   „ ñð
 &˜Ðð FJô
r)   rÙ   c                   ó    — e Zd ZdZefZ	 dd„Zy)ÚUDPFDServerTestsBuilderzC
    Run L{UDPPortTestsMixin} tests using adopted UDP sockets.
    c                 ó<  — t        j                  |«      rØd|v r-t        j                  }t        j                  ||«      d   d   }nt        j
                  }||f}t        j                  |t        j                  «      }|j                  |«       |j                  d«       	 |j                  |j                  «       |j                  ||«      |j                  «        |j                  «        S t        d«      ‚# |j                  «        |j                  «        w xY w)aÄ  
        Get a UDP port from a reactor, wrapping an already-initialized file
        descriptor.

        @param reactor: A reactor used to build the returned
            L{IListeningPort} provider.
        @type reactor: L{twisted.internet.interfaces.IReactorSocket}

        @param port: A port number to which the adopted socket will be
            bound.
        @type port: C{int}

        @param interface: The local IPv4 or IPv6 address to which the
            adopted socket will be bound.  defaults to '', ie all IPv4
            addresses.
        @type interface: C{str}

        @see: L{twisted.internet.IReactorSocket.adoptDatagramPort} for other
            argument and return types.
        ú:r   é   Fz'Reactor does not provide IReactorSocket)r   Ú
providedByr   r   ÚgetaddrinfoÚAF_INETro   r   ÚsetblockingÚadoptDatagramPortÚfilenoÚfamilyr   r   )	r2   r@   rA   r=   rm   rÛ   Údomainr”   ÚportSocks	            r"   r;   z(UDPFDServerTestsBuilder.getListeningPortÈ  sç   € ô. ×$Ñ$ WÔ-Ø�iÑÜŸ™�Ü ×,Ñ,¨Y¸Ó=¸aÑ@ÀÑC‘äŸ™�Ø$ dÐ+�Ü—}‘} V¬V×->Ñ->Ó?ˆHØ�M‰M˜'Ô"Ø× Ñ  Ô'ð
!Ø×0Ñ0Ø—O‘OÓ% x§¡¸À-óð —‘Ô!ð —‘Õ äÐDÓEÐEøð —‘Ô!ð —‘Õ ús   Â"+C9 Ã9"DNrÜ   )r4   r5   r6   re   r   rÞ   r;   r0   r)   r"   rà   rà   ¿  s   „ ñð )Ð*Ðð FJô-Fr)   rà   )/re   r   Úzope.interfacer   Úzope.interface.verifyr   Útwisted.internetr   r   Útwisted.internet.addressr   r   Útwisted.internet.deferr	   r
   Útwisted.internet.interfacesr   r   r   r   Útwisted.internet.protocolr   Ú&twisted.internet.test.connectionmixinsr   r   Ú#twisted.internet.test.reactormixinsr   Útwisted.pythonr   Útwisted.python.logr   r   Útwisted.test.test_udpr   r   Útwisted.trial.unittestr   r#   r%   r(   r+   rg   rÙ   rà   ÚglobalsÚupdateÚmakeTestCaseClassesr0   r)   r"   ú<module>rý      sÎ   ðñó å &Ý .ç )ß =ß :÷ó õ 7ß QÝ >Ý "ß /ß 4Ý +òñ" ‹;€òôM2Ð"2ô M2÷`U4ñ U4ôp
ØÐ%Ð'Bô
ô86FØÐ%Ð'Bô6Fñr ƒ	× Ñ Ð&×:Ñ:Ó<Ô =Ù ƒ	× Ñ Ð(×<Ñ<Ó>Õ ?r)   