Ë
    ojÝ$  ã                   óì  — d Z ddlZddlZddl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e«      Z G d„ de«      Z G d„ de«      Z e«       j1                  ej3                  «       «        e«       j1                  ej3                  «       «        e«       j1                  ej3                  «       «        e«       j1                  ej3                  «       «       y)aD  
Tests for implementations of L{IReactorSocket}.

Generally only tests for failure cases are found here.  Success cases for
this interface are tested elsewhere.  For example, the success case for
I{AF_INET} is in L{twisted.internet.test.test_tcp}, since that case should
behave exactly the same as L{IReactorTCP.listenTCP}.
é    N)Úverify)ÚUnsupportedAddressFamily)ÚIReactorSocket)ÚDatagramProtocolÚServerFactory)ÚReactorBuilderÚneedsRunningReactor)Úerr)Úplatformc                   ó   — e Zd ZdZegZd„ Zy)Ú&IReactorSocketVerificationTestsBuilderaO  
    Builder for testing L{IReactorSocket} implementations for required
    methods and method signatures.

    L{ReactorBuilder} already runs L{IReactorSocket.providedBy} to
    ensure that these tests will only be run on reactor classes that
    claim to implement L{IReactorSocket}.

    These tests ensure that reactors which claim to provide the
    L{IReactorSocket} interface actually have all the required methods
    and that those methods have the expected number of arguments.

    These tests will be skipped for reactors which do not claim to
    provide L{IReactorSocket}.
    c                 óv   — | j                  «       }| j                  t        j                  t        |«      «       y)zf
        The reactor instance returned by C{buildReactor} provides
        L{IReactorSocket}.
        N)ÚbuildReactorÚ
assertTruer   ÚverifyObjectr   )ÚselfÚreactors     úC/usr/lib/python3/dist-packages/twisted/internet/test/test_socket.pyÚtest_providerz4IReactorSocketVerificationTestsBuilder.test_provider-   s+   € ð
 ×#Ñ#Ó%ˆØ�‰œ×+Ñ+¬N¸GÓDÕEó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚrequiredInterfacesr   © r   r   r   r      s   „ ñð  )Ð)ÐóFr   r   c                   ó(   — e Zd ZdZegZd„ Zd„ Zd„ Zy)Ú!AdoptStreamPortErrorsTestsBuilderas  
    Builder for testing L{IReactorSocket.adoptStreamPort} implementations.

    Generally only tests for failure cases are found here.  Success cases for
    this interface are tested elsewhere.  For example, the success case for
    I{AF_INET} is in L{twisted.internet.test.test_tcp}, since that case should
    behave exactly the same as L{IReactorTCP.listenTCP}.
    c                 óð  — | j                  «       }t        j                  «       }|j                  «       }|j                  «        | j	                  t        j
                  |j                  |t        j                  t        «       «      }t        j                  «       r.| j                  |j                  d   t        j                  «       y| j                  |j                  d   t        j                  «       y)z«
        An implementation of L{IReactorSocket.adoptStreamPort} raises
        L{socket.error} if passed an integer which is not associated with a
        socket.
        r   N)r   ÚsocketÚfilenoÚcloseÚassertRaisesÚerrorÚadoptStreamPortÚAF_INETr   r   Ú	isWindowsÚassertEqualÚargsÚerrnoÚWSAENOTSOCKÚEBADF©r   r   Úprober!   Úexcs        r   Útest_invalidDescriptorz8AdoptStreamPortErrorsTestsBuilder.test_invalidDescriptorB   s¨   € ð ×#Ñ#Ó%ˆä—‘“ˆØ—‘“ˆØ�‰Œà×ÑÜ�L‰LØ×#Ñ#ØÜ�N‰NÜ‹Oó
ˆô ×ÑÔØ×Ñ˜SŸX™X a™[¬%×*;Ñ*;Õ<à×Ñ˜SŸX™X a™[¬%¯+©+Õ6r   c                 ó<  — | j                  «       }t        j                  «       }|j                  d«       |j                  d«       | j	                  |j
                  «       d}| j                  t        |j                  |j                  «       |t        «       «       y)z¬
        An implementation of L{IReactorSocket.adoptStreamPort} raises
        L{UnsupportedAddressFamily} if passed an address family it does not
        support.
        ©z	127.0.0.1r   é   é  N)r   r    ÚbindÚlistenÚ
addCleanupr"   r#   r   r%   r!   r   ©r   r   ÚportÚ	arbitrarys       r   Útest_invalidAddressFamilyz;AdoptStreamPortErrorsTestsBuilder.test_invalidAddressFamilyZ   su   € ð ×#Ñ#Ó%ˆä�}‰}‹ˆØ�	‰	Ð"Ô#Ø�‰�AŒØ�‰˜Ÿ
™
Ô#àˆ	à×ÑÜ$Ø×#Ñ#Ø�K‰K‹MØÜ‹Oõ	
r   c                 ó  ‡ ‡‡‡— ‰ j                  «       Št        j                  «       Š‰ j                  ‰j                  «       ‰j	                  d«       ‰j                  d«       ‰j                  d«       ‰j                  ‰j                  «       ‰j                  t        «       «      }|j                  «       Šˆˆ fd„}‰j                  |«       ‰j                  t        d«       t        ‰ˆˆfd„«       ‰j!                  «        y)a9  
        When the L{IListeningPort} returned by
        L{IReactorSocket.adoptStreamPort} is stopped using
        C{stopListening}, the underlying socket is closed but not
        shutdown.  This allows another process which still has a
        reference to it to continue accepting connections over it.
        r2   r3   Fc                 ó8  •— ‰j                  t        j                  ‰j                  «      }t	        j
                  «       r.‰j                  |j                  d   t        j                  «       y ‰j                  |j                  d   t        j                  «       y )Nr   )r#   r    r$   Úacceptr   r'   r(   r)   r*   ÚWSAEWOULDBLOCKÚEAGAIN©Úignoredr/   Ú
portSocketr   s     €€r   ÚstoppedzFAdoptStreamPortErrorsTestsBuilder.test_stopOnlyCloses.<locals>.stoppedˆ   sg   ø€ ð ×#Ñ#¤F§L¡L°*×2CÑ2CÓDˆCÜ×!Ñ!Ô#Ø× Ñ  §¡¨!¡¬e×.BÑ.BÕCà× Ñ  §¡¨!¡¬e¯l©lÕ;r   z"Failed to accept on original port.c                  ó,   •— ‰ j                  ˆfd„«      S )Nc                 ó$   •— ‰j                  «       S ©N©Ústop©rB   r   s    €r   ú<lambda>zYAdoptStreamPortErrorsTestsBuilder.test_stopOnlyCloses.<locals>.<lambda>.<locals>.<lambda>–   ó   ø€ ¸7¿<¹<»>€ r   ©ÚaddCallback©Údr   s   €€r   rK   zGAdoptStreamPortErrorsTestsBuilder.test_stopOnlyCloses.<locals>.<lambda>–   ó   ø€ ˜QŸ]™]Ó+IÓJ€ r   N)r   r    r7   r"   r5   r6   Úsetblockingr%   r!   Úfamilyr   ÚstopListeningrN   Ú
addErrbackr
   r	   Úrun©r   r9   rD   rP   rC   r   s   `  @@@r   Útest_stopOnlyClosesz5AdoptStreamPortErrorsTestsBuilder.test_stopOnlyClosesq   sÎ   û€ ð ×#Ñ#Ó%ˆä—]‘]“_ˆ
Ø�‰˜
×(Ñ(Ô)à�‰Ð(Ô)Ø×Ñ˜!ÔØ×Ñ˜uÔ%ð ×&Ñ&Ø×ÑÓ ×!2Ñ!2´M³Oó
ˆð ×ÑÓ ˆõ	<ð 	
�‰�gÔØ	�‰”SÐ>Ô?äØÔJô	
ð 	�‰�r   N©	r   r   r   r   r   r   r0   r;   rX   r   r   r   r   r   6   s!   „ ñð )Ð)Ðò7ò0
ó.(r   r   c                   ó   — e Zd ZdZegZd„ Zy)Ú'AdoptStreamConnectionErrorsTestsBuildera}  
    Builder for testing L{IReactorSocket.adoptStreamConnection}
    implementations.

    Generally only tests for failure cases are found here.  Success cases for
    this interface are tested elsewhere.  For example, the success case for
    I{AF_INET} is in L{twisted.internet.test.test_tcp}, since that case should
    behave exactly the same as L{IReactorTCP.listenTCP}.
    c                 óø   — | j                  «       }t        j                  «       }| j                  |j                  «       d}| j	                  t
        |j                  |j                  «       |t        «       «       y)z²
        An implementation of L{IReactorSocket.adoptStreamConnection} raises
        L{UnsupportedAddressFamily} if passed an address family it does not
        support.
        r4   N)	r   r    r7   r"   r#   r   ÚadoptStreamConnectionr!   r   )r   r   Ú
connectionr:   s       r   r;   zAAdoptStreamConnectionErrorsTestsBuilder.test_invalidAddressFamily©   sb   € ð ×#Ñ#Ó%ˆä—]‘]“_ˆ
Ø�‰˜
×(Ñ(Ô)àˆ	à×ÑÜ$Ø×)Ñ)Ø×ÑÓØÜ‹Oõ	
r   N)r   r   r   r   r   r   r;   r   r   r   r[   r[   œ   s   „ ñð )Ð)Ðó
r   r[   c                   ó(   — e Zd ZdZegZd„ Zd„ Zd„ Zy)Ú#AdoptDatagramPortErrorsTestsBuilderzR
    Builder for testing L{IReactorSocket.adoptDatagramPort} implementations.
    c                 óð  — | j                  «       }t        j                  «       }|j                  «       }|j                  «        | j	                  t        j
                  |j                  |t        j                  t        «       «      }t        j                  «       r.| j                  |j                  d   t        j                  «       y| j                  |j                  d   t        j                  «       y)z­
        An implementation of L{IReactorSocket.adoptDatagramPort} raises
        L{socket.error} if passed an integer which is not associated with a
        socket.
        r   N)r   r    r!   r"   r#   r$   ÚadoptDatagramPortr&   r   r   r'   r(   r)   r*   r+   r,   r-   s        r   r0   z:AdoptDatagramPortErrorsTestsBuilder.test_invalidDescriptorÆ   s©   € ð ×#Ñ#Ó%ˆä—‘“ˆØ—‘“ˆØ�‰Œà×ÑÜ�L‰LØ×%Ñ%ØÜ�N‰NÜÓó
ˆô ×ÑÔØ×Ñ˜SŸX™X a™[¬%×*;Ñ*;Õ<à×Ñ˜SŸX™X a™[¬%¯+©+Õ6r   c                 ó4  — | j                  «       }t        j                  t        j                  t        j                  «      }| j	                  |j
                  «       d}| j                  t        |j                  |j                  «       |t        «       «       y)z®
        An implementation of L{IReactorSocket.adoptDatagramPort} raises
        L{UnsupportedAddressFamily} if passed an address family it does not
        support.
        r4   N)r   r    r&   Ú
SOCK_DGRAMr7   r"   r#   r   rb   r!   r   r8   s       r   r;   z=AdoptDatagramPortErrorsTestsBuilder.test_invalidAddressFamilyÞ   sm   € ð ×#Ñ#Ó%ˆä�}‰}œVŸ^™^¬V×->Ñ->Ó?ˆØ�‰˜Ÿ
™
Ô#àˆ	à×ÑÜ$Ø×%Ñ%Ø�K‰K‹MØÜÓõ	
r   c                 ó*  ‡ ‡‡‡— ‰ j                  «       Št        j                  t        j                  t        j                  «      Š‰ j	                  ‰j
                  «       ‰j                  d«       ‰j                  d«       ‰j                  ‰j                  «       ‰j                  t        «       «      }|j                  «       Šˆˆ fd„}‰j                  |«       ‰j                  t        d«       t!        ‰ˆˆfd„«       ‰j#                  «        y)a7  
        When the L{IListeningPort} returned by
        L{IReactorSocket.adoptDatagramPort} is stopped using
        C{stopListening}, the underlying socket is closed but not
        shutdown.  This allows another process which still has a
        reference to it to continue reading and writing to it.
        r2   Fc                 ó:  •— ‰j                  t        j                  ‰j                  d«      }t	        j
                  «       r.‰j                  |j                  d   t        j                  «       y ‰j                  |j                  d   t        j                  «       y )Nr3   r   )r#   r    r$   Úrecvfromr   r'   r(   r)   r*   r?   r@   rA   s     €€r   rD   zHAdoptDatagramPortErrorsTestsBuilder.test_stopOnlyCloses.<locals>.stopped	  si   ø€ ð ×#Ñ#¤F§L¡L°*×2EÑ2EÀqÓIˆCÜ×!Ñ!Ô#Ø× Ñ  §¡¨!¡¬e×.BÑ.BÕCà× Ñ  §¡¨!¡¬e¯l©lÕ;r   z Failed to read on original port.c                  ó,   •— ‰ j                  ˆfd„«      S )Nc                 ó$   •— ‰j                  «       S rG   rH   rJ   s    €r   rK   z[AdoptDatagramPortErrorsTestsBuilder.test_stopOnlyCloses.<locals>.<lambda>.<locals>.<lambda>  rL   r   rM   rO   s   €€r   rK   zIAdoptDatagramPortErrorsTestsBuilder.test_stopOnlyCloses.<locals>.<lambda>  rQ   r   N)r   r    r&   rd   r7   r"   r5   rR   rb   r!   rS   r   rT   rN   rU   r
   r	   rV   rW   s   `  @@@r   rX   z7AdoptDatagramPortErrorsTestsBuilder.test_stopOnlyClosesó   sÑ   û€ ð ×#Ñ#Ó%ˆä—]‘]¤6§>¡>´6×3DÑ3DÓEˆ
Ø�‰˜
×(Ñ(Ô)à�‰Ð(Ô)Ø×Ñ˜uÔ%ð ×(Ñ(Ø×ÑÓ ×!2Ñ!2Ô4DÓ4Fó
ˆð ×ÑÓ ˆõ	<ð 	
�‰�gÔØ	�‰”SÐ<Ô=äØÔJô	
ð 	�‰�r   NrY   r   r   r   r`   r`   ¿   s!   „ ñð )Ð)Ðò7ò0
ó*&r   r`   )r   r*   r    Úzope.interfacer   Útwisted.internet.errorr   Útwisted.internet.interfacesr   Útwisted.internet.protocolr   r   Ú#twisted.internet.test.reactormixinsr   r	   Útwisted.python.logr
   Útwisted.python.runtimer   r   r   r[   r`   ÚglobalsÚupdateÚmakeTestCaseClassesr   r   r   ú<module>rt      sÊ   ðñó Û å !å ;Ý 6ß Eß SÝ "Ý +ôF¨^ô Fô8c¨ô côL 
¨nô  
ôFZ¨.ô Zñz ƒ	× Ñ Ð7×KÑKÓMÔ NÙ ƒ	× Ñ Ð2×FÑFÓHÔ IÙ ƒ	× Ñ Ð8×LÑLÓNÔ OÙ ƒ	× Ñ Ð4×HÑHÓJÕ Kr   