U
    
W[.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 dd
lmZmZ ddlmZ G dd„ dejƒZG dd„ deƒ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)ÚportalÚcredentialsÚcheckers)ÚaddressÚdeferÚreactor)ÚDeferredÚDeferredListÚmaybeDeferredÚsucceed)Úunicode)Ú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)ÚselfZkindÚrealmr   r   r   ÚflagZdupExcZ	noSuchExcÚpZnewp© r(   úA/usr/lib/python3/dist-packages/twisted/words/test/test_service.pyÚ_entityCreationTest   s"    
zRealmTests._entityCreationTestc                 C   s
   |   d¡S )NÚUser©r*   ©r$   r(   r(   r)   ÚtestUserCreation5   s    zRealmTests.testUserCreationc                 C   s
   |   d¡S )NÚGroupr,   r-   r(   r(   r)   ÚtestGroupCreation9   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)   ÚtestUserAdditionP   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)   ÚtestGroupRetrievala   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)   ÚtestGroupAdditionn   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)   ÚtestGroupUsernameCollisionw   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)   ÚtestEnumerationƒ   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   Z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Ú	firstuserZ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|f ¡ 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 %rN)Ú	_responser   ZRPL_WELCOMEZRPL_YOURHOSTZRPL_CREATEDZ
RPL_MYINFOÚremoveÚassertFalse)r$   r5   ÚresponseZexpectedÚprefixZcommandÚargsr(   r(   r)   Ú_assertGreeting´   s    
ÿz IRCProtocolTests._assertGreetingNc                 C   s4   |d kr|d }|  d|f ¡ |  d|f ¡ d S )Nrd   z	PASS %s
zNICK %s extrainfo
)rY   )r$   r5   rn   Úpasswordr(   r(   r)   Ú_loginÅ   s    zIRCProtocolTests._loginc                 C   s2   |   | j |¡¡}t|| j| jƒ}|  ||¡ |S rR   )r   r%   r4   rP   rV   rx   )r$   r   r5   Zaggr(   r(   r)   Ú_loggedInUserÌ   s    zIRCProtocolTests._loggedInUserc                 C   sp   |j  ¡ }ttkr&t|tƒr&| d¡}| ¡ }|j  ¡  g }tt	j
|ƒD ]"}|dks`|d |krH| |¡ qH|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.
        rc   Né   )rS   Úvaluerj   Ústrri   rk   Ú
splitlinesÚclearÚmapr   Zparsemsgrl   )r$   r5   ZmessageTypers   ÚresultÚmessager(   r(   r)   rp   Ó   s    


zIRCProtocolTests._responsec                 C   s   |   d¡}|  |¡ d S )Nr^   )ry   rv   )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
ÚPRIVMSGrz   r   é   z	Password?z%PRIVMSG nickserv firstuser_password
N)r   r%   r4   rP   rV   rY   rp   r   Úlenr   ZNICKSERVrS   r~   rv   ©r$   r^   r5   rs   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ƒ   rz   r   r„   zLogin failed.  Goodbye.)	r   r%   r4   rP   rV   rx   rp   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)rl   r(   ©Úlogoutr(   r)   Ú<lambda>  ó    z-IRCProtocolTests.testLogout.<locals>.<lambda>zQUIT
T)
r   r%   r4   rP   rV   rx   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@realmnamerz   ZJOINr„   ú#somechannelZ353Z366é   Ú332é   Ú333r\   úotheruser!otheruser@realmnamer   ú=zfirstuser otheruserzotheruser firstuser)r   r%   r4   r<   ÚmetarP   rV   rx   rS   r~   rY   rp   r   r…   ry   ZassertIn)r$   r^   rŽ   r5   rs   Ú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 )rz   r(   )rE   Úrr(   r(   r)   rG   Z  s     z7IRCProtocolTests.test_joinTopicless.<locals>.<listcomp>r”   r–   N)r   r%   r4   r<   rP   rV   rx   rS   r~   rY   rp   ZassertNotIn)r$   r^   r5   rs   ZresponseCodesr(   r(   r)   Útest_joinTopiclessJ  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
rz   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©
ry   r   r%   r<   rY   rS   r~   rp   r   r…   ©r$   r5   rš   rs   r›   r(   r(   r)   Ú	testLeave_  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   rz   r”   r„   r’   r•   r–   Z77777777úTOPIC #somechannel
)ry   r   r/   r™   r   r%   r@   rS   r~   rY   rp   r   )r$   r5   r>   rs   r(   r(   r)   ÚtestGetTopic›  s*    










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—   rz   ZTOPICr„   r’   zThis is the new topic.i90  r£   r¤   r”   r–   Z12345zTOPIC #asdlkjasd
Z403)
ry   r   r%   r<   rY   rS   r~   rp   r   r™   )r$   r5   rŽ   rš   rs   r›   r(   r(   r)   ÚtestSetTopic¾  s8    

ÿ














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.
rz   r   rŸ   rƒ   éÿÿÿÿr„   r’   zHello, world.)ry   r   r%   r<   rY   rS   r~   rp   rr   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.
rz   r   rŸ   rƒ   r„   zHello, monkey.z)PRIVMSG nousernamedthis :Hello, monkey.
r   Z401ZnousernamedthiszNo such nick/channel.)ry   rS   r~   rY   rp   rr   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
rz   r   Z491©ry   rS   r~   rY   rp   r   r…   ©r$   r5   rs   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
rz   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
rz   r   Ú472rª   r«   r(   r(   r)   ÚtestSetUserMode9  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
rz   r   Z324r    r«   r(   r(   r)   ÚtestGetGroupModeD  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
rz   r   r¯   r    r«   r(   r(   r)   ÚtestSetGroupModeS  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²   )r_   r`   ra   r§   r³   r   zWHO #groupname
rz   r„   r_   r`   ra   r   Z352z
#groupnameÚHz0 Z315zEnd of /WHO list.)r   r/   r   r%   r@   ry   rl   rY   rS   r~   rp   rr   r   Z
assertTruerq   )r$   r>   Zusersrn   Úur5   r   Z	wantusersrt   ÚcoderX   ZmynameZ	theirnameZ	theirhostZtheirserverZ	theirnickr&   ZextraZchannelr(   r(   r)   ÚtestWhob  sD    






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 )Nrb   Ú	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   rz   Z322Z17r“   Z323zEnd of /LISTzLIST
)ry   rS   r~   r   r%   r<   Úsizer™   rY   rp   r   r…   )r$   r5   r¹   r   Z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   rz   Z311r„   r“   r•   Ú*Z312zHi mom!Z317Z15Z10zseconds idle, signon timeZ319z#groupA #groupBZ318zEnd of WHOIS list.)ry   r   r+   rH   ZsignOnÚtimeZlastMessager   r%   r9   rS   r~   rY   rp   r   r…   )	r$   r5   r¾   r   ZwuserZwserverZidleZchannelsr¼   r(   r(   r)   Ú	testWhois¹  sT    





zIRCProtocolTests.testWhois)N)N)rM   rN   rO   rh   ro   rv   rx   ry   rp   r‚   r‡   rˆ   r   rœ   rž   r¢   r¥   r¦   r¨   r©   r¬   r®   r°   r±   r´   r¸   r½   rÄ   r(   r(   r(   r)   rZ   Ÿ   sH            þ


7<#,+,rZ   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Æ   rl   )r$   r5   r>   r(   r(   r)   Úremote_userJoinedø  s    zTestMind.remote_userJoinedc                 C   s   | j  |||f¡ d S rR   )rÇ   rl   )r$   r5   r>   Úreasonr(   r(   r)   Úremote_userLeftü  s    zTestMind.remote_userLeftc                 C   s   | j  |||f¡ d S rR   )rÈ   rl   )r$   ZsenderZ	recipientr   r(   r(   r)   Úremote_receive   s    zTestMind.remote_receivec                 C   s   | j  ||f¡ d S rR   )r™   rl   )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   re   rf   r   rg   r   ZPBServerFactoryZserverFactoryÚ_protocolFactoryrT   ZunsafeTracebacksZPBClientFactoryÚclientFactoryr   Z	listenTCPÚ
serverPortZ
connectTCPZgetHostZportÚ
clientConnr-   r(   r(   r)   ro   
  s"    
 ÿ


ýzPBProtocolTests.setUpc                 O   s   t  d¡| _| jS )Nr   )r   ZBrokerÚ_serverProtocol)r$   ru   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Ó   Z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Ò   Zlogin)Zign©ZcredsrU   r$   r(   r)   r‹   /  rŒ   z1PBProtocolTests._loggedInAvatar.<locals>.<lambda>)
ri   r   Úencoder   ZUsernamePasswordrf   r9   r%   r2   ZaddCallback)r$   r   rw   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)   Ú
testGroups3  s     
zPBProtocolTests.testGroupsN)
rM   rN   rO   ro   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.python.compatr   Ztwisted.spreadr   Ztwisted.testr   Ztwisted.trialr   Ztwisted.wordsr   r   Ztwisted.words.protocolsr   ZTestCaser   ÚobjectrP   rZ   ZPBMindrÅ   ZsetUnjellyableForClassZPBMindReferencerÐ   r(   r(   r(   r)   Ú<module>   s(   }    V