+
    DfjO@                        R t ^ RIt^ RIHt ^ RIHt ^ RIHtHt ^ RI	H
t
Ht ^ RIHtHt ^ RIHtHtHtHt ^ RIHt ^ R	IHtHt ^ R
IHt ^ RIHt ^ RIHtHt ^ RI H!t!H"t" ^ RI#H$t$ ^ RI%H&t&  ! R R]4      t' ! R R4      t( ! R R]](]'4      t) ! R R]](]'4      t*]+! 4       PY                  ])P[                  4       4       ]+! 4       PY                  ]*P[                  4       4       R# )zU
Tests for implementations of L{IReactorUDP} and the UDP parts of
L{IReactorSocket}.
N)implementer)verifyObject)defererror)IPv4AddressIPv6Address)DeferredmaybeDeferred)IListeningPortILoggingContextIReactorSocketIReactorUDP)DatagramProtocol)LogObserverMixinfindFreePort)ReactorBuilder)context)ILogContexterr)
GoodClientServer)skipWithoutIPv6)SkipTestc                   6   a  ] tR t^"t o RtR tR tR tRtV t	R# )DatagramTransportTestsMixinzH
Mixin defining tests which apply to any port/datagram based transport.
c                >   V P                  4       pV P                  4       p\        \        4       ! R R\        4      4       pV! 4       pV P                  W$4      pRVP                  4       P                  3,          pV P                  V3V^ ,          R,          4       R# )z]
When a port starts, a message including a description of the associated
protocol is logged.
c                   &   a  ] tR t^/t o R tRtV tR# )QDatagramTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeProtocolc                    R # )zCrazy Protocol selfs   &@/usr/lib/python3/dist-packages/twisted/internet/test/test_udp.py	logPrefix[DatagramTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeProtocol.logPrefix1   s    '    r   N)__name__
__module____qualname____firstlineno__r#   __static_attributes____classdictcell____classdict__s   @r"   SomeProtocolr   /   s     ( (r%   r.   zCrazy Protocol starting on %dmessageN)	observebuildReactorr   r   r   getListeningPortgetHostportassertEqual)r!   loggedMessagesreactorr.   protocolpexpectedMessages   &      r"   test_startedListeningLogMessage;DatagramTransportTestsMixin.test_startedListeningLogMessage'   s    
 ##%	_	%	(+ 	( 
&	(  >!!'49QYY[=M=M<OO/+^A->y-IJr%   c                `  aaaa V P                  4       oV P                  4       oV P                  S\        4       4      oRSP	                  4       P
                   R2pV3R loVVV3R lpSP                  V4       V P                  S4       V P                  V3S^ ,          R,          4       R# )z{
When a connection is lost a message is logged containing an
address identifying the port and the fact that it was closed.
z
(UDP Port z Closed)c                 (   < SP                  4        R # Nstopignoredr7   s   &r"   stopReactorNDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.stopReactorD   s    LLNr%   c                  V   < S R  \        SP                  4      P                  S4       R# ):NNNN)r	   stopListeningaddCallback)r6   r9   rD   s   r"   doStopListeningRDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.doStopListeningG   s"    q!!//*66{Cr%   r/   N)	r0   r1   r2   r   r3   r4   callWhenRunning
runReactorr5   )r!   r:   rI   r6   r9   r7   rD   s   &  @@@@r"   test_connectionLostLogMessage9DatagramTransportTestsMixin.test_connectionLostLogMessage:   s    
 ##%!!'+;+=>&qyy{'7'7&8A		D 	0 /+^A->y-IJr%   c                B  a  ! V3R lR\         4      pV P                  4       oV! 4       pV P                  SV4       V P                  S4       V P	                  VP
                  4       V P	                  VP                  4       V P                  VP                  4       R# )z
L{DatagramProtocol.stopProtocol} is called asynchronously (ie, not
re-entrantly) when C{stopListening} is used to stop the datagram
transport.
c                   D   <a  ] tR t^Wt o RtRtRtRtR tV3R lt	Rt
V tR# )VDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocolFc                d    R V n         R V n        V P                  P                  4        RV n        R# )TFN)startedinStartProtocol	transportrG   r    s   &r"   startProtocoldDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.startProtocol]   s)    #'+$,,.',$r%   c                X   < R V n         V P                  V n        SP                  4        R# )TN)stoppedrT   stoppedInStartrA   r!   r7   s   &r"   stopProtocolcDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.stopProtocolc   s!    #&*&:&:#r%   )rT   rS   rY   rZ   N)r&   r'   r(   r)   rS   rY   rT   rZ   rV   r\   r*   r+   )r-   r7   s   @r"   DisconnectingProtocolrQ   W   s(     GG#O"N- r%   r^   N)	r   r1   r2   rL   
assertTruerS   rY   assertFalserZ   )r!   r^   r8   r7   s   &  @r"   test_stopProtocolScheduling7DatagramTransportTestsMixin.test_stopProtocolSchedulingP   s|    	$4 	" ##%(*gx0 (()(()001r%   r   N)
r&   r'   r(   r)   __doc__r;   rM   ra   r*   r+   r,   s   @r"   r   r   "   s      K&K,2 2r%   r   c                      a  ] tR t^rt o RtR tR t]R 4       tR t	R t
R tR tR	 t]R
 4       t]R 4       tR t]R 4       t]R 4       tR tR tRtV tR# )UDPPortTestsMixinzM
Tests for L{IReactorUDP.listenUDP} and
L{IReactorSocket.adoptDatagramPort}.
c                    V P                  4       pV P                  V\        4       4      pV P                  \	        \
        V4      4       R# )zI
L{IReactorUDP.listenUDP} returns an object providing L{IListeningPort}.
N)r1   r2   r   r_   r   r
   r!   r7   r4   s   &  r"   test_interface UDPPortTestsMixin.test_interfacex   s;     ##%$$W.>.@A^T:;r%   c                    \        \        P                  R7      w  rV P                  4       pV P	                  V\        4       W!R7      pV P                  VP                  4       \        RW4      4       R# )z
L{IListeningPort.getHost} returns an L{IPv4Address} giving a
dotted-quad of the IPv4 address the port is listening on as well as
the port number.
)type)r4   	interfaceUDPN)	r   socket
SOCK_DGRAMr1   r2   r   r5   r3   r   )r!   host
portNumberr7   r4   s   &    r"   test_getHostUDPPortTestsMixin.test_getHost   sd     (V->->?##%$$%'j % 
 	UD)MNr%   c                    V P                  4       pV P                  V\        4       RR7      pVP                  4       pV P	                  VP
                  R4       V P                  V\        4       R# )zZ
L{IListeningPort.getHost} returns an L{IPv6Address} when listening on
an IPv6 interface.
::1rl   N)r1   r2   r   r3   r5   rp   assertIsInstancer   )r!   r7   r4   addrs   &   r"   test_getHostIPv6"UDPPortTestsMixin.test_getHostIPv6   s\     ##%$$W.>.@E$R||~E*dK0r%   c                    V P                  4       pV P                  \        P                  VP                  \        4       ^ RR7       R# )zr
An L{InvalidAddressError} is raised when trying to listen on an address
that isn't a valid IPv4 or IPv6 address.
zexample.comrv   N)r1   assertRaisesr   InvalidAddressError	listenUDPr   r[   s   & r"   test_invalidInterface'UDPPortTestsMixin.test_invalidInterface   sC    
 ##%%%# 	 	
r%   c                  a a  ! R R\         4      pS P                  4       oV! R4      pVP                  pS P                  SV4      pVP	                  4       pV 3R lpVP                  V4       VP                  \        4       VP                  V3R l4       VP                  RRVP                  34       S P                  S4       R# )	zz
Datagram transports implement L{ILoggingContext.logPrefix} to return a
message reflecting the protocol they are running.
c                   2   a  ] tR t^t o R tR tR tRtV tR# )IUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocolc                0    Wn         \        4       V n        R # r?   )_prefixr   system)r!   prefixs   &&r"   __init__RUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.__init__   s    %&jr%   c                    V P                   # r?   )r   r    s   &r"   r#   SUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.logPrefix   s    ||#r%   c                    V P                   eF   V P                   pR V n         VP                  \        P                  ! \        4      R,          4       R # R # )Nr   )r   callbackr   getr   )r!   bytesrx   r   s   &&& r"   datagramReceivedZUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.datagramReceived   s;    ;;*![[F"&DKOOGKK$<X$FG +r%   )r   r   N)	r&   r'   r(   r)   r   r#   r   r*   r+   r,   s   @r"   CustomLogPrefixDatagramProtocolr      s     )$H Hr%   r   zCustom Datagramsc                 ,   < SP                  R V 4       R# )zCustom Datagrams (UDP)N)r5   )r   r!   s   &r"   	gotSystem3UDPPortTestsMixin.test_logPrefix.<locals>.gotSystem   s    5v>r%   c                 $   < SP                  4       # r?   r@   rB   s   &r"   <lambda>2UDPPortTestsMixin.test_logPrefix.<locals>.<lambda>   s    gllnr%   s
   some bytes	127.0.0.1N)r   r1   r   r2   r3   rH   
addErrbackr   writer4   rL   )r!   r   r8   dr4   addressr   r7   s   f      @r"   test_logPrefix UDPPortTestsMixin.test_logPrefix   s    	H.> 	H ##%23EFOO$$Wh7,,.	? 	
i 	S	45

=;"=> r%   c                  a aa  ! R R\         4      pS P                  4       oV! 4       pVP                  pS P                  SV4      pVP	                  4       pRoVV 3R lpVP
                  ! V4       VP                  ! \        4       VP
                  ! V3R l4       VP                  SRVP                  34       S P                  S4       R# )z8
Write a sequence of L{bytes} to a L{DatagramProtocol}.
c                   ,   a  ] tR t^t o R tR tRtV tR# )DUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocolc                $    \        4       V n        R # r?   )r   r   r    s   &r"   r   MUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.__init__   s    %Z
r%   c                <    V P                   P                  V4       R # r?   )r   r   )r!   datarx   s   &&&r"   r   UUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.datagramReceived   s    

##D)r%   )r   N)r&   r'   r(   r)   r   r   r*   r+   r,   s   @r"   SimpleDatagramProtocolr      s     (* *r%   r   c                 J   < SP                  R P                  S4      V 4       R# )r%   N)r5   join)r   dataToWriter!   s   &r"   gotData5UDPPortTestsMixin.test_writeSequence.<locals>.gotData   s    SXXk2D9r%   c                 $   < SP                  4       # r?   r@   rB   s   &r"   r   6UDPPortTestsMixin.test_writeSequence.<locals>.<lambda>   s    ',,.r%   r   N)s   somes   bytess   tos   write)r   r1   r   r2   r3   rH   r   r   writeSequencer4   rL   )	r!   r   r8   r   r4   r   r   r   r7   s	   f      @@r"   test_writeSequence$UDPPortTestsMixin.test_writeSequence   s    
	*%5 	* ##%)+$$Wh7,,.:	: 	'"89;gll(CD r%   c                    V P                  4       pV P                  V\        4       4      pV P                  \	        VP                  4       P                  4      \	        V4      4       R# )zA
C{str()} on the listening port object includes the port number.
N)r1   r2   r   assertInstrr3   r4   rg   s   &  r"   test_strUDPPortTestsMixin.test_str   sK     ##%$$W.>.@Ac$,,.--.D	:r%   c                    V P                  4       pV P                  V\        4       4      pV P                  \	        VP                  4       P                  4      \        V4      4       R# )zB
C{repr()} on the listening port object includes the port number.
N)r1   r2   r   r   reprr3   r4   r   rg   s   &  r"   	test_reprUDPPortTestsMixin.test_repr   sK     ##%$$W.>.@Ad4<<>../T;r%   c                  aa	a
 V P                  4       o	\        4       o
\        P                  ! 4       ;pS
n        V P                  S	S
RR7       \        4       o\        P                  ! 4       ;pSn        V P                  S	SRR7       SP                  P                  4       pVV
3R lpV	3R lp\        P                  ! W.4      pVP                  V4       VP                  V4       VP                  \        4       V P                  S	4       S
P                  ^ ,          pV P                  VRVP                   VP"                  334       R# )zC
Writing to an IPv6 UDP socket on the loopback interface succeeds.
ru   rv   c                   < SP                   P                  RRSP                   P                  4       P                  34       \        P
                  ! 4       ;pSn        V# )
Send a datagram from the client once it's started.

@param ignored: a list of C{[None, None]}, which is ignored
@returns: a deferred which fires when the server has received a
    datagram.
   spamru   )rU   r   r3   r4   r   r   packetReceivedrC   serverReceivedclientservers   & r"   cbClientStartedDUDPPortTestsMixin.test_writeToIPv6Interface.<locals>.cbClientStarted  sO     ""7UF4D4D4L4L4N4S4S,TU5:^^5EENV2!!r%   c                (   < SP                  4        R# zm
Stop the reactor after a datagram is received.

@param ignored: L{None}, which is ignored
@returns: L{None}
Nr@   rB   s   &r"   cbServerReceivedEUDPPortTestsMixin.test_writeToIPv6Interface.<locals>.cbServerReceived  s     LLNr%   r   Nr1   r   r   r   startedDeferredr2   r   rU   r3   gatherResultsrH   r   r   rL   packetsr5   rp   r4   r!   serverStartedclientStartedcAddrr   r   r   packetr   r7   r   s   &       @@@r"   test_writeToIPv6Interface+UDPPortTestsMixin.test_writeToIPv6Interface   s   
 ##%161AA.gv?161AA.gv?  ((*
	"	  >?	o&	&'	S "'EJJ

+C!DEr%   c                  aa	a
 V P                  4       o	\        4       o
\        P                  ! 4       ;pS
n        V P                  S	S
RR7       \        4       o\        P                  ! 4       ;pSn        V P                  S	SRR7       SP                  P                  4       pVV
3R lpV	3R lp\        P                  ! W.4      pVP                  V4       VP                  V4       VP                  \        4       V P                  S	4       S
P                  ^ ,          pV P                  VRVP                   VP"                  334       R# )zx
An IPv6 address can be passed as the C{interface} argument to
L{listenUDP}. The resulting Port accepts IPv6 datagrams.
ru   rv   c                   < SP                   P                  RSP                   P                  4       P                  4       SP                   P	                  R4       \
        P                  ! 4       ;pSn        V# )r   ru   r   )rU   connectr3   r4   r   r   r   r   r   s   & r"   r   MUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbClientStarted4  s^     $$UF,<,<,D,D,F,K,KL""7+5:^^5EENV2!!r%   c                (   < SP                  4        R# r   r@   rB   s   &r"   r   NUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbServerReceivedB  s     LLNr%   r   Nr   r   s   &       @@@r"   "test_connectedWriteToIPv6Interface4UDPPortTestsMixin.test_connectedWriteToIPv6Interface$  s    ##%161AA.gv?161AA.gv?  ((*	"	  >?	o&	&'	S "'EJJ

+C!DEr%   c                    V P                  4       pV P                  V\        4       4      pV P                  \        P
                  VP                  RR4       R# )zV
Writing to a hostname instead of an IP address will raise an
L{InvalidAddressError}.
spamN)example.invalid   r1   r2   r   r|   r   r}   r   rg   s   &  r"   /test_writingToHostnameRaisesInvalidAddressErrorAUDPPortTestsMixin.test_writingToHostnameRaisesInvalidAddressErrorU  sJ    
 ##%$$W.>.@A%%tzz6;Q	
r%   c                    V P                  4       pV P                  V\        4       RR7      pV P                  \        P
                  VP                  RR4       R# )T
Writing to an IPv6 address on an IPv4 socket will raise an
L{InvalidAddressError}.
r   rv   r   N)ru   r   r   rg   s   &  r"   1test_writingToIPv6OnIPv4RaisesInvalidAddressErrorCUDPPortTestsMixin.test_writingToIPv6OnIPv4RaisesInvalidAddressError`  sK     ##%$$W.>.@K$X%33TZZTr%   c                    V P                  4       pV P                  V\        4       RR7      pV P                  \        P
                  VP                  RR4       R# )r   ru   rv   r   N)r   r   r   rg   s   &  r"   1test_writingToIPv4OnIPv6RaisesInvalidAddressErrorCUDPPortTestsMixin.test_writingToIPv4OnIPv6RaisesInvalidAddressErrorj  sO     ##%$$W.>.@E$R%%tzz6;K	
r%   c                    V P                  4       pV P                  V\        4       4      pV P                  \        P
                  VP                  R^4       R# )zY
Connecting to a hostname instead of an IP address will raise an
L{InvalidAddressError}.
r   N)r1   r2   r   r|   r   r}   r   rg   s   &  r"   2test_connectingToHostnameRaisesInvalidAddressErrorDUDPPortTestsMixin.test_connectingToHostnameRaisesInvalidAddressErrorv  sH    
 ##%$$W.>.@A%33T\\CTVWXr%   c                    V P                  4       pV P                  V\        4       4      pVP                  R4       V P	                  VP                  4       4       R# )zS
L{IListeningPort.setBroadcastAllowed} sets broadcast to be allowed
on the socket.
TN)r1   r2   r   setBroadcastAllowedr_   getBroadcastAllowedrg   s   &  r"   test_allowBroadcast%UDPPortTestsMixin.test_allowBroadcast  sK    
 ##%$$W.>.@A  &0023r%   r   N)r&   r'   r(   r)   rc   rh   rr   r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r*   r+   r,   s   @r"   re   re   r   s     
<O 	1 	1
"!H!8;< *F *FX .F .F`	
 U U 	
 	
Y4 4r%   re   c                   4   a  ] tR tRt o Rt]3tRR ltRtV t	R# )UDPServerTestsBuilderi  zA
Run L{UDPPortTestsMixin} tests using newly created UDP
sockets.
c                (    VP                  W2WER7      # )a
  
Get a UDP port from a reactor.

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

@see: L{twisted.internet.IReactorUDP.listenUDP} for other
    argument and return types.
)rl   maxPacketSize)r~   )r!   r7   r8   r4   rl   r   s   &&&&&&r"   r2   &UDPServerTestsBuilder.getListeningPort  s!       i ! 
 	
r%   r   N     i    )
r&   r'   r(   r)   rc   r   requiredInterfacesr2   r*   r+   r,   s   @r"   r   r     s     
 &
 
r%   r   c                   4   a  ] tR tRt o Rt]3tRR ltRtV t	R# )UDPFDServerTestsBuilderi  z;
Run L{UDPPortTestsMixin} tests using adopted UDP sockets.
c                ^   \         P                  ! V4      '       d   RV9   d6   \        P                  p\        P                  ! WC4      ^ ,          ^,          pM\        P
                  pWC3p\        P                  ! V\        P                  4      pVP                  V4       VP                  R4        VP                  VP                  4       VP                  W%4      VP                  4        VP                  4        # \        R4      h  TP                  4        TP                  4        i ; i)aL  
Get a UDP port from a reactor, wrapping an already-initialized file
descriptor.

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

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

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

@see: L{twisted.internet.IReactorSocket.adoptDatagramPort} for other
    argument and return types.
:Fz'Reactor does not provide IReactorSocket)r   
providedByrn   AF_INET6getaddrinfoAF_INETro   bindsetblockingadoptDatagramPortfilenofamilycloser   )	r!   r7   r8   r4   rl   r   domainr   portSocks	   &&&&&&   r"   r2   (UDPFDServerTestsBuilder.getListeningPort  s    . $$W--i ,,Y=a@C$+}}VV->->?HMM'"  '
!00OO%x !  DEE !  s   4*D
 
"D,r   Nr   )
r&   r'   r(   r)   rc   r   r   r2   r*   r+   r,   s   @r"   r   r     s!      )*-F -Fr%   r   ).rc   rn   zope.interfacer   zope.interface.verifyr   twisted.internetr   r   twisted.internet.addressr   r   twisted.internet.deferr   r	   twisted.internet.interfacesr
   r   r   r   twisted.internet.protocolr   &twisted.internet.test.connectionmixinsr   r   #twisted.internet.test.reactormixinsr   twisted.pythonr   twisted.python.logr   r   twisted.test.test_udpr   r   twisted.test.testutilsr   twisted.trial.unittestr   r   re   r   r   globalsupdatemakeTestCaseClassesr   r%   r"   <module>r     s     & . ) = :  7 Q > " / 4 2 +M2"2 M2`U4 U4p
%'B
86F%'B6Fr 	  &::< = 	  (<<> ?r%   