ó
[³XMc           @   sH  d  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 d d l m Z d d l m Z d d	 l m Z m Z m Z d d
 l m Z m Z d e	 j f d „  ƒ  YZ d e f d „  ƒ  YZ d f  d „  ƒ  YZ d e e j f d „  ƒ  YZ d e e j f d „  ƒ  YZ d e e j f d „  ƒ  YZ d S(   s.   
Test case for L{twisted.protocols.loopback}.
iÿÿÿÿ(   t
   implements(   t   unittest(   t   suppress(   t   basict   loopback(   t   defer(   t   Protocol(   t   Deferred(   t   IAddresst   IPushProducert   IPullProducer(   t   reactort
   interfacest   SimpleProtocolc           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   s%   t  j ƒ  |  _ g  |  _ g  |  _ d  S(   N(   R   R   t   connt   linest   connLost(   t   self(    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   __init__   s    	c         C   s   |  j  j d  ƒ d  S(   N(   R   t   callbackt   None(   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   connectionMade   s    c         C   s   |  j  j | ƒ d  S(   N(   R   t   append(   R   t   line(    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   lineReceived   s    c         C   s   |  j  j | ƒ d  S(   N(   R   R   (   R   t   reason(    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   connectionLost    s    (   t   __name__t
   __module__R   R   R   R   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR      s   			t   DoomProtocolc           B   s   e  Z d  Z d „  Z RS(   i    c         C   sl   |  j  d 7_  |  j  d k  r5 |  j d |  j  ƒ n  t j |  | ƒ |  j d d k rh |  j j ƒ  n  d  S(   Ni   i   s   Hello %diÿÿÿÿs   Hello 3(   t   it   sendLineR   R   R   t	   transportt   loseConnection(   R   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR   &   s    (   R   R   R   R   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR   $   s   t   LoopbackTestCaseMixinc           B   s   e  Z d  „  Z d „  Z RS(   c            so   t  ƒ  ‰ t  ƒ  ‰  ‡ f d †  } ˆ j j | ƒ ‡ ‡ ‡  f d †  } t j ˆ j ˆ ˆ  ƒ } | j | ƒ | S(   Nc            s   ˆ  j  d ƒ ˆ  j j ƒ  d  S(   Ns   THIS IS LINE ONE!(   R   R    R!   (   t   result(   t   s(    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt	   sendALine6   s    c            sL   ˆ  j  ˆ j d g ƒ ˆ  j  t ˆ j ƒ d ƒ ˆ  j  t ˆ j ƒ d ƒ d  S(   Ns   THIS IS LINE ONE!i   (   t   assertEqualsR   t   lenR   (   t   ignored(   R   R$   t   c(    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   check;   s    (   R   R   t   addCallbackR   t   maybeDeferredt   loopbackFunc(   R   R%   R*   t   d(    (   R)   R   R$   s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   testRegularFunction2   s    		c            so   t  ƒ  ‰ t  ƒ  ‰  ‡ f d †  } ˆ j j | ƒ ‡ ‡  ‡ f d †  } t j ˆ j ˆ ˆ  ƒ } | j | ƒ | S(   Nc            s   ˆ  j  d ƒ d  S(   Ns	   DOOM LINE(   R   (   R#   (   R$   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR%   G   s    c            sq   ˆ  j  ˆ j d d d g ƒ ˆ  j  ˆ j d d d d g ƒ ˆ  j  t ˆ j ƒ d ƒ ˆ  j  t ˆ j ƒ d ƒ d  S(   Ns   Hello 1s   Hello 2s   Hello 3s	   DOOM LINEi   (   R&   R   R'   R   (   R(   (   R   R)   R$   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR*   K   s    (   R   R   R+   R   R,   R-   (   R   R%   R*   R.   (    (   R)   R   R$   s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   testSneakyHiddenDoomC   s    		(   R   R   R/   R0   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR"   1   s   	t   LoopbackAsyncTestCasec           B   s¿   e  Z e e j ƒ Z d  „  Z d „  Z d „  Z d „  Z	 d d „ Z
 d „  Z d „  Z d „  Z d	 „  Z d
 d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   sb   d t  f d „  ƒ  Y} | ƒ  } | ƒ  } t j | | ƒ |  j | j d ƒ |  j | j d ƒ d S(   s}   
        Test that the client and server protocol both have makeConnection
        invoked on them by loopbackAsync.
        t   TestProtocolc           B   s   e  Z d Z d  „  Z RS(   c         S   s   | |  _  d  S(   N(   R    (   R   R    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   makeConnectiona   s    N(   R   R   R   R    R3   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR2   _   s   N(   R   R   t   loopbackAsynct   failIfEqualR    R   (   R   R2   t   servert   client(    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_makeConnectionZ   s    		c            s’   d t  f d „  ƒ  Y} | rA | ƒ  } t ƒ  } | _ t  ƒ  } n" t  ƒ  } | ƒ  } t ƒ  } | _ t j | | ƒ ‡ ‡  f d †  } | j | ƒ S(   sJ   
        Test one of the permutations of client/server host/peer.
        R2   c           B   s   e  Z d  „  Z RS(   c         S   s$   t  j |  | ƒ |  j j | ƒ d  S(   N(   R   R3   t   onConnectionR   (   R   R    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR3   p   s    (   R   R   R3   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR2   o   s   c            s,   t  |  ˆ  ƒ ƒ  } ˆ j t j | ƒ ƒ d  S(   N(   t   getattrt
   failUnlessR   t
   providedBy(   R    t   host(   t   getR   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt	   connected   s    (   R   R   R9   R   R4   R+   (   R   R>   t
   testServerR2   R6   R.   R7   R?   (    (   R   R>   s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   _hostpeertestk   s    			c         C   s   |  j  d t ƒ S(   s„   
        Test that the server gets a transport with a properly functioning
        implementation of L{ITransport.getHost}.
        t   getHost(   RA   t   True(   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_serverHost†   s    c         C   s   |  j  d t ƒ S(   sG   
        Like C{test_serverHost} but for L{ITransport.getPeer}
        t   getPeer(   RA   RC   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_serverPeerŽ   s    RB   c         C   s   |  j  d t ƒ S(   s„   
        Test that the client gets a transport with a properly functioning
        implementation of L{ITransport.getHost}.
        RB   (   RA   t   False(   R   R>   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_clientHost•   s    c         C   s   |  j  d t ƒ S(   sH   
        Like C{test_clientHost} but for L{ITransport.getPeer}.
        RE   (   RA   RG   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_clientPeer   s    c            s“   d t  f d „  ƒ  Y} d t  f ‡  f d †  ƒ  Y} | r] | ƒ  } | ƒ  } t ƒ  } | _ n" | ƒ  } t ƒ  } | _ | ƒ  } t j | | ƒ | S(   sT   
        Test one of the permutations of write/writeSequence client/server.
        t   GreeteeProtocolc           B   s   e  Z d  Z d „  Z RS(   t    c         S   s5   |  j  | 7_  |  j  d k r1 |  j j d  ƒ n  d  S(   Nt   bytes(   RL   t   receivedR   R   (   R   RL   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   dataReceivedª   s    (   R   R   RL   RN   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRJ   ¨   s   t   GreeterProtocolc              s   e  Z ‡  f d  †  Z RS(   c            s   t  |  j ˆ  ƒ d ƒ d  S(   NRL   (   R:   R    (   R   (   t   write(    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR   °   s    (   R   R   R   (    (   RP   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRO   ¯   s   (   R   R   RM   R   R4   (   R   RP   R@   RJ   RO   R6   R7   R.   (    (   RP   s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   _greetingtest¤   s    				c         C   s   |  j  d t ƒ S(   s„   
        Test that on a connection where the client speaks first, the server
        receives the bytes sent by the client.
        RP   (   RQ   RG   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_clientGreetingÀ   s    c         C   s   |  j  d t ƒ S(   sz   
        Like C{test_clientGreeting}, but use C{writeSequence} instead of
        C{write} to issue the greeting.
        t   writeSequence(   RQ   RG   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_clientGreetingSequenceÈ   s    RP   c         C   s   |  j  d t ƒ S(   s„   
        Test that on a connection where the server speaks first, the client
        receives the bytes sent by the server.
        RP   (   RQ   RC   (   R   RP   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_serverGreetingÐ   s    c         C   s   |  j  d t ƒ S(   sz   
        Like C{test_serverGreeting}, but use C{writeSequence} instead of
        C{write} to issue the greeting.
        RS   (   RQ   RC   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_serverGreetingSequenceØ   s    c            sŽ   t  t t d d ƒ ƒ ‰ d t f ‡ ‡  f d †  ƒ  Y} d t f ‡ ‡ ‡ f d †  ƒ  Y} | ƒ  ‰ | ƒ  ‰ t ƒ  ˆ _ t j ˆ ˆ ƒ ˆ j S(   Ni    i
   t   ProducingProtocolc              s   e  Z ‡  ‡ f d  †  Z RS(   c            s,   ˆ t  ˆ  ƒ ƒ |  _ |  j j |  j ƒ d  S(   N(   t   listt   producert   startR    (   R   (   t	   toProducet   producerClass(    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR   ä   s    (   R   R   R   (    (   R[   R\   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRW   ã   s   t   ReceivingProtocolc              s#   e  Z d  Z ‡  ‡ ‡ f d †  Z RS(   RK   c            sD   |  j  | 7_  |  j  d j ˆ  ƒ k r@ |  j j ˆ ˆ f ƒ n  d  S(   NRK   (   RL   t   joinRM   R   (   R   RL   (   R[   R7   R6   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRN   ê   s    (   R   R   RL   RN   (    (   R[   R7   R6   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR]   è   s   (   t   mapt   strt   rangeR   R   RM   R   R4   (   R   R\   RW   R]   (    (   R\   R6   R[   R7   s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   _producertestà   s    "		c            sE   d t  f d „  ƒ  Y} ˆ  j | ƒ } ‡  f d †  } | j | ƒ | S(   sO   
        Test a push producer registered against a loopback transport.
        t   PushProducerc           B   s<   e  Z e e ƒ e Z d  „  Z d „  Z d „  Z d „  Z	 RS(   c         S   s   | |  _  d  S(   N(   R[   (   R   R[   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR   ÿ   s    c         S   s   t  |  _ d  S(   N(   RC   t   resumed(   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   resumeProducing  s    c         S   s'   | |  _  | j |  t ƒ |  j ƒ  d  S(   N(   t   consumert   registerProducerRC   t   _produceAndSchedule(   R   Rf   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRZ     s    	c         S   sL   |  j  r; |  j j |  j  j d ƒ ƒ t j d |  j ƒ n |  j j ƒ  d  S(   Ni    (   R[   Rf   RP   t   popR   t	   callLaterRh   t   unregisterProducer(   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRh   
  s    	(
   R   R   R    R	   RG   Rd   R   Re   RZ   Rh   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRc   û   s   
			c            s&   |  \ } } ˆ  j  | j j d ƒ d  S(   Ns0   Streaming producer should not have been resumed.(   t   failIfRY   Rd   (   t   .0R7   R6   (   R   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   finished  s    		(   t   objectRb   R+   (   R   Rc   R.   Rn   (    (   R   s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_pushProducer÷   s
    c         C   s#   d t  f d „  ƒ  Y} |  j | ƒ S(   sO   
        Test a pull producer registered against a loopback transport.
        t   PullProducerc           B   s-   e  Z e e ƒ d  „  Z d „  Z d „  Z RS(   c         S   s   | |  _  d  S(   N(   R[   (   R   R[   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR   !  s    c         S   s    | |  _  |  j  j |  t ƒ d  S(   N(   Rf   Rg   RG   (   R   Rf   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRZ   $  s    	c         S   s9   |  j  j |  j j d ƒ ƒ |  j s5 |  j  j ƒ  n  d  S(   Ni    (   Rf   RP   R[   Ri   Rk   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRe   (  s    	(   R   R   R    R
   R   RZ   Re   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRq     s   
		(   Ro   Rb   (   R   Rq   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_pullProducer  s    c            ss   d t  f d „  ƒ  Y} d t  f d „  ƒ  Y} | ƒ  } | ƒ  ‰ t j ˆ | ƒ } ‡  ‡ f d †  } | j | ƒ | S(   sº   
        L{loopback.loopbackAsync} does not call a protocol's C{dataReceived}
        method while that protocol's transport's C{write} method is higher up
        on the stack.
        t   Serverc           B   s   e  Z d  „  Z RS(   c         S   s   |  j  j d ƒ d  S(   NRL   (   R    RP   (   R   RL   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRN   6  s    (   R   R   RN   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRs   5  s   t   Clientc           B   s)   e  Z e Z d  „  Z d „  Z d „  Z RS(   c         S   s   t  j d |  j ƒ d  S(   Ni    (   R   Rj   t   go(   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR   <  s    c         S   s   |  j  j d ƒ t |  _ d  S(   Nt   foo(   R    RP   RC   t   ready(   R   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRu   ?  s    c         S   s   |  j  |  _ |  j j ƒ  d  S(   N(   Rw   t   wasReadyR    R!   (   R   RL   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRN   C  s    (   R   R   RG   Rw   R   Ru   RN   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyRt   9  s   		c            s   ˆ  j  ˆ j ƒ d  S(   N(   t
   assertTrueRx   (   R(   (   R   R7   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt
   cbFinishedK  s    (   R   R   R4   R+   (   R   Rs   Rt   R6   R.   Rz   (    (   R   R7   s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_writeNotReentrant/  s    		c            sÂ   g  ‰ ‡ f d †  } t  ƒ  ‰ t  ƒ  ‰ t j ˆ ˆ | ƒ } ˆ  j ˆ g  ƒ ˆ j j d ƒ ˆ j j d ƒ ˆ j j d ƒ ˆ j j d ƒ ˆ j j ƒ  ‡  ‡ ‡ ‡ f d †  } | j | ƒ | S(   sÜ   
        The callable passed as the value for the C{pumpPolicy} parameter to
        L{loopbackAsync} is called with a L{_LoopbackQueue} of pending bytes
        and a protocol to which they should be delivered.
        c            s=   g  } x |  r% | j  |  j ƒ  ƒ q	 Wˆ  j  | | f ƒ d  S(   N(   R   R>   (   t   queuet   targetRL   (   t	   pumpCalls(    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   dummyPolicyX  s    	Rv   t   bart   bazt   quuxc            s5   ˆ  j  ˆ ˆ d d d  g f ˆ d d g f g ƒ d  S(   NR   R‚   Rv   R€   (   R&   R   (   R(   (   R   R~   R6   R7   (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt
   cbCompletej  s    (   R   R   R4   R&   R    RP   R!   R+   (   R   R   Rn   Rƒ   (    (   R   R~   R6   R7   s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_pumpPolicyQ  s    		c         C   sx   g  } t  ƒ  } | j | _ t j ƒ  } | j d ƒ | j d ƒ | j d ƒ t j | | ƒ |  j | d d g ƒ d S(   sŸ   
        L{identityPumpPolicy} is a pump policy which calls the target's
        C{dataReceived} method one for each string in the queue passed to it.
        Rv   R€   N(	   R   R   RN   R   t   _LoopbackQueuet   putR   t   identityPumpPolicyR&   (   R   RL   R7   R|   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_identityPumpPolicyu  s    	c         C   su   g  } t  ƒ  } | j | _ t j ƒ  } | j d ƒ | j d ƒ | j d ƒ t j | | ƒ |  j | d g ƒ d S(   sÀ   
        L{collapsingPumpPolicy} is a pump policy which calls the target's
        C{dataReceived} only once with all of the strings in the queue passed
        to it joined together.
        Rv   R€   t   foobarN(	   R   R   RN   R   R…   R†   R   t   collapsingPumpPolicyR&   (   R   RL   R7   R|   (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   test_collapsingPumpPolicy‡  s    	(   R   R   t   staticmethodR   R4   R-   R8   RA   RD   RF   RH   RI   RQ   RR   RT   RU   RV   Rb   Rp   Rr   R{   R„   Rˆ   R‹   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR1   V   s&   											#		"	$	t   LoopbackTCPTestCasec           B   s   e  Z e e j ƒ Z RS(    (   R   R   RŒ   R   t   loopbackTCPR-   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR   ›  s   t   LoopbackUNIXTestCasec           B   s8   e  Z e e j ƒ Z e j e d ƒ d k r6 d  Z
 n  RS(   s-   Current reactor does not support UNIX socketsN(   R   R   RŒ   R   t   loopbackUNIXR-   R   t   IReactorUNIXR   R   t   skip(    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyR   Ÿ  s   N(   t   __doc__t   zope.interfaceR    t   twisted.trialR   t   twisted.trial.utilR   t   SUPPRESSt   twisted.protocolsR   R   t   twisted.internetR   t   twisted.internet.protocolR   t   twisted.internet.deferR   t   twisted.internet.interfacesR   R	   R
   R   R   t   LineReceiverR   R   R"   t   TestCaseR1   R   R   (    (    (    s>   /usr/lib/python2.7/dist-packages/twisted/test/test_loopback.pyt   <module>   s    %ÿ F