
    /JfA                     $   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 Z% e%            Z&d 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)SkipTestc                      d} d}	 t          j         t           j                  } |                     d           d}n# t          $ r Y nw xY w| r|                                  |S )z4Returns True if the system can bind an IPv6 address.NF)::1r   T)socketAF_INET6bindOSErrorclose)sockhas_ipv6s     a/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/twisted/internet/test/test_udp.py	_has_ipv6r#   !   sw    DH}V_--		*     

Os   5< 
A	A	c                 "    t           sd| _        | S )Nz.Does not work on systems without IPv6 support.)HAS_IPV6skip)fs    r"   skipWithoutIPv6r(   5   s     BAH    c                   $    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    r"   	logPrefixz[DatagramTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeProtocol.logPrefixJ   s    ''r)   N)__name__
__module____qualname__r3   r0   r)   r"   SomeProtocolr.   H   s#        ( ( ( ( (r)   r7   zCrazy Protocol starting on %dr   messageN)	observebuildReactorr   r   r   getListeningPortgetHostportassertEqual)r2   loggedMessagesreactorr7   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ignoredr@   s    r"   stopReactorzNDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.stopReactor]   s    LLNNNNNr)   c                  `     d d = t          j                                                 d S rG   )r
   stopListeningaddCallback)r?   rB   rL   s   r"   doStopListeningzRDatagramTransportTestsMixin.test_connectionLostLogMessage.<locals>.doStopListening`   s3    qqq!!/**66{CCCCCr)   r   r8   N)	r9   r:   r;   r   r<   r=   callWhenRunning
runReactorr>   )r2   rC   rP   r?   rB   r@   rL   s      @@@@r"   test_connectionLostLogMessagez9DatagramTransportTestsMixin.test_connectionLostLogMessageS   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	transportrN   r1   s    r"   startProtocolzdDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.startProtocolv   s3    #'+$,,...',$$$r)   c                 V    d| _         | j        | _                                         d S )NT)stoppedrY   stoppedInStartrI   r2   r@   s    r"   stopProtocolzcDatagramTransportTestsMixin.test_stopProtocolScheduling.<locals>.DisconnectingProtocol.stopProtocol|   s&    #&*&:#r)   N)	r4   r5   r6   rX   r]   rY   r^   r[   r`   )r@   s   r"   DisconnectingProtocolrV   p   sQ        GG#O"N- - -      r)   ra   N)	r   r:   r;   rR   
assertTruerX   r]   assertFalser^   )r2   ra   rA   r@   s      @r"   test_stopProtocolSchedulingz7DatagramTransportTestsMixin.test_stopProtocolSchedulingi   s    	 	 	 	 	 	 	$4 	 	 	" ##%%((**gx000   ()))()))011111r)   N)r4   r5   r6   __doc__rD   rS   rd   r0   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   rb   r   r   r2   r@   r=   s      r"   test_interfacez UDPPortTestsMixin.test_interface   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   r   
SOCK_DGRAMr:   r;   r   r>   r<   r   )r2   host
portNumberr@   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.
        r   rm   N)r:   r;   r   r<   r>   rp   assertIsInstancer   )r2   r@   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.comrt   N)r:   assertRaisesr   InvalidAddressError	listenUDPr   r_   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 rG   )_prefixr	   system)r2   prefixs     r"   __init__zRUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.__init__   s    %&jjr)   c                     | j         S rG   )r   r1   s    r"   r3   zSUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.logPrefix   s
    |#r)   c                     | j         B| j         }d | _         |                    t          j        t                    d                    d S d S )Nr   )r   callbackr   getr   )r2   bytesrv   r   s       r"   datagramReceivedzZUDPPortTestsMixin.test_logPrefix.<locals>.CustomLogPrefixDatagramProtocol.datagramReceived   sG    ;*![F"&DKOOGK$<$<X$FGGGGG +*r)   N)r4   r5   r6   r   r3   r   r0   r)   r"   CustomLogPrefixDatagramProtocolr      sF        ) ) )$ $ $H H H H Hr)   r   zCustom Datagramsc                 4                         d|            d S )NzCustom Datagrams (UDP))r>   )r   r2   s    r"   	gotSystemz3UDPPortTestsMixin.test_logPrefix.<locals>.gotSystem   s     5v>>>>>r)   c                 ,                                     S rG   rH   rJ   s    r"   <lambda>z2UDPPortTestsMixin.test_logPrefix.<locals>.<lambda>   s    gllnn r)   s
   some bytes	127.0.0.1N)r   r:   r   r;   r<   rO   
addErrbackr   writer=   rR   )r2   r   rA   dr=   addressr   r@   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 rG   )r	   r   r1   s    r"   r   zMUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.__init__   s    %ZZ


r)   c                 :    | j                             |           d S rG   )r   r   )r2   datarv   s      r"   r   zUUDPPortTestsMixin.test_writeSequence.<locals>.SimpleDatagramProtocol.datagramReceived   s    
##D)))))r)   N)r4   r5   r6   r   r   r0   r)   r"   SimpleDatagramProtocolr      s2        ( ( (* * * * *r)   r   )s   somes   bytess   tos   writec                 Z                         d                              |            d S )Nr)   )r>   join)r   dataToWriter2   s    r"   gotDataz5UDPPortTestsMixin.test_writeSequence.<locals>.gotData   s+    SXXk22D99999r)   c                 ,                                     S rG   rH   rJ   s    r"   r   z6UDPPortTestsMixin.test_writeSequence.<locals>.<lambda>   s    ',,.. r)   r   N)r   r:   r   r;   r<   rO   r   r   writeSequencer=   rR   )	r2   r   rA   r   r=   r   r   r   r@   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=   ri   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   ri   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.
        r   rt   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.
               spamr   )rZ   r   r<   r=   r   r	   packetReceivedrK   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}
            NrH   rJ   s    r"   cbServerReceivedzEUDPPortTestsMixin.test_writeToIPv6Interface.<locals>.cbServerReceived+  s     LLNNNNNr)   r   r   Nr:   r   r   r	   startedDeferredr;   r   rZ   r<   gatherResultsrO   r   r   rR   packetsr>   rp   r=   r2   serverStartedclientStartedcAddrr   r   r   packetr   r@   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.
        r   rt   c                     j                             dj                                         j                   j                             d           t          j                    x}_        |S )r   r   r   )rZ   connectr<   r=   r   r   r	   r   r   s     r"   r   zMUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbClientStartedM  sb     $$UF,<,D,D,F,F,KLLL""7+++5:^5E5EENV2!!r)   c                 0                                      dS r   rH   rJ   s    r"   r   zNUDPPortTestsMixin.test_connectedWriteToIPv6Interface.<locals>.cbServerReceived[  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   ry   r   rz   r   ri   s      r"   /test_writingToHostnameRaisesInvalidAddressErrorzAUDPPortTestsMixin.test_writingToHostnameRaisesInvalidAddressErrorn  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   rt   r   )r   r   Nr   ri   s      r"   1test_writingToIPv6OnIPv4RaisesInvalidAddressErrorzCUDPPortTestsMixin.test_writingToIPv6OnIPv4RaisesInvalidAddressErrory  s[     ##%%$$W.>.@.@K$XX%3TZTTTTTr)   c                     |                                  }|                     |t                      d          }|                     t          j        |j        dd           dS )r   r   rt   r   )r   r   Nr   ri   s      r"   1test_writingToIPv4OnIPv6RaisesInvalidAddressErrorzCUDPPortTestsMixin.test_writingToIPv4OnIPv6RaisesInvalidAddressError  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   ry   r   rz   r   ri   s      r"   2test_connectingToHostnameRaisesInvalidAddressErrorzDUDPPortTestsMixin.test_connectingToHostnameRaisesInvalidAddressError  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   setBroadcastAllowedrb   getBroadcastAllowedri   s      r"   test_allowBroadcastz%UDPPortTestsMixin.test_allowBroadcast  si    
 ##%%$$W.>.@.@AA  &&&002233333r)   N)r4   r5   r6   re   rj   rr   r(   rw   r|   r   r   r   r   r   r   r   r   r   r   r   r0   r)   r"   rg   rg      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)   rg   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.
        )rm   maxPacketSize)r{   )r2   r@   rA   r=   rm   r   s         r"   r;   z&UDPServerTestsBuilder.getListeningPort  s*       (i} ! 
 
 	
r)   Nr   r   r   )r4   r5   r6   re   r   requiredInterfacesr;   r0   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   
providedByr   r   getaddrinfoAF_INETro   r   setblockingadoptDatagramPortfilenofamilyr   r   )	r2   r@   rA   r=   rm   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   )r4   r5   r6   re   r   r   r;   r0   r)   r"   r   r     sJ          )* FJ-F -F -F -F -F -Fr)   r   )/re   r   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.trial.unittestr   r#   r%   r(   r+   rg   r   r   globalsupdatemakeTestCaseClassesr0   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 + + + + + +  " 9;;  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)   