U
    n5{i¹o  ã                   @   sô   d Z ddlZddlmZmZmZ ddlmZ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 ddlmZ dd	lmZmZ dd
lmZ G dd„ dejƒZG dd„ dƒZG dd„ dejƒZG dd„ dejƒZe  eej!¡ G dd„ dejƒZ"dS )z%
Tests for L{twisted.words.service}.
é    N)ÚcheckersÚcredentialsÚportal)ÚaddressÚdeferÚreactor)ÚDeferredÚDeferredListÚmaybeDeferredÚsucceed)Úpb)Úproto_helpers)Úunittest)ÚewordsÚservice)Úircc                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )Ú
RealmTestsc                 C   s$  t  d¡}d| ¡  }t|d| ¡  ƒ}t|d| ¡  ƒ}d| ¡  d }ttd| ¡  ƒ}ttd| ¡  ƒ}|  ||ƒ¡}	|  ||	j¡ |  	||ƒ¡ 
|¡ t||dƒ |  |d	| ¡  ƒ¡}	|  d	| ¡  |	j¡ |  |d	| ¡  ƒ¡}
|  |	|
¡ t||d
ƒ |  	|d| ¡  ƒ¡ 
|¡ d S )NÚ	realmnameÚtestÚcreateÚgetZ	OnRequestZ	DuplicateZNoSuchTÚnewFZanother)r   ÚInMemoryWordsRealmÚlowerÚgetattrÚtitler   ÚsuccessResultOfÚassertEqualÚnameÚfailureResultOfÚtrapÚsetattrÚassertIdentical)ÚselfÚkindÚrealmr   r   r   ÚflagZdupExcZ	noSuchExcÚpZnewp© r(   úC/tmp/pip-unpacked-wheel-mnhg7r0q/twisted/words/test/test_service.pyÚ_entityCreationTest   s"    
zRealmTests._entityCreationTestc                 C   s
   |   d¡S )NÚUser©r*   ©r#   r(   r(   r)   ÚtestUserCreation4   s    zRealmTests.testUserCreationc                 C   s
   |   d¡S )NÚGroupr,   r-   r(   r(   r)   ÚtestGroupCreation7   s    zRealmTests.testGroupCreationc                 C   sn   t  d¡}|  | d¡¡}|  | d¡¡}|  ||¡ |  | d¡¡}|  ||¡ |  | d¡¡ t	j
¡ d S )Nr   ÚtestuserZ
nosuchuser)r   r   r   Ú
createUserÚgetUserr"   Ú
lookupUserr   r    r   Z
NoSuchUser)r#   r%   ÚuserÚ	retrievedÚlookedUpr(   r(   r)   ÚtestUserRetrieval:   s    
zRealmTests.testUserRetrievalc                 C   sl   t  d¡}t  d¡}|  | |¡¡}|  ||¡ |  | d¡¡}|  ||¡ |  | d¡¡}|  ||¡ d S )Nr   r1   )r   r   r+   r   ÚaddUserr"   r3   r4   )r#   r%   r'   r5   r6   r7   r(   r(   r)   ÚtestUserAdditionK   s    

zRealmTests.testUserAdditionc                 C   sR   t  d¡}|  | d¡¡}|  | d¡¡}|  ||¡ |  | d¡¡ tj	¡ d S )Nr   Ú	testgroupZnosuchgroup)
r   r   r   ÚcreateGroupÚgetGroupr"   r   r    r   ZNoSuchGroup)r#   r%   Úgroupr6   r(   r(   r)   ÚtestGroupRetrieval[   s
    
zRealmTests.testGroupRetrievalc                 C   sD   t  d¡}t  d¡}|  | |¡¡ |  | d¡¡}|  ||¡ d S )Nr   r;   Z	testGroup)r   r   r/   r   ÚaddGroupr=   r"   )r#   r%   r'   r>   r(   r(   r)   ÚtestGroupAdditionf   s
    

zRealmTests.testGroupAdditionc                 C   s.   t  d¡}|  | d¡¡ |  | d¡¡ dS )zÚ
        Try creating a group with the same name as an existing user and
        assert that it succeeds, since users and groups should not be in the
        same namespace and collisions should be impossible.
        r   r   N)r   r   r   r2   r<   )r#   r%   r(   r(   r)   ÚtestGroupUsernameCollisionn   s    
z%RealmTests.testGroupUsernameCollisionc                 C   sb   t  d¡}|  | d¡¡ |  | d¡¡ |  | ¡ ¡}dd„ |D ƒ}| ¡  |  |ddg¡ d S )Nr   ÚgrouponeÚgrouptwoc                 S   s   g | ]
}|j ‘qS r(   )r   )Ú.0Úgr(   r(   r)   Ú
<listcomp>�   s     z.RealmTests.testEnumeration.<locals>.<listcomp>)r   r   r   r<   Ú
itergroupsÚsortr   )r#   r%   ÚgroupsÚnr(   r(   r)   ÚtestEnumerationy   s    
zRealmTests.testEnumerationN)Ú__name__Ú
__module__Ú__qualname__r*   r.   r0   r8   r:   r?   rA   rB   rL   r(   r(   r(   r)   r      s   r   c                   @   s*   e Zd Ze ddd¡fdd„Zdd„ ZdS )	ÚTestCaseUserAggZTCPú	127.0.0.1i1Ô  c                 C   sB   || _ t ¡ | _| |¡| _| j| j_| j| j _| j | j¡ d S ©N)r5   r   Z StringTransportWithDisconnectionÚ	transportZbuildProtocolÚprotocolÚmindZmakeConnection)r#   r5   r%   Úfactoryr   r(   r(   r)   Ú__init__‡   s    


zTestCaseUserAgg.__init__c                 C   s   | j  |¡ d S rR   )rT   ZdataReceived)r#   Ústuffr(   r(   r)   Úwrite•   s    zTestCaseUserAgg.writeN)rM   rN   rO   r   ÚIPv4AddressrW   rY   r(   r(   r(   r)   rP   †   s   û
rP   c                   @   sê   e Zd Zddddddddd	d
dgZdd„ Zdd„ Zd=dd„Zdd„ Zd>dd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ ZdS )?ÚIRCProtocolTestsÚuseruserÚ	otheruserÚsomeguyÚ	firstuserÚusernameÚuseroneÚusertwoÚ	userthreeZuserfours   userfiveÚsomeuserc                 C   sŒ   t  d¡| _t ¡ | _t | j| jg¡| _t  | j| j¡| _	g }| j
D ]<}t|tƒr^| d¡}| | j |¡¡ | j ||d ¡ qFt|ƒS )Nr   úutf-8Ú	_password)r   r   r%   r   Ú'InMemoryUsernamePasswordDatabaseDontUseÚcheckerr   ÚPortalZ
IRCFactoryrV   ÚSTATIC_USERSÚ
isinstanceÚbytesÚdecodeÚappendr2   r9   r	   )r#   ÚcÚnickr(   r(   r)   ÚsetUp¨   s    



zIRCProtocolTests.setUpc                 C   sV   |   |¡}tjtjtjtjg}|D ]\}}}||kr"| |¡ q"|  |d|›�¡ dS )z½
        The user has been greeted with the four messages that are (usually)
        considered to start an IRC session.

        Asserts that the required responses were received.
        zMissing responses for N)Ú	_responser   ZRPL_WELCOMEZRPL_YOURHOSTZRPL_CREATEDZ
RPL_MYINFOÚremoveÚassertFalse)r#   r5   ÚresponseÚexpectedÚprefixÚcommandÚargsr(   r(   r)   Ú_assertGreeting¶   s    
z IRCProtocolTests._assertGreetingNc                 C   s8   |d kr|d }|  d|› d�¡ |  d|› d�¡ d S )Nrf   zPASS z
zNICK z extrainfo
)rY   )r#   r5   rp   Úpasswordr(   r(   r)   Ú_loginÅ   s    zIRCProtocolTests._loginc                 C   s2   |   | j |¡¡}t|| j| jƒ}|  ||¡ |S rR   )r   r%   r4   rP   rV   r|   )r#   r   r5   Zaggr(   r(   r)   Ú_loggedInUserË   s    zIRCProtocolTests._loggedInUserc                 C   s^   |j  ¡ }| d¡}| ¡ }|j  ¡  g }ttj|ƒD ]"}|dksN|d |kr6| |¡ q6|S )z£
        Extracts the user's response, and returns a list of parsed lines.
        If messageType is defined, only messages of that type will be returned.
        re   Né   )	rS   Úvaluerm   Ú
splitlinesÚclearÚmapr   Zparsemsgrn   )r#   r5   ZmessageTyperu   ÚresultÚmessager(   r(   r)   rr   Ñ   s    


zIRCProtocolTests._responsec                 C   s   |   d¡}|  |¡ d S )Nr_   )r}   rz   )r#   r5   r(   r(   r)   ÚtestPASSLoginà   s    
zIRCProtocolTests.testPASSLoginc                 C   s¬   |   | j d¡¡}t|| j| jƒ}| d¡ |  |d¡}|  t|ƒd¡ |  |d d t	j
¡ |  |d d d¡ |  |d d ddg¡ |j ¡  | d¡ |  |¡ d	S )
zµ
        Sending NICK without PASS will prompt the user for their password.
        When the user sends their password to NickServ, it will respond with a
        Greeting.
        r_   zNICK firstuser extrainfo
ÚPRIVMSGr~   r   é   z	Password?z%PRIVMSG nickserv firstuser_password
N)r   r%   r4   rP   rV   rY   rr   r   Úlenr   ZNICKSERVrS   r�   rz   ©r#   r_   r5   ru   r(   r(   r)   Útest_nickServLoginä   s    


z#IRCProtocolTests.test_nickServLoginc                 C   sh   |   | j d¡¡}t|| j| jƒ}|  |dd¡ |  |d¡}|  t|ƒd¡ |  |d d ddg¡ d S )Nr_   Z	wrongpassr†   r~   r   r‡   zLogin failed.  Goodbye.)	r   r%   r4   rP   rV   r|   rr   r   rˆ   r‰   r(   r(   r)   ÚtestFailedLoginø   s    z IRCProtocolTests.testFailedLoginc                    s^   g ‰ |   | j d¡¡}t|| j| jƒ}|  |d¡ ‡ fdd„|j_| d¡ |  	ˆ dg¡ d S )Nr_   c                      s
   ˆ   d¡S )NT)rn   r(   ©Úlogoutr(   r)   Ú<lambda>  ó    z-IRCProtocolTests.testLogout.<locals>.<lambda>zQUIT
T)
r   r%   r4   rP   rV   r|   rT   r�   rY   r   )r#   r_   r5   r(   rŒ   r)   Ú
testLogout  s    
zIRCProtocolTests.testLogoutc                 C   sä  |   | j d¡¡}|   | j d¡¡}d|jd< t|| j| jƒ}|  |d¡ |j 	¡  | 
d¡ |  |¡}|  t|ƒd¡ |  |d d d¡ |  |d d	 d
¡ |  |d d dg¡ |  |d	 d	 d¡ |  |d d	 d¡ |  |d d	 d¡ |  |d d	 d¡ |  d¡}|j 	¡  |j 	¡  | 
d¡ |  |¡}|  |¡}|  t|ƒd	¡ |  |d d d¡ |  |d d	 d
¡ |  |d d dg¡ |  |d	 d d¡ |  |d	 d	 d¡ |  |d	 d ddddgddddgg¡ d S )Nr_   Úsomechannelzsome random topicÚtopicúJOIN #somechannel
é   r   zfirstuser!firstuser@realmnamer~   ZJOINr‡   ú#somechannelZ353Z366é   Ú332é   Ú333r]   úotheruser!otheruser@realmnamer   ú=zfirstuser otheruserzotheruser firstuser)r   r%   r4   r<   ÚmetarP   rV   r|   rS   r�   rY   rr   r   rˆ   r}   ZassertIn)r#   r_   r‘   r5   ru   ÚotherÚeventr(   r(   r)   ÚtestJoin  sD    












þþzIRCProtocolTests.testJoinc                 C   sˆ   |   | j d¡¡}|   | j d¡¡ t|| j| jƒ}|  |d¡ |j ¡  | 	d¡ |  
|¡}dd„ |D ƒ}|  d|¡ |  d|¡ dS )	zo
        When a user joins a group without a topic, no topic information is
        sent to that user.
        r_   r‘   r“   c                 S   s   g | ]}|d  ‘qS )r~   r(   )rE   Úrr(   r(   r)   rG   R  s     z7IRCProtocolTests.test_joinTopicless.<locals>.<listcomp>r—   r™   N)r   r%   r4   r<   rP   rV   r|   rS   r�   rY   rr   ZassertNotIn)r#   r_   r5   ru   ZresponseCodesr(   r(   r)   Útest_joinTopiclessB  s    


z#IRCProtocolTests.test_joinTopiclessc                 C   s  |   d¡}|  | j d¡¡ | d¡ |j ¡  |   d¡}| d¡ |j ¡  |j ¡  | d¡ |  |¡}|  |¡}|  t	|ƒd¡ |  |d d d¡ |  |d d d	¡ |  |d d
 ddg¡ |  ||¡ | d¡ |j ¡  |j ¡  | d¡ |  |¡}|  |¡}|  t	|ƒd¡ |  |d d d¡ |  |d d d	¡ |  |d d
 ddg¡ |  ||¡ | d¡ |j ¡  |j ¡  | d¡ |  |¡}|  |¡}|  t	|ƒd¡ |  |d d d¡ |  |d d d	¡ |  |d d
 ddg¡ |  ||¡ d S )Nr\   r‘   r“   r]   zPART #somechannel
r~   r   úuseruser!useruser@realmnameZPARTr‡   r•   Zleavingz(PART #somechannel :goodbye stupidheads
zgoodbye stupidheadss   JOIN #somechannel
s)   PART #somechannel :goodbye stupidheads1
zgoodbye stupidheads1©
r}   r   r%   r<   rY   rS   r�   rr   r   rˆ   ©r#   r5   r�   ru   rž   r(   r(   r)   Ú	testLeaveV  sL    





















zIRCProtocolTests.testLeavec                 C   sT  |   d¡}t d¡}d|jd< d|jd< d|jd< |  | j |¡¡ |j ¡  | 	d	¡ |  
|¡}|  |d
 d d¡ |  |d
 d d¡ |  |d
 d dddg¡ |  |d d d¡ |  |d d ddddg¡ |j ¡  | 	d¡ |  
|¡}|  |d d d¡ |  |d d dddg¡ |  |d d d¡ |  |d d ddddg¡ d S )Nr\   r‘   zThis is a test topic.r’   Zsome_fellowZtopic_authoriqË¢Ú
topic_dater“   r–   r   r   r~   r—   r‡   r•   r˜   r™   Z77777777úTOPIC #somechannel
)r}   r   r/   rœ   r   r%   r@   rS   r�   rY   rr   r   )r#   r5   r>   ru   r(   r(   r)   ÚtestGetTopic‘  sB    








 ÿ
 
ÿ



 ÿ
 
ÿzIRCProtocolTests.testGetTopicc                 C   st  |   d¡}|  | j d¡¡}| d¡ |   d¡}| d¡ |j ¡  |j ¡  | d¡ |  |¡}|  |¡}|  ||¡ |  |d d d¡ |  |d d d	¡ |  |d d
 ddg¡ |j ¡  d|j	d< | d¡ |  |¡}|  |d d d¡ |  |d d
 dddg¡ |  |d d d¡ |  |d d
 ddddg¡ |j ¡  | d¡ |  |¡}|  |d d d¡ d S )Nr\   r‘   r“   r]   z,TOPIC #somechannel :This is the new topic.
r   rš   r~   ZTOPICr‡   r•   zThis is the new topic.i90  r¦   r§   r—   r™   Z12345zTOPIC #asdlkjasd
Z403)
r}   r   r%   r<   rY   rS   r�   rr   r   rœ   )r#   r5   r‘   r�   ru   rž   r(   r(   r)   ÚtestSetTopic»  s@    













 ÿ
 
ÿ


zIRCProtocolTests.testSetTopicc                 C   sÌ   |   d¡}|  | j d¡¡ | d¡ |   d¡}| d¡ |j ¡  |j ¡  | d¡ |  |¡}|  |¡}|  |¡ |  	t
|ƒd¡ |  	|d d d¡ |  	|d d d	d
¡ |  	|d d ddg¡ d S )Nr\   r‘   r“   r]   z%PRIVMSG #somechannel :Hello, world.
r~   r   r¢   r†   éÿÿÿÿr‡   r•   zHello, world.)r}   r   r%   r<   rY   rS   r�   rr   rt   r   rˆ   r¤   r(   r(   r)   ÚtestGroupMessageé  s    









z!IRCProtocolTests.testGroupMessagec                 C   s
  |   d¡}|   d¡}|j ¡  |j ¡  | d¡ |  |¡}|  |¡}|  |¡ |  t|ƒd¡ |  |d d d¡ |  |d d d¡ |  |d d dd	g¡ | d
¡ |  |¡}|  t|ƒd¡ |  |d d d¡ |  |d d d¡ |  |d d dddg¡ d S )Nr\   r]   z#PRIVMSG otheruser :Hello, monkey.
r~   r   r¢   r†   r‡   zHello, monkey.z)PRIVMSG nousernamedthis :Hello, monkey.
r   Z401ZnousernamedthiszNo such nick/channel.)r}   rS   r�   rY   rr   rt   r   rˆ   r¤   r(   r(   r)   ÚtestPrivateMessage  s*    










 ÿz#IRCProtocolTests.testPrivateMessagec                 C   sP   |   d¡}|j ¡  | d¡ |  |¡}|  t|ƒd¡ |  |d d d¡ d S )Nr\   zOPER user pass
r~   r   Z491©r}   rS   r�   rY   rr   r   rˆ   ©r#   r5   ru   r(   r(   r)   ÚtestOper   s    



zIRCProtocolTests.testOperc                 C   s|   |   d¡}|j ¡  | d¡ |  |¡}|  t|ƒd¡ |  |d d d¡ |  |d d d¡ |  |d d ddg¡ d S )	Nr\   zMODE useruser
r~   r   r   Z221r‡   ú+r­   r®   r(   r(   r)   ÚtestGetUserMode*  s    



z IRCProtocolTests.testGetUserModec                 C   sP   |   d¡}|j ¡  | d¡ |  |¡}|  t|ƒd¡ |  |d d d¡ d S )Nr\   zMODE useruser +abcd
r~   r   Ú472r­   r®   r(   r(   r)   ÚtestSetUserMode6  s    



z IRCProtocolTests.testSetUserModec                 C   sl   |   d¡}|  | j d¡¡ | d¡ |j ¡  | d¡ |  |¡}|  t	|ƒd¡ |  |d d d¡ d S )Nr\   r‘   r“   zMODE #somechannel
r~   r   Z324r£   r®   r(   r(   r)   ÚtestGetGroupMode@  s    




z!IRCProtocolTests.testGetGroupModec                 C   sl   |   d¡}|  | j d¡¡ | d¡ |j ¡  | d¡ |  |¡}|  t	|ƒd¡ |  |d d d¡ d S )Nr\   Ú	groupnameúJOIN #groupname
zMODE #groupname +abcd
r~   r   r²   r£   r®   r(   r(   r)   ÚtestSetGroupModeN  s    




z!IRCProtocolTests.testSetGroupModec              	   C   s¸  t  d¡}|  | j |¡¡ g }dD ]&}|  |¡}| |¡ |d  d¡ q$|D ]}|j 	¡  qP|d  d¡ |  
|d ¡}|  |  
|d ¡¡ |  |  
|d ¡¡ d	d
dg}|d d… D ]š\}}	}
|  |d¡ |  |	d¡ |
\}}}}}}}}|  |d	¡ |  |d¡ |  ||k¡ |  |d¡ |  |d¡ | |¡ |  |d¡ |  |d| ¡ qº|  |¡ |d \}}	}
|  |d¡ |  |	d¡ |
\}}}|  |d	¡ |  |d¡ |  |d¡ d S )Nrµ   )ra   rb   rc   rª   r¶   r   zWHO #groupname
r~   r‡   ra   rb   rc   r   Z352z
#groupnameÚHz0 Z315zEnd of /WHO list.)r   r/   r   r%   r@   r}   rn   rY   rS   r�   rr   rt   r   Ú
assertTruers   )r#   r>   Zusersrp   Úur5   r    Z	wantusersrw   ÚcoderX   ZmynameZ	theirnameZ	theirhostZtheirserverZ	theirnickr&   ÚextraZchannelr(   r(   r)   ÚtestWho\  sV    



÷


zIRCProtocolTests.testWhoc                 C   s´  |   d¡}|j ¡  |  | j d¡¡}dd„ |_d|jd< | d¡ |  	|¡}|  
t|ƒd¡ |\}}|  
|d	 d
¡ |  
|d d¡ |  
|d d	 d¡ |  
|d d d¡ |  
|d d d¡ |  
|d d d¡ |  
|d	 d
¡ |  
|d d¡ |  
|d d	 d¡ |  
|d d d¡ |j ¡  | d¡ |  	|¡}|  
t|ƒd¡ |\}}|  
|d d¡ |  
|d d d¡ |  
|d d d¡ |  
|d d d¡ |  
|d d¡ d S )Nrd   Ú	somegroupc                   S   s   t dƒS )Né   )r   r(   r(   r(   r)   rŽ   ”  r�   z+IRCProtocolTests.testList.<locals>.<lambda>zthis is the topic woor’   zLIST #somegroup
r‡   r   r   r~   Z322Z17r–   Z323zEnd of /LISTzLIST
)r}   rS   r�   r   r%   r<   Úsizerœ   rY   rr   r   rˆ   )r#   r5   r¾   r    ÚrespÚendZfg1r(   r(   r)   ÚtestList�  s:    








zIRCProtocolTests.testListc           	      C   sÈ  |   d¡}t d¡}dd„ |_d|_t ¡ d |_|  | j 	|¡¡ |j
 ¡  | d¡ |  |¡}|  t|ƒd¡ |\}}}}}|  |d	 d
¡ |  |d d¡ |  |d d	 d¡ |  |d d d¡ |  |d d d¡ |  |d d d
¡ |  |d d d¡ |  |d d d¡ |  |d	 d
¡ |  |d d¡ |  |d d	 d¡ |  |d d d¡ |  |d d d
¡ |  |d d d¡ |  |d	 d
¡ |  |d d¡ |  |d d	 d¡ |  |d d d¡ |  |d d d¡ |  |d d d¡ |  |d d d¡ |  |d	 d
¡ |  |d d¡ |  |d d	 d¡ |  |d d d¡ |  |d d d¡ |  |d	 d
¡ |  |d d¡ |  |d d	 d¡ |  |d d d¡ |  |d d d¡ d S )Nr^   Úotherguyc                   S   s   t t d¡t d¡gƒS )NZgroupAZgroupB)Úiterr   r/   r(   r(   r(   r)   rŽ   ¾  s   ÿz,IRCProtocolTests.testWhois.<locals>.<lambda>é
   é   zWHOIS otherguy
r”   r   r   r~   Z311r‡   r–   r˜   Ú*Z312zHi mom!Z317Z15Ú10zseconds idle, signon timeZ319z#groupA #groupBZ318zEnd of WHOIS list.)r}   r   r+   rH   ZsignOnÚtimeZlastMessager   r%   r9   rS   r�   rY   rr   r   rˆ   )	r#   r5   rÄ   r    ZwuserZwserverZidleZchannelsrÂ   r(   r(   r)   Ú	testWhoisº  sT    





zIRCProtocolTests.testWhois)N)N)rM   rN   rO   rj   rq   rz   r|   r}   rr   r…   rŠ   r‹   r�   rŸ   r¡   r¥   r¨   r©   r«   r¬   r¯   r±   r³   r´   r·   r½   rÃ   rË   r(   r(   r(   r)   r[   ™   sH   õ

	
7;*.

3+r[   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestMindc                 O   s   g | _ g | _g | _g | _d S rR   )ÚjoinsÚpartsÚmessagesrœ   )r#   ÚaÚkwr(   r(   r)   rW   ó  s    zTestMind.__init__c                 C   s   | j  ||f¡ d S rR   )rÍ   rn   )r#   r5   r>   r(   r(   r)   Úremote_userJoinedù  s    zTestMind.remote_userJoinedc                 C   s   | j  |||f¡ d S rR   )rÎ   rn   )r#   r5   r>   Úreasonr(   r(   r)   Úremote_userLeftü  s    zTestMind.remote_userLeftc                 C   s   | j  |||f¡ d S rR   )rÏ   rn   )r#   ZsenderZ	recipientr„   r(   r(   r)   Úremote_receiveÿ  s    zTestMind.remote_receivec                 C   s   | j  ||f¡ d S rR   )rœ   rn   )r#   r>   rœ   r(   r(   r)   Úremote_groupMetaUpdate  s    zTestMind.remote_groupMetaUpdateN)rM   rN   rO   rW   rÒ   rÔ   rÕ   rÖ   r(   r(   r(   r)   rÌ   ò  s
   rÌ   c                   @   s:   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zejd	d
„ ƒZ	dS )ÚPBProtocolTestsc                 C   sŠ   t  d¡| _t ¡ | _t | j| jg¡| _t 	| j¡| _
| j| j
_d| j
_t ¡ | _d| j_t d| j
¡| _t d| j ¡ j| j¡| _d S )Nr   Tr   rQ   )r   r   r%   r   rg   rh   r   ri   r   ZPBServerFactoryZserverFactoryÚ_protocolFactoryrT   ZunsafeTracebacksZPBClientFactoryÚclientFactoryr   Z	listenTCPÚ
serverPortZ
connectTCPZgetHostÚportÚ
clientConnr-   r(   r(   r)   rq   
  s    


 
 ÿzPBProtocolTests.setUpc                 O   s   t  d¡| _| jS )Nr   )r   ZBrokerÚ_serverProtocol)r#   ry   rÑ   r(   r(   r)   rØ     s    z PBProtocolTests._protocolFactoryc                    s8   t ƒ ‰ | j ‡ fdd„¡ tt| jjƒt| jjƒˆ gƒS )Nc                      s
   ˆ   d ¡S rR   )Úcallbackr(   ©Zd3r(   r)   rŽ     r�   z*PBProtocolTests.tearDown.<locals>.<lambda>)	r   rÝ   ZnotifyOnDisconnectr	   r
   rÚ   ÚstopListeningrÜ   Z
disconnectr-   r(   rß   r)   ÚtearDown  s    

ýÿzPBProtocolTests.tearDownc                    sX   |}t |tƒr| d¡}t ||¡‰ ˆj ||¡ ˆj |¡}| 	‡ ‡‡fdd„¡ |S )NÚasciic                    s   ˆj  ˆ ˆ¡S rR   )rÙ   Úlogin)Zign©ÚcredsrU   r#   r(   r)   rŽ   .  r�   z1PBProtocolTests._loggedInAvatar.<locals>.<lambda>)
rk   ÚstrÚencoder   ZUsernamePasswordrh   r9   r%   r2   ZaddCallback)r#   r   r{   rU   Z	nameBytesÚdr(   rä   r)   Ú_loggedInAvatar'  s    

zPBProtocolTests._loggedInAvatarc           	      c   sÂ   t ƒ }|  dd|¡V }t ƒ }|  dd|¡V }t ƒ }|  dd|¡V }| j d¡V  | j d¡V  | d¡V }| d¡V }| d¡V  | d¡V  | d¡V  | d	d
i¡V  | ¡ V  | ¡ V  d S )NÚones   p1Útwos   p2s   threes   p3Zfoobars   barfoos   texts   hello, monkeys)rÌ   ré   r%   r<   ÚjoinÚsendZleave)	r#   Zmindonerê   Zmindtworë   Z	mindThreeZthreerC   rD   r(   r(   r)   Ú
testGroups1  s     
zPBProtocolTests.testGroupsN)
rM   rN   rO   rq   rØ   rá   ré   r   ZinlineCallbacksrî   r(   r(   r(   r)   r×   	  s   
r×   )#Ú__doc__rÊ   Ztwisted.credr   r   r   Ztwisted.internetr   r   r   Ztwisted.internet.deferr   r	   r
   r   Ztwisted.spreadr   Ztwisted.testr   Ztwisted.trialr   Ztwisted.wordsr   r   Ztwisted.words.protocolsr   ZTestCaser   rP   r[   ZPBMindrÌ   ZsetUnjellyableForClassZPBMindReferencer×   r(   r(   r(   r)   Ú<module>   s&   r    ]