+
    üÐjO@  ã                   óÌ  € R t ^ RIt^ RIHt ^ RIHt ^ RIHtHt ^ RI	H
t
Ht ^ RIHtHt ^ RIHtHtHtHt ^ RIHt ^ R	IHtHt ^ R
IHt ^ RIHt ^ RIHtHt ^ RI H!t!H"t" ^ RI#H$t$ ^ RI%H&t&  ! R R]4      t' ! R R4      t( ! R R]](]'4      t) ! R R]](]'4      t*]+! 4       PY                  ])P[                  4       4       ]+! 4       PY                  ]*P[                  4       4       R# )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)ÚskipWithoutIPv6)ÚSkipTestc                   ó6   a € ] tR t^"t o RtR tR tR tRtV t	R# )ÚDatagramTransportTestsMixinzH
Mixin defining tests which apply to any port/datagram based transport.
c                ó>  € V P                  4       pV P                  4       p\        \        4       ! R R\        4      4       pV! 4       pV P                  W$4      pRVP                  4       P                  3,          pV P                  V3V^ ,          R,          4       R# )z]
When a port starts, a message including a description of the associated
protocol is logged.
c                   ó&   a € ] tR t^/t o R tRtV tR# )ÚQDatagramTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeProtocolc                ó   € R # )zCrazy Protocol© ©Úselfs   &Ú@/usr/lib/python3/dist-packages/twisted/internet/test/test_udp.pyÚ	logPrefixÚ[DatagramTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeProtocol.logPrefix1   s   € Ù'ó    r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r#   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r"   ÚSomeProtocolr   /   s   ø‡ € ÷(ð (r%   r.   zCrazy Protocol starting on %dÚmessageN)	ÚobserveÚbuildReactorr   r   r   ÚgetListeningPortÚgetHostÚportÚassertEqual)r!   ÚloggedMessagesÚreactorr.   ÚprotocolÚpÚexpectedMessages   &      r"   Útest_startedListeningLogMessageÚ;DatagramTransportTestsMixin.test_startedListeningLogMessage'   s‹   € ð
 Ÿ™›ˆØ×#Ñ#Ó%ˆä	”_Ó	%ô	(Ô+ó 	(ó 
&ð	(ñ  “>ˆà×!Ñ! 'Ó4ˆØ9¸Q¿Y¹Y»[×=MÑ=MÐ<OÕOˆØ×Ñ˜/Ð+¨^¸AÕ->¸yÕ-IÖJr%   c                ó`  aaaa€ V P                  4       oV P                  4       oV P                  S\        4       4      oRSP	                  4       P
                   R2pV3R loVVV3R lpSP                  V4       V P                  S4       V P                  V3S^ ,          R,          4       R# )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                 ó(   <€ SP                  4        R # ©N©Ústop©Úignoredr7   s   &€r"   ÚstopReactorÚNDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.stopReactorD   s   ø€ Ø�L‰LŽNr%   c                  óV   <€ S R  \        SP                  4      P                  S4       R# ):NNNN)r	   ÚstopListeningÚaddCallback)r6   r9   rD   s   €€€r"   ÚdoStopListeningÚRDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.doStopListeningG   s"   ø€ Ø˜qÐ!Ü˜!Ÿ/™/Ó*×6Ñ6°{ÖCr%   r/   N)	r0   r1   r2   r   r3   r4   ÚcallWhenRunningÚ
runReactorr5   )r!   r:   rI   r6   r9   r7   rD   s   &  @@@@r"   Útest_connectionLostLogMessageÚ9DatagramTransportTestsMixin.test_connectionLostLogMessage:   s“   û€ ð
 Ÿ™›ˆØ×#Ñ#Ó%ˆØ×!Ñ! 'Ô+;Ó+=Ó>ˆØ& q§y¡y£{×'7Ñ'7Ð&8¸ÐAˆõ	÷	Dð 	×Ñ Ô0Ø�‰˜Ô à×Ñ˜/Ð+¨^¸AÕ->¸yÕ-IÖJr%   c                óB  a€  ! V3R lR\         4      pV P                  4       oV! 4       pV P                  SV4       V P                  S4       V P	                  VP
                  4       V P	                  VP                  4       V P                  VP                  4       R# )z�
L{DatagramProtocol.stopProtocol} is called asynchronously (ie, not
re-entrantly) when C{stopListening} is used to stop the datagram
transport.
c                   óD   <a € ] tR t^Wt o RtRtRtRtR tV3R lt	Rt
V tR# )ÚVDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocolFc                ód   € R V n         R V n        V P                  P                  4        RV n        R# )TFN)ÚstartedÚinStartProtocolÚ	transportrG   r    s   &r"   ÚstartProtocolÚdDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.startProtocol]   s)   € Ø#�”Ø'+�Ô$Ø—‘×,Ñ,Ô.Ø',�Ö$r%   c                óX   <€ R V n         V P                  V n        SP                  4        R# )TN)ÚstoppedrT   ÚstoppedInStartrA   ©r!   r7   s   &€r"   ÚstopProtocolÚcDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.stopProtocolc   s!   ø€ Ø#�”Ø&*×&:Ñ&:�Ô#Ø—‘–r%   )rT   rS   rY   rZ   N)r&   r'   r(   r)   rS   rY   rT   rZ   rV   r\   r*   r+   )r-   r7   s   @€r"   ÚDisconnectingProtocolrQ   W   s(   ù‡ € ØˆGØˆGØ#ˆOØ"ˆNò-÷ó r%   r^   N)	r   r1   r2   rL   Ú
assertTruerS   rY   ÚassertFalserZ   )r!   r^   r8   r7   s   &  @r"   Útest_stopProtocolSchedulingÚ7DatagramTransportTestsMixin.test_stopProtocolSchedulingP   s|   ø€ ÷	Ô$4ô 	ð" ×#Ñ#Ó%ˆÙ(Ó*ˆØ×Ñ˜g xÔ0Ø�‰˜Ô à�‰˜×(Ñ(Ô)Ø�‰˜×(Ñ(Ô)Ø×Ñ˜×0Ñ0Ö1r%   r   N)
r&   r'   r(   r)   Ú__doc__r;   rM   ra   r*   r+   r,   s   @r"   r   r   "   s    ø‡ € ñòKò&K÷,2ð 2r%   r   c                   ó°   a € ] tR t^rt o RtR tR t]R 4       tR t	R t
R tR tR	 t]R
 4       t]R 4       tR t]R 4       t]R 4       tR tR tRtV tR# )ÚUDPPortTestsMixinzM
Tests for L{IReactorUDP.listenUDP} and
L{IReactorSocket.adoptDatagramPort}.
c                ó˜   € V P                  4       pV P                  V\        4       4      pV P                  \	        \
        V4      4       R# )zI
L{IReactorUDP.listenUDP} returns an object providing L{IListeningPort}.
N)r1   r2   r   r_   r   r
   ©r!   r7   r4   s   &  r"   Útest_interfaceÚ UDPPortTestsMixin.test_interfacex   s;   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ�‰œ¤^°TÓ:Ö;r%   c                óê   € \        \        P                  R7      w  rV P                  4       pV P	                  V\        4       W!R7      pV P                  VP                  4       \        RW4      4       R# )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)r4   Ú	interfaceÚUDPN)	r   ÚsocketÚ
SOCK_DGRAMr1   r2   r   r5   r3   r   )r!   ÚhostÚ
portNumberr7   r4   s   &    r"   Útest_getHostÚUDPPortTestsMixin.test_getHost€   sd   € ô (¬V×->Ñ->Ô?ÑˆØ×#Ñ#Ó%ˆØ×$Ñ$ØÔ%Ó'¨jð %ó 
ˆð 	×Ñ˜Ÿ™›¬°U¸DÓ)MÖNr%   c                óâ   € V P                  4       pV P                  V\        4       RR7      pVP                  4       pV P	                  VP
                  R4       V P                  V\        4       R# )zZ
L{IListeningPort.getHost} returns an L{IPv6Address} when listening on
an IPv6 interface.
ú::1©rl   N)r1   r2   r   r3   r5   rp   ÚassertIsInstancer   )r!   r7   r4   Úaddrs   &   r"   Útest_getHostIPv6Ú"UDPPortTestsMixin.test_getHostIPv6�   s\   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÈEÐ$ÓRˆØ�|‰|‹~ˆØ×Ñ˜Ÿ™ EÔ*Ø×Ñ˜d¤KÖ0r%   c                ó’   € V P                  4       pV P                  \        P                  VP                  \        4       ^ RR7       R# )zr
An L{InvalidAddressError} is raised when trying to listen on an address
that isn't a valid IPv4 or IPv6 address.
zexample.comrv   N)r1   ÚassertRaisesr   ÚInvalidAddressErrorÚ	listenUDPr   r[   s   & r"   Útest_invalidInterfaceÚ'UDPPortTestsMixin.test_invalidInterface™   sC   € ð
 ×#Ñ#Ó%ˆØ×ÑÜ×%Ñ%Ø×ÑÜÓØØ#ð 	ö 	
r%   c                ó”  a a€  ! R R\         4      pS P                  4       oV! R4      pVP                  pS P                  SV4      pVP	                  4       pV 3R lpVP                  V4       VP                  \        4       VP                  V3R l4       VP                  RRVP                  34       S P                  S4       R# )	zz
Datagram transports implement L{ILoggingContext.logPrefix} to return a
message reflecting the protocol they are running.
c                   ó2   a € ] tR t^­t o R tR tR tRtV tR# )ÚIUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocolc                ó0   € Wn         \        4       V n        R # r?   )Ú_prefixr   Úsystem)r!   Úprefixs   &&r"   Ú__init__ÚRUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.__init__®   s   € Ø%”Ü&›j�–r%   c                ó   € V P                   # r?   )r…   r    s   &r"   r#   ÚSUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.logPrefix²   s   € Ø—|‘|Ð#r%   c                ó¬   € V P                   eF   V P                   pR V n         VP                  \        P                  ! \        4      R,          4       R # R # )Nr†   )r†   Úcallbackr   Úgetr   )r!   Úbytesrx   r†   s   &&& r"   ÚdatagramReceivedÚZUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.datagramReceivedµ   s;   € Ø—;‘;Ò*Ø!Ÿ[™[�FØ"&�D”KØ—O‘O¤G§K¢K´Ó$<¸XÕ$FÖGñ +r%   )r…   r†   N)	r&   r'   r(   r)   rˆ   r#   r�   r*   r+   r,   s   @r"   ÚCustomLogPrefixDatagramProtocolrƒ   ­   s   ø‡ € ò)ò$÷Hð Hr%   r’   zCustom Datagramsc                 ó,   <€ SP                  R V 4       R# )zCustom Datagrams (UDP)N)r5   )r†   r!   s   &€r"   Ú	gotSystemÚ3UDPPortTestsMixin.test_logPrefix.<locals>.gotSystemÁ   s   ø€ Ø×ÑÐ5°vÖ>r%   c                 ó$   <€ SP                  4       # r?   r@   rB   s   &€r"   Ú<lambda>Ú2UDPPortTestsMixin.test_logPrefix.<locals>.<lambda>Æ   s   ø€  g§l¡l¤nr%   s
   some bytesú	127.0.0.1N)r   r1   r†   r2   r3   rH   Ú
addErrbackr   Úwriter4   rL   )r!   r’   r8   Údr4   Úaddressr”   r7   s   f      @r"   Útest_logPrefixÚ UDPPortTestsMixin.test_logPrefix§   s¢   ù€ ô	HÔ.>ô 	Hð ×#Ñ#Ó%ˆÙ2Ð3EÓFˆØ�O‰OˆØ×$Ñ$ W¨hÓ7ˆØ—,‘,“.ˆõ	?ð 	
�‰�iÔ Ø	�‰”SÔØ	�‰Ô4Ô5à�
‰
�= ;°·±Ð"=Ô>Ø�‰˜Ö r%   c                ó   a aa€  ! R R\         4      pS P                  4       oV! 4       pVP                  pS P                  SV4      pVP	                  4       pRoVV 3R lpVP
                  ! V4       VP                  ! \        4       VP
                  ! V3R l4       VP                  SRVP                  34       S P                  S4       R# )z8
Write a sequence of L{bytes} to a L{DatagramProtocol}.
c                   ó,   a € ] tR t^Ðt o R tR tRtV tR# )ÚDUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocolc                ó$   € \        4       V n        R # r?   )r   r   r    s   &r"   rˆ   ÚMUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.__init__Ñ   s   € Ü%›Z�–
r%   c                ó<   € V P                   P                  V4       R # r?   )r   r�   )r!   Údatarx   s   &&&r"   r�   ÚUUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.datagramReceivedÔ   s   € Ø—
‘
×#Ñ# DÖ)r%   )r   N)r&   r'   r(   r)   rˆ   r�   r*   r+   r,   s   @r"   ÚSimpleDatagramProtocolr¢   Ð   s   ø‡ € ò(÷*ð *r%   r¨   c                 óJ   <€ SP                  R P                  S4      V 4       R# )r%   N)r5   Újoin)r¦   ÚdataToWriter!   s   &€€r"   ÚgotDataÚ5UDPPortTestsMixin.test_writeSequence.<locals>.gotDataÞ   s   ø€ Ø×Ñ˜SŸX™X kÓ2°DÖ9r%   c                 ó$   <€ SP                  4       # r?   r@   rB   s   &€r"   r—   Ú6UDPPortTestsMixin.test_writeSequence.<locals>.<lambda>ã   s   ø€ ¨'¯,©,¬.r%   r™   N)s   somes   bytess   tos   write)r   r1   r   r2   r3   rH   rš   r   ÚwriteSequencer4   rL   )	r!   r¨   r8   r   r4   r�   r¬   r«   r7   s	   f      @@r"   Útest_writeSequenceÚ$UDPPortTestsMixin.test_writeSequenceË   sª   ú€ ô
	*Ô%5ô 	*ð ×#Ñ#Ó%ˆÙ)Ó+ˆØ—‘ˆØ×$Ñ$ W¨hÓ7ˆØ—,‘,“.ˆØ:ˆö	:ð 	×Ò˜'Ô"Ø×ÒœÔØ×ÒÔ8Ô9Ø×Ñ˜;¨°g·l±lÐ(CÔDØ�‰˜Ö r%   c                óÒ   € V P                  4       pV P                  V\        4       4      pV P                  \	        VP                  4       P                  4      \	        V4      4       R# )zA
C{str()} on the listening port object includes the port number.
N)r1   r2   r   ÚassertInÚstrr3   r4   rg   s   &  r"   Útest_strÚUDPPortTestsMixin.test_strç   sK   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ�‰”c˜$Ÿ,™,›.×-Ñ-Ó.´°D³	Ö:r%   c                óÒ   € V P                  4       pV P                  V\        4       4      pV P                  \	        VP                  4       P                  4      \        V4      4       R# )zB
C{repr()} on the listening port object includes the port number.
N)r1   r2   r   r´   Úreprr3   r4   rµ   rg   s   &  r"   Ú	test_reprÚUDPPortTestsMixin.test_reprï   sK   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ�‰”d˜4Ÿ<™<›>×.Ñ.Ó/´°T³Ö;r%   c                óš  aa	a
€ V P                  4       o	\        4       o
\        P                  ! 4       ;pS
n        V P                  S	S
RR7       \        4       o\        P                  ! 4       ;pSn        V P                  S	SRR7       SP                  P                  4       pVV
3R lpV	3R lp\        P                  ! W.4      pVP                  V4       VP                  V4       VP                  \        4       V P                  S	4       S
P                  ^ ,          pV P                  VRVP                   VP"                  334       R# )zC
Writing to an IPv6 UDP socket on the loopback interface succeeds.
ru   rv   c                óÀ   <€ SP                   P                  RRSP                   P                  4       P                  34       \        P
                  ! 4       ;pSn        V# )ú¿
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.
ó   spamru   )rU   r›   r3   r4   r   r   ÚpacketReceived©rC   ÚserverReceivedÚclientÚservers   & €€r"   ÚcbClientStartedÚDUDPPortTestsMixin.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                ó(   <€ SP                  4        R# ©zm
Stop the reactor after a datagram is received.

@param ignored: L{None}, which is ignored
@returns: L{None}
Nr@   rB   s   &€r"   ÚcbServerReceivedÚEUDPPortTestsMixin.test_writeToIPv6Interface.<locals>.cbServerReceived  s   ø€ ð �L‰LŽNr%   r¿   N©r1   r   r   r   ÚstartedDeferredr2   r   rU   r3   ÚgatherResultsrH   rš   r   rL   Úpacketsr5   rp   r4   ©r!   ÚserverStartedÚclientStartedÚcAddrrÅ   rÉ   rœ   ÚpacketrÃ   r7   rÄ   s   &       @@@r"   Útest_writeToIPv6InterfaceÚ+UDPPortTestsMixin.test_writeToIPv6Interface÷   s  ú€ ð
 ×#Ñ#Ó%ˆÜ“ˆÜ16·²Ó1AÐAˆ˜Ô.Ø×Ñ˜g v¸ÐÔ?ä“ˆÜ16·²Ó1AÐAˆ˜Ô.Ø×Ñ˜g v¸ÐÔ?Ø× Ñ ×(Ñ(Ó*ˆö
	"õ	ô ×Ò Ð >Ó?ˆØ	�‰�oÔ&Ø	�‰Ð&Ô'Ø	�‰”SÔØ�‰˜Ô à—‘ Õ"ˆØ×Ñ˜ '¨E¯J©J¸¿
¹
Ð+CÐ!DÖEr%   c                óš  aa	a
€ V P                  4       o	\        4       o
\        P                  ! 4       ;pS
n        V P                  S	S
RR7       \        4       o\        P                  ! 4       ;pSn        V P                  S	SRR7       SP                  P                  4       pVV
3R lpV	3R lp\        P                  ! W.4      pVP                  V4       VP                  V4       VP                  \        4       V P                  S	4       S
P                  ^ ,          pV P                  VRVP                   VP"                  334       R# )zx
An IPv6 address can be passed as the C{interface} argument to
L{listenUDP}. The resulting Port accepts IPv6 datagrams.
ru   rv   c                óò   <€ SP                   P                  RSP                   P                  4       P                  4       SP                   P	                  R4       \
        P                  ! 4       ;pSn        V# )r¾   ru   r¿   )rU   Úconnectr3   r4   r›   r   r   rÀ   rÁ   s   & €€r"   rÅ   ÚMUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbClientStarted4  s^   ø€ ð ×Ñ×$Ñ$ U¨F×,<Ñ,<×,DÑ,DÓ,F×,KÑ,KÔLØ×Ñ×"Ñ" 7Ô+Ü5:·^²^Ó5EÐEˆN˜VÔ2Ø!Ð!r%   c                ó(   <€ SP                  4        R# rÈ   r@   rB   s   &€r"   rÉ   ÚNUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbServerReceivedB  s   ø€ ð �L‰LŽNr%   r¿   NrË   rÏ   s   &       @@@r"   Ú"test_connectedWriteToIPv6InterfaceÚ4UDPPortTestsMixin.test_connectedWriteToIPv6Interface$  s  ú€ ð ×#Ñ#Ó%ˆÜ“ˆÜ16·²Ó1AÐAˆ˜Ô.Ø×Ñ˜g v¸ÐÔ?ä“ˆÜ16·²Ó1AÐAˆ˜Ô.Ø×Ñ˜g v¸ÐÔ?Ø× Ñ ×(Ñ(Ó*ˆö	"õ	ô ×Ò Ð >Ó?ˆØ	�‰�oÔ&Ø	�‰Ð&Ô'Ø	�‰”SÔØ�‰˜Ô à—‘ Õ"ˆØ×Ñ˜ '¨E¯J©J¸¿
¹
Ð+CÐ!DÖEr%   c                ó²   € V P                  4       pV P                  V\        4       4      pV P                  \        P
                  VP                  RR4       R# )zV
Writing to a hostname instead of an IP address will raise an
L{InvalidAddressError}.
ÚspamN)úexample.invalidé   ©r1   r2   r   r|   r   r}   r›   rg   s   &  r"   Ú/test_writingToHostnameRaisesInvalidAddressErrorÚAUDPPortTestsMixin.test_writingToHostnameRaisesInvalidAddressErrorU  sJ   € ð
 ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ×ÑÜ×%Ñ% t§z¡z°6Ð;Qö	
r%   c                ó¶   € V P                  4       pV P                  V\        4       RR7      pV P                  \        P
                  VP                  RR4       R# )úT
Writing to an IPv6 address on an IPv4 socket will raise an
L{InvalidAddressError}.
r™   rv   rß   N)ru   rá   râ   rg   s   &  r"   Ú1test_writingToIPv6OnIPv4RaisesInvalidAddressErrorÚCUDPPortTestsMixin.test_writingToIPv6OnIPv4RaisesInvalidAddressError`  sK   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÈKÐ$ÓXˆØ×Ñœ%×3Ñ3°T·Z±ZÀÈÖTr%   c                ó¶   € V P                  4       pV P                  V\        4       RR7      pV P                  \        P
                  VP                  RR4       R# )ræ   ru   rv   rß   N)r™   rá   râ   rg   s   &  r"   Ú1test_writingToIPv4OnIPv6RaisesInvalidAddressErrorÚCUDPPortTestsMixin.test_writingToIPv4OnIPv6RaisesInvalidAddressErrorj  sO   € ð ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÈEÐ$ÓRˆØ×ÑÜ×%Ñ% t§z¡z°6Ð;Kö	
r%   c                ó²   € V P                  4       pV P                  V\        4       4      pV P                  \        P
                  VP                  R^4       R# )zY
Connecting to a hostname instead of an IP address will raise an
L{InvalidAddressError}.
rà   N)r1   r2   r   r|   r   r}   rØ   rg   s   &  r"   Ú2test_connectingToHostnameRaisesInvalidAddressErrorÚDUDPPortTestsMixin.test_connectingToHostnameRaisesInvalidAddressErrorv  sH   € ð
 ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ×Ñœ%×3Ñ3°T·\±\ÐCTÐVWÖXr%   c                óº   € V P                  4       pV P                  V\        4       4      pVP                  R4       V P	                  VP                  4       4       R# )zS
L{IListeningPort.setBroadcastAllowed} sets broadcast to be allowed
on the socket.
TN)r1   r2   r   ÚsetBroadcastAllowedr_   ÚgetBroadcastAllowedrg   s   &  r"   Útest_allowBroadcastÚ%UDPPortTestsMixin.test_allowBroadcast  sK   € ð
 ×#Ñ#Ó%ˆØ×$Ñ$ WÔ.>Ó.@ÓAˆØ× Ñ  Ô&Ø�‰˜×0Ñ0Ó2Ö3r%   r   N)r&   r'   r(   r)   rc   rh   rr   r   ry   r   rž   r±   r¶   rº   rÔ   rÜ   rã   rç   rê   rí   rò   r*   r+   r,   s   @r"   re   re   r   s°   ø‡ € ñò
<òOð ñ	1ó ð	1ò
ò"!òH!ò8;ò<ð ñ*Fó ð*FðX ñ.Fó ð.Fò`	
ð ñUó ðUð ñ	
ó ð	
òY÷4ð 4r%   re   c                   ó4   a € ] tR tRt o Rt]3tRR ltRtV t	R# )ÚUDPServerTestsBuilderiŠ  zA
Run L{UDPPortTestsMixin} tests using newly created UDP
sockets.
c                ó(   € VP                  W2WER7      # )a
  
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.
)rl   ÚmaxPacketSize)r~   )r!   r7   r8   r4   rl   r÷   s   &&&&&&r"   r2   Ú&UDPServerTestsBuilder.getListeningPort”  s!   € ð × Ñ Ø ið !ó 
ð 	
r%   r   N©é    Ú i    )
r&   r'   r(   r)   rc   r   ÚrequiredInterfacesr2   r*   r+   r,   s   @r"   rõ   rõ   Š  s   ø‡ € ñð
 &˜Ð÷
ò 
r%   rõ   c                   ó4   a € ] tR tRt o Rt]3tRR ltRtV t	R# )ÚUDPFDServerTestsBuilderi¦  z;
Run L{UDPPortTestsMixin} tests using adopted UDP sockets.
c                ó^  € \         P                  ! V4      '       dã   RV9   d6   \        P                  p\        P                  ! WC4      ^ ,          ^,          pM\        P
                  pWC3p\        P                  ! V\        P                  4      pVP                  V4       VP                  R4        VP                  VP                  4       VP                  W%4      VP                  4        VP                  4        # \        R4      h  TP                  4        TP                  4        i ; i)aL  
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.
Ú:Fz'Reactor does not provide IReactorSocket)r   Ú
providedByrn   ÚAF_INET6ÚgetaddrinfoÚAF_INETro   ÚbindÚsetblockingÚadoptDatagramPortÚfilenoÚfamilyÚcloser   )	r!   r7   r8   r4   rl   r÷   Údomainr�   ÚportSocks	   &&&&&&   r"   r2   Ú(UDPFDServerTestsBuilder.getListeningPort¯  sä   € ô. ×$Ò$ W×-Ò-Ø�iÔÜŸ™�Ü ×,Ò,¨YÓ=¸aÕ@ÀÕC‘äŸ™�Ø$Ð+�Ü—}’} V¬V×->Ñ->Ó?ˆHØ�M‰M˜'Ô"Ø× Ñ  Ô'ð
!Ø×0Ñ0Ø—O‘OÓ% x§¡¸óð —‘Ô!ð —‘Õ äÐDÓEÐEøð —‘Ô!ð —‘Õ ús   Â4*D
 Ä
"D,r   Nrù   )
r&   r'   r(   r)   rc   r   rü   r2   r*   r+   r,   s   @r"   rþ   rþ   ¦  s!   ø‡ € ñð )Ð*Ð÷-Fò -Fr%   rþ   ).rc   rn   Ú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.test.testutilsr   Útwisted.trial.unittestr   r   re   rõ   rþ   ÚglobalsÚupdateÚmakeTestCaseClassesr   r%   r"   Ú<module>r     s¾   ðñó å &Ý .ç )ß =ß :÷ó õ 7ß QÝ >Ý "ß /ß 4Ý 2Ý +ôM2Ð"2ô M2÷`U4ñ U4ôp
ØÐ%Ð'Bô
ô86FØÐ%Ð'Bô6Fñr ƒ	× Ñ Ð&×:Ñ:Ó<Ô =Ù ƒ	× Ñ Ð(×<Ñ<Ó>Ö ?r%   