§
    Ètºf.k  ã                   óR  — d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZmZmZ ddlmZ ddlmZ  G d„ d	¦  «        Z G d
„ deej        ¦  «        Z G d„ deej        ¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ dej        ¦  «        Z e ej        e	d¦  «         d¦  «         G d„ de¦  «        ¦   «         Z e ej        e	d¦  «         d¦  «         G d„ de¦  «        ¦   «         Z e ej        e	d¦  «         d¦  «         G d„ de¦  «        ¦   «         Z dS )zG
Tests for implementations of L{IReactorUDP} and L{IReactorMulticast}.
é    N)ÚskipIf)ÚdeferÚerrorÚ
interfacesÚprotocolÚreactorÚudp)ÚDeferredÚgatherResultsÚmaybeDeferred)Úruntime)ÚTestCasec                   ó,   — e Zd ZdZdZdZd„ Zd„ Zd„ ZdS )ÚMixinr   Nc                 ó   — g | _         d S ©N)Úpackets©Úselfs    úT/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/test/test_udp.pyÚ__init__zMixin.__init__   s   € ØˆŒˆˆó    c                 ón   — d| _         | j        �&| j        d c}| _        |                     d ¦  «         d S d S ©Né   )ÚstartedÚstartedDeferredÚcallback©r   Úds     r   ÚstartProtocolzMixin.startProtocol   sD   € ØˆŒØÔÐ+Ø&*Ô&:¸DÐ#ˆAˆtÔ#Ø�JŠJ�tÑÔÐÐÐð ,Ð+r   c                 ó   — d| _         d S r   )Ústoppedr   s    r   ÚstopProtocolzMixin.stopProtocol"   s   € ØˆŒˆˆr   )	Ú__name__Ú
__module__Ú__qualname__r   r#   r   r   r!   r$   © r   r   r   r      sP   € € € € € Ø€GØ€Gà€Oðð ð ðð ð ðð ð ð ð r   r   c                   ó   — e Zd ZdZdZd„ ZdS )ÚServerNr   c                 ó˜   — | j                              ||f¦  «         | j        �&| j        d c}| _        |                     d ¦  «         d S d S r   ©r   ÚappendÚpacketReceivedr   )r   ÚdataÚaddrr    s       r   ÚdatagramReceivedzServer.datagramReceived*   sW   € ØŒ×Ò˜T 4˜LÑ)Ô)Ð)ØÔÐ*Ø%)Ô%8¸$Ð"ˆAˆtÔ"Ø�JŠJ�tÑÔÐÐÐð +Ð*r   )r%   r&   r'   r.   Úrefusedr1   r(   r   r   r*   r*   &   s-   € € € € € Ø€NØ€Gðð ð ð ð r   r*   c                   ó(   — e Zd ZdZdZd„ Zd„ Zd„ ZdS )ÚClientNr   c                 ó”   — | j                              |¦  «         | j        �&| j        d c}| _        |                     d ¦  «         d S d S r   r,   )r   r/   r    s      r   r1   zClient.datagramReceived5   sS   € ØŒ×Ò˜DÑ!Ô!Ð!ØÔÐ*Ø%)Ô%8¸$Ð"ˆAˆtÔ"Ø�JŠJ�tÑÔÐÐÐð +Ð*r   c                 ój   — | j         �$| j         d c}| _         |                     |¦  «         || _        d S r   )r   ÚerrbackÚfailure)r   r8   r    s      r   ÚconnectionFailedzClient.connectionFailed;   s:   € ØÔÐ+Ø&*Ô&:¸DÐ#ˆAˆtÔ#Ø�IŠI�gÑÔÐØˆŒˆˆr   c                 óŽ   — | j         �6| j         d c}| _         |                     t          j        d¦  «        ¦  «         d| _        d S ©NÚyupr   ©r   r7   r   ÚConnectionRefusedErrorr2   r   s     r   ÚconnectionRefusedzClient.connectionRefusedA   óE   € ØÔÐ+Ø&*Ô&:¸DÐ#ˆAˆtÔ#Ø�IŠI•eÔ2°5Ñ9Ô9Ñ:Ô:Ð:ØˆŒˆˆr   )r%   r&   r'   r.   r2   r1   r9   r?   r(   r   r   r4   r4   1   sK   € € € € € Ø€NØ€Gðð ð ðð ð ðð ð ð ð r   r4   c                   ó   — e Zd Zd„ ZdS )Ú
GoodClientc                 óŽ   — | j         �6| j         d c}| _         |                     t          j        d¦  «        ¦  «         d| _        d S r;   r=   r   s     r   r?   zGoodClient.connectionRefusedI   r@   r   N)r%   r&   r'   r?   r(   r   r   rB   rB   H   s#   € € € € € ðð ð ð ð r   rB   c                   ó   — e Zd ZdZdS )ÚBadClientErrorzf
    Raised by BadClient at the end of every datagramReceived call to try and
    screw stuff up.
    N)r%   r&   r'   Ú__doc__r(   r   r   rE   rE   P   s   € € € € € ðð ð ð r   rE   c                   ó"   — e Zd ZdZdZd„ Zd„ ZdS )Ú	BadClientz�
    A DatagramProtocol which always raises an exception from datagramReceived.
    Used to test error handling behavior in the reactor for that method.
    Nc                 ó   — || _         dS )ze
        Set the Deferred which will be called back when datagramReceived is
        called.
        N)r    r   s     r   ÚsetDeferredzBadClient.setDeferred_   s   € ð
 ˆŒˆˆr   c                 óv   — | j         �$| j         d c}| _         |                     |¦  «         t          d¦  «        ‚)NzApplication code is very buggy!)r    r   rE   )r   Úbytesr0   r    s       r   r1   zBadClient.datagramReceivedf   s:   € ØŒ6ÐØœ ˆIˆAˆtŒvØ�JŠJ�uÑÔÐÝÐ>Ñ?Ô?Ð?r   )r%   r&   r'   rF   r    rJ   r1   r(   r   r   rH   rH   W   sH   € € € € € ðð ð
 	€Aðð ð ð@ð @ð @ð @ð @r   rH   ú!This reactor does not support UDPc                   ó¦   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Z ee	j
                             d¦  «        dk    d¦  «        d	„ ¦   «         Zd
„ Zd„ Zd„ Zd„ ZdS )ÚUDPTestsc                 óº   ‡ ‡— t          ¦   «         }t          j        ¦   «         x}|_        t	          j        d|d¬¦  «        Šˆˆ fd„}|                     |¦  «        S )zu
        The C{type} of the host address of a listening L{DatagramProtocol}'s
        transport is C{"UDP"}.
        r   ú	127.0.0.1©Ú	interfacec                 óŠ   •— ‰                      ¦   «         }‰                     |j        d¦  «         ‰                     ¦   «         S )NÚUDP)ÚgetHostÚassertEqualÚtypeÚstopListening)Úignoredr0   Úpr   s     €€r   Ú	cbStartedz+UDPTests.test_oldAddress.<locals>.cbStartedx   s8   ø€ Ø—9’9‘;”;ˆDØ×Ò˜TœY¨Ñ.Ô.Ð.Ø—?’?Ñ$Ô$Ð$r   ©r*   r   r
   r   r   Ú	listenUDPÚaddCallback)r   Úserverr    r\   r[   s   `   @r   Útest_oldAddresszUDPTests.test_oldAddresso   sm   øø€ õ
 ‘”ˆÝ%*¤^Ñ%5Ô%5Ð5ˆˆFÔ"ÝÔ˜a °;Ð?Ñ?Ô?ˆð	%ð 	%ð 	%ð 	%ð 	%ð 	%ð
 �}Š}˜YÑ'Ô'Ð'r   c                 óð   ‡ ‡‡— t          ¦   «         Št          j        ¦   «         x}‰_        t	          j        d‰d¬¦  «        Šˆˆ ˆfd„}ˆ ˆfd„}|                     |¦  «                             |¦  «        S )z±
        The L{DatagramProtocol}'s C{startProtocol} and C{stopProtocol}
        methods are called when its transports starts and stops listening,
        respectively.
        r   rQ   rR   c                 ó˜   •— ‰                      ‰j        d¦  «         ‰                      ‰j        d¦  «         ‰                     ¦   «         S )Nr   r   )rW   r   r#   rY   )rZ   Úport1r   r`   s    €€€r   r\   z*UDPTests.test_startStop.<locals>.cbStarted‰   sE   ø€ Ø×Ò˜Vœ^¨QÑ/Ô/Ð/Ø×Ò˜Vœ^¨QÑ/Ô/Ð/Ø×&Ò&Ñ(Ô(Ð(r   c                 ó>   •— ‰                      ‰j        d¦  «         d S r   )rW   r#   )rZ   r   r`   s    €€r   Ú	cbStoppedz*UDPTests.test_startStop.<locals>.cbStoppedŽ   s!   ø€ Ø×Ò˜Vœ^¨QÑ/Ô/Ð/Ð/Ð/r   r]   )r   r    r\   rf   rd   r`   s   `   @@r   Útest_startStopzUDPTests.test_startStop   sŸ   øøø€ õ ‘”ˆÝ%*¤^Ñ%5Ô%5Ð5ˆˆFÔ"ÝÔ! ! V°{ÐCÑCÔCˆð	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð
	0ð 	0ð 	0ð 	0ð 	0ð 	0ð �}Š}˜YÑ'Ô'×3Ò3°IÑ>Ô>Ð>r   c                 óÂ   ‡‡— t          ¦   «         Št          j        ¦   «         x}‰_        t	          j        d‰d¬¦  «        }d„ Šˆˆfd„}|                     ‰|¦  «        S )zr
        Re-listening with the same L{DatagramProtocol} re-invokes the
        C{startProtocol} callback.
        r   rQ   rR   c                 ó*   — |                      ¦   «         S r   ©rY   ©rZ   Úports     r   r\   z'UDPTests.test_rebind.<locals>.cbStartedœ   s   € Ø×%Ò%Ñ'Ô'Ð'r   c                 ó’   •— t          j        ¦   «         x}‰_        t          j        d‰d¬¦  «        }|                     ‰|¦  «        S ©Nr   rQ   rR   )r   r
   r   r   r^   r_   )rZ   r    r[   r\   r`   s      €€r   rf   z'UDPTests.test_rebind.<locals>.cbStoppedŸ   sC   ø€ Ý).¬Ñ)9Ô)9Ð9ˆA�Ô&ÝÔ! ! V°{ÐCÑCÔCˆAØ—=’= ¨AÑ.Ô.Ð.r   r]   )r   r    r[   rf   r\   r`   s       @@r   Útest_rebindzUDPTests.test_rebind“   s~   øø€ õ
 ‘”ˆÝ%*¤^Ñ%5Ô%5Ð5ˆˆFÔ"ÝÔ˜a °;Ð?Ñ?Ô?ˆð	(ð 	(ð 	(ð	/ð 	/ð 	/ð 	/ð 	/ð 	/ð
 �}Š}˜Y¨Ñ*Ô*Ð*r   c                 óö   ‡ ‡‡— t          ¦   «         Št          j        ¦   «         x}‰_        t	          j        d‰d¬¦  «        Šˆˆ ˆfd„}|                     |¦  «         ˆfd„}|                     |¦  «         |S )z�
        A L{CannotListenError} exception is raised when attempting to bind a
        second protocol instance to an already bound port
        r   rQ   rR   c                 ó,  •— ‰                      ‰                     ¦   «         ‰j                             ¦   «         ¦  «         t          ¦   «         }‰                     t
          j        t          j        ‰                     ¦   «         j	        |d¬¦  «         d S )NrQ   rR   )
rW   rV   Ú	transportr*   ÚassertRaisesr   ÚCannotListenErrorr   r^   rl   )rZ   Úserver2rl   r   r`   s     €€€r   r\   z*UDPTests.test_bindError.<locals>.cbStarted¯   s€   ø€ Ø×Ò˜TŸ\š\™^œ^¨VÔ-=×-EÒ-EÑ-GÔ-GÑHÔHÐHÝ‘h”hˆGØ×ÒÝÔ'ÝÔ!Ø—’‘”Ô#ØØ%ð ñ ô ð ð ð r   c                 ó,   •— ‰                      ¦   «         S r   rj   rk   s    €r   Ú
cbFinishedz+UDPTests.test_bindError.<locals>.cbFinished¼   s   ø€ Ø×%Ò%Ñ'Ô'Ð'r   r]   )r   r    r\   rw   rl   r`   s   `   @@r   Útest_bindErrorzUDPTests.test_bindError¦   s¥   øøø€ õ
 ‘”ˆÝ%*¤^Ñ%5Ô%5Ð5ˆˆFÔ"ÝÔ   F°kÐBÑBÔBˆð		ð 		ð 		ð 		ð 		ð 		ð 		ð 	
�Š�iÑ Ô Ð ð	(ð 	(ð 	(ð 	(ð 	(ð 	
�Š�jÑ!Ô!Ð!Øˆr   c                 óº  ‡ ‡‡‡	‡
— t          ¦   «         Š
t          j        ¦   «         x}‰
_        t	          j        d‰
d¬¦  «        Š	t          ¦   «         Št          j        ¦   «         xŠ‰_        ˆˆˆ fd„}|                     |¦  «        }ˆˆ
fd„}|                     |¦  «         ˆˆ ˆ
fd„}|                     |¦  «         ˆ	ˆ fd„}|                     |¦  «         |S )zŽ
        Datagrams can be sent with the transport's C{write} method and
        received via the C{datagramReceived} callback method.
        r   rQ   rR   c                 ó@   •— t          j        d‰d¬¦  «        ‰_        ‰S rn   )r   r^   Úport2)rZ   ÚclientÚclientStartedr   s    €€€r   ÚcbServerStartedz2UDPTests.test_sendPackets.<locals>.cbServerStartedÎ   s"   ø€ Ý Ô*¨1¨fÀÐLÑLÔLˆDŒJØ Ð r   c                 óÔ  •‡‡— ‰j                              d‰j                              ¦   «         j        ¦  «         ‰j                              ¦   «         }‰j                              ¦   «         }t	          j        ¦   «         x}‰_        ‰j                              d|j        |j        f¦  «         ddd|j        |j        ffgŠˆˆˆˆfd„Št	          j	         ‰d ¦  «        |gd¬¦  «        S )	NrQ   ó   hello)ó   a)ó   bNó   cc                 ó²   •— ‰rSt          j        ¦   «         x}‰_        |                     ‰¦  «          ‰j        j        ‰                     d¦  «        Ž  |S d S ©Nr   )r   r
   r.   r_   rr   ÚwriteÚpop)rZ   ÚnextClientWriteÚcbClientSendr|   ÚclientWritesr`   s     €€€€r   r‰   zHUDPTests.test_sendPackets.<locals>.cbClientStarted.<locals>.cbClientSendÞ   se   ø€ Øð +Ý>C¼nÑ>NÔ>NÐN�O fÔ&;Ø#×/Ò/°Ñ=Ô=Ð=Ø*�FÔ$Ô*¨L×,<Ò,<¸QÑ,?Ô,?Ð@Ð@Ø*Ð*ð	+ð +r   T©ÚfireOnOneErrback)
rr   ÚconnectrV   rl   r   r
   r.   r†   ÚhostÚDeferredList)rZ   ÚcAddrÚsAddrÚ
serverSendr‰   rŠ   r|   r`   s       @@€€r   ÚcbClientStartedz2UDPTests.test_sendPackets.<locals>.cbClientStartedÔ   s  øøø€ ØÔ×$Ò$ [°&Ô2B×2JÒ2JÑ2LÔ2LÔ2QÑRÔRÐRØÔ$×,Ò,Ñ.Ô.ˆEØÔ$×,Ò,Ñ.Ô.ˆEå16´Ñ1AÔ1AÐAˆJ˜Ô.ØÔ×"Ò" 8¨e¬j¸%¼*Ð-EÑFÔFÐFà# \°D¸5¼:ÀuÄzÐ:RÐ3SÐTˆLð+ð +ð +ð +ð +ð +ð +ð +õ Ô%Ø�˜dÑ#Ô# ZÐ0À4ðñ ô ð r   c                 ó$  •— ‰j                              ¦   «         }‰j                              ¦   «         }‰                     ‰j        d|j        |j        ffg¦  «         |j        |j        f}‰                     ‰j        d|fd|fd|fg¦  «         d S )Nr€   r�   r‚   rƒ   )rr   rV   rW   r   rŽ   rl   )rZ   r�   r‘   Ú
clientAddrr|   r   r`   s       €€€r   ÚcbSendsFinishedz2UDPTests.test_sendPackets.<locals>.cbSendsFinishedî   s¢   ø€ ØÔ$×,Ò,Ñ.Ô.ˆEØÔ$×,Ò,Ñ.Ô.ˆEØ×Ò˜Vœ^¨x¸%¼*ÀeÄjÐ9QÐ.RÐ-SÑTÔTÐTØœ* e¤jÐ1ˆJØ×ÒØ”Ø˜
Ð# d¨JÐ%7¸$À
Ð9KÐLñô ð ð ð r   c                 óš   •— t          j        t          j        ‰j        ¦  «        t          j        ‰j        j        ¦  «        gd¬¦  «        S ©NTr‹   )r   r�   r   rY   r{   )rZ   rd   r   s    €€r   rw   z-UDPTests.test_sendPackets.<locals>.cbFinishedú   sK   ø€ ÝÔ%åÔ'¨Ô(;Ñ<Ô<ÝÔ'¨¬
Ô(@ÑAÔAðð "&ðñ ô ð r   )r*   r   r
   r   r   r^   rB   r_   )r   ÚserverStartedr~   r    r“   r–   rw   r|   r}   rd   r`   s   `      @@@@r   Útest_sendPacketszUDPTests.test_sendPacketsÂ   s4  øøøøø€ õ
 ‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.ÝÔ! ! V°{ÐCÑCÔCˆå‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.ð	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð ×%Ò% oÑ6Ô6ˆð	ð 	ð 	ð 	ð 	ð 	ð0 	
�Š�oÑ&Ô&Ð&ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	
�Š�oÑ&Ô&Ð&ð	ð 	ð 	ð 	ð 	ð 	ð 	
�Š�jÑ!Ô!Ð!Øˆr   ÚINFRASTRUCTUREÚAZUREPIPELINESz"Hangs on Pipelines due to firewallc                 óª  ‡ ‡‡‡‡	— t          ¦   «         Št          j        ¦   «         x}‰_        t	          j        d‰d¬¦  «        Št          ¦   «         Š	t          j        ¦   «         x}‰	_        t	          j        d‰	d¬¦  «        Št          j        ||gd¬¦  «        }ˆˆ ˆ	fd„}|                     |¦  «         ˆˆfd„}|                     |¦  «         |S )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   rQ   rR   Tr‹   c                 óL  •— t          j        ¦   «         x}‰_        ‰j                             dd¦  «         t          d¦  «        D ]?}‰j                             d|fz  ¦  «         ‰j                             d|fz  d¦  «         Œ@‰                     |t          j	        ¦  «        S )NrQ   éP   é
   ó   %d©rQ   rŸ   )
r   r
   r   rr   r�   Úranger†   ÚassertFailurer   r>   )rZ   r?   Úir|   r   r`   s      €€€r   r\   z2UDPTests.test_connectionRefused.<locals>.cbStarted  s£   ø€ Ý9>¼Ñ9IÔ9IÐIÐ Ô 6ØÔ×$Ò$ [°"Ñ5Ô5Ð5å˜2‘Y”Yð Hð H�ØÔ ×&Ò& u°¨t¡|Ñ4Ô4Ð4ØÔ ×&Ò& u°¨t¡|Ð5FÑGÔGÐGÐGà×%Ò%Ð&7½Ô9UÑVÔVÐVr   c                 ó�   •— t          j        t          j        ‰j        ¦  «        t          j        ‰j        ¦  «        gd¬¦  «        S r˜   ©r   r�   r   rY   )rZ   rl   r{   s    €€r   rw   z3UDPTests.test_connectionRefused.<locals>.cbFinished'  sI   ø€ ÝÔ%åÔ'¨Ô(:Ñ;Ô;ÝÔ'¨Ô(;Ñ<Ô<ðð "&ðñ ô ð r   )	rB   r   r
   r   r   r^   r*   r�   r_   )
r   r}   r™   r    r\   rw   r|   rl   r{   r`   s
   `     @@@@r   Útest_connectionRefusedzUDPTests.test_connectionRefused  s  øøøøø€ õ ‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.ÝÔ   F°kÐBÑBÔBˆå‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.ÝÔ! ! V°{ÐCÑCÔCˆåÔ ¨}Ð=ÐPTÐUÑUÔUˆð	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	
�Š�iÑ Ô Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	
�Š�jÑ!Ô!Ð!Øˆr   c                 óN  ‡ ‡	‡
‡‡‡— t          ¦   «         Š	t          j        ¦   «         x}‰	_        t	          j        d‰	d¬¦  «        Š
dŠt          ¦   «         Št          j        ¦   «         x}‰_        t          j        ¦   «         x}‰_        t	          j        d‰d¬¦  «        Št          j        ||gd¬¦  «        }ˆ	ˆˆˆfd„}| 	                    |¦  «         t          j        ||gd¬¦  «        }ˆ ˆˆfd„}| 	                    |¦  «         ˆ
ˆfd	„}| 	                    |¦  «         |S )
as  
        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   rQ   rR   s   Sending test packet to serverTr‹   c                 ó‚   •— ‰j                              dd¦  «         ‰j                              ‰d‰j        f¦  «         d S )Ns$   write to port no one is listening tor¢   rQ   )rr   r†   Ú_realPortNumber)rZ   r|   r`   Ú
serverPortÚtest_data_to_sends    €€€€r   ÚcbClientAndServerStartedzAUDPTests.test_serverReadFailure.<locals>.cbClientAndServerStartedJ  sZ   ø€ ð Ô×"Ò"Ø7Ð9Jñô ð ð Ô×"Ò"Ø! K°Ô1KÐ#Lñô ð ð ð r   c                 óV   •— ‰                      ‰j        d         d         ‰¦  «         d S r…   ©rW   r   )rZ   r   r`   r­   s    €€€r   Úverify_server_got_dataz?UDPTests.test_serverReadFailure.<locals>.verify_server_got_data]  s,   ø€ Ø×Ò˜Vœ^¨AÔ.¨qÔ1Ð3DÑEÔEÐEÐEÐEr   c                 ó�   •— t          j        t          j        ‰j        ¦  «        t          j        ‰j        ¦  «        gd¬¦  «        S r˜   r§   )rZ   Ú
clientPortr¬   s    €€r   Úcleanupz0UDPTests.test_serverReadFailure.<locals>.cleanupb  sI   ø€ ÝÔ%åÔ'¨
Ô(@ÑAÔAÝÔ'¨
Ô(@ÑAÔAðð "&ðñ ô ð r   )
rB   r   r
   r   r   r^   r*   r.   r�   r_   )r   r}   r™   ÚserverGotDataÚserver_client_started_dr®   Úall_data_sentr±   r´   r|   r³   r`   r¬   r­   s   `        @@@@@r   Útest_serverReadFailurezUDPTests.test_serverReadFailure3  sŒ  øøøøøø€ õ ‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.ÝÔ& q¨&¸KÐHÑHÔHˆ
Ø<Ðå‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.Ý05´Ñ0@Ô0@Ð@ˆ˜Ô-ÝÔ& q¨&¸KÐHÑHÔHˆ
å"'Ô"4Ø˜MÐ*¸Tð#
ñ #
ô #
Ðð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	 ×+Ò+Ð,DÑEÔEÐEåÔ*Ø$ mÐ4Àtð
ñ 
ô 
ˆð	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	×!Ò!Ð"8Ñ9Ô9Ð9ð	ð 	ð 	ð 	ð 	ð 	ð 	×!Ò! 'Ñ*Ô*Ð*àÐr   c                 óP  — t          ¦   «         }t          j        d|d¬¦  «        }|                      t          j        |j        j        dd¦  «         |j                             dd¦  «         |                      t          |j        j        dd¦  «         | 	                    ¦   «         S )a   
        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   rQ   rR   Ú	localhostrŸ   )
rB   r   r^   rs   r   ÚInvalidAddressErrorrr   r�   ÚRuntimeErrorrY   )r   r|   rl   s      r   Útest_badConnectzUDPTests.test_badConnecto  s›   € õ ‘”ˆÝÔ   F°kÐBÑBÔBˆØ×ÒÝÔ% vÔ'7Ô'?ÀÈbñ	
ô 	
ð 	
ð 	Ô× Ò  ¨bÑ1Ô1Ð1Ø×Ò�,¨Ô(8Ô(@À+ÈrÑRÔRÐRØ×!Ò!Ñ#Ô#Ð#r   c                 ó|  ‡ ‡‡‡‡‡‡‡	— t          j        ¦   «         Šˆ fd„}‰                     |¦  «         t          ¦   «         Št	          j        d‰d¬¦  «        Šˆfd„}‰                     |¦  «         ‰                     ¦   «         Št          t          d¦  «        ¦  «        Šg Š	ˆˆˆˆˆˆ ˆ	fd„Š ‰¦   «          ‰S )zr
        When datagramReceived raises an exception it is logged but the port
        is not disconnected.
        c                 ó¦   •— ‰                      t          ¦  «        }‰                     t          |¦  «        ddt          |¦  «        fz  ¦  «         dS )z…
            Flush the exceptions which the reactor should have logged and make
            sure they're actually there.
            é   z'Incorrectly found %d errors, expected 2N)ÚflushLoggedErrorsrE   rW   Úlen)ÚignÚerrsr   s     €r   ÚcbCompletedz8UDPTests.test_datagramReceivedError.<locals>.cbCompletedˆ  sU   ø€ ð
 ×)Ò)­.Ñ9Ô9ˆDØ×ÒÝ�D‘	”	˜1ÐGÍ3ÈtÉ9Ì9È,ÑVñô ð ð ð r   r   rQ   rR   c                 ód   •‡ — t          j        ‰j        ¦  «                             ˆ fd„¦  «        S )zƒ
            Disconnect the port we started and pass on whatever was given to us
            in case it was a Failure.
            c                 ó   •— ‰S r   r(   )rÃ   Úresults    €r   ú<lambda>zHUDPTests.test_datagramReceivedError.<locals>.cbCleanup.<locals>.<lambda>œ  s   ø€ Èv€ r   )r   r   rY   ÚaddBoth)rÈ   rl   s   `€r   Ú	cbCleanupz6UDPTests.test_datagramReceivedError.<locals>.cbCleanup—  s2   øø€ õ
 Ô& tÔ'9Ñ:Ô:×BÒBÐCUÐCUÐCUÐCUÑVÔVÐVr   é<   c                  ó`  •‡— ‰s;	 ‰
                      d¦  «         n$# t          $ r ‰                     ¦   «          Y nw xY w‰
                     ‰j        dd¦  «         d‰                     d¦  «        fz  } t          j        ¦   «         }‰                     |¦  «         ‰j         	                    | ‰j
        ‰j        f¦  «         ˆˆ	ˆˆfd„}ˆ	fd„}|                     ||¦  «         |                     ‰j        ¦  «         t          j        d|j        t!          j        d	¦  «        ¦  «        ŠdS )
a6  
            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          ‰¦  «        dk    rt          j        d‰j        d¦  «         dS  ‰¦   «          dS )z…
                A packet arrived.  Cancel the timeout for it, record it, and
                maybe finish the test.
                rÀ   r   N)Úcancelr-   rÂ   r   Ú	callLaterr   )ÚpacketÚfinalDeferredÚmakeAttemptÚsucceededAttemptsÚtimeoutCalls    €€€€r   ÚcbPacketReceivedzRUDPTests.test_datagramReceivedError.<locals>.makeAttempt.<locals>.cbPacketReceivedÃ  sn   ø€ ð
 ×"Ò"Ñ$Ô$Ð$Ø!×(Ò(¨Ñ0Ô0Ð0ÝÐ(Ñ)Ô)¨QÒ.Ð.õ
 Ô% a¨Ô)?ÀÑFÔFÐFÐFÐFà�K‘M”M�M�M�Mr   c                 ó   •—  ‰¦   «          dS )aÄ  
                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.
                Nr(   )ÚerrrÓ   s    €r   ÚebPacketTimeoutzQUDPTests.test_datagramReceivedError.<locals>.makeAttempt.<locals>.ebPacketTimeoutÓ  s   ø€ ð �‘”���r   gš™™™™™¹?z&Timed out in testDatagramReceivedError)ÚfailÚ	Exceptionr7   ÚfailIfIdenticalrr   r‡   r   r
   rJ   r†   rŽ   rl   ÚaddCallbacksÚ
addErrbackr   rÐ   r   ÚTimeoutError)rÑ   ÚpacketDeferredrÖ   rÙ   rÕ   r0   Úattemptsr|   rÒ   rÓ   r   rÔ   s       @€€€€€€€r   rÓ   z8UDPTests.test_datagramReceivedError.<locals>.makeAttempt­  s|  øø€ ð ð ,ð,Ø—I’IÐ;Ñ<Ô<Ð<Ð<øÝ ð ,ð ,ð ,Ø!×)Ò)Ñ+Ô+Ð+Ð+Ð+ð,øøøð × Ò ØÔ  $Ð(Iñô ð ð ˜hŸlšl¨1™oœoÐ/Ñ/ˆFÝ"œ^Ñ-Ô-ˆNØ×Ò˜~Ñ.Ô.Ð.ØÔ×"Ò" 6¨D¬I°t´yÐ+AÑBÔBÐBð"ð "ð "ð "ð "ð "ð "ð "ð 	ð 	ð 	ð 	ð 	ð ×'Ò'Ð(8¸/ÑJÔJÐJØ×%Ò% mÔ&;Ñ<Ô<Ð<å!Ô+ØØÔ&ÝÔ"Ð#KÑLÔLñô ˆKˆKˆKs   † œ=¼=)
r   r
   r_   rH   r   r^   rÊ   rV   Úlistr£   )
r   rÅ   rË   r0   rá   r|   rÒ   rÓ   rl   rÔ   s
   `  @@@@@@@r   Útest_datagramReceivedErrorz#UDPTests.test_datagramReceivedError�  s  øøøøøøøø€ õ
 œÑ(Ô(ˆð	ð 	ð 	ð 	ð 	ð 	×!Ò! +Ñ.Ô.Ð.å‘”ˆÝÔ   F°kÐBÑBÔBˆð	Wð 	Wð 	Wð 	Wð 	Wð 	×Ò˜iÑ(Ô(Ð(à�|Š|‰~Œ~ˆõ �˜b™	œ	‘?”?ˆØÐð8	ð 8	ð 8	ð 8	ð 8	ð 8	ð 8	ð 8	ð 8	ð 8	ð 8	ðt 	ˆ‰ŒˆØÐr   c                 ó(  —  G d„ d¦  «        }t          j        dt          ¦   «         ¦  «        } |¦   «         |_        |                     dd¦  «         |                      | j        g¦  «        }|                      t          |¦  «        d¦  «         dS )ai  
        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                   ó   — e Zd Zd„ ZdS )ú6UDPTests.test_NoWarningOnBroadcast.<locals>.fakeSocketc                 ó   — d S r   r(   )r   ÚfooÚbars      r   Úsendtoz=UDPTests.test_NoWarningOnBroadcast.<locals>.fakeSocket.sendtoô  s   € Ø�r   N)r%   r&   r'   rê   r(   r   r   Ú
fakeSocketræ   ó  s#   € € € € € ðð ð ð ð r   rë   r   s   test)z<broadcast>iÒ  N)	r	   ÚPortr*   Úsocketr†   ÚflushWarningsÚtest_NoWarningOnBroadcastrW   rÂ   )r   rë   r[   Úwarningss       r   rï   z"UDPTests.test_NoWarningOnBroadcastê  sž   € ð	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	õ ŒH�Q�™œÑ!Ô!ˆØ�:‘<”<ˆŒØ	�Š�Ð.Ñ/Ô/Ð/à×%Ò% tÔ'EÐ&FÑGÔGˆØ×Ò�˜X™œ¨Ñ*Ô*Ð*Ð*Ð*r   N)r%   r&   r'   ra   rg   ro   rx   rš   r   ÚosÚenvironÚgetr¨   r¸   r½   rã   rï   r(   r   r   rO   rO   m   sê   € € € € € ð(ð (ð (ð ?ð ?ð ?ð(+ð +ð +ð&ð ð ð8Bð Bð BðH €VØ
Œ
�ŠÐ'Ñ(Ô(Ð,<Ò<Ø,ñô ð'ð 'ñ	ô ð'ðR:ð :ð :ðx$ð $ð $ð$gð gð gðR+ð +ð +ð +ð +r   rO   c                   óJ   — e Zd ZdZ ej        ed¦  «        sdZd„ Zd„ Z	d„ Z
dS )ÚReactorShutdownInteractionTestsz!Test reactor shutdown interactionNrM   c                 ón   — t          ¦   «         | _        t          j        d| j        d¬¦  «        | _        dS )zStart a UDP portr   rQ   rR   N)r*   r`   r   r^   rl   r   s    r   ÚsetUpz%ReactorShutdownInteractionTests.setUp  s,   € å‘h”hˆŒÝÔ% a¨¬ÀÐLÑLÔLˆŒ	ˆ	ˆ	r   c                 ó4   — | j                              ¦   «         S )zStop the UDP port)rl   rY   r   s    r   ÚtearDownz(ReactorShutdownInteractionTests.tearDown  s   € àŒy×&Ò&Ñ(Ô(Ð(r   c                 ó^  ‡ ‡— t          j        ¦   «         Št          j        ¦   «         x}‰ j        _        ˆˆ fd„}|                     |¦  «         ˆ fd„}‰                     |¦  «         ‰ j        j                             dd‰ j        j                             ¦   «         j        f¦  «         ‰S )z0Test reactor shutdown while in a recvfrom() loopc                 óz   •— ‰j         j                             ¦   «          t          j        d‰j        d ¦  «         d S r…   )r`   rr   ÚconnectionLostr   rÐ   r   )rZ   Úfinishedr   s    €€r   ÚpktRecezQReactorShutdownInteractionTests.testShutdownFromDatagramReceived.<locals>.pktRece  s:   ø€ àŒKÔ!×0Ò0Ñ2Ô2Ð2õ Ô˜a Ô!2°DÑ9Ô9Ð9Ð9Ð9r   c                 ó0   •— ‰                      ¦   «          d S r   )rÁ   ©rZ   r   s    €r   ÚflushErrorszUReactorShutdownInteractionTests.testShutdownFromDatagramReceived.<locals>.flushErrors(  s   ø€ ð
 ×"Ò"Ñ$Ô$Ð$Ð$Ð$r   s@                                                                   rQ   )	r   r
   r`   r.   r_   rr   r†   rV   rl   )r   Úprrþ   r  rý   s   `   @r   Ú testShutdownFromDatagramReceivedz@ReactorShutdownInteractionTests.testShutdownFromDatagramReceived  sÍ   øø€ õ ”>Ñ#Ô#ˆÝ*/¬.Ñ*:Ô*:Ð:ˆˆTŒ[Ô'ð	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	�Š�wÑÔÐð	%ð 	%ð 	%ð 	%ð 	%ð 	×Ò˜[Ñ)Ô)Ð)ØŒÔ×#Ò#Ø˜ d¤kÔ&;×&CÒ&CÑ&EÔ&EÔ&JÐKñ	
ô 	
ð 	
ð ˆr   )r%   r&   r'   rF   r   ÚIReactorUDPr   Úskipr÷   rù   r  r(   r   r   rõ   rõ   ÿ  sf   € € € € € à+Ð+à!ˆ:Ô! '¨4Ñ0Ô0ð 3Ø2ˆðMð Mð Mð
)ð )ð )ð$ð $ð $ð $ð $r   rõ   ú'This reactor does not support multicastc                   ó´  — e Zd Zej                             d¦  «        dk    rej                             ¦   «         rdZ	 e
j        ed¦  «        sdZ	d„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Z eej                             ¦   «         oej                             ¦   «          d¦  «        d„ ¦   «         Zd„ Z eej                             ¦   «         d¦  «        d„ ¦   «         ZdS )ÚMulticastTestsr›   rœ   z Does not work on Azure PipelinesNr  c                 óP  — t          ¦   «         | _        t          ¦   «         | _        t	          j        d| j        ¦  «        | _        t	          j        d| j        ¦  «        | _        | j        j         	                    d| j        j         
                    ¦   «         j        ¦  «         d S )Nr   rQ   )r*   r`   r4   r|   r   ÚlistenMulticastrd   r{   rr   r�   rV   rl   r   s    r   r÷   zMulticastTests.setUpD  sy   € Ý‘h”hˆŒÝ‘h”hˆŒåÔ,¨Q°´Ñ<Ô<ˆŒ
ÝÔ,¨Q°´Ñ<Ô<ˆŒ
ØŒÔ×%Ò% k°4´;Ô3H×3PÒ3PÑ3RÔ3RÔ3WÑXÔXÐXÐXÐXr   c                 ó€   — t          t          | j        j        ¦  «        t          | j        j        ¦  «        g¦  «        S r   )r   r   rd   rY   r{   r   s    r   rù   zMulticastTests.tearDownL  s9   € Ýå˜dœjÔ6Ñ7Ô7Ý˜dœjÔ6Ñ7Ô7ðñ
ô 
ð 	
r   c                 ó  — | j         | j        fD ]v}|                      |j                             ¦   «         d¦  «         |j                             d¦  «         |                      |j                             ¦   «         d¦  «         Œwd S )Nr   rÀ   )r|   r`   rW   rr   ÚgetTTLÚsetTTL)r   Úos     r   ÚtestTTLzMulticastTests.testTTLT  s…   € Ø”˜dœkÐ)ð 	6ð 	6ˆAØ×Ò˜Qœ[×/Ò/Ñ1Ô1°1Ñ5Ô5Ð5ØŒK×Ò˜qÑ!Ô!Ð!Ø×Ò˜Qœ[×/Ò/Ñ1Ô1°1Ñ5Ô5Ð5Ð5ð	6ð 	6r   c                 óˆ  ‡ ‡— ‰                       ‰ j        j                             ¦   «         d¦  «         ‰ j        j                             ¦   «         Š‰ j        j                             d¦  «        }ˆˆ fd„}|                     |¦  «         ˆˆ fd„}|                     |¦  «         ˆ fd„}|                     |¦  «         |S )zv
        Test that after loopback mode has been set, multicast packets are
        delivered to their sender.
        r   ú225.0.0.250c                 óŠ   •— t          ¦   «         x}‰j        _        ‰j        j                             dd‰j        f¦  «         |S )Nr€   r  ©r
   r`   r.   rr   r†   rl   ©rZ   r    r0   r   s     €€r   ÚcbJoinedz.MulticastTests.test_loopback.<locals>.cbJoinedc  s=   ø€ Ý-5©Z¬ZÐ7ˆA�”Ô*ØŒKÔ!×'Ò'¨°=À$Ä)Ð2LÑMÔMÐMØˆHr   c                 ó¤  •— ‰                      t          ‰j        j        ¦  «        d¦  «         ‰j        j                             d¦  «         ‰                      ‰j        j                             ¦   «         d¦  «         ‰j        j                             dd‰j        f¦  «         t          ¦   «         }t          j        d|j        d ¦  «         |S )Nr   r   r€   r  )rW   rÂ   r`   r   rr   ÚsetLoopbackModeÚgetLoopbackModer†   rl   r
   r   rÐ   r   r  s     €€r   ÚcbPacketz.MulticastTests.test_loopback.<locals>.cbPacketj  s¯   ø€ Ø×Ò�S ¤Ô!4Ñ5Ô5°qÑ9Ô9Ð9ØŒKÔ!×1Ò1°!Ñ4Ô4Ð4Ø×Ò˜Tœ[Ô2×BÒBÑDÔDÀaÑHÔHÐHØŒKÔ!×'Ò'¨°=À$Ä)Ð2LÑMÔMÐMõ ‘
”
ˆAÝÔ˜a ¤¨TÑ2Ô2Ð2ØˆHr   c                 ób   •— ‰                      t          ‰j        j        ¦  «        d¦  «         d S r   )rW   rÂ   r`   r   r   s    €r   Ú
cbNoPacketz0MulticastTests.test_loopback.<locals>.cbNoPacketw  s,   ø€ Ø×Ò�S ¤Ô!4Ñ5Ô5°qÑ9Ô9Ð9Ð9Ð9r   )rW   r`   rr   r  rV   Ú	joinGroupr_   )r   Újoinedr  r  r  r0   s   `    @r   Útest_loopbackzMulticastTests.test_loopbackZ  s÷   øø€ ð
 	×Ò˜œÔ.×>Ò>Ñ@Ô@À!ÑDÔDÐDØŒ{Ô$×,Ò,Ñ.Ô.ˆØ”Ô&×0Ò0°Ñ?Ô?ˆð	ð 	ð 	ð 	ð 	ð 	ð
 	×Ò˜8Ñ$Ô$Ð$ð		ð 		ð 		ð 		ð 		ð 		ð 	×Ò˜8Ñ$Ô$Ð$ð	:ð 	:ð 	:ð 	:ð 	:ð 	×Ò˜:Ñ&Ô&Ð&àˆr   c                 ó¢  ‡ — ‰                       ‰ j        j                             ¦   «         d¦  «         ‰                       ‰ j        j                             ¦   «         d¦  «         ‰ j        j                             d¦  «        }‰ j        j                             d¦  «        }t          ||g¦  «        }ˆ fd„}|                     |¦  «         |S )zK
        Test C{getOutgoingInterface} and C{setOutgoingInterface}.
        z0.0.0.0rQ   c                 óÐ   •— ‰                      ‰j        j                             ¦   «         d¦  «         ‰                      ‰j        j                             ¦   «         d¦  «         d S )NrQ   )rW   r|   rr   ÚgetOutgoingInterfacer`   r   s    €r   ÚcbInterfacesz3MulticastTests.test_interface.<locals>.cbInterfaces‰  sW   ø€ Ø×Ò˜Tœ[Ô2×GÒGÑIÔIÈ;ÑWÔWÐWØ×Ò˜Tœ[Ô2×GÒGÑIÔIÈ;ÑWÔWÐWÐWÐWr   )rW   r|   rr   r"  r`   ÚsetOutgoingInterfacer   r_   )r   Úd1Úd2rÈ   r#  s   `    r   Útest_interfacezMulticastTests.test_interface~  sÍ   ø€ ð 	×Ò˜œÔ.×CÒCÑEÔEÀyÑQÔQÐQØ×Ò˜œÔ.×CÒCÑEÔEÀyÑQÔQÐQàŒ[Ô"×7Ò7¸ÑDÔDˆØŒ[Ô"×7Ò7¸ÑDÔDˆÝ  B˜xÑ(Ô(ˆð	Xð 	Xð 	Xð 	Xð 	Xð 	×Ò˜<Ñ(Ô(Ð(Øˆr   c                 óâ   ‡ — ‰ j         j                             d¦  «        }ˆ fd„}|                     |¦  «         ˆ fd„}|                     |¦  «         ˆ fd„}|                     |¦  «         |S )zE
        Test that multicast a group can be joined and left.
        r  c                 óB   •— ‰j         j                             d¦  «        S ©Nr  )r|   rr   Ú
leaveGroupr   s    €r   ÚclientJoinedz3MulticastTests.test_joinLeave.<locals>.clientJoined–  ó   ø€ Ø”;Ô(×3Ò3°MÑBÔBÐBr   c                 óB   •— ‰j         j                             d¦  «        S r*  )r`   rr   r  r   s    €r   Ú
clientLeftz1MulticastTests.test_joinLeave.<locals>.clientLeft›  s   ø€ Ø”;Ô(×2Ò2°=ÑAÔAÐAr   c                 óB   •— ‰j         j                             d¦  «        S r*  )r`   rr   r+  r   s    €r   ÚserverJoinedz3MulticastTests.test_joinLeave.<locals>.serverJoined   r-  r   )r|   rr   r  r_   )r   r    r,  r/  r1  s   `    r   Útest_joinLeavezMulticastTests.test_joinLeave�  s¸   ø€ ð ŒKÔ!×+Ò+¨MÑ:Ô:ˆð	Cð 	Cð 	Cð 	Cð 	Cð 	
�Š�lÑ#Ô#Ð#ð	Bð 	Bð 	Bð 	Bð 	Bð 	
�Š�jÑ!Ô!Ð!ð	Cð 	Cð 	Cð 	Cð 	Cð 	
�Š�lÑ#Ô#Ð#àˆr   z2Windows' UDP multicast is not yet fully supported.c                 ó|   — |                       | j        j                             d¦  «        t          j        ¦  «        S )zŠ
        Test that an attempt to join an address which is not a multicast
        address fails with L{error.MulticastJoinError}.
        rQ   )r¤   r|   rr   r  r   ÚMulticastJoinErrorr   s    r   Útest_joinFailurezMulticastTests.test_joinFailure¨  s7   € ð ×!Ò!ØŒKÔ!×+Ò+¨KÑ8Ô8½%Ô:Rñ
ô 
ð 	
r   c                 ón  ‡ ‡‡‡— t          ¦   «         Št          j        d‰¦  «        Š‰ j        j                             ¦   «         Š‰ j        j                             d¦  «        }ˆˆˆ fd„}|                     |¦  «         ˆ fd„}|                     |¦  «         ˆfd„}|                     |¦  «         |S )zn
        Test that a multicast group can be joined and messages sent to and
        received from it.
        r   r  c                 ó€   •— t          ¦   «         x}‰j        _        ‰j                             dd‰j        f¦  «         |S )Nó   hello worldr  r  )rZ   r    r0   Úcr   s     €€€r   r  z/MulticastTests.test_multicast.<locals>.cbJoinedÁ  s:   ø€ Ý-5©Z¬ZÐ7ˆA�”Ô*ØŒK×Ò˜n¨}¸d¼iÐ.HÑIÔIÐIØˆHr   c                 ó`   •— ‰                      ‰j        j        d         d         d¦  «         d S ©Nr   r8  )rW   r`   r   r   s    €r   r  z/MulticastTests.test_multicast.<locals>.cbPacketÈ  s.   ø€ Ø×Ò˜Tœ[Ô0°Ô3°AÔ6¸ÑGÔGÐGÐGÐGr   c                 ób   •‡ — t          ‰j        ¦  «        }|                     ˆ fd„¦  «         |S )Nc                 ó   •— ‰S r   r(   ©rÃ   Úpassthroughs    €r   rÉ   z@MulticastTests.test_multicast.<locals>.cleanup.<locals>.<lambda>Ï  ó   ø€ ¨;€ r   )r   rY   r_   )r?  rÈ   r[   s   ` €r   r´   z.MulticastTests.test_multicast.<locals>.cleanupÍ  s6   øø€ Ý" 1¤?Ñ3Ô3ˆFØ×ÒÐ6Ð6Ð6Ð6Ñ7Ô7Ð7ØˆMr   )r*   r   r
  r`   rr   rV   r  r_   )r   r  r  r  r´   r0   r9  r[   s   `    @@@r   Útest_multicastzMulticastTests.test_multicast¶  sò   øøøø€ õ
 ‰HŒHˆÝÔ# A qÑ)Ô)ˆØŒ{Ô$×,Ò,Ñ.Ô.ˆà”Ô&×0Ò0°Ñ?Ô?ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð
 	×Ò˜8Ñ$Ô$Ð$ð	Hð 	Hð 	Hð 	Hð 	Hð 	×Ò˜8Ñ$Ô$Ð$ð	ð 	ð 	ð 	ð 	ð
 	×Ò˜7Ñ#Ô#Ð#àˆr   zjon non-linux platforms it appears multiple processes can listen, but not multiple sockets in same process?c                 ó0  ‡ ‡‡‡‡‡	‡
— t          ¦   «         Št          j        d‰d¬¦  «        Š‰                     ¦   «         j        Št          ¦   «         Št          j        ‰‰d¬¦  «        Š	dŠ
t          ‰ j        j                             ‰
¦  «        ‰                     ‰
¦  «        ‰	                     ‰
¦  «        g¦  «        }ˆˆˆˆ
fd„}| 	                    |¦  «         ˆˆˆ fd„}| 	                    |¦  «         ˆˆ	fd„}| 
                    |¦  «         |S )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  c                 ó´   •— t          ¦   «         x}‰_        t          ¦   «         x}‰_        ‰j                             d‰‰f¦  «         t	          ||g¦  «        S )Nr8  )r
   r.   rr   r†   r   )rZ   r%  r&  ÚfirstClientÚportnoÚsecondClientÚtheGroups      €€€€r   r1  z5MulticastTests.test_multiListen.<locals>.serverJoinedò  sU   ø€ Ý.6©j¬jÐ8ˆB�Ô+Ý/7©z¬zÐ9ˆB�Ô,ØÔ!×'Ò'¨¸À6Ð8JÑKÔKÐKÝ  " b Ñ*Ô*Ð*r   c                 ó¤   •— ‰                      ‰j        d         d         d¦  «         ‰                      ‰j        d         d         d¦  «         d S r;  r°   )rZ   rE  rG  r   s    €€€r   Ú
gotPacketsz3MulticastTests.test_multiListen.<locals>.gotPacketsú  sO   ø€ Ø×Ò˜[Ô0°Ô3°AÔ6¸ÑGÔGÐGØ×Ò˜\Ô1°!Ô4°QÔ7¸ÑHÔHÐHÐHÐHr   c                 ó¤   •‡ — t          t          ‰j        ¦  «        t          ‰j        ¦  «        g¦  «        }|                     ˆ fd„¦  «         |S )Nc                 ó   •— ‰S r   r(   r>  s    €r   rÉ   zBMulticastTests.test_multiListen.<locals>.cleanup.<locals>.<lambda>  r@  r   )r   r   rY   r_   )r?  rÈ   Ú	firstPortÚ
secondPorts   ` €€r   r´   z0MulticastTests.test_multiListen.<locals>.cleanup   sY   øø€ Ý"å! )Ô"9Ñ:Ô:Ý! *Ô":Ñ;Ô;ðñô ˆFð ×ÒÐ6Ð6Ð6Ð6Ñ7Ô7Ð7ØˆMr   )r*   r   r
  rV   rl   r   r`   rr   r  r_   rÊ   )r   r  r1  rJ  r´   rE  rM  rF  rG  rN  rH  s   `    @@@@@@r   Útest_multiListenzMulticastTests.test_multiListenÖ  sf  øøøøøøø€ õ ‘h”hˆÝÔ+¨A¨{È4ÐPÑPÔPˆ	à×"Ò"Ñ$Ô$Ô)ˆå‘x”xˆÝÔ,¨V°\ÐRVÐWÑWÔWˆ
à ˆÝà”Ô%×/Ò/°Ñ9Ô9Ø×#Ò# HÑ-Ô-Ø×$Ò$ XÑ.Ô.ðñ
ô 
ˆð	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	×Ò˜<Ñ(Ô(Ð(ð	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	×Ò˜:Ñ&Ô&Ð&ð	ð 	ð 	ð 	ð 	ð 	ð 	�Š�wÑÔÐØˆr   )r%   r&   r'   rñ   rò   ró   r   ÚplatformÚisMacOSXr  r   ÚIReactorMulticastr   r÷   rù   r  r  r'  r2  r   Ú	isWindowsÚisVistar5  rA  rO  r(   r   r   r  r  6  sp  € € € € € ð 	Œ
�ŠÐ'Ñ(Ô(Ð,<Ò<Ð<ØÔ×%Ò%Ñ'Ô'ð 	=ð 2ˆà'ˆ:Ô'¨°Ñ6Ô6ð 9Ø8ˆðYð Yð Yð
ð 
ð 
ð6ð 6ð 6ð"ð "ð "ðHð ð ð$ð ð ð0 €VØÔ×"Ò"Ñ$Ô$ÐG¨WÔ-=×-EÒ-EÑ-GÔ-GÐ)GØ<ñô ð
ð 
ñ	ô ð
ðð ð ð@ €VØÔ×"Ò"Ñ$Ô$ð	ñô ð/ð /ñô ð/ð /ð /r   r  )!rF   rñ   Úunittestr   Útwisted.internetr   r   r   r   r   r	   Útwisted.internet.deferr
   r   r   Útwisted.pythonr   Útwisted.trial.unittestr   r   ÚDatagramProtocolr*   ÚConnectedDatagramProtocolr4   rB   rÛ   rE   rH   r  rO   rõ   rR  r  r(   r   r   ú<module>r\     sØ  ðð
ð ð
 
€	€	€	Ø Ð Ð Ð Ð Ð à MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ "Ð "Ð "Ð "Ð "Ð "Ø +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ñ ô ð ð&ð ð ð ð ˆU�HÔ-ñ ô ð ðð ð ð ð ˆU�HÔ6ñ ô ð ð.ð ð ð ð �ñ ô ð ðð ð ð ð �Yñ ô ð ð@ð @ð @ð @ð @�Ô)ñ @ô @ð @ð, €Ð"ˆJÔ" 7¨DÑ1Ô1Ð1Ð3VÑWÔWðN+ð N+ð N+ð N+ð N+ˆxñ N+ô N+ñ XÔWðN+ðb €Ð"ˆJÔ" 7¨DÑ1Ô1Ð1Ð3VÑWÔWð3ð 3ð 3ð 3ð 3 hñ 3ô 3ñ XÔWð3ðl €Ø$ˆ
Ô$ W¨dÑ3Ô3Ð3Ø-ñô ðQð Qð Qð Qð Q�Xñ Qô Qñ	ô ðQð Qð Qr   