ó
    ×›‘h}w  ã                  ó¶  • S r SSKJr  SSKrSSKJrJrJrJrJ	r	J
r
JrJrJrJrJr  SSKJr  SSKJrJrJrJrJrJr  SSKJrJr  SSKJrJrJr  SS	KJ r   SS
K!J"r"J#r#J$r$  SSK%J&r&  SSK'J(r(  SSK)J*r*  SSK+J,r,J-r-   " S S5      r. " S S\.\R^                  5      r0 " S S\.\Rb                  5      r2 " S S\05      r3 " S S\45      r5 " S S\R^                  5      r6\" \Rn                  " \S5      (       + S5       " S S\-5      5       r8\" \Rn                  " \S5      (       + S5       " S S\-5      5       r9            S,S  jr:\" \RF                  " \S5      (       + S!5      \" \:" \\\S"S#5      (       + S$5       " S% S&\-5      5       5       r;\" \RF                  " \S5      (       + S!5      \*\" \:" \\	\
S'S(5      (       + S)5       " S* S+\;5      5       5       5       r<g)-zG
Tests for implementations of L{IReactorUDP} and L{IReactorMulticast}.
é    )ÚannotationsN)ÚAF_INETÚAF_INET6ÚIP_ADD_MEMBERSHIPÚ
IPPROTO_IPÚIPPROTO_IPV6ÚIPV6_JOIN_GROUPÚ
SOCK_DGRAMÚAddressFamilyÚif_nameindexÚ	inet_ptonÚsocket)ÚskipIf)ÚdeferÚerrorÚ
interfacesÚprotocolÚreactorÚudp)ÚIPv4AddressÚIPv6Address)ÚDeferredÚgatherResultsÚmaybeDeferred)ÚMulticastJoinError)ÚIMulticastTransportÚIReactorMulticastÚIReactorTime)Ú
deferLater)Úruntime)ÚskipWithoutIPv6)ÚSkipTestÚTestCasec                  ó2   • \ rS rSrSrSrSrS rS rS r	Sr
g)ÚMixiné*   r   Nc                ó   • / U l         g ©N)Úpackets©Úselfs    ÚYC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/test/test_udp.pyÚ__init__ÚMixin.__init__0   s	   € Øˆ�ó    c                óv   • SU l         U R                  b%  U R                  S sol        UR                  S 5        g g ©Né   )ÚstartedÚstartedDeferredÚcallback©r+   Úds     r,   ÚstartProtocolÚMixin.startProtocol3   s9   € ØˆŒØ×ÑÑ+Ø&*×&:Ñ&:¸DÐ#ˆAÔ#Ø�J‰J�tÕð ,r/   c                ó   • SU l         g r1   )Ústoppedr*   s    r,   ÚstopProtocolÚMixin.stopProtocol9   s	   € Øˆ�r/   )r)   r3   r4   r;   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r3   r;   r4   r-   r8   r<   Ú__static_attributes__© r/   r,   r%   r%   *   s    † Ø€GØ€Gà€Oòòõr/   r%   c                  ó8   • \ rS rSr% SrS\S'   SrS\S'   S rS	rg)
ÚServeré=   NzDeferred[None] | NoneÚpacketReceivedr   r   Ú	transportc                ó    • U R                   R                  X45        U R                  b%  U R                  S so0l        UR                  S 5        g g r(   ©r)   ÚappendrG   r5   )r+   ÚdataÚaddrr7   s       r,   ÚdatagramReceivedÚServer.datagramReceivedB   sF   € Ø�‰×Ñ˜T˜LÔ)Ø×ÑÑ*Ø%)×%8Ñ%8¸$Ð"ˆAÔ"Ø�J‰J�tÕð +r/   )rG   )	r>   r?   r@   rA   rG   Ú__annotations__ÚrefusedrN   rB   rC   r/   r,   rE   rE   =   s   ‡ Ø,0€NÐ)Ó0Ø€GØ"Ó"õr/   rE   c                  ó.   • \ rS rSrSrSrS rS rS rSr	g)ÚClientéI   Nr   c                óž   • U R                   R                  U5        U R                  b%  U R                  S so l        UR                  S 5        g g r(   rJ   )r+   rL   r7   s      r,   rN   ÚClient.datagramReceivedM   sD   € Ø�‰×Ñ˜DÔ!Ø×ÑÑ*Ø%)×%8Ñ%8¸$Ð"ˆAÔ"Ø�J‰J�tÕð +r/   c                ór   • U R                   b$  U R                   S so l         UR                  U5        Xl        g r(   )r4   ÚerrbackÚfailure)r+   rY   r7   s      r,   ÚconnectionFailedÚClient.connectionFailedS   s2   € Ø×ÑÑ+Ø&*×&:Ñ&:¸DÐ#ˆAÔ#Ø�I‰I�gÔØ�r/   c                óœ   • U R                   b8  U R                   S sol         UR                  [        R                  " S5      5        SU l        g ©NÚyupr2   ©r4   rX   r   ÚConnectionRefusedErrorrQ   r6   s     r,   ÚconnectionRefusedÚClient.connectionRefusedY   ó?   € Ø×ÑÑ+Ø&*×&:Ñ&:¸DÐ#ˆAÔ#Ø�I‰I”e×2Ò2°5Ó9Ô:Øˆ�r/   )rY   rG   rQ   r4   )
r>   r?   r@   rA   rG   rQ   rN   rZ   ra   rB   rC   r/   r,   rS   rS   I   s   † Ø€NØ€Gòòõr/   rS   c                  ó   • \ rS rSrS rSrg)Ú
GoodClienté`   c                óœ   • U R                   b8  U R                   S sol         UR                  [        R                  " S5      5        SU l        g r]   r_   r6   s     r,   ra   ÚGoodClient.connectionRefuseda   rc   r/   )rQ   r4   N)r>   r?   r@   rA   ra   rB   rC   r/   r,   re   re   `   s   † õr/   re   c                  ó   • \ rS rSrSrSrg)ÚBadClientErroréh   zZ
Raised by BadClient at the end of every datagramReceived call to try and
screw stuff up.
rC   N)r>   r?   r@   rA   Ú__doc__rB   rC   r/   r,   rj   rj   h   s   † ôr/   rj   c                  ó(   • \ rS rSrSrSrS rS rSrg)Ú	BadClientéo   z‘
A DatagramProtocol which always raises an exception from datagramReceived.
Used to test error handling behavior in the reactor for that method.
Nc                ó   • Xl         g)zM
Set the Deferred which will be called back when datagramReceived is
called.
N©r7   r6   s     r,   ÚsetDeferredÚBadClient.setDeferredw   s	   € ð
 �r/   c                óz   • U R                   b$  U R                   S so0l         UR                  U5        [        S5      e)NzApplication code is very buggy!)r7   r5   rj   )r+   ÚbytesrM   r7   s       r,   rN   ÚBadClient.datagramReceived~   s3   € Ø�6‰6ÑØŸ™ ˆIˆAŒvØ�J‰J�uÔÜÐ>Ó?Ð?r/   rq   )	r>   r?   r@   rA   rl   r7   rr   rN   rB   rC   r/   r,   rn   rn   o   s   † ñð
 	€Aòõ@r/   rn   ú!This reactor does not support UDPc                  ó    • \ rS rSrS rS rS rS rS r\	" \
R                  R                  S5      S:H  S	5      S
 5       rS rS rS rS rSrg)ÚUDPTestsé…   c                ó¬   ^ ^• [        5       n[        R                  " 5       =o!l        [        R
                  " SUSS9mUU 4S jnUR                  U5      $ )z]
The C{type} of the host address of a listening L{DatagramProtocol}'s
transport is C{"UDP"}.
r   ú	127.0.0.1©Ú	interfacec                ó|   >• TR                  5       nTR                  UR                  S5        TR                  5       $ )NÚUDP)ÚgetHostÚassertEqualÚtypeÚstopListening)ÚignoredrM   Úpr+   s     €€r,   Ú	cbStartedÚ+UDPTests.test_oldAddress.<locals>.cbStarted�   s/   ø€ Ø—9‘9“;ˆDØ×Ñ˜TŸY™Y¨Ô.Ø—?‘?Ó$Ð$r/   ©rE   r   r   r4   r   Ú	listenUDPÚaddCallback)r+   Úserverr7   r‡   r†   s   `   @r,   Útest_oldAddressÚUDPTests.test_oldAddress‡   sH   ù€ ô
 “ˆÜ%*§^¢^Ó%5Ð5ˆÔ"Ü×Ò˜a °;Ñ?ˆö	%ð
 �}‰}˜YÓ'Ð'r/   c                óÞ   ^ ^^• [        5       m[        R                  " 5       =nTl        [        R
                  " STSS9mUU U4S jnU U4S jnUR                  U5      R                  U5      $ )z‘
The L{DatagramProtocol}'s C{startProtocol} and C{stopProtocol}
methods are called when its transports starts and stops listening,
respectively.
r   r|   r}   c                ó”   >• TR                  TR                  S5        TR                  TR                  S5        TR                  5       $ )Nr2   r   )r‚   r3   r;   r„   )r…   Úport1r+   rŒ   s    €€€r,   r‡   Ú*UDPTests.test_startStop.<locals>.cbStarted¡   s:   ø€ Ø×Ñ˜VŸ^™^¨QÔ/Ø×Ñ˜VŸ^™^¨QÔ/Ø×&Ñ&Ó(Ð(r/   c                ó>   >• TR                  TR                  S5        g r1   )r‚   r;   )r…   r+   rŒ   s    €€r,   Ú	cbStoppedÚ*UDPTests.test_startStop.<locals>.cbStopped¦   s   ø€ Ø×Ñ˜VŸ^™^¨QÕ/r/   r‰   )r+   r7   r‡   r”   r‘   rŒ   s   `   @@r,   Útest_startStopÚUDPTests.test_startStop—   sZ   ú€ ô “ˆÜ%*§^¢^Ó%5Ð5ˆˆFÔ"Ü×!Ò! ! V°{ÑCˆ÷	)ö
	0ð �}‰}˜YÓ'×3Ñ3°IÓ>Ð>r/   c                ó¶   ^^• [        5       m[        R                  " 5       =nTl        [        R
                  " STSS9nS mUU4S jnUR                  TU5      $ )zZ
Re-listening with the same L{DatagramProtocol} re-invokes the
C{startProtocol} callback.
r   r|   r}   c                ó"   • UR                  5       $ r(   ©r„   ©r…   Úports     r,   r‡   Ú'UDPTests.test_rebind.<locals>.cbStarted´   s   € Ø×%Ñ%Ó'Ð'r/   c                óŒ   >• [         R                  " 5       =nTl        [        R                  " STSS9nUR                  TU5      $ ©Nr   r|   r}   )r   r   r4   r   rŠ   r‹   )r…   r7   r†   r‡   rŒ   s      €€r,   r”   Ú'UDPTests.test_rebind.<locals>.cbStopped·   s<   ø€ Ü).¯ªÓ)9Ð9ˆA�Ô&Ü×!Ò! ! V°{ÑCˆAØ—=‘= ¨AÓ.Ð.r/   r‰   )r+   r7   r†   r”   r‡   rŒ   s       @@r,   Útest_rebindÚUDPTests.test_rebind«   sQ   ù€ ô
 “ˆÜ%*§^¢^Ó%5Ð5ˆˆFÔ"Ü×Ò˜a °;Ñ?ˆò	(ö	/ð
 �}‰}˜Y¨Ó*Ð*r/   c                óä   ^ ^^• [        5       m[        R                  " 5       =nTl        [        R
                  " STSS9mUU U4S jnUR                  U5        U4S jnUR                  U5        U$ )zx
A L{CannotListenError} exception is raised when attempting to bind a
second protocol instance to an already bound port
r   r|   r}   c                ó  >• TR                  TR                  5       TR                  R                  5       5        [        5       nTR	                  [
        R                  [        R                  TR                  5       R                  USS9  g )Nr|   r}   )
r‚   r�   rH   rE   ÚassertRaisesr   ÚCannotListenErrorr   rŠ   rœ   )r…   Úserver2rœ   r+   rŒ   s     €€€r,   r‡   Ú*UDPTests.test_bindError.<locals>.cbStartedÇ   si   ø€ Ø×Ñ˜TŸ\™\›^¨V×-=Ñ-=×-EÑ-EÓ-GÔHÜ“hˆGØ×ÑÜ×'Ñ'Ü×!Ñ!Ø—‘“×#Ñ#ØØ%ð ò r/   c                ó$   >• TR                  5       $ r(   rš   r›   s    €r,   Ú
cbFinishedÚ+UDPTests.test_bindError.<locals>.cbFinishedÔ   s   ø€ Ø×%Ñ%Ó'Ð'r/   r‰   )r+   r7   r‡   rª   rœ   rŒ   s   `   @@r,   Útest_bindErrorÚUDPTests.test_bindError¾   s_   ú€ ô
 “ˆÜ%*§^¢^Ó%5Ð5ˆˆFÔ"Ü× Ò   F°kÑBˆ÷		ð 	
�‰�iÔ õ	(ð 	
�‰�jÔ!Øˆr/   c                ó˜  ^ ^^^	^
• [        5       m
[        R                  " 5       =nT
l        [        R
                  " ST
SS9m	[        5       m[        R                  " 5       =mTl        UUU 4S jnUR                  U5      nUU
4S jnUR                  U5        UU U
4S jnUR                  U5        U	U 4S jnUR                  U5        U$ )zv
Datagrams can be sent with the transport's C{write} method and
received via the C{datagramReceived} callback method.
r   r|   r}   c                ó>   >• [         R                  " STSS9Tl        T$ rŸ   )r   rŠ   Úport2)r…   ÚclientÚclientStartedr+   s    €€€r,   ÚcbServerStartedÚ2UDPTests.test_sendPackets.<locals>.cbServerStartedæ   s   ø€ Ü ×*Ò*¨1¨fÀÑLˆDŒJØ Ð r/   c                ó  >^^• TR                   R                  STR                   R                  5       R                  5        TR                   R                  5       nTR                   R                  5       n[        R
                  " 5       =nTl        TR                   R                  SUR                  UR                  45        SSSUR                  UR                  44/mUUUU4S jm[        R                  " T" S 5      U/SS9$ )	Nr|   ó   hello)ó   a)ó   bNó   cc                óÂ   >• T(       aW  [         R                  " 5       =nTl        UR                  T5        TR                  R
                  " TR                  S5      6   U$ g ©Nr   )r   r   rG   r‹   rH   ÚwriteÚpop)r…   ÚnextClientWriteÚcbClientSendr±   ÚclientWritesrŒ   s     €€€€r,   r¿   ÚHUDPTests.test_sendPackets.<locals>.cbClientStarted.<locals>.cbClientSendö   sR   ø€ ÞÜ>C¿nºnÓ>NÐN�O fÔ&;Ø#×/Ñ/°Ô=Ø×$Ñ$×*Ò*¨L×,<Ñ,<¸QÓ,?Ñ@Ø*Ð*ð	  r/   T©ÚfireOnOneErrback)
rH   Úconnectr�   rœ   r   r   rG   r¼   ÚhostÚDeferredList)r…   ÚcAddrÚsAddrÚ
serverSendr¿   rÀ   r±   rŒ   s       @@€€r,   ÚcbClientStartedÚ2UDPTests.test_sendPackets.<locals>.cbClientStartedì   sÙ   ú€ Ø×Ñ×$Ñ$ [°&×2BÑ2B×2JÑ2JÓ2L×2QÑ2QÔRØ×$Ñ$×,Ñ,Ó.ˆEØ×$Ñ$×,Ñ,Ó.ˆEä16·²Ó1AÐAˆJ˜Ô.Ø×Ñ×"Ñ" 8¨e¯j©j¸%¿*¹*Ð-EÔFà# \°D¸5¿:¹:ÀuÇzÁzÐ:RÐ3SÐTˆL÷+ð +ô ×%Ò%Ù˜dÓ# ZÐ0À4ñð r/   c                óR  >• TR                   R                  5       nTR                   R                  5       nTR                  TR                  SUR                  UR
                  44/5        UR                  UR
                  4nTR                  TR                  SU4SU4SU4/5        g )Nr¶   r·   r¸   r¹   )rH   r�   r‚   r)   rÅ   rœ   )r…   rÇ   rÈ   Ú
clientAddrr±   r+   rŒ   s       €€€r,   ÚcbSendsFinishedÚ2UDPTests.test_sendPackets.<locals>.cbSendsFinished  s”   ø€ Ø×$Ñ$×,Ñ,Ó.ˆEØ×$Ñ$×,Ñ,Ó.ˆEØ×Ñ˜VŸ^™^¨x¸%¿*¹*ÀeÇjÁjÐ9QÐ.RÐ-SÔTØŸ*™* e§j¡jÐ1ˆJØ×ÑØ—‘Ø˜
Ð# d¨JÐ%7¸$À
Ð9KÐLõr/   c                ó¾   >• [         R                  " [         R                  " TR                  5      [         R                  " TR                  R                  5      /SS9$ ©NTrÂ   )r   rÆ   r   r„   r°   )r…   r‘   r+   s    €€r,   rª   Ú-UDPTests.test_sendPackets.<locals>.cbFinished  sL   ø€ Ü×%Ò%ä×'Ò'¨×(;Ñ(;Ó<Ü×'Ò'¨¯
©
×(@Ñ(@ÓAðð "&ñð r/   )rE   r   r   r4   r   rŠ   re   r‹   )r+   ÚserverStartedr³   r7   rÊ   rÎ   rª   r±   r²   r‘   rŒ   s   `      @@@@r,   Útest_sendPacketsÚUDPTests.test_sendPacketsÚ   s¤   ü€ ô
 “ˆÜ16·²Ó1AÐAˆ˜Ô.Ü×!Ò! ! V°{ÑCˆä“ˆÜ16·²Ó1AÐAˆ˜Ô.÷	!ð ×%Ñ% oÓ6ˆö	ð0 	
�‰�oÔ&÷	ð 	
�‰�oÔ&ö	ð 	
�‰�jÔ!Øˆr/   ÚINFRASTRUCTUREÚAZUREPIPELINESz"Hangs on Pipelines due to firewallc                óŽ  ^ ^^^^	• [        5       m[        R                  " 5       =nTl        [        R
                  " STSS9m[        5       m	[        R                  " 5       =nT	l        [        R
                  " ST	SS9m[        R                  " X/SS9nUU U	4S jnUR                  U5        UU4S jnUR                  U5        U$ )z®
A L{ConnectionRefusedError} exception is raised when a connection
attempt is actively refused by the other end.

Note: This test assumes no one is listening on port 80 UDP.
r   r|   r}   TrÂ   c                óV  >• [         R                  " 5       =nTl        TR                  R	                  SS5        [        S5       HB  nTR                  R                  SU4-  5        TR                  R                  SU4-  S5        MD     TR                  U[        R                  5      $ )Nr|   éP   é
   ó   %d©r|   rÚ   )
r   r   r4   rH   rÄ   Úranger¼   ÚassertFailurer   r`   )r…   ra   Úir±   r+   rŒ   s      €€€r,   r‡   Ú2UDPTests.test_connectionRefused.<locals>.cbStarted3  s�   ø€ Ü9>¿ºÓ9IÐIÐ Ô 6Ø×Ñ×$Ñ$ [°"Ô5ä˜2–Y�Ø× Ñ ×&Ñ& u°¨t¡|Ô4Ø× Ñ ×&Ñ& u°¨t¡|Ð5FÖGñ ð ×%Ñ%Ð&7¼×9UÑ9UÓVÐVr/   c                óª   >• [         R                  " [         R                  " TR                  5      [         R                  " TR                  5      /SS9$ rÑ   ©r   rÆ   r   r„   )r…   rœ   r°   s    €€r,   rª   Ú3UDPTests.test_connectionRefused.<locals>.cbFinished?  sH   ø€ Ü×%Ò%ä×'Ò'¨×(:Ñ(:Ó;Ü×'Ò'¨×(;Ñ(;Ó<ðð "&ñð r/   )	re   r   r   r4   r   rŠ   rE   rÆ   r‹   )
r+   r²   rÓ   r7   r‡   rª   r±   rœ   r°   rŒ   s
   `     @@@@r,   Útest_connectionRefusedÚUDPTests.test_connectionRefused  s¥   ü€ ô “ˆÜ16·²Ó1AÐAˆ˜Ô.Ü× Ò   F°kÑBˆä“ˆÜ16·²Ó1AÐAˆ˜Ô.Ü×!Ò! ! V°{ÑCˆä×Ò Ð=ÐPTÑUˆ÷	Wð 	
�‰�iÔ ö	ð 	
�‰�jÔ!Øˆr/   c                ó,  ^ ^	^
^^^• [        5       m	[        R                  " 5       =nT	l        [        R
                  " ST	SS9m
Sm[        5       m[        R                  " 5       =nTl        [        R                  " 5       =nTl        [        R
                  " STSS9m[        R                  " X/SS9nU	UUU4S jnUR                  U5        [        R                  " XC/SS9nU UU4S jnUR                  U5        U
U4S	 jnUR                  U5        U$ )
aC  
When a server fails to successfully read a packet the server should
still be able to process future packets.
The IOCP reactor had a historical problem where a failure to read caused
the reactor to ignore any future reads. This test should prevent a regression.

Note: This test assumes no one is listening on port 80 UDP.
r   r|   r}   s   Sending test packet to serverTrÂ   c                óŽ   >• TR                   R                  SS5        TR                   R                  TSTR                  45        g )Ns$   write to port no one is listening torÝ   r|   )rH   r¼   Ú_realPortNumber)r…   r±   rŒ   Ú
serverPortÚtest_data_to_sends    €€€€r,   ÚcbClientAndServerStartedÚAUDPTests.test_serverReadFailure.<locals>.cbClientAndServerStartedb  sE   ø€ ð ×Ñ×"Ñ"Ø7Ð9Jôð ×Ñ×"Ñ"Ø! K°×1KÑ1KÐ#Lõr/   c                óJ   >• TR                  TR                  S   S   T5        g r»   )r‚   r)   )r…   r+   rŒ   rë   s    €€€r,   Úverify_server_got_dataÚ?UDPTests.test_serverReadFailure.<locals>.verify_server_got_datau  s"   ø€ Ø×Ñ˜VŸ^™^¨AÑ.¨qÑ1Ð3DÕEr/   c                óª   >• [         R                  " [         R                  " TR                  5      [         R                  " TR                  5      /SS9$ rÑ   rã   )r…   Ú
clientPortrê   s    €€r,   ÚcleanupÚ0UDPTests.test_serverReadFailure.<locals>.cleanupz  sH   ø€ Ü×%Ò%ä×'Ò'¨
×(@Ñ(@ÓAÜ×'Ò'¨
×(@Ñ(@ÓAðð "&ñð r/   )
re   r   r   r4   r   rŠ   rE   rG   rÆ   r‹   )r+   r²   rÓ   ÚserverGotDataÚserver_client_started_drì   Úall_data_sentrï   ró   r±   rò   rŒ   rê   rë   s   `        @@@@@r,   Útest_serverReadFailureÚUDPTests.test_serverReadFailureK  sû   ý€ ô “ˆÜ16·²Ó1AÐAˆ˜Ô.Ü×&Ò& q¨&¸KÑHˆ
Ø<Ðä“ˆÜ16·²Ó1AÐAˆ˜Ô.Ü05·²Ó0@Ð@ˆ˜Ô-Ü×&Ò& q¨&¸KÑHˆ
ä"'×"4Ò"4ØÐ*¸Tñ#
Ð÷	ð 	ð 	 ×+Ñ+Ð,DÔEä×*Ò*Ø$Ð4Àtñ
ˆ÷	Fð 	×!Ñ!Ð"8Ô9ö	ð 	×!Ñ! 'Ô*àÐr/   c                ó^  • [        5       n[        R                  " SUSS9nU R                  [        R
                  UR                  R                  SS5        UR                  R                  SS5        U R                  [        UR                  R                  SS5        UR                  5       $ )zð
A call to the transport's connect method fails with an
L{InvalidAddressError} when a non-IP address is passed as the host
value.

A call to a transport's connect method fails with a L{RuntimeError}
when the transport is already connected.
r   r|   r}   Ú	localhostrÚ   )
re   r   rŠ   r¥   r   ÚInvalidAddressErrorrH   rÄ   ÚRuntimeErrorr„   )r+   r±   rœ   s      r,   Útest_badConnectÚUDPTests.test_badConnect‡  s�   € ô “ˆÜ× Ò   F°kÑBˆØ×ÑÜ×%Ñ% v×'7Ñ'7×'?Ñ'?ÀÈbô	
ð 	×Ñ× Ñ  ¨bÔ1Ø×Ñœ,¨×(8Ñ(8×(@Ñ(@À+ÈrÔRØ×!Ñ!Ó#Ð#r/   c                óN  ^ ^^^^^^^	• [         R                  " 5       mU 4S jnTR                  U5        [        5       m[        R
                  " STSS9mU4S jnTR                  U5        TR                  5       m[        [        S5      5      m/ m	UUUUUU U	4S jmT" 5         T$ )zZ
When datagramReceived raises an exception it is logged but the port
is not disconnected.
c                ó‚   >• TR                  [        5      nTR                  [        U5      SS[        U5      4-  5        g)za
Flush the exceptions which the reactor should have logged and make
sure they're actually there.
é   z'Incorrectly found %d errors, expected 2N)ÚflushLoggedErrorsrj   r‚   Úlen)ÚignÚerrsr+   s     €r,   ÚcbCompletedÚ8UDPTests.test_datagramReceivedError.<locals>.cbCompleted   s:   ø€ ð
 ×)Ñ)¬.Ó9ˆDØ×ÑÜ�D“	˜1ÐGÌ3ÈtË9È,ÑVõr/   r   r|   r}   c                ól   >^ • [         R                  " TR                  5      R                  U 4S j5      $ )z_
Disconnect the port we started and pass on whatever was given to us
in case it was a Failure.
c                ó   >• T$ r(   rC   )r  Úresults    €r,   Ú<lambda>ÚHUDPTests.test_datagramReceivedError.<locals>.cbCleanup.<locals>.<lambda>´  s   ø€ Évr/   )r   r   r„   ÚaddBoth)r  rœ   s   `€r,   Ú	cbCleanupÚ6UDPTests.test_datagramReceivedError.<locals>.cbCleanup¯  s(   ù€ ô
 ×&Ò& t×'9Ñ'9Ó:×BÑBÔCUÓVÐVr/   é<   c                 ór  >^• T(       d   T
R                  S5        T
R                  TR                  SS5        STR                  S5      4-  n [        R                  " 5       nTR                  U5        TR                  R                  U TR                  TR                  45        UU	UU4S jnU	4S jnUR                  X#5        UR                  TR                  5        [        R                  " SUR                  [         R"                  " S	5      5      mg! [         a    TR                  5          GNf = f)
zú
Send one packet to the listening BadClient.  Set up a 0.1 second
timeout to do re-transmits in case the packet is dropped.  When two
packets have been received by the BadClient, stop sending and let
the finalDeferred's callbacks do some assertions.
zNot enough packets receivedNzUDP Protocol lost its transportrÜ   r   c                óº   >• TR                  5         TR                  U 5        [        T5      S:X  a#  [        R                  " STR
                  S5        gT" 5         g)zU
A packet arrived.  Cancel the timeout for it, record it, and
maybe finish the test.
r  r   N)ÚcancelrK   r  r   Ú	callLaterr5   )ÚpacketÚfinalDeferredÚmakeAttemptÚsucceededAttemptsÚtimeoutCalls    €€€€r,   ÚcbPacketReceivedÚRUDPTests.test_datagramReceivedError.<locals>.makeAttempt.<locals>.cbPacketReceivedÛ  sL   ø€ ð
 ×"Ñ"Ô$Ø!×(Ñ(¨Ô0ÜÐ(Ó)¨QÓ.ô
 ×%Ò% a¨×)?Ñ)?ÀÕFá•Mr/   c                ó   >• T" 5         g)aT  
The packet wasn't received quickly enough.  Try sending another
one.  It doesn't matter if the packet for which this was the
timeout eventually arrives: makeAttempt throws away the
Deferred on which this function is the errback, so when
datagramReceived callbacks, so it won't be on this Deferred, so
it won't raise an AlreadyCalledError.
NrC   )Úerrr  s    €r,   ÚebPacketTimeoutÚQUDPTests.test_datagramReceivedError.<locals>.makeAttempt.<locals>.ebPacketTimeoutë  s
   ø€ ñ •r/   gš™™™™™¹?z&Timed out in testDatagramReceivedError)ÚfailÚ	ExceptionrX   ÚfailIfIdenticalrH   r½   r   r   rr   r¼   rÅ   rœ   ÚaddCallbacksÚ
addErrbackr   r  r   ÚTimeoutError)r  ÚpacketDeferredr  r  r  rM   Úattemptsr±   r  r  r+   r  s       @€€€€€€€r,   r  Ú8UDPTests.test_datagramReceivedError.<locals>.makeAttemptÅ  s	  ù€ ö ð,Ø—I‘IÐ;Ô<ð × Ñ Ø× Ñ  $Ð(Iôð ˜hŸl™l¨1›oÐ/Ñ/ˆFÜ"Ÿ^š^Ó-ˆNØ×Ñ˜~Ô.Ø×Ñ×"Ñ" 6¨D¯I©I°t·y±yÐ+AÔB÷"ð "õ 	ð ×'Ñ'Ð(8ÔJØ×%Ñ% m×&;Ñ&;Ô<ä!×+Ò+ØØ×&Ñ&Ü×"Ò"Ð#KÓLó‰KøôU !ó ,Ø!×)Ñ)×+ð,ús   ‹D ÄD6Ä5D6)
r   r   r‹   rn   r   rŠ   r  r�   ÚlistrÞ   )
r+   r  r  rM   r(  r±   r  r  rœ   r  s
   `  @@@@@@@r,   Útest_datagramReceivedErrorÚ#UDPTests.test_datagramReceivedError™  s�   ÿ€ ô
 ŸšÓ(ˆõ	ð 	×!Ñ! +Ô.ä“ˆÜ× Ò   F°kÑBˆõ	Wð 	×Ñ˜iÔ(à�|‰|‹~ˆô œ˜b›	“?ˆØÐ÷8	ó 8	ñt 	ŒØÐr/   c                ó   •  " S S5      n[         R                  " S[        5       5      nU" 5       Ul        UR	                  SS5        U R                  U R                  /5      nU R                  [        U5      S5        g)a9  
C{'<broadcast>'} is an alternative way to say C{'255.255.255.255'}
({socket.gethostbyname("<broadcast>")} returns C{'255.255.255.255'}),
so because it becomes a valid IP address, no deprecation warning about
passing hostnames to L{twisted.internet.udp.Port.write} needs to be
emitted by C{write()} in this case.
c                  ó   • \ rS rSrS rSrg)Ú6UDPTests.test_NoWarningOnBroadcast.<locals>.fakeSocketi  c                ó   • g r(   rC   )r+   ÚfooÚbars      r,   ÚsendtoÚ=UDPTests.test_NoWarningOnBroadcast.<locals>.fakeSocket.sendto  s   € Ør/   rC   N)r>   r?   r@   rA   r3  rB   rC   r/   r,   Ú
fakeSocketr/    s   † õr/   r5  r   s   test)z<broadcast>iÒ  N)	r   ÚPortrE   r   r¼   ÚflushWarningsÚtest_NoWarningOnBroadcastr‚   r  )r+   r5  r†   Úwarningss       r,   r8  Ú"UDPTests.test_NoWarningOnBroadcast  se   € ÷	ñ 	ô �HŠH�Qœ›Ó!ˆÙ“<ˆŒØ	�‰�Ð.Ô/à×%Ñ% t×'EÑ'EÐ&FÓGˆØ×Ñœ˜X›¨Õ*r/   )r°   N)r>   r?   r@   rA   r�   r–   r¡   r¬   rÔ   r   ÚosÚenvironÚgetrå   rø   rþ   r+  r8  rB   rC   r/   r,   ry   ry   …   sh   † ò(ò ?ò(+ò&ò8BñH Ø
�
‰
�‰Ð'Ó(Ð,<Ñ<Ø,óñ'ó	ð'òR:òx$ò$gõR+r/   ry   c                  ó^   • \ rS rSrSr\R                  " \S5      (       d  SrS r	S r
S rSrg)	ÚReactorShutdownInteractionTestsi  z!Test reactor shutdown interactionNrw   c                ól   • [        5       U l        [        R                  " SU R                  SS9U l        g)zStart a UDP portr   r|   r}   N)rE   rŒ   r   rŠ   rœ   r*   s    r,   ÚsetUpÚ%ReactorShutdownInteractionTests.setUp  s%   € ä“hˆŒÜ×%Ò% a¨¯©ÀÑLˆ�	r/   c                ó6   • U R                   R                  5       $ )zStop the UDP port)rœ   r„   r*   s    r,   ÚtearDownÚ(ReactorShutdownInteractionTests.tearDown#  s   € à�y‰y×&Ñ&Ó(Ð(r/   c                ó†  ^ ^• [         R                  " 5       m[         R                  " 5       =nT R                  l        UU 4S jnUR	                  U5        U 4S jnTR	                  U5        T R                  R
                  R                  SST R                  R
                  R                  5       R                  45        T$ )z0Test reactor shutdown while in a recvfrom() loopc                ó’   >• TR                   R                  R                  5         [        R                  " STR
                  S 5        g r»   )rŒ   rH   ÚconnectionLostr   r  r5   )r…   Úfinishedr+   s    €€r,   ÚpktReceÚQReactorShutdownInteractionTests.testShutdownFromDatagramReceived.<locals>.pktRece6  s3   ø€ à�K‰K×!Ñ!×0Ñ0Ô2ô ×Ò˜a ×!2Ñ!2°DÕ9r/   c                ó&   >• TR                  5         g r(   )r  ©r…   r+   s    €r,   ÚflushErrorsÚUReactorShutdownInteractionTests.testShutdownFromDatagramReceived.<locals>.flushErrors@  s   ø€ ð
 ×"Ñ"Õ$r/   s@                                                                   r|   )	r   r   rŒ   rG   r‹   rH   r¼   r�   rœ   )r+   ÚprrJ  rN  rI  s   `   @r,   Ú testShutdownFromDatagramReceivedÚ@ReactorShutdownInteractionTests.testShutdownFromDatagramReceived'  s“   ù€ ô —>’>Ó#ˆÜ*/¯.ª.Ó*:Ð:ˆˆT�[‰[Ô'ö	:ð 	�‰�wÔõ	%ð 	×Ñ˜[Ô)Ø�‰×Ñ×#Ñ#Ø˜ d§k¡k×&;Ñ&;×&CÑ&CÓ&E×&JÑ&JÐKô	
ð ˆr/   )rœ   rŒ   )r>   r?   r@   rA   rl   r   ÚIReactorUDPr   ÚskiprA  rD  rQ  rB   rC   r/   r,   r?  r?    s-   † á+à×!Ò! '¨4×0Ñ0Ø2ˆòMò
)õ$r/   r?  c                ó,  • [        U [        5      nUR                  US45        [        X5      n[        X5      n UR	                  XXg-   5         UR                  5         g! [         a     UR                  5         gf = f! UR                  5         f = f)zõ
Bind a socket to the given network interface and attempt to join a
multicast group with the given address family.  This is used to determine
whether the local networking stack configuration allows for multicast
within the given address family.
r   TF)r   r
   Úbindr   Ú
setsockoptÚcloseÚOSError)ÚafÚipprotoÚjoinÚgroupÚbindtoÚsÚ	packgroupÚpackifs           r,   ÚcheckMulticastAvailabilityrb  N  sƒ   € ô 	ˆr”:Ó€AØ‡F�FˆF�Aˆ;ÔÜ˜"Ó$€IÜ�rÓ"€FðØ	�‰�W IÑ$6Ô7ð à	�‰�	øô ó Øð 	
�‰�	ðûð
 	
�‰�	ús#   »A! Á!
A>Á+B Á=A>Á>B ÂBz'This reactor does not support multicastú225.0.0.250ú0.0.0.0z:The local networking stack does not enable IPv4 multicast.c                  óº  • \ rS rSr% SrSrS\S'   SrS\S'   SrS\S	'   S
r	S\S'   Sr
S\S'   SrS\S'   SrS\S'   SrS\S'   S rS rS S jrS S jrS S jrS S jrS S jr\" \R.                  R1                  5       =(       a    \R.                  R3                  5       (       + S5      S 5       rS r\" \R.                  R1                  5       S5      S S j5       rSrg)!ÚMulticastTestsie  zg
Tests for sending and receiving multicast datagrams.  (This suite supports
IPv4, see below for IPv6.)
rd  Ústrr~   ú	str | intÚexpectedInterfacer|   ÚclientAddressrc  ÚmulticastGroupÚalternateInterfacerû   ÚinterfaceSynonymÚinvalidGroupú::1ÚwrongAddressFamilyc                ó¼  • [        5       U l        [        5       U l        [        R
                  " SU R                  U R                  5      U l        [        R
                  " SU R                  U R                  5      U l        U R                  R                  R                  U R                  U R                  R                  R                  5       R                  5        g r»   )rE   rŒ   rS   r±   r   ÚlistenMulticastr~   r‘   r°   rH   rÄ   rj  r�   rœ   r*   s    r,   rA  ÚMulticastTests.setUp€  s�   € Ü“hˆŒÜ“hˆŒä×,Ò,¨Q°·±¸T¿^¹^ÓLˆŒ
Ü×,Ò,¨Q°·±¸T¿^¹^ÓLˆŒ
Ø�‰×Ñ×%Ñ%Ø×ÑØ�K‰K×!Ñ!×)Ñ)Ó+×0Ñ0õ	
r/   c                ó�   • [        [        U R                  R                  5      [        U R                  R                  5      /5      $ r(   )r   r   r‘   r„   r°   r*   s    r,   rD  ÚMulticastTests.tearDown‹  s8   € Üä˜dŸj™j×6Ñ6Ó7Ü˜dŸj™j×6Ñ6Ó7ðó
ð 	
r/   c                óÄ   ^ • T R                   R                  R                  [        :w  a  [	        S5      eSU 4S jjnU" T R
                  5        U" T R                   5        g )Nz+only IPv4 multicast has TTLs, IPv6 has hopsc                ó2  >• [         R                  " U R                  5      (       d   eTR                  U R                  R	                  5       S5        U R                  R                  S5        TR                  U R                  R	                  5       S5        g )Nr2   r  )r   Ú
providedByrH   r‚   ÚgetTTLÚsetTTL)Úor+   s    €r,   ÚcheckttlÚ(MulticastTests.testTTL.<locals>.checkttl—  sj   ø€ Ü&×1Ò1°!·+±+×>Ñ>Ð>Ð>Ø×Ñ˜QŸ[™[×/Ñ/Ó1°1Ô5Ø�K‰K×Ñ˜qÔ!Ø×Ñ˜QŸ[™[×/Ñ/Ó1°1Õ5r/   )r{  zServer | ClientÚreturnÚNone)rŒ   rH   ÚaddressFamilyr   r"   r±   )r+   r|  s   ` r,   ÚtestTTLÚMulticastTests.testTTL“  sF   ø€ Ø�;‰;× Ñ ×.Ñ.´'Ó9ÜÐHÓIÐI÷	6ñ 	�—‘ÔÙ�—‘Õr/   c              ƒ  ó   #   • U R                   nU R                  U R                  R                  R	                  5       S5        U R                  R                  R                  5       nU R                  R                  R                  U5      I Sh  v•N   [        5       U R                  l        U R                  R                  R                  SXR                  45        U R                  R                  I Sh  v•N   U R                  [        U R                  R                  5      S5        U R                  R                  R                  S5        U R                  U R                  R                  R	                  5       S5        U R                  R                  R                  SXR                  45        [        [        [         5      S5      I Sh  v•N   U R                  [        U R                  R                  5      S5        g GNw GN N:7f)z^
Test that after loopback mode has been set, multicast packets are
delivered to their sender.
r2   Nr¶   r   )rk  r‚   rŒ   rH   ÚgetLoopbackModer�   Ú	joinGroupr   rG   r¼   rœ   r  r)   ÚsetLoopbackModer   r   r   )r+   r]  rM   s      r,   Útest_loopbackÚMulticastTests.test_loopback   sm  é € ð
 ×#Ñ#ˆØ×Ñ˜Ÿ™×.Ñ.×>Ñ>Ó@À!ÔDØ�{‰{×$Ñ$×,Ñ,Ó.ˆà�k‰k×#Ñ#×-Ñ-¨eÓ4×4Ð4Ü%-£Zˆ�‰Ô"Ø�‰×Ñ×#Ñ# H¨u·i±iÐ.@ÔAØ�k‰k×(Ñ(×(Ð(à×Ñœ˜TŸ[™[×0Ñ0Ó1°1Ô5Ø�‰×Ñ×-Ñ-¨aÔ0Ø×Ñ˜Ÿ™×.Ñ.×>Ñ>Ó@À!ÔDØ�‰×Ñ×#Ñ# H¨u·i±iÐ.@ÔAô œ¤gÓ.°Ó2×2Ð2Ø×Ñœ˜TŸ[™[×0Ñ0Ó1°1Õ5ò 	5ò 	)ñ 	3ùs8   ‚BHÂHÂA'HÃ7H	Ã8CHÇHÇ5HÈ	HÈHc              ƒ  óî   #   • U R                  [        5         U R                  R                  R	                  U R
                  U R                  S9I Sh  v•N   SSS5        g N! , (       d  f       g= f7f)z|
A sensible error will be reported when using the wrong address family
literal for the 'interface' argument to 'joinGroup'.
r}   N)r¥   r   rŒ   rH   r…  rk  rp  r*   s    r,   Útest_wrongFamilyInterfaceJoinÚ,MulticastTests.test_wrongFamilyInterfaceJoin¸  sc   é € ð
 ×ÑÔ1Õ2Ø—+‘+×'Ñ'×1Ñ1Ø×#Ñ#¨t×/FÑ/Fð 2ð ÷ ð ÷ 3Ð2ñ÷ 3Õ2üs.   ‚A5˜<A$ÁA"ÁA$Á	A5Á"A$Á$
A2Á.A5c              ƒ  óà  #   • U R                  U R                  R                  R                  5       U R                  5        U R                  U R
                  R                  R                  5       U R                  5        U R
                  R                  R                  U R                  5      I Sh  v•N   U R                  R                  R                  U R                  5      I Sh  v•N   U R                  U R                  R                  R                  5       U R                  5        U R                  U R
                  R                  R                  5       U R                  5        g N¸ Nƒ7f)z;
Test C{getOutgoingInterface} and C{setOutgoingInterface}.
N)	r‚   r±   rH   ÚgetOutgoingInterfaceri  rŒ   ÚsetOutgoingInterfacerl  rm  r*   s    r,   Útest_interfaceÚMulticastTests.test_interfaceÂ  s  é € ð 	×ÑØ�K‰K×!Ñ!×6Ñ6Ó8¸$×:PÑ:Pô	
ð 	×ÑØ�K‰K×!Ñ!×6Ñ6Ó8¸$×:PÑ:Pô	
ð �k‰k×#Ñ#×8Ñ8¸×9PÑ9PÓQ×QÐQØ�k‰k×#Ñ#×8Ñ8¸×9NÑ9NÓO×OÐOà×ÑØ�K‰K×!Ñ!×6Ñ6Ó8Ø×#Ñ#ô	
ð 	×ÑØ�K‰K×!Ñ!×6Ñ6Ó8Ø×#Ñ#õ	
ñ 	RÙOùs%   ‚B/E.Â1E*Â26E.Ã(E,Ã)BE.Å,E.c              ƒ  óÔ  #   • U R                   R                  R                  U R                  5      I Sh  v•N   U R                   R                  R	                  U R                  5      I Sh  v•N   U R
                  R                  R                  U R                  5      I Sh  v•N   U R
                  R                  R	                  U R                  5      I Sh  v•N   g Nª Nu N@ N7f)z5
Test that multicast a group can be joined and left.
N)r±   rH   r…  rk  Ú
leaveGrouprŒ   r*   s    r,   Útest_joinLeaveÚMulticastTests.test_joinLeaveÙ  s¦   é € ð �k‰k×#Ñ#×-Ñ-¨d×.AÑ.AÓB×BÐBØ�k‰k×#Ñ#×.Ñ.¨t×/BÑ/BÓC×CÐCØ�k‰k×#Ñ#×-Ñ-¨d×.AÑ.AÓB×BÐBØ�k‰k×#Ñ#×.Ñ.¨t×/BÑ/BÓC×CÑCñ 	CÙCÙBÙCùsE   ‚3C(µC ¶6C(Á,C"Á-6C(Â#C$Â$6C(ÃC&ÃC(Ã"C(Ã$C(Ã&C(z2Windows' UDP multicast is not yet fully supported.c                óœ   • U R                  U R                  R                  R                  U R                  5      [
        R                  5      $ )zr
Test that an attempt to join an address which is not a multicast
address fails with L{error.MulticastJoinError}.
)rß   r±   rH   r…  rn  r   r   r*   s    r,   Útest_joinFailureÚMulticastTests.test_joinFailureã  s=   € ð ×!Ñ!Ø�K‰K×!Ñ!×+Ñ+¨D×,=Ñ,=Ó>Ä×@XÑ@Xó
ð 	
r/   c                óš  ^ ^^^• [        5       m[        R                  " STT R                  5      mT R                  R
                  R                  5       mT R                  R
                  R                  T R                  5      nUUU 4S jnUR                  U5        U 4S jnUR                  U5        U4S jnUR                  U5        U$ )zV
Test that a multicast group can be joined and messages sent to and
received from it.
r   c                ó¢   >• [        5       =nTR                  l        TR                  R	                  STR
                  TR                  45        U$ )Nó   hello world)r   rŒ   rG   rH   r¼   rk  rœ   )r…   r7   rM   Úcr+   s     €€€r,   ÚcbJoinedÚ/MulticastTests.test_multicast.<locals>.cbJoinedü  s>   ø€ Ü-5«ZÐ7ˆA�—‘Ô*Ø�K‰K×Ñ˜n¨t×/BÑ/BÀDÇIÁIÐ.NÔOØˆHr/   c                ó^   >• TR                  TR                  R                  S   S   S5        g )Nr   rš  )r‚   rŒ   r)   rM  s    €r,   ÚcbPacketÚ/MulticastTests.test_multicast.<locals>.cbPacket  s'   ø€ Ø×Ñ˜TŸ[™[×0Ñ0°Ñ3°AÑ6¸ÕGr/   c                ó^   >^ • [        TR                  5      nUR                  U 4S j5        U$ )Nc                ó   >• T$ r(   rC   )r  Úpassthroughs    €r,   r  Ú@MulticastTests.test_multicast.<locals>.cleanup.<locals>.<lambda>
  s   ø€ ©;r/   )r   r„   r‹   )r£  r  r†   s   ` €r,   ró   Ú.MulticastTests.test_multicast.<locals>.cleanup  s%   ù€ Ü" 1§?¡?Ó3ˆFØ×ÑÔ6Ô7ØˆMr/   )
rE   r   rr  r~   rŒ   rH   r�   r…  rk  r‹   )r+   Újoinedrœ  rŸ  ró   rM   r›  r†   s   `    @@@r,   Útest_multicastÚMulticastTests.test_multicastñ  s¡   û€ ô
 ‹HˆÜ×#Ò# A q¨$¯.©.Ó9ˆØ�{‰{×$Ñ$×,Ñ,Ó.ˆà—‘×&Ñ&×0Ñ0°×1DÑ1DÓEˆ÷	ð
 	×Ñ˜8Ô$õ	Hð 	×Ñ˜8Ô$õ	ð
 	×Ñ˜7Ô#àˆr/   zjon non-linux platforms it appears multiple processes can listen, but not multiple sockets in same process?c              ƒ  óà  #   • [        5       n[        [        5      nUR                  SUSU R                  S9nUR                  5       n[        U[        [        45      (       d   eUR                  n[        5       nUR                  UUSU R                  S9n[        U R                  R                  R                  U R                  5      UR                  U R                  5      UR                  U R                  5      /5      I Sh  v•N   [        5       =o�l        [        5       =o–l        UR                  R#                  SU R                  U45        [        X‰/5      I Sh  v•N   U R%                  UR&                  S   S   S5        U R%                  UR&                  S   S   S5        [        [)        UR*                  5      [)        UR*                  5      /5      I Sh  v•N   g Nà N† N	7f)zŠ
Test that multiple sockets can listen on the same multicast port and
that they both receive multicast messages directed to that address.
r   T)ÚlistenMultipler~   Nrš  )rE   r   r   rr  r~   r�   Ú
isinstancer   r   rœ   r   rŒ   rH   r…  rk  r   rG   r¼   r‚   r)   r   r„   )
r+   ÚfirstClientÚmreactorÚ	firstPortÚfpAddrÚportnoÚsecondClientÚ
secondPortÚd1Úd2s
             r,   Útest_multiListenÚMulticastTests.test_multiListen  sÅ  é € ô “hˆÜ$¤WÓ-ˆØ×,Ñ,Øˆ{¨4¸4¿>¹>ð -ð 
ˆ	ð ×"Ñ"Ó$ˆÜ˜&¤;´Ð"<×=Ñ=Ð=Ð=Ø—‘ˆä“xˆØ×-Ñ-ØØØØ—n‘nð	 .ð 
ˆ
ô à—‘×%Ñ%×/Ñ/°×0CÑ0CÓDØ×#Ñ# D×$7Ñ$7Ó8Ø×$Ñ$ T×%8Ñ%8Ó9ðó
÷ 	
ð 	
ô +3«*Ð4ˆÔ'ä+3«:Ð5ˆÔ(à×Ñ×#Ñ# N°T×5HÑ5HÈ&Ð4QÔRÜ˜R˜HÓ%×%Ð%à×Ñ˜×,Ñ,¨QÑ/°Ñ2°NÔCØ×Ñ˜×-Ñ-¨aÑ0°Ñ3°^ÔDää˜i×5Ñ5Ó6Ü˜j×6Ñ6Ó7ðó
÷ 	
ñ 	
ñ'	
ñ 	&ñ
	
ùs8   ‚DG.ÄG(ÄAG.Å#G*Å$A>G.Ç"G,Ç#G.Ç*G.Ç,G.)r±   r‘   r°   rŒ   N)r~  r  )r>   r?   r@   rA   rl   r~   rP   ri  rj  rk  rl  rm  rn  rp  rA  rD  r�  r‡  rŠ  r�  r“  r   r    ÚplatformÚ	isWindowsÚisVistar–  r§  rµ  rB   rC   r/   r,   rf  rf  e  sü   ‡ ñð €IˆsÓØ#,Ð�yÓ,Ø$€M�3Ó$Ø'€N�CÓ'Ø$/Ð˜	Ó/Ø"-Ð�iÓ-Ø#€L�#Ó#Ø#Ð˜Ó#ò	
ò
ôô6ô0ô
ô.Dñ Ø×Ñ×"Ñ"Ó$×G¨W×-=Ñ-=×-EÑ-EÓ-GÔ)GØ<óñ
ó	ð
òñ@ Ø×Ñ×"Ñ"Ó$ð	óó.
óó.
r/   rf  úff03::1ú::z/The local stack does not enable IPv6 multicast.c                  ó®   • \ rS rSr% SrSrS\S'   SrS\S'   SrS\S	'   \	" S
 \
" 5        5       5      rS\S'   \rS\S'   SrS\S'   SrS\S'   SrS\S'   Srg)ÚMulticastTestsIPv6iH  z;
Tests for sending and receiving IPv6 multicast datagrams.
r»  rg  r~   ro  rj  rº  rk  c              #  ó`   #   • U  H$  oS    R                  S5      (       d  M  US   v •  M&     g7f)r2   Úlor   N)Ú
startswith)Ú.0Úidxnms     r,   Ú	<genexpr>ÚMulticastTestsIPv6.<genexpr>^  s%   é € ÐKš~�e°q±×1DÑ1DÀT×1J‹ˆˆqŽš~ùs   ‚.¢.rh  rl  rm  rn  r   ri  r|   rp  rC   N)r>   r?   r@   rA   rl   r~   rP   rj  rk  Únextr   rl  rm  rn  ri  rp  rB   rC   r/   r,   r½  r½  H  sp   ‡ ñð €IˆsÓØ€M�3ÓØ#€N�CÓ#Ù$(ÙK™|œ~ÓKó%Ð˜	ó ð #5Ð�iÓ4Ø€L�#ÓØ#$Ð�yÓ$Ø)Ð˜Ö)r/   r½  )rZ  r   r[  Úintr\  rÆ  r]  rg  r^  rg  r~  Úbool)=rl   Ú
__future__r   r;  r   r   r   r   r   r   r	   r
   r   r   r   Úunittestr   Útwisted.internetr   r   r   r   r   r   Útwisted.internet.addressr   r   Útwisted.internet.deferr   r   r   Útwisted.internet.errorr   Útwisted.internet.interfacesr   r   r   Útwisted.internet.taskr   Útwisted.pythonr    Útwisted.test.testutilsr!   Útwisted.trial.unittestr"   r#   r%   ÚDatagramProtocolrE   ÚConnectedDatagramProtocolrS   re   r"  rj   rn   rS  ry   r?  rb  rf  r½  rC   r/   r,   Ú<module>rÕ     s'  ðñ
õ #ã 	÷÷ ÷ ñ õ ç M× Mß =ß IÑ IÝ 5÷ñ õ
 -Ý "Ý 2ß 5÷ñ ô&	ˆU�H×-Ñ-ô 	ôˆU�H×6Ñ6ô ô.�ô ô�Yô ô@�×)Ñ)ô @ñ, ˆJ×"Ò" 7¨DÓ1Ô1Ð3VÓWôN+ˆxó N+ó XðN+ñb ˆJ×"Ò" 7¨DÓ1Ô1Ð3VÓWô3 hó 3ó Xð3ðlØðØ #ðØ+.ðØ7:ðØDGðà	ôñ. Ø×$Ò$ W¨dÓ3Ô3Ø-óñ Ù"Ø�Ð.°¸yó	ô ð Aó	ôV
�Xó V
óó	ðV
ñr Ø×$Ò$ W¨dÓ3Ô3Ø-óð ÙÙ"Ø�, °¸Dó	ô ð 6ó	ô*˜ó *óó ó	ñ*r/   