Ë
    ojRF  ã                   óª  — d Z ddlmZ ddlmZ 	 ddlZe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mZ dd
l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m Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z'm(Z(  G d„ de jR                  «      Z* G d„ dejV                  «      Z+ G d„ de,«      Z- G d„ de«      Z. G d„ d«      Z/ G d„ de«      Z0y# e$ r dZY Œ»w xY w)z#
Tests for L{twisted.web.distrib}.
é    )Úabspath)ÚparseStringN)ÚskipIf)ÚverifyObject)ÚdeferÚreactor)ÚglobalLogPublisher)ÚfailureÚfilepath)Úpb©Ú
SIZE_LIMIT)Úproto_helpers)ÚTestCase)ÚclientÚdistribÚresourceÚserverÚstatic)ÚHeaders)Ú_render)ÚDummyChannelÚDummyRequestc                   ó   — e Zd Zy)ÚMySiteN)Ú__name__Ú
__module__Ú__qualname__© ó    ú?/usr/lib/python3/dist-packages/twisted/web/test/test_distrib.pyr   r   #   s   „ Ør    r   c                   ó   — e Zd ZdZdZd„ Zy)ÚPBServerFactoryzÅ
    A PB server factory which keeps track of the most recent protocol it
    created.

    @ivar proto: L{None} or the L{Broker} instance most recently returned
        from C{buildProtocol}.
    Nc                 ód   — t         j                  j                  | |«      | _        | j                  S ©N)r   r#   ÚbuildProtocolÚproto)ÚselfÚaddrs     r!   r&   zPBServerFactory.buildProtocol2   s&   € Ü×'Ñ'×5Ñ5°d¸DÓAˆŒ
Ø�z‰zÐr    )r   r   r   Ú__doc__r'   r&   r   r    r!   r#   r#   '   s   „ ñð €Eór    r#   c                   ó   — e Zd ZdZy)ÚArbitraryErrorz%
    An exception for this test.
    N)r   r   r   r*   r   r    r!   r,   r,   7   s   „ òr    r,   c                   ój   — e Zd ZdZdZdZdZd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zy)ÚDistribTestsNc                 óR  ‡— t        j                  «       t        j                  «       gŠ| j                  �?| j                  j                  �)| j                  j                  j	                  ˆfd„«       n‰d   j                  d«       | j                  ��| j                  j                  �k| j                  j                  j                  j	                  ˆfd„«       | j                  j                  j                  j                  j                  «        n‰d   j                  d«       | j                  �)‰j                  | j                  j                  «       «       | j                  �)‰j                  | j                  j                  «       «       t        j                  ‰«      S )z‹
        Clean up all the event sources left behind by either directly by
        test methods or indirectly via some distrib API.
        Nc                  ó,   •— ‰ d   j                  d «      S ©Nr   ©Úcallback©Údls   €r!   ú<lambda>z'DistribTests.tearDown.<locals>.<lambda>J   s   ø€ °R¸±U·^±^ÀDÓ5I€ r    r   c                  ó,   •— ‰ d   j                  d «      S )Né   r2   r4   s   €r!   r6   z'DistribTests.tearDown.<locals>.<lambda>N   s   ø€ ÀÀAÁÇÁÐPTÓAU€ r    r8   )r   ÚDeferredÚf1r'   ÚnotifyOnDisconnectr3   ÚsubÚ	publisherÚbrokerÚ	transportÚloseConnectionÚport1ÚappendÚstopListeningÚport2ÚgatherResults)r(   r5   s    @r!   ÚtearDownzDistribTests.tearDownC   s  ø€ ô
 �n‰nÓ¤§¡Ó 0Ð1ˆØ�7‰7Ð 4§7¡7§=¡=Ð#<Ø�G‰G�M‰M×,Ñ,Ó-IÕJàˆq‰E�N‰N˜4Ô Ø�8‰8Ð D§H¡H×$6Ñ$6Ð$BØ�H‰H×Ñ×%Ñ%×8Ñ8Ó9UÔVØ�H‰H×Ñ×%Ñ%×/Ñ/×>Ñ>Õ@àˆq‰E�N‰N˜4Ô Ø�:‰:Ð!Ø�I‰I�d—j‘j×.Ñ.Ó0Ô1Ø�:‰:Ð!Ø�I‰I�d—j‘j×.Ñ.Ó0Ô1Ü×"Ñ" 2Ó&Ð&r    c                 ó˜  — t        j                  «       }|j                  dt        j                  dd«      «       t        j                  |«      }t        t        j                  |«      «      | _
        t        j                  d| j                  «      | _        t        j                  d| j                  j                  «       j                   «      | _        t        j                  «       }|j                  d| j"                  «       t%        |«      }t        j                  d|«      | _        t)        j*                  t        «      }d| j&                  j                  «       j                   › d�}|j-                  d	«      }|j/                  d
|«      }|j1                  t(        j2                  «       |j1                  | j4                  d«       |S )Ns   theres   rootz
text/plainr   ú	127.0.0.1s   herezhttp://127.0.0.1:z/here/thereÚasciió   GET)r   ÚResourceÚputChildr   ÚDatar   ÚSiter#   r   ÚResourcePublisherr:   r   Ú	listenTCPrA   ÚResourceSubscriptionÚgetHostÚportr<   r   rD   r   ÚAgentÚencodeÚrequestÚaddCallbackÚreadBodyÚassertEqual)r(   Úr1Úsite1Úr2Úf2ÚagentÚurlÚds           r!   ÚtestDistribzDistribTests.testDistribX   s@  € ä×ÑÓ ˆØ
�‰�HœfŸk™k¨'°<Ó@ÔAÜ—‘˜B“ˆÜ!¤'×";Ñ";¸EÓ"BÓCˆŒÜ×&Ñ& q¨$¯'©'Ó2ˆŒ
Ü×/Ñ/°¸T¿Z¹Z×=OÑ=OÓ=Q×=VÑ=VÓWˆŒÜ×ÑÓ ˆØ
�‰�G˜TŸX™XÔ&Ü�B‹ZˆÜ×&Ñ& q¨"Ó-ˆŒ
Ü—‘œWÓ%ˆØ! $§*¡*×"4Ñ"4Ó"6×";Ñ";Ð!<¸KÐHˆØ�j‰j˜Ó!ˆØ�M‰M˜& #Ó&ˆØ	�‰”f—o‘oÔ&Ø	�‰�d×&Ñ&¨Ô0Øˆr    c                 ób  — t        j                  «       }|j                  d|«       t        j                  |«      }t        t        j                  |«      «      x| _        }t        j                  d|d¬«      }| j                  |j                  «       |j                  «       }t        j                  |j                  |j                   «      x| _        }t        j                  |«      }t        j                  d|d¬«      }	| j                  |	j                  «       |	j                  «       }
|	|
fS )zû
        Set up a resource on a distrib site using L{ResourcePublisher}.

        @param child: The resource to publish using distrib.

        @return: A tuple consisting of the host and port on which to contact
            the created site.
        s   childr   rH   )Ú	interface)r   rK   rL   r   rN   r#   r   rO   r:   r   rP   Ú
addCleanuprC   rR   rQ   ÚhostrS   r<   )r(   ÚchildÚdistribRootÚdistribSiteÚdistribFactoryÚdistribPortr)   ÚmainRootÚmainSiteÚmainPortÚmainAddrs              r!   Ú_setupDistribServerz DistribTests._setupDistribServerl   sõ   € ô ×'Ñ'Ó)ˆØ×Ñ˜X uÔ-Ü—k‘k +Ó.ˆÜ#2Ü×%Ñ% kÓ2ó$
ð 	
ˆŒ�.ô ×'Ñ'¨¨>À[ÔQˆØ�‰˜×1Ñ1Ô2Ø×"Ñ"Ó$ˆä%×:Ñ:¸4¿9¹9ÀdÇiÁiÓPÐPˆŒ�8Ü—;‘;˜xÓ(ˆÜ×$Ñ$ Q¨¸KÔHˆØ�‰˜×.Ñ.Ô/Ø×#Ñ#Ó%ˆà˜Ð!Ð!r    c                 ó"  — | j                  |«      \  }}t        j                  t        «      }d|j                  › d|j
                  › d�}|j                  d«      } |j                  d|fi |¤Ž}|j                  t        j                  «       |S )a¡  
        Set up a resource on a distrib site using L{ResourcePublisher} and
        then retrieve it from a L{ResourceSubscription} via an HTTP client.

        @param child: The resource to publish using distrib.
        @param **kwargs: Extra keyword arguments to pass to L{Agent.request} when
            requesting the resource.

        @return: A L{Deferred} which fires with the result of the request.
        úhttp://ú:ú/childrI   rJ   )
ro   r   rT   r   re   rS   rU   rV   rW   rX   )r(   rf   Úkwargsrm   rn   r^   r_   r`   s           r!   Ú_requestTestzDistribTests._requestTest‡   s}   € ð "×5Ñ5°eÓ<Ñˆ�(Ü—‘œWÓ%ˆØ˜Ÿ™� a¨¯© °fÐ=ˆØ�j‰j˜Ó!ˆØˆE�M‰M˜& #Ñ0¨Ñ0ˆØ	�‰”f—o‘oÔ&Øˆr    c                 ó  — | j                  |«      \  }}d|j                  › d|j                  › d�}|j                  d«      } t	        j
                  t        «      j                  d|fi |¤Ž}d„ }|j                  |«       |S )a;  
        Set up a resource on a distrib site using L{ResourcePublisher} and
        then retrieve it from a L{ResourceSubscription} via an HTTP client.

        @param child: The resource to publish using distrib.
        @param **kwargs: Extra keyword arguments to pass to L{Agent.request} when
            requesting the resource.

        @return: A L{Deferred} which fires with a tuple consisting of a
            L{twisted.test.proto_helpers.AccumulatingProtocol} containing the
            body of the response and an L{IResponse} with the response itself.
        rq   rr   rs   rI   rJ   c                 ó´   ‡ ‡— t        j                  «       Š‰ j                  ‰«       t        j                  «       x}‰_        |j                  ˆˆ fd„«       |S )Nc                 ó   •— ‰‰fS r%   r   )Ú_ÚprotocolÚresponses    €€r!   r6   zGDistribTests._requestAgentTest.<locals>.cbCollectBody.<locals>.<lambda>±   s   ø€  X¨xÐ$8€ r    )r   ÚAccumulatingProtocolÚdeliverBodyr   r9   ÚclosedDeferredrW   )r{   r`   rz   s   ` @r!   ÚcbCollectBodyz5DistribTests._requestAgentTest.<locals>.cbCollectBody­   sE   ù€ Ü$×9Ñ9Ó;ˆHØ× Ñ  Ô*Ü*/¯.©.Ó*:Ð:ˆA�Ô'Ø�M‰MÔ8Ô9ØˆHr    )	ro   re   rS   rU   r   rT   r   rV   rW   )r(   rf   rt   rm   rn   r_   r`   r   s           r!   Ú_requestAgentTestzDistribTests._requestAgentTestš   s}   € ð "×5Ñ5°eÓ<Ñˆ�(à˜Ÿ™� a¨¯© °fÐ=ˆØ�j‰j˜Ó!ˆØ)ŒF�L‰LœÓ!×)Ñ)¨&°#Ñ@¸Ñ@ˆò	ð 	
�‰�mÔ$Øˆr    c                 ó*  ‡ ‡‡‡‡— i Št        j                  «       Št        j                  ‰«       dgŠ G ˆˆfd„dt        j
                  «      }ˆˆˆ fd„Š‰ j                   |«       t        ddgi«      ¬«      }ˆˆˆ fd„}|j                  |«       |S )	z†
        The request headers are available on the request object passed to a
        distributed resource's C{render} method.
        Nc                   ó   •— e Zd Zˆ ˆfd„Zy)ú>DistribTests.test_requestHeaders.<locals>.ReportRequestHeadersc                 ót   •— |‰d<   ‰j                  t        |j                  j                  «       «      «       y)Nr   r    )ÚupdateÚdictÚrequestHeadersÚgetAllRawHeaders)r(   rV   Úreqr‡   s     €€r!   ÚrenderzEDistribTests.test_requestHeaders.<locals>.ReportRequestHeaders.renderÂ   s1   ø€ Ø ��A‘Ø×%Ñ%¤d¨7×+AÑ+A×+RÑ+RÓ+TÓ&UÔVØr    N©r   r   r   rŠ   )r‰   r‡   s   €€r!   ÚReportRequestHeadersrƒ   Á   s   ø„ ör    rŒ   c                  óÐ   •— ‰D � cg c]  } | d   ‘Œ	 }} ‰j                  d|«       ‰j                  d|«       ‰j                  ‰d   |«       t        j                  ‰«       y c c} w )NÚ
log_formatzconnected to publisherz3could not connect to distributed web service: {msg}r   )ÚassertInr	   ÚremoveObserver)ÚeÚmsgsÚlogObserverr‰   r(   s     €€€r!   Ú
check_logsz4DistribTests.test_requestHeaders.<locals>.check_logsÇ   s^   ø€ Ø-8Ö9¨�A�l“OÐ9ˆDÐ9Ø�M‰MÐ2°DÔ9Ø�M‰MÐOÐQUÔVØ�M‰M˜#˜a™& $Ô'Ü×-Ñ-¨kÕ:ùò	 :s   †A#ÚfooÚbar)Úheadersc                 ó|   •— ‰j                   j                  j                  ‰«       ‰j                  ‰d   dg«       y )Ns   Foos   bar)r:   r'   r;   rY   )Úresultr”   r‡   r(   s    €€€r!   ÚcbRequestedz5DistribTests.test_requestHeaders.<locals>.cbRequestedÒ   s0   ø€ Ø�G‰G�M‰M×,Ñ,¨ZÔ8Ø×Ñ˜^¨FÑ3°f°XÕ>r    )	r   ÚEventLoggingObserverr	   ÚaddObserverr   rK   ru   r   rW   )r(   rŒ   rV   rš   r”   r“   r‰   r‡   s   `   @@@@r!   Útest_requestHeadersz DistribTests.test_requestHeaders·   s‰   ü€ ð
 ˆÜ#×8Ñ8Ó:ˆÜ×&Ñ& {Ô3Øˆfˆ÷	¤8×#4Ñ#4ô 	ö	;ð ×#Ñ#Ù Ó"¬G°U¸U¸GÐ4DÓ,Eð $ó 
ˆö	?ð 	×Ñ˜KÔ(Øˆr    c                 ó’   ‡ —  G d„ dt         j                  «      }‰ j                   |«       «      }ˆ fd„}|j                  |«       |S )z�
        The response code can be set by the request object passed to a
        distributed resource's C{render} method.
        c                   ó   — e Zd Zd„ Zy)ú>DistribTests.test_requestResponseCode.<locals>.SetResponseCodec                 ó&   — |j                  d«       y)NéÈ   Ú ©ÚsetResponseCode©r(   rV   s     r!   rŠ   zEDistribTests.test_requestResponseCode.<locals>.SetResponseCode.renderà   s   € Ø×'Ñ'¨Ô,Ør    Nr‹   r   r    r!   ÚSetResponseCoder    ß   ó   „ ór    r§   c                 óÀ   •— ‰j                  | d   j                  d«       ‰j                  | d   j                  d«       ‰j                  | d   j                  d«       y )Nr   r    r8   r¢   s   OK©rY   ÚdataÚcodeÚphrase©r™   r(   s    €r!   rš   z:DistribTests.test_requestResponseCode.<locals>.cbRequestedæ   sM   ø€ Ø×Ñ˜V A™YŸ^™^¨SÔ1Ø×Ñ˜V A™YŸ^™^¨SÔ1Ø×Ñ˜V A™Y×-Ñ-¨uÕ5r    ©r   rK   r€   rW   ©r(   r§   rV   rš   s   `   r!   Útest_requestResponseCodez%DistribTests.test_requestResponseCodeÙ   sD   ø€ ô	œh×/Ñ/ô 	ð
 ×(Ñ(©Ó):Ó;ˆô	6ð
 	×Ñ˜KÔ(Øˆr    c                 ó’   ‡ —  G d„ dt         j                  «      }‰ j                   |«       «      }ˆ fd„}|j                  |«       |S )z�
        The response code and message can be set by the request object passed to
        a distributed resource's C{render} method.
        c                   ó   — e Zd Zd„ Zy)úEDistribTests.test_requestResponseCodeMessage.<locals>.SetResponseCodec                 ó(   — |j                  dd«       y)Nr¢   ó   some-messager£   r¤   r¦   s     r!   rŠ   zLDistribTests.test_requestResponseCodeMessage.<locals>.SetResponseCode.renderõ   s   € Ø×'Ñ'¨¨_Ô=Ør    Nr‹   r   r    r!   r§   r´   ô   r¨   r    r§   c                 óÀ   •— ‰j                  | d   j                  d«       ‰j                  | d   j                  d«       ‰j                  | d   j                  d«       y )Nr   r    r8   r¢   r¶   rª   r®   s    €r!   rš   zADistribTests.test_requestResponseCodeMessage.<locals>.cbRequestedû   sM   ø€ Ø×Ñ˜V A™YŸ^™^¨SÔ1Ø×Ñ˜V A™YŸ^™^¨SÔ1Ø×Ñ˜V A™Y×-Ñ-¨Õ?r    r¯   r°   s   `   r!   Útest_requestResponseCodeMessagez,DistribTests.test_requestResponseCodeMessageî   sE   ø€ ô	œh×/Ñ/ô 	ð
 ×(Ñ(©Ó):Ó;ˆô	@ð
 	×Ñ˜KÔ(Øˆr    c                 ó°   —  G d„ dt         j                  «      }| j                   |«       «      }|j                  | j                  dt
        z  dz   «       |S )zÞ
        If a string longer than the Banana size limit is passed to the
        L{distrib.Request} passed to the remote resource, it is broken into
        smaller strings to be transported over the PB connection.
        c                   ó   — e Zd Zd„ Zy)ú0DistribTests.test_largeWrite.<locals>.LargeWritec                 óx   — |j                  dt        z  dz   «       |j                  «        t        j                  S ©Nó   xó   y)Úwriter   Úfinishr   ÚNOT_DONE_YETr¦   s     r!   rŠ   z7DistribTests.test_largeWrite.<locals>.LargeWrite.render  s.   € Ø—‘˜d¤ZÑ/°$Ñ6Ô7Ø—‘Ô Ü×*Ñ*Ð*r    Nr‹   r   r    r!   Ú
LargeWriter»   
  s   „ ó+r    rÃ   r¾   r¿   ©r   rK   ru   rW   rY   r   )r(   rÃ   rV   s      r!   Útest_largeWritezDistribTests.test_largeWrite  sM   € ô	+œ×*Ñ*ô 	+ð ×#Ñ#¡J£LÓ1ˆØ×Ñ˜D×,Ñ,¨d´ZÑ.?À$Ñ.FÔGØˆr    c                 ó°   —  G d„ dt         j                  «      }| j                   |«       «      }|j                  | j                  dt
        z  dz   «       |S )z 
        Like L{test_largeWrite}, but for the case where C{render} returns a
        long string rather than explicitly passing it to L{Request.write}.
        c                   ó   — e Zd Zd„ Zy)ú2DistribTests.test_largeReturn.<locals>.LargeReturnc                 ó   — dt         z  dz   S r½   r   r¦   s     r!   rŠ   z9DistribTests.test_largeReturn.<locals>.LargeReturn.render  s   € ØœjÑ(¨4Ñ/Ð/r    Nr‹   r   r    r!   ÚLargeReturnrÈ     s   „ ó0r    rÊ   r¾   r¿   rÄ   )r(   rÊ   rV   s      r!   Útest_largeReturnzDistribTests.test_largeReturn  sM   € ô	0œ(×+Ñ+ô 	0ð ×#Ñ#¡K£MÓ2ˆØ×Ñ˜D×,Ñ,¨d´ZÑ.?À$Ñ.FÔGØˆr    c                 óT  ‡ ‡— t        t        j                  «       «      x‰ _        }t	        j
                  d|«      x‰ _        }t        j                  d|j                  «       j                  «      x‰ _        }t        dg«      Št        |‰«      }ˆˆ fd„}|j                  |«       |S )zz
        If there is an error issuing the request to the remote publisher, an
        error response is returned.
        r   rH   r    c                 ó  •— ‰j                  ‰j                  d«       ‰j                  t        j                  «      }‰j                  t        |«      d«       g d¢}‰j                  dj                  |«      g‰j                  «       y )Niô  r8   )
r    s   <html>s:     <head><title>500 - Server Connection Lost</title></head>s     <body>s#       <h1>Server Connection Lost</h1>s¦       <p>Connection to distributed server lost:<pre>[Failure instance: Traceback from remote host -- twisted.spread.flavors.NoSuchMethod: No such method: remote_requests   ]</pre></p>s	     </body>s   </html>r    ó   
)rY   ÚresponseCodeÚflushLoggedErrorsr   ÚNoSuchMethodÚlenÚjoinÚwritten)ÚignoredÚerrorsÚexpectedrV   r(   s      €€r!   Ú
cbRenderedz4DistribTests.test_connectionLost.<locals>.cbRendered2  sl   ø€ Ø×Ñ˜W×1Ñ1°3Ô7ð ×+Ñ+¬B¯O©OÓ<ˆFØ×ÑœS ›[¨!Ô,òˆHð  ×Ñ˜eŸj™j¨Ó2Ð3°W·_±_ÕEr    )r#   r   ÚRootr:   r   rP   rA   r   rQ   rR   rS   r<   r   r   rW   )r(   ÚserverFactoryÚ
serverPortÚsubscriptionr`   rØ   rV   s   `     @r!   Útest_connectionLostz DistribTests.test_connectionLost"  s•   ù€ ô #2´"·'±'³)Ó"<Ð<ˆŒ�-Ü")×"3Ñ"3°A°}Ó"EÐEˆŒ
�Zä")×">Ñ">Ø˜×+Ñ+Ó-×2Ñ2ó#
ð 	
ˆŒ�<ô  ˜uÓ%ˆÜ�L 'Ó*ˆõ	Fð2 	
�‰�jÔ!Øˆr    c                 óP  — t         j                  j                  | t        «      }t	        j
                  t        «       «      }t        dg«      }t        j                  |«      }|j                  |«       | j                  dt        |«      «       | j                  d|d   d   «       y)zQ
        When a request fails, the string form of the failure is logged.
        r    r8   zFailure instancer   rŽ   N)r   r›   ÚcreateWithCleanupr	   r
   ÚFailurer,   r   r   ÚIssueÚfailedÚassertEqualsrÒ   r�   )r(   r“   ÚfrV   Úissues        r!   Útest_logFailedzDistribTests.test_logFailedN  s…   € ô $×8Ñ8×JÑJØÔ$ó
ˆô �O‰OœNÓ,Ó-ˆÜ ˜uÓ%ˆÜ—‘˜gÓ&ˆØ�‰�QŒØ×Ñ˜!œS Ó-Ô.Ø�‰Ð(¨+°a©.¸Ñ*FÕGr    c                 óv  — t         j                  j                  | t        «      }t	        «       }t        j                  |«      }t        j                  t        «       «      }|j                  |«       | j                  t        «       | j                  dt        |«      «       | j                  |d   d   |«       y)zf
        When L{twisted.web.distrib.Request}'s fail is called, the failure
        is logged.
        r8   r   Úlog_failureN)r   r›   rß   r	   r,   r
   rà   r   ÚRequestr   ÚfailrÐ   rã   rÒ   ÚassertIs)r(   r“   Úerrrä   r‰   s        r!   Útest_requestFailzDistribTests.test_requestFail]  s�   € ô
 $×8Ñ8×JÑJØÔ$ó
ˆô ÓˆÜ�O‰O˜CÓ ˆÜ�o‰oœl›nÓ-ˆØ�‰�ŒØ×Ñœ~Ô.Ø×Ñ˜!œS Ó-Ô.Ø�‰�k !‘n ]Ñ3°QÕ7r    )r   r   r   rA   rD   r<   r:   rF   ra   ro   ru   r€   r�   r±   r¸   rÅ   rË   rÝ   ræ   rí   r   r    r!   r.   r.   =   sZ   „ Ø€EØ€EØ
€CØ	€Bò'ò*ò("ò6ò&ò: òDò*ò*ò"ò*òXHó8r    r.   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)Ú_PasswordDatabasec                 ó   — || _         y r%   )Ú_users)r(   Úuserss     r!   Ú__init__z_PasswordDatabase.__init__o  s	   € Øˆ�r    c                 ó,   — t        | j                  «      S r%   )Úiterrñ   ©r(   s    r!   Úgetpwallz_PasswordDatabase.getpwallr  s   € Ü�D—K‘KÓ Ð r    c                 óP   — | j                   D ]  }|d   |k(  sŒ|c S  t        «       ‚r1   )rñ   ÚKeyError)r(   ÚusernameÚusers      r!   Úgetpwnamz_PasswordDatabase.getpwnamu  s0   € Ø—K‘Kò 	ˆDØ�A‰w˜(Ó"Ø’ð	ô ‹jÐr    N)r   r   r   ró   r÷   rü   r   r    r!   rï   rï   n  s   „ òò!ór    rï   c                   óp   — e Zd ZdZd„ Zd„ Zdeddfd„Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zd„ Z ee d«      d„ «       Zy)ÚUserDirectoryTestszj
    Tests for L{UserDirectory}, a resource for listing all user resources
    available on a system.
    c                 ó  — ddddd| j                  «       df| _        dddd	d
| j                  «       df| _        t        | j                  | j                  g«      | _        t        j                  | j                  «      | _        y )NÚaliceÚxé{   iÈ  zAlice,,,z/bin/shÚbobéê   i7  zBob,,,)Úmktempr   r  rï   Údatabaser   ÚUserDirectoryÚ	directoryrö   s    r!   ÚsetUpzUserDirectoryTests.setUp‚  si   € Ø˜s C¨¨j¸$¿+¹+»-ÈÐSˆŒ
Ø˜3  S¨(°D·K±K³MÀ9ÐMˆŒÜ)¨4¯:©:°t·x±xÐ*@ÓAˆŒÜ ×.Ñ.¨t¯}©}Ó=ˆ�r    c                 ój   — | j                  t        t        j                  | j                  «      «       y)zK
        L{UserDirectory} instances provide L{resource.IResource}.
        N)Ú
assertTruer   r   Ú	IResourcer  rö   s    r!   Útest_interfacez!UserDirectoryTests.test_interfaceˆ  s!   € ð 	�‰œ¤X×%7Ñ%7¸¿¹ÓHÕIr    ÚnameÚreturnNc              ƒ   óÄ   K  — t        |g«      }| j                  j                  ||«      }t        ||«      }|ƒ d{  –—†  | j	                  |j
                  d«       y7 Œ!­w)zr
        Verify that requesting the C{name} child of C{self.directory} results
        in a 404 response.
        Ni”  )r   r  ÚgetChildr   rY   rÏ   )r(   r  rV   r™   r`   s        r!   Ú_404TestzUserDirectoryTests._404TestŽ  sX   è ø€ ô
  ˜vÓ&ˆØ—‘×(Ñ(¨¨wÓ7ˆÜ�F˜GÓ$ˆØ�ˆØ×Ñ˜×-Ñ-¨sÕ3ð 	ús   ‚:A ¼A½"A c              ƒ   óB   K  — | j                  d«      ƒ d{  –—†  y7 Œ­w)z­
        L{UserDirectory.getChild} returns a resource which renders a 404
        response when passed a string which does not correspond to any known
        user.
        s   carolN©r  rö   s    r!   Útest_getInvalidUserz&UserDirectoryTests.test_getInvalidUser™  ó   è ø€ ð �m‰m˜HÓ%×%Ò%úó   ‚—˜c              ƒ   óB   K  — | j                  d«      ƒ d{  –—†  y7 Œ­w)zÞ
        L{UserDirectory.getChild} returns a resource which renders a 404
        response when passed a string which corresponds to a known user who has
        neither a user directory nor a user distrib socket.
        s   aliceNr  rö   s    r!   Útest_getUserWithoutResourcez.UserDirectoryTests.test_getUserWithoutResource¡  r  r  c                 óf  — t        j                  | j                  d   «      }|j                  d«      }|j	                  «        t        dg«      }| j                  j                  d|«      }| j                  |t        j                  «       | j                  |j                  |j                  «       y)z¹
        L{UserDirectory.getChild} returns a L{static.File} instance when passed
        the name of a user with a home directory containing a I{public_html}
        directory.
        éþÿÿÿÚpublic_htmlr  s   bobN)r   ÚFilePathr  rf   Úmakedirsr   r  r  ÚassertIsInstancer   ÚFilerY   Úpath)r(   Úhomer  rV   r™   s        r!   Útest_getPublicHTMLChildz*UserDirectoryTests.test_getPublicHTMLChild©  s†   € ô × Ñ  §¡¨"¡Ó.ˆØ—j‘j Ó/ˆØ×ÑÔÜ ˜wÓ'ˆØ—‘×(Ñ(¨°Ó9ˆØ×Ñ˜f¤f§k¡kÔ2Ø×Ñ˜Ÿ™ k×&6Ñ&6Õ7r    c                 ó°  — t        j                  | j                  d   «      }|j                  «        |j	                  d«      }t        dg«      }| j                  j                  d|«      }| j                  |t        j                  «       | j                  |j                  d«       | j                  t        |j                  «      |j                  «       y)zà
        L{UserDirectory.getChild} returns a L{ResourceSubscription} instance
        when passed the name of a user suffixed with C{".twistd"} who has a
        home directory containing a I{.twistd-web-pb} socket.
        r  ú.twistd-web-pbr  s
   bob.twistdÚunixN)r   r  r  r  rf   r   r  r  r  r   rQ   rY   re   r   rS   r!  )r(   r"  ÚwebrV   r™   s        r!   Útest_getDistribChildz'UserDirectoryTests.test_getDistribChild·  s�   € ô × Ñ  §¡¨"¡Ó.ˆØ�‰ŒØ�j‰jÐ)Ó*ˆÜ ˜wÓ'ˆØ—‘×(Ñ(¨¸Ó@ˆØ×Ñ˜f¤g×&BÑ&BÔCØ×Ñ˜Ÿ™ fÔ-Ø×Ñœ §¡Ó-¨s¯x©xÕ8r    c                 ó”   — t        dg«      }d|_        | j                  t        j                  | j
                  j                  |«       y)zr
        L{UserDirectory.render} raises L{UnsupportedMethod} in response to a
        non-I{GET} request.
        r£   ÚPOSTN)r   ÚmethodÚassertRaisesr   ÚUnsupportedMethodr  rŠ   r¦   s     r!   Útest_invalidMethodz%UserDirectoryTests.test_invalidMethodÆ  s9   € ô
  ˜tÓ$ˆØˆŒØ×Ñœ&×2Ñ2°D·N±N×4IÑ4IÈ7ÕSr    c                 ó¢  ‡ ‡— t        j                  ‰ j                  d   «      j                  d«      }|j	                  «        t        j                  ‰ j
                  d   «      }|j	                  «        |j                  d«      j                  d«       t        dg«      Št        ‰ j                  ‰«      }ˆˆ fd„}|j                  |«       |S )z}
        L{UserDirectory} renders a list of links to available user content
        in response to a I{GET} request.
        r  r  r%  r    r£   c                 óz  •— t        dj                  ‰j                  «      «      }|j                  d«      \  }}‰j	                  |j
                  j                  d«       ‰j	                  |j
                  j                  d«      d«       ‰j	                  |j
                  j
                  j                  d«       ‰j	                  |j
                  j                  d«       ‰j	                  |j
                  j                  d«      d«       ‰j	                  |j
                  j
                  j                  d«       y )	Nr    ÚliÚaÚhrefzalice/zAlice (file)zbob.twistd/zBob (twistd))	r   rÓ   rÔ   ÚgetElementsByTagNamerY   Ú
firstChildÚtagNameÚgetAttributer«   )rÕ   Údocumentr   r  rV   r(   s       €€r!   rØ   z2UserDirectoryTests.test_render.<locals>.cbRenderedà  sè   ø€ Ü" 3§8¡8¨G¯O©OÓ#<Ó=ˆHð $×8Ñ8¸Ó>‰LˆU�CØ×Ñ˜U×-Ñ-×5Ñ5°sÔ;Ø×Ñ˜U×-Ñ-×:Ñ:¸6ÓBÀHÔMØ×Ñ˜U×-Ñ-×8Ñ8×=Ñ=¸~ÔNØ×Ñ˜SŸ^™^×3Ñ3°SÔ9Ø×Ñ˜SŸ^™^×8Ñ8¸Ó@À-ÔPØ×Ñ˜SŸ^™^×6Ñ6×;Ñ;¸^ÕLr    )r   r  r   rf   r  r  Ú
setContentr   r   r  rW   )r(   r  r'  r™   rØ   rV   s   `    @r!   Útest_renderzUserDirectoryTests.test_renderÏ  s¦   ù€ ô
 ×'Ñ'¨¯
©
°2©Ó7×=Ñ=¸mÓLˆØ×ÑÔÜ×Ñ §¡¨¡Ó-ˆØ�‰Œð 	�	‰	Ð"Ó#×.Ñ.¨sÔ3ä ˜tÓ$ˆÜ˜Ÿ™¨Ó1ˆõ
	Mð 	×Ñ˜:Ô&Øˆr    zpwd module requiredc                 ól   — t        j                  «       }| j                  |j                  t        «       y)z„
        If L{UserDirectory} is instantiated with no arguments, it uses the
        L{pwd} module as its password database.
        N)r   r  ÚassertIdenticalÚ_pwdÚpwd)r(   r  s     r!   Útest_passwordDatabasez(UserDirectoryTests.test_passwordDatabaseï  s&   € ô ×)Ñ)Ó+ˆ	Ø×Ñ˜YŸ^™^¬SÕ1r    )r   r   r   r*   r	  r  Úbytesr  r  r  r#  r(  r.  r:  r   r>  r?  r   r    r!   rþ   rþ   |  sc   „ ñò
>òJð	4 5ð 	4¨Tó 	4ò&ò&ò8ò9òTòñ@ �ˆGÐ*Ó+ñ2ó ,ñ2r    rþ   )1r*   Úos.pathr   Úxml.dom.minidomr   r>  r=  ÚImportErrorÚunittestr   Úzope.interface.verifyr   Útwisted.internetr   r   Útwisted.loggerr	   Útwisted.pythonr
   r   Útwisted.spreadr   Útwisted.spread.bananar   Útwisted.testr   Útwisted.trial.unittestr   Útwisted.webr   r   r   r   r   Útwisted.web.http_headersr   Útwisted.web.test._utilr   Útwisted.web.test.requesthelperr   r   rN   r   r#   Ú	Exceptionr,   r.   rï   rþ   r   r    r!   ú<module>rR     s·   ðñõ Ý 'ðÛð €Cå å .ç +Ý -ß ,Ý Ý ,Ý &Ý +ß AÕ AÝ ,Ý *ß Eô	ˆV�[‰[ô 	ô�b×(Ñ(ô ô �Yô ôn8�8ô n8÷b	ñ ôz2˜õ z2øð_ ò Ø
‚Cðús   �C ÃCÃC