
    YfO@                        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    P/var/www/html/env/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9QYY[[=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    LLNNNNNr%   c                  `     d d = t          j                                                 d S r9   )r
   stopListeningaddCallback)r1   r4   r>   s   r#   doStopListeningzRDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.doStopListeningG   s3    qqq!!/**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    
 ##%%!!'+;+=+=>>Aqyy{{'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 	 	 	" ##%%((**gx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##%%$$%''jD % 
 
 	UD*)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***dK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    %&jj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"&DKOOGK$<$<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     5v>>>>>r%   c                 ,                                     S r9   r:   r<   s    r#   <lambda>z2UDPPortTestsMixin.test_logPrefix.<locals>.<lambda>   s    gllnn 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23EFFO$$Wh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    %ZZ


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+    SXXk22D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 	* 	* 	* ##%%))++$$Wh77,,..:	: 	: 	: 	: 	: 	: 	'"""8888999;gl(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d4<<>>.//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     ""7UF4D4L4L4N4N4S,TUUU5:^5E5EENV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     LLNNNNNr%   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1A1AA.gv???161A1AA.gv??? ((**
	" 
	" 
	" 
	" 
	" 
	"	 	 	 	 	  >??	o&&&	&'''	S   "'EJ
+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     $$UF,<,D,D,F,F,KLLL""7+++5:^5E5EENV2!!r%   c                 0                                      dS r   r:   r<   s    r#   r   zNUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbServerReceivedB  s     LLNNNNNr%   r   r   Nr   r   s           @@@r#   "test_connectedWriteToIPv6Interfacez4UDPPortTestsMixin.test_connectedWriteToIPv6Interface$  sk    ##%%161A1AA.gv???161A1AA.gv??? ((**	" 	" 	" 	" 	" 	"	 	 	 	 	  >??	o&&&	&'''	S   "'EJ
+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%tz6;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%3TZ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%tz6;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%3T\CTVW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+}VV->??HMM'"""  '''
!00OO%%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4p
 
 
 
 
%'B
 
 
86F 6F 6F 6F 6F%'B6F 6F 6Fr 		  &::<< = = = 		  (<<>> ? ? ? ? ?r%   