ϪfodZddlZddlmZmZmZddlmZmZm Z ddl m Z m Z m Z mZddlmZddlmZddlmZdd lmZmZdd lmZGd d ej4ZGd dZGddej4ZGddej<Zej@eejBGddej4Z"y)z% Tests for L{twisted.words.service}. N)checkers credentialsportal)addressdeferreactor)Deferred DeferredList maybeDeferredsucceed)pb) proto_helpers)unittest)ewordsservice)irccBeZdZdZdZdZdZdZdZdZ dZ d Z y ) RealmTestsctjd}d|jz}t|d|j z}t|d|j z}d|j zdz}tt d|j z}tt d|j z}|j ||} |j|| j|j||j|t||d|j |d |jz} |jd |jz| j|j |d |jz} |j| | t||d |j|d |jzj|y) N realmnametestcreateget OnRequest DuplicateNoSuchTnewFanother) rInMemoryWordsRealmlowergetattrtitlersuccessResultOf assertEqualnamefailureResultOftrapsetattrassertIdentical) selfkindrealmr%rrflagdupExc noSuchExcpnewps A/usr/lib/python3/dist-packages/twisted/words/test/test_service.py_entityCreationTestzRealmTests._entityCreationTests**;7 $4::< 78eUTZZ\12$**,&4tzz|!;<FHtzz|$;<    . qvv& VD\*//7 tT"  UTZZ\%9!: ; -qvv6##C (<$=> Q% tU# STZZ\!9:;@@Kc$|jdS)NUserr3r*s r2testUserCreationzRealmTests.testUserCreation4s''//r4c$|jdS)NGroupr7r8s r2testGroupCreationzRealmTests.testGroupCreation7s''00r4ctjd}|j|jd}|j|j d}|j |||j|j d}|j |||j|j djtjy)Nrtestuser nosuchuser) rrr# createUsergetUserr) lookupUserr&r'r NoSuchUser)r*r,user retrievedlookedUps r2testUserRetrievalzRealmTests.testUserRetrieval:s**;7##E$4$4Z$@A((z)BC  T9-''(8(8(DE Y1   e..|< = B B6CTCT Ur4ctjd}tjd}|j|j |}|j |||j|j d}|j |||j|jd}|j ||y)Nrr>)rrr6r#addUserr)rArB)r*r,r0rDrErFs r2testUserAdditionzRealmTests.testUserAdditionKs**;7 LL $##EMM!$45 Q%((z)BC  T9-''(8(8(DE Y1r4cLtjd}|j|jd}|j|j d}|j |||j |j djtjy)Nr testgroup nosuchgroup) rrr# createGroupgetGroupr)r&r'r NoSuchGroup)r*r,grouprEs r2testGroupRetrievalzRealmTests.testGroupRetrieval[s~**;7$$U%6%6{%CD(( )DE  UI.  enn]; < A A&BTBT Ur4ctjd}tjd}|j|j ||j|j d}|j ||y)NrrL testGroup)rrr;r#addGrouprOr))r*r,r0rQs r2testGroupAdditionzRealmTests.testGroupAdditionfs`**;7 MM+ & U^^A./$$U^^K%@A Q&r4ctjd}|j|jd|j|j dy)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. rrN)rrr#r@rN)r*r,s r2testGroupUsernameCollisionz%RealmTests.testGroupUsernameCollisionnsF **;7 U--f56 U..v67r4cptjd}|j|jd|j|jd|j|j }|Dcgc]}|j }}|j |j|ddgycc}w)Nrgrouponegrouptwo)rrr#rN itergroupsr%sortr$)r*r,groupsgns r2testEnumerationzRealmTests.testEnumerationys**;7 U..z:; U..z:;%%e&6&6&89# $QVV $ $  Z45 %s9B3N) __name__ __module__ __qualname__r3r9r<rGrJrRrVrXrar4r2rrs2L>01W"2 W' 8 6r4rc@eZdZejdddfdZdZy)TestCaseUserAggTCP 127.0.0.1i1c&||_tj|_|j ||_|j |j_|j |j_|j j|jyN)rDr StringTransportWithDisconnection transport buildProtocolprotocolmindmakeConnection)r*rDr,factoryrs r2__init__zTestCaseUserAgg.__init__sb &GGI--g6 "&--  $$T^^4r4c:|jj|yrk)ro dataReceived)r*stuffs r2writezTestCaseUserAgg.writes ""5)r4N)rbrcrdr IPv4Addressrsrwrer4r2rgrgs" $##E;> 5*r4rgceZdZgdZdZdZddZdZddZdZ d Z d Z d Z d Z d ZdZdZdZdZdZdZdZdZdZdZdZdZdZy)IRCProtocolTests) useruser otherusersomeguy firstuserusernameuseroneusertwo userthreeuserfoursuserfivesomeuserc6tjd|_tj|_t j|j|j g|_tj|j|j |_ g}|jD]l}t|tr|jd}|j|jj||j j!||dznt#|S)Nrutf-8 _password)rrr,r'InMemoryUsernamePasswordDatabaseDontUsecheckerrPortal IRCFactoryrr STATIC_USERS isinstancebytesdecodeappendr@rIr )r*cnicks r2setUpzIRCProtocolTests.setUps// < GGI mmDJJ? ))$**dkkB %% ;D$&{{7+ HHTZZ**40 1 LL tk'9 :  ; Ar4c|j|}tjtjtjtj g}|D]\}}}||vs |j ||j|d|y)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. zMissing responses for N) _responser RPL_WELCOME RPL_YOURHOST RPL_CREATED RPL_MYINFOremove assertFalse)r*rDresponseexpectedprefixcommandargss r2_assertGreetingz IRCProtocolTests._assertGreetingsv>>$'OOS%5%5sW%- ) !FGT("( ) %;H<#HIr4Ncf||dz}|jd|d|jd|dy)NrzPASS z zNICK z extrainfo )rw)r*rDrpasswords r2_loginzIRCProtocolTests._logins<  k)H U8*D)* U4&/0r4c|j|jj|}t||j|j}|j |||Srk)r#r,rBrgrrr)r*r%rDaggs r2 _loggedInUserzIRCProtocolTests._loggedInUsersJ##DJJ$9$9$$?@dDJJ = C r4cd|jj}ttk7r!t |tr|j d}|j }|jjg}ttj|D]}| |d|k(s|j| |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. r) rmvaluerstrrr splitlinesclearmaprparsemsgr)r*rD messageTyperresultmessages r2rzIRCProtocolTests._responses >>'') C|j|jjd}t||j|j}|j d|j |d}|jt|d|j|ddtj|j|ddd|j|ddddg|jj|j d|j|y ) 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~zNICK firstuser extrainfo PRIVMSGrrz Password?z%PRIVMSG nickserv firstuser_password N)r#r,rBrgrrrwrr$lenrNICKSERVrmrrr*r~rDrs r2test_nickServLoginz#IRCProtocolTests.test_nickServLogins (()>)>{)KL y$**dllC 12>>$ 2 X* !Q)9)9: !Q3 !Q+{)CD  <= T"r4cN|j|jjd}t||j|j}|j |dd|j |d}|jt|d|j|ddddgy)Nr~ wrongpassrrrrzLogin failed. Goodbye.) r#r,rBrgrrrrr$rrs r2testFailedLoginz IRCProtocolTests.testFailedLogins(()>)>{)KL y$**dllC D+{3>>$ 2 X* !Q+7P)QRr4c4g|j|jjd}t||j|j}|j |dfd|j _|jd|jdgy)Nr~c&jdS)NT)r)logoutsr2z-IRCProtocolTests.testLogout..sv}}T':r4zQUIT T) r#r,rBrgrrrrorrwr$)r*r~rDrs @r2 testLogoutzIRCProtocolTests.testLogoutsu(()>)>{)KL y$**dllC D+&:  : $(r4c|j|jjd}|j|jjd}d|jd<t ||j|j }|j|d|jj|jd|j|}|jt|d|j|ddd|j|dd d |j|dd d g|j|d d d |j|d d d|j|dd d|j|dd d|jd}|jj|jj|jd|j|}|j|}|jt|d |j|ddd|j|dd d |j|dd d g|j|d dd|j|d d d |j|d d gdgdgy)Nr~ somechannelzsome random topictopicJOIN #somechannel rzfirstuser!firstuser@realmnamerJOINr #somechannel353366332333r|otheruser!otheruser@realmnamer)r|=rzfirstuser otheruser)r|rrzotheruser firstuser)r#r,rBrNmetargrrrrmrrwrr$rrassertIn)r*r~rrDrotherevents r2testJoinzIRCProtocolTests.testJoin sv(()>)>{)KL **4::+A+A-+PQ $7 !y$**dllC D+&  *+>>$' X* !Q)HI !Q0 !Q.)9: !Q/ !Q/ !Q/ !Q/"";/   +,>>%(t$ UQ' q!&EF q!f- q!~&67 !Q5 !Q/ QKNII  r4c|j|jjd}|j|jjdt ||j|j }|j |d|jj|jd|j|}|Dcgc]}|d }}|jd||jd|ycc}w)zo When a user joins a group without a topic, no topic information is sent to that user. r~rrrrrN) r#r,rBrNrgrrrrmrrwr assertNotIn)r*r~rDrr responseCodess r2test_joinTopiclessz#IRCProtocolTests.test_joinTopiclessCs (()>)>{)KL  TZZ33MBCy$**dllC D+&  *+>>$''/0!10 0  .  .1s C;c|jd}|j|jjd|j d|j j |jd}|j d|j j |j j |j d|j|}|j|}|jt|d|j|ddd|j|ddd |j|dd d d g|j|||j d|j j |j j |j d |j|}|j|}|jt|d|j|ddd|j|ddd |j|dd d dg|j|||j d|j j |j j |j d|j|}|j|}|jt|d|j|ddd|j|ddd |j|dd d dg|j||y)Nr{rrr|zPART #somechannel rruseruser!useruser@realmnamePARTrrleavingz(PART #somechannel :goodbye stupidheads zgoodbye stupidheadssJOIN #somechannel s)PART #somechannel :goodbye stupidheads1 zgoodbye stupidheads1 rr#r,rNrwrmrrr$rr*rDrrrs r2 testLeavezIRCProtocolTests.testLeaveWs!!*- TZZ33MBC *+ "";/ +,   *+>>$'u% X* !Q)FG !Q0 !Q.))DE 5) *+   ?@>>$'u% X* !Q)FG !Q0 !Q.:O)PQ 5) +,   AB>>$'u% X* !Q)FG !Q0 !Q.:P)QR 5)r4c|jd}tjd}d|jd<d|jd<d|jd<|j |j j ||jj|jd |j|}|j|d d d |j|d d d|j|d dgd|j|dd d|j|ddgd|jj|jd|j|}|j|d d d|j|d dgd|j|d d d|j|d dgdy)Nr{rThis is a test topic.r some_fellow topic_authoriqˢ topic_daterrrrrrr)r{rrrr)r{rr77777777TOPIC #somechannel ) rrr;rr#r,rUrmrrwrr$)r*rDrQrs r2 testGetTopiczIRCProtocolTests.testGetTopics!!*- m,5 7%2 >"#+ <  TZZ0078  *+>>$' !Q5 !Q/  QKNQ  !Q/  QKNS   +,>>$' !Q/  QKNQ  !Q/  QKNS r4cl|jd}|j|jjd}|j d|jd}|j d|j j |j j |j d|j|}|j|}|j|||j|ddd|j|ddd |j|dd d d g|j j d |jd<|j d|j|}|j|ddd|j|dd gd|j|ddd|j|dd gd|j j |j d|j|}|j|dddy)Nr{rrr|z,TOPIC #somechannel :This is the new topic. rrrTOPICrrThis is the new topic.i90rrr)r|rrr)r|rr|12345zTOPIC #asdlkjasd 403) rr#r,rNrwrmrrr$r)r*rDrrrrs r2 testSetTopiczIRCProtocolTests.testSetTopics!!*-**4::+A+A-+PQ  *+"";/ +,   DE>>%(t$ 5) !Q)HI !Q1 !Q.:R)ST ). & ,->>%( !Q/  QKNS  !Q/  QKNO   *+>>%( !Q/r4c|jd}|j|jjd|j d|jd}|j d|j j |j j |j d|j|}|j|}|j||jt|d|j|ddd|j|ddd d |j|dd d d gy)Nr{rrr|z%PRIVMSG #somechannel :Hello, world. rrrrrrz Hello, world.) rr#r,rNrwrmrrrr$rrs r2testGroupMessagez!IRCProtocolTests.testGroupMessages!!*- TZZ33MBC *+"";/ +,   <=>>$'u% " UQ' q!&CD q!i4 q!~&GHr4c|jd}|jd}|jj|jj|jd|j |}|j |}|j ||j t|d|j |ddd|j |ddd|j |dddd g|jd |j |}|j t|d|j |ddd |j |ddd |j |ddgd y)Nr{r|z#PRIVMSG otheruser :Hello, monkey. rrrrrzHello, monkey.z)PRIVMSG nousernamedthis :Hello, monkey. r401)r{nousernamedthiszNo such nick/channel.)rrmrrwrrr$rrs r2testPrivateMessagez#IRCProtocolTests.testPrivateMessagesW!!*-"";/   :;>>$'u% " UQ' q!&CD q!i0 q!{4D&EF @A>>$' X* !Q5 !Q/  QKNT r4c|jd}|jj|jd|j |}|j t |d|j |dddy)Nr{zOPER user pass rr491rrmrrwrr$rr*rDrs r2testOperzIRCProtocolTests.testOper!si!!*-  '(>>$' X* !Q/r4ch|jd}|jj|jd|j |}|j t |d|j |ddd|j |ddd|j |ddddgy) Nr{zMODE useruser rrr221r+rrs r2testGetUserModez IRCProtocolTests.testGetUserMode+s!!*-  &'>>$' X* !Q5 !Q/ !Q*c):;r4c|jd}|jj|jd|j |}|j t |d|j |dddy)Nr{zMODE useruser +abcd rr472rrs r2testSetUserModez IRCProtocolTests.testSetUserMode7si!!*-  ,->>$' X* !Q/r4cz|jd}|j|jjd|j d|j j |j d|j|}|jt|d|j|dddy)Nr{rrzMODE #somechannel rr324rrs r2testGetGroupModez!IRCProtocolTests.testGetGroupModeAs!!*- TZZ33MBC *+  *+>>$' X* !Q/r4cz|jd}|j|jjd|j d|j j |j d|j|}|jt|d|j|dddy)Nr{ groupnameJOIN #groupname zMODE #groupname +abcd rrrrrs r2testSetGroupModez!IRCProtocolTests.testSetGroupModeOs!!*- TZZ33K@A ()  ./>>$' X* !Q/r4c tjd}|j|jj |g}dD]8}|j |}|j ||djd:|D]}|jj|djd|j|d}|j|j|d|j|j|dgd}|ddD]\}} } |j|d |j| d | \} }} } }}}}|j| d |j|d |j| |v|j| d |j|d |j||j|d |j|d|z|j||d\}} } |j|d |j| d| \} }}|j| d |j|d |j|dy)Nr )rrrrr rzWHO #groupname rrr352rz #groupnameHz0 315zEnd of /WHO list.)rr;r#r,rUrrrwrmrrrr$ assertTruer)r*rQusersrurDr wantusersrcodervmyname theirname theirhost theirserver theirnickr-extrachannels r2testWhozIRCProtocolTests.testWho]sM k* TZZ00785 3D""4(A LLO "IOO1 2 3 #D NN " # a+, NN58 $ a12 a127 #$Sb6 6 FD%   V[ 1   T5 )    VY /   UL 1 OOI2 3   Y 4   [+ 6   Y '   T3 '   UD9$4 5+ 6, #ee - u%!& + ,/  34r4c|jd}|jj|j|jj d}d|_d|jd<|jd|j|}|jt|d|\}}|j|dd |j|d d |j|ddd|j|dd d|j|ddd |j|dd d|j|dd |j|d d|j|ddd|j|dd d|jj|jd|j|}|jt|d|\}}|j|d d |j|dd d|j|ddd |j|dd d|j|d dy)Nr somegroupctdS)N)r rer4r2rz+IRCProtocolTests.testList..s r4zthis is the topic woorzLIST #somegroup rrrr32217r323z End of /LISTzLIST ) rrmrr#r,rNsizerrwrr$r)r*rDrrrespendfg1s r2testListzIRCProtocolTests.testLists+!!*- (()?)? )LM , "9 w () NN4  Q# c a+. a%( aZ0 a[1 aT* a%<= Q- Q' QJ/ QN3  : NN4  Q#S Q' QK0 QD) Q$;< Q'r4cL|jd}tjd}d|_d|_t j dz |_|j|jj||jj|jd|j|}|jt|d|\}}}}}|j|dd |j|d d |j|d dd|j|d d d|j|d d d|j|d d d |j|d dd|j|d dd|j|dd |j|d d|j|d dd|j|d d d|j|d d d |j|d d d|j|dd |j|d d|j|d dd|j|d d d|j|d d d|j|d d d|j|d dd|j|dd |j|d d|j|d dd|j|d d d|j|d d d|j|dd |j|d d|j|d dd|j|d d d|j|d d dy)Nr}otherguychttjdtjdgS)NgroupAgroupB)iterrr;rer4r2rz,IRCProtocolTests.testWhois..s%d ]]8 $gmmH&= >' r4 zWHOIS otherguy rrrr311rrr*312zHi mom!3171510zseconds idle, signon time319z#groupA #groupB318zEnd of WHOIS list.)rrr6r\signOntime lastMessager#r,rIrmrrwrr$r) r*rDr*rwuserwserveridlechannelsr&s r2 testWhoiszIRCProtocolTests.testWhoissu!!),<< + #yy{R/ TZZ//9:  '( NN4  Q#./+wh q;/ q5) q!i0 q!j1 q!j1 q!k2 q!c* q!j1 [1 U+ A 2 A 3 A 4 A 2 a+. a%( aY/ aZ0 aT* aT* a%@A !k2 !e, !Q3 !Q4 !Q):; Q- Q' QI. QJ/ Q$89r4rk)rbrcrdrrrrrrrrrrrrrrrrrrrrrr rr(r@rer4r2rzrzs L  J1   ##(S)5 n/(9*v( T,0\I2 <0 <0 0 015f)(V5:r4rzc*eZdZdZdZdZdZdZy)TestMindc<g|_g|_g|_g|_yrk)joinspartsmessagesr)r*akws r2rszTestMind.__init__s    r4c>|jj||fyrk)rDr)r*rDrQs r2remote_userJoinedzTestMind.remote_userJoineds 4-(r4c@|jj|||fyrk)rEr)r*rDrQreasons r2remote_userLeftzTestMind.remote_userLefts 4/0r4c@|jj|||fyrk)rFr)r*sender recipientrs r2remote_receivezTestMind.remote_receives fi9:r4c>|jj||fyrk)rr)r*rQrs r2remote_groupMetaUpdatezTestMind.remote_groupMetaUpdates %'r4N)rbrcrdrsrJrMrQrSrer4r2rBrBs )1;(r4rBcHeZdZdZdZdZdZejdZ y)PBProtocolTestsctjd|_tj|_t j|j|j g|_tj|j |_ |j|j_ d|j_ tj|_d|j_ t!j"d|j|_t!j&d|j$j)j*|j|_y)NrTrri)rrr,rrrrrr PBServerFactory serverFactory_protocolFactoryrounsafeTracebacksPBClientFactory clientFactoryr listenTCP serverPort connectTCPgetHostport clientConnr8s r2rzPBProtocolTests.setUp s// < GGI mmDJJ? // <&*&;&;#.2+//1.2+!++At/A/AB!,, 002779K9K r4cNtjd|_|jS)Nr)r Broker_serverProtocol)r*rrHs r2rYz PBProtocolTests._protocolFactorys!yy|###r4ct|jjfdtt |j j t |jjgS)Nc&jdSrk)callback)d3sr2rz*PBProtocolTests.tearDown..s D8Ir4) r renotifyOnDisconnectr r r^ stopListeningrb disconnect)r*ris @r2tearDownzPBProtocolTests.tearDownsX Z //0IJdoo;;<doo889   r4c|}t|tr|jd}tj||j j ||jj|}|jfd|S)Nasciic<jjSrk)r\login)igncredsrpr*s r2rz1PBProtocolTests._loggedInAvatar../s$"4"4":":5$"Gr4) rrencoderUsernamePasswordrrIr,r@ addCallback)r*r%rrp nameBytesdrss` ` @r2_loggedInAvatarzPBProtocolTests._loggedInAvatar(sl dC  G,I,,YA Y1 JJ ! !$ ' GHr4c#jKt}|jdd|}t}|jdd|}t}|jdd|}|jjd|jjd|j d}|j d}|j d|j d|j d|j d d i|j |j yw) Nonesp1twosp2sthreesp3foobarsbarfoostextshello, monkeys)rBryr,rNjoinsendleave) r*mindoner{mindtwor| mindThreethreerZr[s r2 testGroupszPBProtocolTests.testGroups2s*((w??*((w??J **8UIFFjj$$X..jj$$Y//(++),,hhx  hhy!!jj""mmW&7899nnnnsD1D3N) rbrcrdrrYrmryrinlineCallbacksrrer4r2rUrU s0  $   r4rU)#__doc__r: twisted.credrrrtwisted.internetrrrtwisted.internet.deferr r r r twisted.spreadr twisted.testr twisted.trialr twisted.wordsrrtwisted.words.protocolsrTestCaserrgrzPBMindrBsetUnjellyableForClassPBMindReferencerUrer4r2rs 6644QQ&")'o6""o6d**&W :x((W :t(w~~(((G$;$;<@h''@r4