§
    ÈtºfO@  ã                   ó  — d Z ddlZddlmZ ddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlmZmZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z&  G d„ de¦  «        Z' G d„ d¦  «        Z( G d„ dee(e'¦  «        Z) G d„ dee(e'¦  «        Z* e+¦   «          ,                    e) -                    ¦   «         ¦  «          e+¦   «          ,                    e* -                    ¦   «         ¦  «         dS )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                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚDatagramTransportTestsMixinzP
    Mixin defining tests which apply to any port/datagram based transport.
    c                 óp  — |                       ¦   «         }|                      ¦   «         }t          t          ¦  «         G d„ dt          ¦  «        ¦   «         } |¦   «         }|                      ||¦  «        }d|                     ¦   «         j        fz  }|                      |f|d         d         ¦  «         dS )zu
        When a port starts, a message including a description of the associated
        protocol is logged.
        c                   ó   — e Zd Zd„ ZdS )úQDatagramTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeProtocolc                 ó   — dS )NzCrazy Protocol© ©Úselfs    ú]/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/internet/test/test_udp.pyÚ	logPrefixz[DatagramTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeProtocol.logPrefix1   s   € Ø'Ð'ó    N)Ú__name__Ú
__module__Ú__qualname__r$   r    r%   r#   ÚSomeProtocolr   /   s#   € € € € € ð(ð (ð (ð (ð (r%   r)   zCrazy Protocol starting on %dr   ÚmessageN)	ÚobserveÚbuildReactorr   r   r   ÚgetListeningPortÚgetHostÚportÚassertEqual)r"   ÚloggedMessagesÚreactorr)   ÚprotocolÚpÚexpectedMessages          r#   Útest_startedListeningLogMessagez;DatagramTransportTestsMixin.test_startedListeningLogMessage'   sÃ   € ð
 Ÿš™œˆØ×#Ò#Ñ%Ô%ˆå	•_Ñ	%Ô	%ð	(ð 	(ð 	(ð 	(ð 	(Õ+ñ 	(ô 	(ñ 
&Ô	%ð	(ð  �<‘>”>ˆà×!Ò! '¨8Ñ4Ô4ˆØ9¸Q¿YºY¹[¼[Ô=MÐ<OÑOˆØ×Ò˜/Ð+¨^¸AÔ->¸yÔ-IÑJÔJÐJÐJÐJr%   c                 óŽ  ‡‡‡‡— |                       ¦   «         Š|                      ¦   «         Š|                      ‰t          ¦   «         ¦  «        Šd‰                     ¦   «         j        › d�}ˆfd„Šˆˆˆfd„}‰                     |¦  «         |                      ‰¦  «         |                      |f‰d         d         ¦  «         dS )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                 ó0   •— ‰                      ¦   «          d S ©N©Ústop©Úignoredr2   s    €r#   ÚstopReactorzNDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.stopReactorD   s   ø€ Ø�LŠL‰NŒNˆNˆNˆNr%   c                  ó`   •— ‰ d d …= t          ‰j        ¦  «                             ‰¦  «         d S r9   )r
   ÚstopListeningÚaddCallback)r1   r4   r>   s   €€€r#   ÚdoStopListeningzRDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.doStopListeningG   s3   ø€ Ø˜q˜q˜qÐ!Ý˜!œ/Ñ*Ô*×6Ò6°{ÑCÔCÐCÐCÐCr%   r   r*   N)	r+   r,   r-   r   r.   r/   ÚcallWhenRunningÚ
runReactorr0   )r"   r5   rB   r1   r4   r2   r>   s      @@@@r#   Útest_connectionLostLogMessagez9DatagramTransportTestsMixin.test_connectionLostLogMessage:   sñ   øøøø€ ð
 Ÿš™œˆØ×#Ò#Ñ%Ô%ˆØ×!Ò! 'Õ+;Ñ+=Ô+=Ñ>Ô>ˆØA q§y¢y¡{¤{Ô'7ÐAÐAÐAˆð	ð 	ð 	ð 	ð 	ð	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	×Ò Ñ0Ô0Ð0Ø�Š˜Ñ Ô Ð à×Ò˜/Ð+¨^¸AÔ->¸yÔ-IÑJÔJÐJÐJÐJr%   c                 ó`  ‡—  G ˆfd„dt           ¦  «        }|                      ¦   «         Š |¦   «         }|                      ‰|¦  «         |                      ‰¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |                      |j        ¦  «         dS )z°
        L{DatagramProtocol.stopProtocol} is called asynchronously (ie, not
        re-entrantly) when C{stopListening} is used to stop the datagram
        transport.
        c                   ó0   •— e Zd ZdZdZdZdZd„ Zˆ fd„ZdS )úVDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocolFc                 ób   — d| _         d| _        | j                             ¦   «          d| _        d S )NTF)ÚstartedÚinStartProtocolÚ	transportr@   r!   s    r#   ÚstartProtocolzdDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.startProtocol]   s3   € Ø#�”Ø'+�Ô$Ø”×,Ò,Ñ.Ô.Ð.Ø',�Ô$Ð$Ð$r%   c                 óV   •— d| _         | j        | _        ‰                     ¦   «          d S )NT)ÚstoppedrK   ÚstoppedInStartr;   ©r"   r2   s    €r#   ÚstopProtocolzcDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.stopProtocolc   s&   ø€ Ø#�”Ø&*Ô&:�Ô#Ø—’‘”���r%   N)	r&   r'   r(   rJ   rO   rK   rP   rM   rR   )r2   s   €r#   ÚDisconnectingProtocolrH   W   sQ   ø€ € € € € ØˆGØˆGØ#ˆOØ"ˆNð-ð -ð -ðð ð ð ð ð ð r%   rS   N)	r   r,   r-   rD   Ú
assertTruerJ   rO   ÚassertFalserP   )r"   rS   r3   r2   s      @r#   Útest_stopProtocolSchedulingz7DatagramTransportTestsMixin.test_stopProtocolSchedulingP   sÈ   ø€ ð	ð 	ð 	ð 	ð 	ð 	ð 	Õ$4ñ 	ô 	ð 	ð" ×#Ò#Ñ%Ô%ˆØ(Ð(Ñ*Ô*ˆØ×Ò˜g xÑ0Ô0Ð0Ø�Š˜Ñ Ô Ð à�Š˜Ô(Ñ)Ô)Ð)Ø�Š˜Ô(Ñ)Ô)Ð)Ø×Ò˜Ô0Ñ1Ô1Ð1Ð1Ð1r%   N)r&   r'   r(   Ú__doc__r6   rE   rV   r    r%   r#   r   r   "   sQ   € € € € € ðð ðKð Kð Kð&Kð Kð Kð,2ð 2ð 2ð 2ð 2r%   r   c                   ó¼   — e Zd ZdZd„ Zd„ Zed„ ¦   «         Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zed
„ ¦   «         Zed„ ¦   «         Zd„ Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ ZdS )ÚUDPPortTestsMixinzY
    Tests for L{IReactorUDP.listenUDP} and
    L{IReactorSocket.adoptDatagramPort}.
    c                 óÂ   — |                       ¦   «         }|                      |t          ¦   «         ¦  «        }|                      t	          t
          |¦  «        ¦  «         dS )zY
        L{IReactorUDP.listenUDP} returns an object providing L{IListeningPort}.
        N)r,   r-   r   rT   r   r   ©r"   r2   r/   s      r#   Útest_interfacez UDPPortTestsMixin.test_interfacex   sS   € ð ×#Ò#Ñ%Ô%ˆØ×$Ò$ WÕ.>Ñ.@Ô.@ÑAÔAˆØ�Š�¥^°TÑ:Ô:Ñ;Ô;Ð;Ð;Ð;r%   c                 ó   — t          t          j        ¬¦  «        \  }}|                      ¦   «         }|                      |t          ¦   «         ||¬¦  «        }|                      |                     ¦   «         t          d||¦  «        ¦  «         dS )z³
        L{IListeningPort.getHost} returns an L{IPv4Address} giving a
        dotted-quad of the IPv4 address the port is listening on as well as
        the port number.
        )Útype)r/   Ú	interfaceÚUDPN)	r   ÚsocketÚ
SOCK_DGRAMr,   r-   r   r0   r.   r   )r"   ÚhostÚ
portNumberr2   r/   s        r#   Útest_getHostzUDPPortTestsMixin.test_getHost€   s‰   € õ (­VÔ->Ð?Ñ?Ô?ÑˆˆjØ×#Ò#Ñ%Ô%ˆØ×$Ò$ØÕ%Ñ'Ô'¨jÀDð %ñ 
ô 
ˆð 	×Ò˜Ÿš™œ­°U¸DÀ*Ñ)MÔ)MÑNÔNÐNÐNÐNr%   c                 ó
  — |                       ¦   «         }|                      |t          ¦   «         d¬¦  «        }|                     ¦   «         }|                      |j        d¦  «         |                      |t          ¦  «         dS )zr
        L{IListeningPort.getHost} returns an L{IPv6Address} when listening on
        an IPv6 interface.
        ú::1©r_   N)r,   r-   r   r.   r0   rc   ÚassertIsInstancer   )r"   r2   r/   Úaddrs       r#   Útest_getHostIPv6z"UDPPortTestsMixin.test_getHostIPv6�   sw   € ð ×#Ò#Ñ%Ô%ˆØ×$Ò$ WÕ.>Ñ.@Ô.@ÈEÐ$ÑRÔRˆØ�|Š|‰~Œ~ˆØ×Ò˜œ EÑ*Ô*Ð*Ø×Ò˜d¥KÑ0Ô0Ð0Ð0Ð0r%   c                 ó˜   — |                       ¦   «         }|                      t          j        |j        t          ¦   «         dd¬¦  «         dS )zŠ
        An L{InvalidAddressError} is raised when trying to listen on an address
        that isn't a valid IPv4 or IPv6 address.
        r   zexample.comrh   N)r,   ÚassertRaisesr   ÚInvalidAddressErrorÚ	listenUDPr   rQ   s     r#   Útest_invalidInterfacez'UDPPortTestsMixin.test_invalidInterface™   sW   € ð
 ×#Ò#Ñ%Ô%ˆØ×ÒÝÔ%ØÔÝÑÔØØ#ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r%   c                 óÌ  ‡ ‡—  G d„ dt           ¦  «        }‰                      ¦   «         Š |d¦  «        }|j        }‰                      ‰|¦  «        }|                     ¦   «         }ˆ fd„}|                     |¦  «         |                     t          ¦  «         |                     ˆfd„¦  «         |                     dd|j	        f¦  «         ‰  
                    ‰¦  «         dS )	z’
        Datagram transports implement L{ILoggingContext.logPrefix} to return a
        message reflecting the protocol they are running.
        c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )úIUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocolc                 ó:   — || _         t          ¦   «         | _        d S r9   )Ú_prefixr	   Úsystem)r"   Úprefixs     r#   Ú__init__zRUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.__init__®   s   € Ø%�”Ý&™jœj�”��r%   c                 ó   — | j         S r9   )ru   r!   s    r#   r$   zSUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.logPrefix²   s
   € Ø”|Ð#r%   c                 ó˜   — | j         �B| j         }d | _         |                     t          j        t          ¦  «        d         ¦  «         d S d S )Nrv   )rv   Úcallbackr   Úgetr   )r"   Úbytesrj   rv   s       r#   ÚdatagramReceivedzZUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.datagramReceivedµ   sG   € Ø”;Ð*Ø!œ[�FØ"&�D”KØ—O’O¥G¤KµÑ$<Ô$<¸XÔ$FÑGÔGÐGÐGÐGð +Ð*r%   N)r&   r'   r(   rx   r$   r~   r    r%   r#   ÚCustomLogPrefixDatagramProtocolrs   ­   sF   € € € € € ð)ð )ð )ð$ð $ð $ðHð Hð Hð Hð Hr%   r   zCustom Datagramsc                 ó4   •— ‰                      d| ¦  «         d S )NzCustom Datagrams (UDP))r0   )rv   r"   s    €r#   Ú	gotSystemz3UDPPortTestsMixin.test_logPrefix.<locals>.gotSystemÁ   s    ø€ Ø×ÒÐ5°vÑ>Ô>Ð>Ð>Ð>r%   c                 ó,   •— ‰                      ¦   «         S r9   r:   r<   s    €r#   ú<lambda>z2UDPPortTestsMixin.test_logPrefix.<locals>.<lambda>Æ   s   ø€  g§l¢l¡n¤n€ r%   s
   some bytesú	127.0.0.1N)r   r,   rv   r-   r.   rA   Ú
addErrbackr   Úwriter/   rD   )r"   r   r3   Údr/   Úaddressr�   r2   s   `      @r#   Útest_logPrefixz UDPPortTestsMixin.test_logPrefix§   s  øø€ ð	Hð 	Hð 	Hð 	Hð 	HÕ.>ñ 	Hô 	Hð 	Hð ×#Ò#Ñ%Ô%ˆØ2Ð2Ð3EÑFÔFˆØŒOˆØ×$Ò$ W¨hÑ7Ô7ˆØ—,’,‘.”.ˆð	?ð 	?ð 	?ð 	?ð 	?ð 	
�Š�iÑ Ô Ð Ø	�Š•SÑÔÐØ	�ŠÐ4Ð4Ð4Ð4Ñ5Ô5Ð5à�
Š
�= ;°´Ð"=Ñ>Ô>Ð>Ø�Š˜Ñ Ô Ð Ð Ð r%   c                 ó´  ‡ ‡‡—  G d„ dt           ¦  «        }‰                      ¦   «         Š |¦   «         }|j        }‰                      ‰|¦  «        }|                     ¦   «         }dŠˆˆ fd„} |j        |¦  «          |j        t          ¦  «          |j        ˆfd„¦  «         |                     ‰d|j	        f¦  «         ‰  
                    ‰¦  «         dS )zH
        Write a sequence of L{bytes} to a L{DatagramProtocol}.
        c                   ó   — e Zd Zd„ Zd„ ZdS )úDUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocolc                 ó,   — t          ¦   «         | _        d S r9   )r	   r   r!   s    r#   rx   zMUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.__init__Ñ   s   € Ý%™ZœZ�”
�
�
r%   c                 ó:   — | j                              |¦  «         d S r9   )r   r{   )r"   Údatarj   s      r#   r~   zUUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.datagramReceivedÔ   s   € Ø”
×#Ò# DÑ)Ô)Ð)Ð)Ð)r%   N)r&   r'   r(   rx   r~   r    r%   r#   ÚSimpleDatagramProtocolrŒ   Ð   s2   € € € € € ð(ð (ð (ð*ð *ð *ð *ð *r%   r�   )s   somes   bytess   tos   writec                 óZ   •— ‰                      d                     ‰¦  «        | ¦  «         d S )Nr%   )r0   Újoin)r�   ÚdataToWriter"   s    €€r#   ÚgotDataz5UDPPortTestsMixin.test_writeSequence.<locals>.gotDataÞ   s+   ø€ Ø×Ò˜SŸXšX kÑ2Ô2°DÑ9Ô9Ð9Ð9Ð9r%   c                 ó,   •— ‰                      ¦   «         S r9   r:   r<   s    €r#   rƒ   z6UDPPortTestsMixin.test_writeSequence.<locals>.<lambda>ã   s   ø€ ¨'¯,ª,©.¬.€ r%   r„   N)r   r,   r   r-   r.   rA   r…   r   ÚwriteSequencer/   rD   )	r"   r�   r3   r   r/   rˆ   r”   r“   r2   s	   `      @@r#   Útest_writeSequencez$UDPPortTestsMixin.test_writeSequenceË   s  øøø€ ð
	*ð 	*ð 	*ð 	*ð 	*Õ%5ñ 	*ô 	*ð 	*ð ×#Ò#Ñ%Ô%ˆØ)Ð)Ñ+Ô+ˆØ”ˆØ×$Ò$ W¨hÑ7Ô7ˆØ—,’,‘.”.ˆØ:ˆð	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	ˆÔ˜'Ñ"Ô"Ð"ØˆÔ�ÑÔÐØˆÔÐ8Ð8Ð8Ð8Ñ9Ô9Ð9Ø×Ò˜;¨°g´lÐ(CÑDÔDÐDØ�Š˜Ñ Ô Ð Ð Ð r%   c                 ó   — |                       ¦   «         }|                      |t          ¦   «         ¦  «        }|                      t	          |                     ¦   «         j        ¦  «        t	          |¦  «        ¦  «         dS )zQ
        C{str()} on the listening port object includes the port number.
        N)r,   r-   r   ÚassertInÚstrr.   r/   r[   s      r#   Útest_strzUDPPortTestsMixin.test_strç   sd   € ð ×#Ò#Ñ%Ô%ˆØ×$Ò$ WÕ.>Ñ.@Ô.@ÑAÔAˆØ�Š•c˜$Ÿ,š,™.œ.Ô-Ñ.Ô.µ°D±	´	Ñ:Ô:Ð:Ð:Ð:r%   c                 ó   — |                       ¦   «         }|                      |t          ¦   «         ¦  «        }|                      t	          |                     ¦   «         j        ¦  «        t          |¦  «        ¦  «         dS )zR
        C{repr()} on the listening port object includes the port number.
        N)r,   r-   r   r™   Úreprr.   r/   rš   r[   s      r#   Ú	test_reprzUDPPortTestsMixin.test_reprï   sd   € ð ×#Ò#Ñ%Ô%ˆØ×$Ò$ WÕ.>Ñ.@Ô.@ÑAÔAˆØ�Š•d˜4Ÿ<š<™>œ>Ô.Ñ/Ô/µ°T±´Ñ;Ô;Ð;Ð;Ð;r%   c                 ó¼  ‡‡	‡
— |                       ¦   «         Š	t          ¦   «         Š
t          j        ¦   «         x}‰
_        |                      ‰	‰
d¬¦  «         t          ¦   «         Št          j        ¦   «         x}‰_        |                      ‰	‰d¬¦  «         ‰j                             ¦   «         }ˆˆ
fd„}ˆ	fd„}t          j	        ||g¦  «        }| 
                    |¦  «         | 
                    |¦  «         |                     t          ¦  «         |                      ‰	¦  «         ‰
j        d         }|                      |d|j        |j        ff¦  «         dS )zS
        Writing to an IPv6 UDP socket on the loopback interface succeeds.
        rg   rh   c                 ó®   •— ‰j                              dd‰j                              ¦   «         j        f¦  «         t	          j        ¦   «         x}‰_        |S )úû
            Send a datagram from the client once it's started.

            @param ignored: a list of C{[None, None]}, which is ignored
            @returns: a deferred which fires when the server has received a
                datagram.
            ó   spamrg   )rL   r†   r.   r/   r   r	   ÚpacketReceived©r=   ÚserverReceivedÚclientÚservers     €€r#   ÚcbClientStartedzDUDPPortTestsMixin.test_writeToIPv6Interface.<locals>.cbClientStarted  sP   ø€ ð Ô×"Ò" 7¨U°FÔ4D×4LÒ4LÑ4NÔ4NÔ4SÐ,TÑUÔUÐUÝ5:´^Ñ5EÔ5EÐEˆN˜VÔ2Ø!Ð!r%   c                 ó0   •— ‰                      ¦   «          dS ©z�
            Stop the reactor after a datagram is received.

            @param ignored: L{None}, which is ignored
            @returns: L{None}
            Nr:   r<   s    €r#   ÚcbServerReceivedzEUDPPortTestsMixin.test_writeToIPv6Interface.<locals>.cbServerReceived  s   ø€ ð �LŠL‰NŒNˆNˆNˆNr%   r   r¢   N©r,   r   r   r	   ÚstartedDeferredr-   r   rL   r.   ÚgatherResultsrA   r…   r   rD   Úpacketsr0   rc   r/   ©r"   ÚserverStartedÚclientStartedÚcAddrr¨   r«   r‡   Úpacketr¦   r2   r§   s           @@@r#   Útest_writeToIPv6Interfacez+UDPPortTestsMixin.test_writeToIPv6Interface÷   sk  øøø€ ð
 ×#Ò#Ñ%Ô%ˆÝ‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.Ø×Ò˜g v¸ÐÑ?Ô?Ð?å‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.Ø×Ò˜g v¸ÐÑ?Ô?Ð?ØÔ ×(Ò(Ñ*Ô*ˆð
	"ð 
	"ð 
	"ð 
	"ð 
	"ð 
	"ð	ð 	ð 	ð 	ð 	õ Ô °Ð >Ñ?Ô?ˆØ	�Š�oÑ&Ô&Ð&Ø	�ŠÐ&Ñ'Ô'Ð'Ø	�Š•SÑÔÐØ�Š˜Ñ Ô Ð à” Ô"ˆØ×Ò˜ '¨E¬J¸¼
Ð+CÐ!DÑEÔEÐEÐEÐEr%   c                 ó¼  ‡‡	‡
— |                       ¦   «         Š	t          ¦   «         Š
t          j        ¦   «         x}‰
_        |                      ‰	‰
d¬¦  «         t          ¦   «         Št          j        ¦   «         x}‰_        |                      ‰	‰d¬¦  «         ‰j                             ¦   «         }ˆˆ
fd„}ˆ	fd„}t          j	        ||g¦  «        }| 
                    |¦  «         | 
                    |¦  «         |                     t          ¦  «         |                      ‰	¦  «         ‰
j        d         }|                      |d|j        |j        ff¦  «         dS )z�
        An IPv6 address can be passed as the C{interface} argument to
        L{listenUDP}. The resulting Port accepts IPv6 datagrams.
        rg   rh   c                 óÞ   •— ‰j                              d‰j                              ¦   «         j        ¦  «         ‰j                              d¦  «         t          j        ¦   «         x}‰_        |S )r¡   rg   r¢   )rL   Úconnectr.   r/   r†   r   r	   r£   r¤   s     €€r#   r¨   zMUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbClientStarted4  sb   ø€ ð Ô×$Ò$ U¨FÔ,<×,DÒ,DÑ,FÔ,FÔ,KÑLÔLÐLØÔ×"Ò" 7Ñ+Ô+Ð+Ý5:´^Ñ5EÔ5EÐEˆN˜VÔ2Ø!Ð!r%   c                 ó0   •— ‰                      ¦   «          dS rª   r:   r<   s    €r#   r«   zNUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbServerReceivedB  s   ø€ ð �LŠL‰NŒNˆNˆNˆNr%   r   r¢   Nr¬   r°   s           @@@r#   Ú"test_connectedWriteToIPv6Interfacez4UDPPortTestsMixin.test_connectedWriteToIPv6Interface$  sk  øøø€ ð ×#Ò#Ñ%Ô%ˆÝ‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.Ø×Ò˜g v¸ÐÑ?Ô?Ð?å‘”ˆÝ16´Ñ1AÔ1AÐAˆ˜Ô.Ø×Ò˜g v¸ÐÑ?Ô?Ð?ØÔ ×(Ò(Ñ*Ô*ˆð	"ð 	"ð 	"ð 	"ð 	"ð 	"ð	ð 	ð 	ð 	ð 	õ Ô °Ð >Ñ?Ô?ˆØ	�Š�oÑ&Ô&Ð&Ø	�ŠÐ&Ñ'Ô'Ð'Ø	�Š•SÑÔÐØ�Š˜Ñ Ô Ð à” Ô"ˆØ×Ò˜ '¨E¬J¸¼
Ð+CÐ!DÑEÔEÐEÐEÐEr%   c                 óÀ   — |                       ¦   «         }|                      |t          ¦   «         ¦  «        }|                      t          j        |j        dd¦  «         dS )zn
        Writing to a hostname instead of an IP address will raise an
        L{InvalidAddressError}.
        Úspam)úexample.invalidé   N©r,   r-   r   rm   r   rn   r†   r[   s      r#   Ú/test_writingToHostnameRaisesInvalidAddressErrorzAUDPPortTestsMixin.test_writingToHostnameRaisesInvalidAddressErrorU  sb   € ð
 ×#Ò#Ñ%Ô%ˆØ×$Ò$ WÕ.>Ñ.@Ô.@ÑAÔAˆØ×ÒÝÔ% t¤z°6Ð;Qñ	
ô 	
ð 	
ð 	
ð 	
r%   c                 óÄ   — |                       ¦   «         }|                      |t          ¦   «         d¬¦  «        }|                      t          j        |j        dd¦  «         dS )úl
        Writing to an IPv6 address on an IPv4 socket will raise an
        L{InvalidAddressError}.
        r„   rh   r¼   )rg   r¾   Nr¿   r[   s      r#   Ú1test_writingToIPv6OnIPv4RaisesInvalidAddressErrorzCUDPPortTestsMixin.test_writingToIPv6OnIPv4RaisesInvalidAddressError`  s[   € ð ×#Ò#Ñ%Ô%ˆØ×$Ò$ WÕ.>Ñ.@Ô.@ÈKÐ$ÑXÔXˆØ×Ò�%Ô3°T´ZÀÈÑTÔTÐTÐTÐTr%   c                 óÄ   — |                       ¦   «         }|                      |t          ¦   «         d¬¦  «        }|                      t          j        |j        dd¦  «         dS )rÂ   rg   rh   r¼   )r„   r¾   Nr¿   r[   s      r#   Ú1test_writingToIPv4OnIPv6RaisesInvalidAddressErrorzCUDPPortTestsMixin.test_writingToIPv4OnIPv6RaisesInvalidAddressErrorj  sg   € ð ×#Ò#Ñ%Ô%ˆØ×$Ò$ WÕ.>Ñ.@Ô.@ÈEÐ$ÑRÔRˆØ×ÒÝÔ% t¤z°6Ð;Kñ	
ô 	
ð 	
ð 	
ð 	
r%   c                 óÀ   — |                       ¦   «         }|                      |t          ¦   «         ¦  «        }|                      t          j        |j        dd¦  «         dS )zq
        Connecting to a hostname instead of an IP address will raise an
        L{InvalidAddressError}.
        r½   r¾   N)r,   r-   r   rm   r   rn   r¸   r[   s      r#   Ú2test_connectingToHostnameRaisesInvalidAddressErrorzDUDPPortTestsMixin.test_connectingToHostnameRaisesInvalidAddressErrorv  sX   € ð
 ×#Ò#Ñ%Ô%ˆØ×$Ò$ WÕ.>Ñ.@Ô.@ÑAÔAˆØ×Ò�%Ô3°T´\ÐCTÐVWÑXÔXÐXÐXÐXr%   c                 óê   — |                       ¦   «         }|                      |t          ¦   «         ¦  «        }|                     d¦  «         |                      |                     ¦   «         ¦  «         dS )zk
        L{IListeningPort.setBroadcastAllowed} sets broadcast to be allowed
        on the socket.
        TN)r,   r-   r   ÚsetBroadcastAllowedrT   ÚgetBroadcastAllowedr[   s      r#   Útest_allowBroadcastz%UDPPortTestsMixin.test_allowBroadcast  si   € ð
 ×#Ò#Ñ%Ô%ˆØ×$Ò$ WÕ.>Ñ.@Ô.@ÑAÔAˆØ× Ò  Ñ&Ô&Ð&Ø�Š˜×0Ò0Ñ2Ô2Ñ3Ô3Ð3Ð3Ð3r%   N)r&   r'   r(   rW   r\   re   r   rk   rp   r‰   r—   r›   rž   rµ   rº   rÀ   rÃ   rÅ   rÇ   rË   r    r%   r#   rY   rY   r   sM  € € € € € ðð ð
<ð <ð <ðOð Oð Oð ð	1ð 	1ñ „_ð	1ð
ð 
ð 
ð"!ð "!ð "!ðH!ð !ð !ð8;ð ;ð ;ð<ð <ð <ð ð*Fð *Fñ „_ð*FðX ð.Fð .Fñ „_ð.Fð`	
ð 	
ð 	
ð ðUð Uñ „_ðUð ð	
ð 	
ñ „_ð	
ðYð Yð Yð4ð 4ð 4ð 4ð 4r%   rY   c                   ó"   — e Zd ZdZefZ	 dd„ZdS )ÚUDPServerTestsBuilderzM
    Run L{UDPPortTestsMixin} tests using newly created UDP
    sockets.
    r   Ú é    c                 ó4   — |                      ||||¬¦  «        S )aB  
        Get a UDP port from a reactor.

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

        @see: L{twisted.internet.IReactorUDP.listenUDP} for other
            argument and return types.
        )r_   ÚmaxPacketSize)ro   )r"   r2   r3   r/   r_   rÑ   s         r#   r-   z&UDPServerTestsBuilder.getListeningPort”  s*   € ð × Ò Ø�( i¸}ð !ñ 
ô 
ð 	
r%   N©r   rÎ   rÏ   )r&   r'   r(   rW   r   ÚrequiredInterfacesr-   r    r%   r#   rÍ   rÍ   Š  sC   € € € € € ðð ð
 &˜Ðð FJð
ð 
ð 
ð 
ð 
ð 
r%   rÍ   c                   ó"   — e Zd ZdZefZ	 dd„ZdS )ÚUDPFDServerTestsBuilderzC
    Run L{UDPPortTestsMixin} tests using adopted UDP sockets.
    r   rÎ   rÏ   c                 ój  — t          j        |¦  «        �rd|v r.t          j        }t          j        ||¦  «        d         d         }nt          j        }||f}t          j        |t          j        ¦  «        }|                     |¦  «         |                     d¦  «         	 | 	                    | 
                    ¦   «         |j        ||¦  «        | 
                    ¦   «          |                     ¦   «          S # | 
                    ¦   «          |                     ¦   «          w xY wt          d¦  «        ‚)aÄ  
        Get a UDP port from a reactor, wrapping an already-initialized file
        descriptor.

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

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

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

        @see: L{twisted.internet.IReactorSocket.adoptDatagramPort} for other
            argument and return types.
        ú:r   é   Fz'Reactor does not provide IReactorSocket)r   Ú
providedByra   ÚAF_INET6ÚgetaddrinfoÚAF_INETrb   ÚbindÚsetblockingÚadoptDatagramPortÚfilenoÚfamilyÚcloser   )	r"   r2   r3   r/   r_   rÑ   Údomainrˆ   ÚportSocks	            r#   r-   z(UDPFDServerTestsBuilder.getListeningPort¯  s!  € õ. Ô$ WÑ-Ô-ñ 	FØ�iÐÐÝœ�Ý Ô,¨Y¸Ñ=Ô=¸aÔ@ÀÔC��åœ�Ø$ dÐ+�Ý”} V­VÔ->Ñ?Ô?ˆHØ�MŠM˜'Ñ"Ô"Ð"Ø× Ò  Ñ'Ô'Ð'ð
!Ø×0Ò0Ø—O’OÑ%Ô% x¤¸À-ñô ð —’Ñ!Ô!Ð!ð —’Ñ Ô Ð Ð øð —’Ñ!Ô!Ð!ð —’Ñ Ô Ð Ð øøøåÐDÑEÔEÐEs   Â".C9 Ã9*D#NrÒ   )r&   r'   r(   rW   r   rÓ   r-   r    r%   r#   rÕ   rÕ   ¦  sJ   € € € € € ðð ð )Ð*Ðð FJð-Fð -Fð -Fð -Fð -Fð -Fr%   rÕ   ).rW   ra   Ú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   rY   rÍ   rÕ   ÚglobalsÚupdateÚmakeTestCaseClassesr    r%   r#   ú<module>rö      sŒ  ððð ð €€€à &Ð &Ð &Ð &Ð &Ð &Ø .Ð .Ð .Ð .Ð .Ð .à )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ðð ð ð ð ð ð ð ð ð ð ð ð 7Ð 6Ð 6Ð 6Ð 6Ð 6Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ >Ð >Ð >Ð >Ð >Ð >Ø "Ð "Ð "Ð "Ð "Ð "Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø +Ð +Ð +Ð +Ð +Ð +ðM2ð M2ð M2ð M2ð M2Ð"2ñ M2ô M2ð M2ð`U4ð U4ð U4ð U4ð U4ñ U4ô U4ð U4ðp
ð 
ð 
ð 
ð 
ØÐ%Ð'Bñ
ô 
ð 
ð86Fð 6Fð 6Fð 6Fð 6FØÐ%Ð'Bñ6Fô 6Fð 6Fðr €�	„	× Ò Ð&×:Ò:Ñ<Ô<Ñ =Ô =Ð =Ø €�	„	× Ò Ð(×<Ò<Ñ>Ô>Ñ ?Ô ?Ð ?Ð ?Ð ?r%   