a 5êdg‰ùã@sºddlZddlZddlZddlZddlZddlZddlZddlZddlZ ddl Z ddl Z ddl m Z ddlmZddlmZmZddlmZz ddlZWney®dZYn0e j e j e¡d¡ZedurÖejZnGdd„deƒZGd d „d ƒZe ¡efZ edure ej!f7Z Gd d „d eej"ƒZ#e $ed ¡Gdd„de#ƒƒZ%Gdd„dej&ƒZ'dd„Z(Gdd„dejƒZ)Gdd„dƒZ*Gdd„de*ƒZ+Gdd„dƒZ,Gdd„de,ƒZ-Gdd„de-ƒZ.Gd d!„d!e-ƒZ/Gd"d#„d#ƒZ0Gd$d%„d%e0e*ej"ƒZ1Gd&d'„d'e0e*ej"ƒZ2Gd(d)„d)e*ej"ƒZ3Gd*d+„d+e+ej"ƒZ4Gd,d-„d-ej"ƒZ5Gd.d/„d/ej"ƒZ6Gd0d1„d1ej"ƒZ7Gd2d3„d3ƒZ8e $ed ¡Gd4d5„d5e7ƒƒZ9Gd6d7„d7ej"ƒZ:e;d8kr¶e <¡dS)9éN)Úsupport)Ú socket_helper)ÚNNTPÚ GroupInfo)Úpatchz keycert3.pemc@seZdZdZdS)ÚSSLErrorzThis will never be raised.N)Ú__name__Ú __module__Ú __qualname__Úreason©r r ú-/usr/local/lib/python3.9/test/test_nntplib.pyrsrc@sÚeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Ze dd¡dd„ƒZdd„Zd1d d!„Ze dd"¡d#d$„ƒZd%d&„Zd'd(„Zd)d*„Zed+d,„ƒZd-d.„Zd/d0„ZdS)2ÚNetworkedNNTPTestsMixincCs|j ¡}| tt|ƒ¡dS©N)ÚserverZ getwelcomeÚ assertEqualÚstrÚtype)ÚselfÚwelcomer r r Ú test_welcome(s z$NetworkedNNTPTestsMixin.test_welcomecCs>|j ¡\}}| | d¡|¡|D]}| tt|ƒ¡q$dS)Nz100 )rÚhelpÚ assertTrueÚ startswithrrr)rÚrespÚlinesÚliner r r Ú test_help,sz!NetworkedNNTPTestsMixin.test_helpcCsH|j ¡\}}t|ƒdkrD| tt|dƒ¡| tt|djƒ¡dS©Nr)rÚlistÚlenrrrrÚgroup©rrÚgroupsr r r Ú test_list2s z!NetworkedNNTPTestsMixin.test_listcCsL|j |j¡\}}t|ƒdkrH| tt|dƒ¡| tt|djƒ¡dSr) rrÚ GROUP_PATr rrrrr!r"r r r Útest_list_active8s z(NetworkedNNTPTestsMixin.test_list_activecCsV| tj¡}|j d¡Wdƒn1s.0Y|jj}| | d¡|¡dS)NZXYZZYz500 ) Ú assertRaisesÚnntplibÚNNTPPermanentErrorrZ _shortcmdÚ exceptionÚresponserr)rÚcmrr r r Útest_unknown_command>s*z,NetworkedNNTPTestsMixin.test_unknown_commandcCsXtj ¡tjdd}|j |¡\}}t|ƒdkrT| |dt¡| |dj t ¡dS)Né)Zdaysr) ÚdatetimeÚdateZtodayZ timedeltarZ newgroupsr ÚassertIsInstancerr!r)rÚdtrr#r r r Útest_newgroupsDs  z&NetworkedNNTPTestsMixin.test_newgroupscsb‡fdd„}ˆj ˆj¡}||ƒˆ ˆj|¡ˆj ˆj¡}||ƒˆj d¡}ˆ |d¡dS)Ncsˆ |t¡ˆ ˆj|¡dSr)r1rÚ assertNotInÚ GROUP_NAME)Údesc©rr r Ú _check_descNs z=NetworkedNNTPTestsMixin.test_description.._check_descz zk.brrtt.bazÚ)rÚ descriptionr5ÚassertInÚDESCr%r)rr8r6r r7r Útest_descriptionMs  z(NetworkedNNTPTestsMixin.test_descriptioncCs^|j |j¡\}}| | d¡p(| d¡|¡| |t¡||j}| ||j  |j¡¡dS)Nz215 z282 ) rÚ descriptionsr%rrr1Údictr5rr:)rrZdescsr6r r r Útest_descriptions]sÿ  z)NetworkedNNTPTestsMixin.test_descriptionscCs€|j |j¡}| dt|ƒ¡|\}}}}}| ||j¡| |t¡| |t¡| |t¡| ||¡| |  d¡|¡dS)Néú211 ) rr!r5rr r1ÚintÚassertLessEqualrr)rÚresultrÚcountÚfirstÚlastr!r r r Ú test_groupfs    z"NetworkedNNTPTestsMixin.test_groupcCs<|j ¡\}}| |tj¡| |jd¡| |jd¡dS)NiËiî)rr0r1r/ÚassertGreaterEqualZyearrD©rrr0r r r Ú test_dateqsz!NetworkedNNTPTestsMixin.test_datecCsF| |t¡| | ¡hd£¡| ¡D]}| |ttdƒf¡q(dS)N>Úfromú:bytesr0Ú referencesú:linesÚsubjectú message-id)r1r?rJÚkeysÚvaluesrr)rÚart_dictÚvr r r Ú_check_art_dictxs   ÿ z'NetworkedNNTPTestsMixin._check_art_dictc Csz|j |j¡\}}}}}|j |d|¡\}}t|ƒdkrD| d¡|d\}}| ||d¡| ||¡| |¡dS)NrArzno articles retrieved) rr!r5Úxoverr ÚskipTestrJrDrW) rrrFrGrHÚnamerÚart_numrUr r r Ú test_xoverƒs    z"NetworkedNNTPTestsMixin.test_xoverTzHtemporarily skipped until a permanent solution is found for issue #28971c Cs|j |j¡\}}}}}|d}|j |df¡\}}|d\}} | | ¡|j ||f¡\}}|d\}} | ||¡| ||¡| | ¡dS)Né réÿÿÿÿ)rr!r5ÚoverrWrJrD) rrrFrGrHrZÚstartrr[rUr r r Ú test_overŽs     z!NetworkedNNTPTestsMixin.test_overcCsL|j |j¡\}}}}}|j d|¡\}}|D]}| tt|dƒ¡q.dS)NrQé)rr!r5Zxhdrrrr)rrrFrGrHrZrrr r r Ú test_xhdr¡sz!NetworkedNNTPTestsMixin.test_xhdrNcCsR| |tj¡|dur$| |j|¡|jD]}| |t¡q*| |jdd¡dS)Nr^)ó.s. ó. )r1r(Z ArticleInforZnumberrÚbytesr4)rrÚarticler[rr r r Úcheck_article_resp§s  z*NetworkedNNTPTestsMixin.check_article_respzFIXME: see bpo-32128c s\|j |j¡\}}}}}|||dfD]^}z|j |¡\}}Wn@tjy~}z&|j d¡s^‚WYd}~q&WYd}~n d}~00qq&| d¡|  | d¡|¡|  |||¡|j  |¡\}} |  | d¡|¡|  || |¡|j  |¡\}} |  | d¡|¡|  || |¡dd„‰‡fd d „|j Dƒ} ‡fd d „| j Dƒ} | | | d g| j ¡dS) Nrbz423 z(could not find a suitable article numberz221 z222 z220 cSs | d¡S)Ns X-Antivirus)r)rr r r ÚÈóz@NetworkedNNTPTestsMixin.test_article_head_body..csg|]}ˆ|ƒs|‘qSr r ©Ú.0r©Z blacklistr r Ú ÉsÿzBNetworkedNNTPTestsMixin.test_article_head_body..csg|]}ˆ|ƒs|‘qSr r rkrmr r rnËsÿrj)rr!r5Úheadr(ÚNNTPTemporaryErrorr+rrYrrhÚbodyrgrr) rrrFrGrHrZr[roÚerqrgZfiltered_head_linesZfiltered_linesr rmr Útest_article_head_body°s, " z.NetworkedNNTPTestsMixin.test_article_head_bodycsD‡fdd„}ˆ ˆjjd¡|ˆj ¡ƒˆj ¡\}}||ƒdS)Ncs(|d}ˆ |ttf¡ˆ d|¡dS)NÚLISTú OVERVIEW.FMT)r1rÚtupler;)ÚcapsZ caps_listr7r r Ú _check_capsÓsz>NetworkedNNTPTestsMixin.test_capabilities.._check_capsé)rJrÚ nntp_versionÚgetcapabilitiesZ capabilities)rrxrrwr r7r Útest_capabilitiesÏs  z)NetworkedNNTPTestsMixin.test_capabilitiescCs&d}d}|jtj|jj||dddS)NZ notarealuserZnotarealpasswordF)ÚuserÚpasswordÚusenetrc)r'r(Ú NNTPErrorrÚlogin)rZbaduserZbadpwr r r Ú test_zloginÝs ÿz#NetworkedNNTPTestsMixin.test_zlogincCs*t|ƒ}z|j ¡Wd|_nd|_0dSr)rrÚquit)rÚclsr r r Ú test_zzquitês z#NetworkedNNTPTestsMixin.test_zzquitcCsJdd„}t|ƒD]4}| d¡s qt||ƒ}t|ƒs4qt||||ƒƒqdS)Ncst ˆ¡‡fdd„ƒ}|S)Ncs8t |j¡ˆ|ƒWdƒn1s*0YdSr)rÚtransient_internetÚ NNTP_HOSTr7©Úmethr r Úwrapped÷szHNetworkedNNTPTestsMixin.wrap_methods..wrap_meth..wrapped)Ú functoolsÚwraps)r‰rŠr rˆr Ú wrap_methösz7NetworkedNNTPTestsMixin.wrap_methods..wrap_methZtest_)ÚdirrÚgetattrÚcallableÚsetattr)r„rrZr‰r r r Ú wrap_methodsòs   z$NetworkedNNTPTestsMixin.wrap_methodscCs@| t¡"|j|jdddWdƒn1s20YdS)NrF©Útimeoutr)r'Ú ValueErrorÚ NNTP_CLASSr‡r7r r r Ú test_timeouts z$NetworkedNNTPTestsMixin.test_timeoutc s‡fdd„}z®|j|jtjdd‰ˆ*| |ƒ¡| ˆ ¡¡Wdƒn1sV0Y| |ƒ¡|j|jtjdd‰ˆˆ ¡Wdƒn1s¢0Y| |ƒ¡WnNty}z4t   d|j ¡ròt   d|›d|j›¡‚‚WYd}~n d}~00dS)Nc s8tˆdƒsdSz ˆ ¡Wnttfy2YdS0dS)NÚfileFT)ÚhasattrrÚOSErrorÚEOFErrorr ©rr r Ú is_connected s  zANetworkedNNTPTestsMixin.test_with_statement..is_connectedFr“ú(?i)KEY.TOO.SMALLzGot ú connecting to )r–r‡rÚINTERNET_TIMEOUTrrÚ assertFalserƒrÚreÚsearchr ÚunittestÚSkipTest)rrÚssl_errr rœr Útest_with_statement s. þ , þ& ÿz+NetworkedNNTPTestsMixin.test_with_statement)N)rr r rrr$r&r-r3r=r@rIrLrWr\r¤ZskipIfrarcrhrsr|r‚r…Ú classmethodr’r—r§r r r r r&s2          rc@s8eZdZdZdZdZdZeZe dd„ƒZ e dd„ƒZ d S) ÚNetworkedNNTPTestsznews.trigofacile.comúfr.comp.lang.pythonzfr.comp.lang.*ÚPythonc CsÌt d¡t |j¡¢z|j|jtjdd|_Wnvty‚}z8t   d|j ¡rlt   |›d|›d|j›¡‚‚WYd}~n0d}~0ty¨t   |›d|j›¡‚Yn0Wdƒn1s¾0YdS)NZnetworkFr“ržz got rŸz got EOF error on connecting to )rZrequiresrr†r‡r–r rrr¢r£r r¤r¥Ú EOF_ERRORS)r„r¦r r r Ú setUpClass<s" þ ÿ  ÿzNetworkedNNTPTests.setUpClasscCs|jdur|j ¡dSr)rrƒ)r„r r r Ú tearDownClassNs z NetworkedNNTPTests.tearDownClassN) rr r r‡r5r%r<rr–r¨r­r®r r r r r©3s r©úrequires SSL supportc@s0eZdZdZdZdZdZeeddƒZ dZ dZ dS)ÚNetworkedNNTP_SSLTestsz nntp.aioe.orgz aioe.testzaioe.*ÚtestÚNNTP_SSLN) rr r r‡r5r%r<rr(r–r$Ú test_starttlsr r r r r°Ss r°c@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)Ú _NNTPServerIOcCs>tj |¡t ¡|_t ¡|_||_|j |jj|j ¡dSr) ÚioÚ RawIOBaseÚ__init__ÚBytesIOÚc2sÚs2cÚhandlerr`ÚreadlineÚ push_data)rr»r r r r·ss    z_NNTPServerIO.__init__cCsdS©NTr r7r r r Úreadable|sz_NNTPServerIO.readablecCsdSr¾r r7r r r Úwritablesz_NNTPServerIO.writablecCs4|j ¡}|j dd¡|j |¡|j |¡dS)Nrry)rºÚtellÚseekÚwrite)rÚdataÚposr r r r½‚s  z_NNTPServerIO.push_datacCs4|j ¡}|j |¡|j |¡|j ¡t|ƒSr)r¹rÁrÃrÂr»Úprocess_pendingr )rÚbrÅr r r rÉs     z_NNTPServerIO.writecCs2|j ¡|j t|ƒ¡}t|ƒ}||d|…<|Sr)r»rÆrºÚreadr )rÚbufrÇÚnr r r Úreadinto‘s   z_NNTPServerIO.readintoN) rr r r·r¿rÀr½rÃrËr r r r r´ns  r´cCst|ƒ}t ||¡}||fSr)r´rµÚBufferedRWPair)r»Úsior˜r r r Úmake_mock_filešs rÎc@seZdZddd„Zdd„ZdS)Ú NNTPServerNcCs||_||_| |¡dSr)r˜ÚhostZ _base_init)rÚfrÐÚ readermoder r r r·¤szNNTPServer.__init__cCs|j ¡|`dSr)r˜Úcloser7r r r Ú_close©s zNNTPServer._close)N)rr r r·rÔr r r r rÏ¢s rÏcs4eZdZdZ‡fdd„Z‡fdd„Zdd„Z‡ZS)ÚMockedNNTPTestsMixinNcstƒ ¡| ¡dSr©ÚsuperÚsetUpÚ make_serverr7©Ú __class__r r rزs zMockedNNTPTestsMixin.setUpcstƒ ¡|`dSr)r×ÚtearDownrr7rÚr r rܶs zMockedNNTPTestsMixin.tearDowncOs:| ¡|_t|jƒ\|_}t|dg|¢Ri|¤Ž|_|jS)Nz test.server)Ú handler_classr»rÎrÍrÏr)rÚargsÚkwargsr˜r r r rÙºs z MockedNNTPTestsMixin.make_server)rr r rÝrØrÜrÙÚ __classcell__r r rÚr rÕ®s  rÕcseZdZ‡fdd„Z‡ZS)ÚMockedNNTPWithReaderModeMixincstƒ ¡|jdddS)NT)rÒrÖr7rÚr r rØÂs z#MockedNNTPWithReaderModeMixin.setUp)rr r rØràr r rÚr ráÁsrác@súeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zd7dd„Zdd„Zdd „Zd8d!d"„Zd#d$„Zd%d&„Zdd'œd(d)„Zdd'œd*d+„Zd,Zd-Zed.eZd9d/d0„Zd:d1d2„Zd;d3d4„Zd5d6„ZdS)<Ú NNTPv1Handlerz200 NNTP mock servercCs0d|_d|_||_||_d|_d|_| ¡dS)NFT)Úin_bodyÚ allow_postingÚ _readlineÚ _push_dataÚ _logged_inÚ _user_sentÚhandle_welcome)rr¼r½r r r r`ÌszNNTPv1Handler.startcCs t|ddƒS)Núutf-8Úsurrogateescape)r©rrÄr r r Ú_decodeÖszNNTPv1Handler._decodec Cs@|jrt| ¡}|sdS|j |¡|dkrq.qz0|j\}}||d|jiŽWd|_d|_d|_nd|_d|_d|_0| | ¡¡}|sŠdS| d¡s¢td |¡ƒ‚|dd…}|  ¡^}}t |d|  ¡dƒ}|durà|  ¡qtz ||ŽWn6t y"}ztd |¡ƒ|‚WYd}~qtd}~00|jrt||f|_g|_qtdS) NrerqFú z line doesn't end with \r\n: {!r}éþÿÿÿZhandle_zcommand failed: {!r})rãrårqÚappendZ body_callbackríÚendswithr•ÚformatÚsplitrÚupperÚhandle_unknownÚ Exception)rrr‰ÚtokensÚcmdrrr r r rÆÙsB  þ     & zNNTPv1Handler.process_pendingcCs d|_dSr¾)rãr7r r r Ú expect_bodyÿszNNTPv1Handler.expect_bodycCs| |¡dSr)rærìr r r r½szNNTPv1Handler.push_datacCs4t |¡}d | ¡¡d}| d¡}| |¡dS)Nrîrê)ÚtextwrapÚdedentÚjoinÚ splitlinesÚencoder½)rZlitr r r Úpush_lits  zNNTPv1Handler.push_litcCs| d¡dS)Nz 500 What?©rÿr7r r r rõszNNTPv1Handler.handle_unknowncCs| |j¡dSr)rÿrr7r r r részNNTPv1Handler.handle_welcomecCs| d¡dS©Nz205 Bye!rr7r r r Ú handle_QUITszNNTPv1Handler.handle_QUITcCs| d¡dS)Nú111 20100914001155rr7r r r Ú handle_DATEszNNTPv1Handler.handle_DATEcCs(|dkr| d¡n| d |¡¡dS)Nrªz$211 486 761 1265 fr.comp.lang.pythonz411 No such group {})rÿrò)rr!r r r Ú handle_GROUPs zNNTPv1Handler.handle_GROUPcCs| d¡dS)NzÉ 100 Legal commands authinfo user Name|pass Password|generic date help Report problems to .rr7r r r Ú handle_HELP szNNTPv1Handler.handle_HELPNcCsJ|dur| d¡n2|dkr(| d¡n|dkr<| d¡n | d¡dS)Nú412 No newsgroup selectedÚ3000234ú"223 3000234 <45223423@example.com>ú<45223423@example.com>ú223 0 <45223423@example.com>ú430 No Such Article Foundr©rZ message_specr r r Ú handle_STAT)s   zNNTPv1Handler.handle_STATcCs| d¡dS)Nú*223 3000237 <668929@example.org> retrievedrr7r r r Ú handle_NEXT3szNNTPv1Handler.handle_NEXTcCs| d¡dS)Nú,223 3000234 <45223423@example.com> retrievedrr7r r r Ú handle_LAST6szNNTPv1Handler.handle_LASTcCsš|dur| d¡n‚|dkr<|dkr0| d¡q–| d¡nZ|dkrP| d¡nF|dkrŒ|d krl| d ¡q–|d kr€| d ¡q–| d ¡n | d¡dS)NaÑ 215 Newsgroups in form "group high low flags". comp.lang.python 0000052340 0000002828 y comp.lang.python.announce 0000001153 0000000993 m free.it.comp.lang.python 0000000002 0000000002 y fr.comp.lang.python 0000001254 0000000760 y free.it.comp.lang.python.learner 0000000000 0000000001 y tw.bbs.comp.lang.python 0000000304 0000000304 y .ÚACTIVEú *distutils*zñ 215 Newsgroups in form "group high low flags" gmane.comp.python.distutils.devel 0000014104 0000000001 m gmane.comp.python.distutils.cvs 0000000000 0000000001 m .zW 215 Newsgroups in form "group high low flags" .rua 215 Order of fields in overview database. Subject: From: Date: Message-ID: References: Bytes: Lines: Xref:full .Ú NEWSGROUPSúcomp.lang.pythonzš 215 Descriptions in form "group description". comp.lang.python The Python computer language. .úcomp.lang.python*zý 215 Descriptions in form "group description". comp.lang.python.announce Announcements about the Python language. (Moderated) comp.lang.python The Python computer language. .zW 215 Descriptions in form "group description". .z501 Unknown LIST keywordr)rÚactionZparamr r r Ú handle_LIST9s       zNNTPv1Handler.handle_LISTcCs‚|dkr$|dkr$|dkr$| d¡nZ|dkrH|dkrH|dkrH| d¡n6|dkrt|dvrt|dkrt| d d d ¡n | d ¡dS) NrZ20100913Z082004a 230 list of newsarticles (NNTP v2) created after Mon Sep 13 08:20:04 2010 follows .Z100913a 230 list of newsarticles (NNTP v1) created after Mon Sep 13 08:20:04 2010 follows .)Z20100101Z100101Z090000z too long linei¸ z .zK 230 An empty list of newsarticles follows .r)rr!Údate_strÚtime_strr r r Úhandle_NEWNEWSos"ÿ ÿ ÿþ ÿzNNTPv1Handler.handle_NEWNEWScCs"|dkr| d¡n | d¡dS)Nz57-59uK224 Overview information for 57-58 follows 57 Re: ANN: New Plone book with strong Python (and Zope) themes throughout Doug Hellmann Sat, 19 Jun 2010 18:04:08 -0400 <4FD05F05-F98B-44DC-8111-C6009C925F0C@gmail.com> 7103 16 Xref: news.gmane.io gmane.comp.python.authors:57 58 Looking for a few good bloggers Doug Hellmann Thu, 22 Jul 2010 09:14:14 -0400 6683 16 59 Re: Message d'erreur incompréhensible (par moi) Eric Brunel Wed, 15 Sep 2010 18:09:15 +0200 <4c90ec87$0$32425$ba4acef3@reader.news.orange.fr> 1641 27 Xref: saria.nerim.net fr.comp.lang.python:1265 . z1 224 No articles .rr r r r Ú handle_XOVERŽs ÿzNNTPv1Handler.handle_XOVER)rqcCsB|dur.|jr"| d¡| ¡q>| d¡n| d¡||_dS)Nz+340 Input article; end with .ú440 Posting not permittedú240 Article received OK©rärÿrùÚ posted_body)rrqr r r Ú handle_POST®s    zNNTPv1Handler.handle_POSTcCsJ|dur6|jr*|dkr*| d¡| ¡qF| d¡n| d¡||_dS)Nú+z%335 Send it; end with .ú435 Article not wantedú235 Article transferred OKr )rÚ message_idrqr r r Ú handle_IHAVEºsÿ    zNNTPv1Handler.handle_IHAVEz× From: "Demo User" Subject: I am just a test article Content-Type: text/plain; charset=UTF-8; format=flowed Message-ID: ui This is just a test article. ..Here is a dot-starting line. -- Signed by André.z cCsd|dur| d¡n6|dkr(| d¡n"|dkr<| d¡n| d¡dS| |j¡| d¡dS)Nú"220 3000237 <45223423@example.com>r ú220 0 <45223423@example.com>rú"220 3000234 <45223423@example.com>r Ú.)rÿÚsample_articler r r r Úhandle_ARTICLEÕs     zNNTPv1Handler.handle_ARTICLEcCsd|dur| d¡n6|dkr(| d¡n"|dkr<| d¡n| d¡dS| |j¡| d¡dS)Nú"221 3000237 <45223423@example.com>r ú221 0 <45223423@example.com>rú"221 3000234 <45223423@example.com>r r+)rÿÚ sample_headr r r r Ú handle_HEADâs     zNNTPv1Handler.handle_HEADcCsd|dur| d¡n6|dkr(| d¡n"|dkr<| d¡n| d¡dS| |j¡| d¡dS)Nú"222 3000237 <45223423@example.com>r ú222 0 <45223423@example.com>rú"222 3000234 <45223423@example.com>r r+)rÿÚ sample_bodyr r r r Ú handle_BODYïs     zNNTPv1Handler.handle_BODYcCsj|jr| d¡nT|dkr>|jr,| d¡qf| d¡d|_n(|dkrX| d¡d|_ntd |¡ƒ‚dS) Nz502 Already Logged Inr}z 482 User Credential Already Sentz381 Password RequiredTÚpassz281 Login SuccessfulzUnknown cred type {})rçrÿrèrörò)rZ cred_typerÄr r r Úhandle_AUTHINFOüs    zNNTPv1Handler.handle_AUTHINFO)N)NN)N)N)N)rr r rr`rírÆrùr½rÿrõrérrrrrrrrrrr"r'r1r6r,r-r2r7r9r r r r râÇs8 &  6     râc@s&eZdZdd„Zdd„Zddd„ZdS) Ú NNTPv2HandlercCs0d}|js| | d¡¡n| | d¡¡dS)Na 101 Capability list: VERSION 2 3 IMPLEMENTATION INN 2.5.1{} HDR LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT OVER POST READER .z AUTHINFO USERr9)rçrÿrò©rÚfmtr r r Úhandle_CAPABILITIESs z!NNTPv2Handler.handle_CAPABILITIEScCs tdƒ‚dS)Nz3MODE READER sent despite READER has been advertised)rö)rÚ_r r r Ú handle_MODE szNNTPv2Handler.handle_MODENcCs | |¡Sr)rr r r r Ú handle_OVER#szNNTPv2Handler.handle_OVER)N)rr r r=r?r@r r r r r: sr:cseZdZ‡fdd„Z‡ZS)ÚCapsAfterLoginNNTPv2Handlercs |js| d¡n tƒ ¡dS)Nz480 You must log in.)rçrÿr×r=r7rÚr r r=*s z/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES)rr r r=ràr r rÚr rA'srAc@s$eZdZdd„Zdd„Zdd„ZdS)ÚModeSwitchingNNTPv2HandlercCs d|_dS©NF)Ú _switchedr7r r r r·4sz#ModeSwitchingNNTPv2Handler.__init__cCs0d}|jr| | d¡¡n| | d¡¡dS)Na 101 Capability list: VERSION 2 3 IMPLEMENTATION INN 2.5.1 HDR LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT OVER POST {}READER .r9zMODE-)rDrÿròr;r r r r=7s z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIEScCsd|_| d¡dS)NTz200 Posting allowed)rDrÿ)rZwhatr r r r?Gsz&ModeSwitchingNNTPv2Handler.handle_MODEN)rr r r·r=r?r r r r rB1srBcseZdZ‡fdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5Zd6d7„Zd8d9„Zd:d;„Z dd?„Z"d@dA„Z#‡Z$S)BÚNNTPv1v2TestsMixincstƒ ¡dSr)r×rØr7rÚr r rØOszNNTPv1v2TestsMixin.setUpcCs| |jj|jj¡dSr)rrrr»r7r r r rRszNNTPv1v2TestsMixin.test_welcomecCs<|jdkr| d|jj¡|j dd¡| d|jj¡dS)NryÚAUTHINFOÚtestuserÚtestpw)rzr;rÚ_capsrr4r7r r r Ú test_authinfoUs z NNTPv1v2TestsMixin.test_authinfoc Cs:|j ¡\}}| |d¡| |t dddddd¡¡dS)NréÚé éré é7)rr0rr/rKr r r rL]s zNNTPv1v2TestsMixin.test_datecCs6| |jj¡|j ¡}| |d¡| |jj¡dSr)r¡rÍÚclosedrrƒrr)rrr r r Ú test_quitbs  zNNTPv1v2TestsMixin.test_quitcCs.|j ¡\}}| |d¡| |gd¢¡dS)Nz100 Legal commands)z8 authinfo user Name|pass Password|generic z datez helpz%Report problems to )rrr)rrrr r r rhs zNNTPv1v2TestsMixin.test_helpcCs~|j ¡\}}| t|ƒd¡|d}| |tddddƒ¡|j d¡\}}| t|ƒd¡|d }| |td d d dƒ¡dS) Nérbúcomp.lang.python.announceZ 0000001153Z 0000000993Úmrryrz!gmane.comp.python.distutils.develZ 0000014104Z 0000000001)rrrr r)rrr#Úgr r r r$rs ÿÿÿÿzNNTPv1v2TestsMixin.test_listcCsþ|j d¡\}}}| |d¡| |d¡| |d¡|j d¡\}}}| |d¡| |d¡| |d¡| tj¡}|j d¡Wdƒn1sš0Y| |jjd¡| tj¡}|j ¡Wdƒn1sà0Y| |jjd¡dS) NéªÇ-r r r rzr r)rÚstatrr'r(rpr*r+)rrr[r&r,r r r Ú test_stat€s      *(zNNTPv1v2TestsMixin.test_statcCs8|j ¡\}}}| |d¡| |d¡| |d¡dS)Nré­Ç-z<668929@example.org>)rÚnextr©rrr[r&r r r Ú test_nexts  zNNTPv1v2TestsMixin.test_nextcCs8|j ¡\}}}| |d¡| |d¡| |d¡dS)NrrVr )rrHrr[r r r Ú test_last–s  zNNTPv1v2TestsMixin.test_lastcCs4|j d¡}| |d¡|j d¡}| |d¡dS)NrúThe Python computer language.úcomp.lang.pythonxr9)rr:r)rr6r r r r=œs   z#NNTPv1v2TestsMixin.test_descriptioncCsn|j d¡\}}| |d¡| |ddi¡|j d¡\}}| |dddœ¡|j d¡\}}| |i¡dS)Nrz-215 Descriptions in form "group description".r^rz4Announcements about the Python language. (Moderated))rrSr_)rr>rr"r r r r@¢s ÿþz$NNTPv1v2TestsMixin.test_descriptionscCs°|j d¡\}}}}}| | d¡|¡| |d¡| |d¡| |d¡| |d¡| tj¡}|j d¡Wdƒn1s†0Y|j}| |j  d¡|j ¡dS)NrªrBiùiñiæzcomp.lang.python.develz411 No such group) rr!rrrr'r(rpr*r+)rrrFrGrHr!r,Úexcr r r rI°s    *ÿzNNTPv1v2TestsMixin.test_groupcCst dddddd¡}|j d|¡\}}d |j¡}| ||¡| |d d g¡t dddddd¡}|j d |¡\}}| |d ¡| |g¡dS) NrKrLé ééérzS230 list of newsarticles (NNTP v{0}) created after Mon Sep 13 08:20:04 2010 followszBzBrªz)230 An empty list of newsarticles follows)r/rÚnewnewsròrzr)rr2rZidsZexpectedr r r Ú test_newnews½sÿý þ zNNTPv1v2TestsMixin.test_newnewscCsZ| t|ƒd¡| |d d¡d¡| |dd¡| |dd¡| |d d ¡dS) Nrdr^rêu-- Signed by André.rïrjéýÿÿÿs.Here is a dot-starting line.éüÿÿÿsThis is just a test article.)rr Údecode©rrr r r Ú_check_article_bodyÐs z&NNTPv1v2TestsMixin._check_article_bodycCs4| t|ƒd¡| |dd¡| |dd¡dS)Nrdrs&From: "Demo User" és7Message-ID: )rr rjr r r Ú_check_article_head×sz&NNTPv1v2TestsMixin._check_article_headcCsH| t|ƒd¡| |dd…¡| |dd…¡| |dd¡dS)NrLrdrhrj)rr rmrkrjr r r Ú_check_article_dataÜsz&NNTPv1v2TestsMixin._check_article_datacCs$|j ¡\}}| |d¡|\}}}| |d¡| |d¡| |¡|j d¡\}}| |d¡|\}}}| |d¡| |d¡| |¡|j d¡\}}| |d¡|\}}}| |d¡| |d¡| |¡| tj¡}|j d¡Wdƒn1s0Y| |jjd ¡dS) Nr(rYr rVr*r)rúr ) rrgrrnr'r(rpr*r+©rrÚinfor[r&rr,r r r Ú test_articleâs*               ,zNNTPv1v2TestsMixin.test_articlecCsŒt ¡}|jj|d\}}| |d¡|\}}}| |d¡| |d¡| |g¡| ¡}| | d¡t|ƒ¡| |  d¡t|ƒ¡dS)N©r˜r(rYr óKFrom: "Demo User" Subject: I am just a test article óUThis is just a test article. .Here is a dot-starting line. -- Signed by André. ) rµr¸rrgrÚgetvaluerrÚasciirñ©rrÑrrqr[r&rrÄr r r Útest_article_fileýs$     ÿýÿûz$NNTPv1v2TestsMixin.test_article_filecCs$|j ¡\}}| |d¡|\}}}| |d¡| |d¡| |¡|j d¡\}}| |d¡|\}}}| |d¡| |d¡| |¡|j d¡\}}| |d¡|\}}}| |d¡| |d¡| |¡| tj¡}|j d¡Wdƒn1s0Y| |jjd ¡dS) Nr.rYr rVr0r/rror ) rrorrmr'r(rpr*r+rpr r r Ú test_heads*               ,zNNTPv1v2TestsMixin.test_headcCsŒt ¡}|jj|d\}}| |d¡|\}}}| |d¡| |d¡| |g¡| ¡}| | d¡t|ƒ¡|  |  d¡t|ƒ¡dS)Nrsr.rYr rtru) rµr¸rrorrvrrrwr¡rñrxr r r Útest_head_file-s$     ÿýÿûz!NNTPv1v2TestsMixin.test_head_filecCs$|j ¡\}}| |d¡|\}}}| |d¡| |d¡| |¡|j d¡\}}| |d¡|\}}}| |d¡| |d¡| |¡|j d¡\}}| |d¡|\}}}| |d¡| |d¡| |¡| tj¡}|j d¡Wdƒn1s0Y| |jjd ¡dS) Nr3rYr rVr5r4rror ) rrqrrkr'r(rpr*r+rpr r r Ú test_bodyAs*               ,zNNTPv1v2TestsMixin.test_bodycCsŒt ¡}|jj|d\}}| |d¡|\}}}| |d¡| |d¡| |g¡| ¡}| | d¡t|ƒ¡|  |  d¡t|ƒ¡dS)Nrsr3rYr rtru) rµr¸rrqrrvr¡rrwrrñrxr r r Útest_body_file\s$     ÿýÿûz!NNTPv1v2TestsMixin.test_body_filec Cs”| | d¡|¡| t|ƒd¡|d\}}| |d¡| |ddddd d d d d œ¡|d\}}| |dd¡|d\}}| |dd¡dS)Nz224 rlré9zEDoug Hellmann zGRe: ANN: New Plone book with strong Python (and Zope) themes throughoutzSat, 19 Jun 2010 18:04:08 -0400z0<4FD05F05-F98B-44DC-8111-C6009C925F0C@gmail.com>zZ7103Z16z*news.gmane.io gmane.comp.python.authors:57)rMrQr0rRrOrNrPÚxrefrbrryrQõ0Re: Message d'erreur incompréhensible (par moi))rrrr )rrÚ overviewsr[r_r r r Úcheck_over_xover_respps(  ø   ÿz(NNTPv1v2TestsMixin.check_over_xover_respcCs"|j dd¡\}}| ||¡dS)Nr~é;)rrXr‚©rrrr r r r\…szNNTPv1v2TestsMixin.test_xovercCs |j d¡\}}| ||¡dS)N)r~rƒ)rr_r‚r„r r r ra‰szNNTPv1v2TestsMixin.test_oversFrom: "Demo User" Subject: I am just a test article Content-Type: text/plain; charset=UTF-8; format=flowed Message-ID: This is just a test article. .Here is a dot-starting line. -- Signed by André. cCsl|jj}| t|ƒd¡| |dd¡| |dd¡| |dd¡| |dd ¡| |d d ¡dS) Nr]r^rerïs-- Signed by André. rgó rhs ..Here is a dot-starting line. rs(From: "Demo User" )r»r!rr rjr r r Ú_check_posted_bodyšsz%NNTPv1v2TestsMixin._check_posted_bodycGsd|j}|||ƒf}d|j_||Ž}| ¡|j dd¡}|||ƒf}d|j_||Ž}| ¡|S)Nr…ó )Ú sample_postr»r!r†Úreplace)rÚfuncÚ file_factoryrÞÚpostZ func_argsrr r r Ú_check_post_ihave_sub¥sz(NNTPv1v2TestsMixin._check_post_ihave_subcGsÊ|j|g|¢RdtiŽ}| ||¡|j|g|¢RdtiŽ}| ||¡|j|g|¢RdtjiŽ}| ||¡dd„}|j|g|¢Rd|iŽ}| ||¡dd„}|j|g|¢Rd|iŽ}| ||¡dS)Nr‹cSst|jddƒS)NT©Úkeepends©Úiterrý©rÇr r r Ú iterlinesÀsz6NNTPv1v2TestsMixin.check_post_ihave..iterlinescSst|jddƒS)NFrŽrr’r r r r“Ås)rrfrÚ bytearrayrµr¸)rrŠZ success_resprÞrr“r r r Úcheck_post_ihaveµs    z#NNTPv1v2TestsMixin.check_post_ihavecCsf| |jjd¡d|j_| tj¡}|j |j¡Wdƒn1sH0Y|  |j j d¡dS)NrFr) r•rrŒr»rär'r(rprˆrr*r+©rr,r r r Ú test_postÊs, ÿzNNTPv1v2TestsMixin.test_postcCsb| |jjdd¡| tj¡ }|j d|j¡Wdƒn1sD0Y| |jj d¡dS)Nr%r#zr$) r•rZihaver'r(rprˆrr*r+r–r r r Ú test_ihaveÒs ÿ. ÿzNNTPv1v2TestsMixin.test_ihavecCs.t dddddd¡}| tj|jjd|¡dS)NrKrbrLrr)r/r'r(Ú NNTPDataErrorrre)rr2r r r Útest_too_long_linesÚs ÿz&NNTPv1v2TestsMixin.test_too_long_lines)%rr r rØrrJrLrQrr$rXr\r]r=r@rIrfrkrmrnrrryrzr{r|r}r‚r\rarˆr†rr•r—r˜ršràr r rÚr rEMsD   ÿ  rEc@seZdZdZeZdd„ZdS)Ú NNTPv1TestsrbcCs:|j ¡}| |i¡| |jjd¡| |jjd¡dS)Nrb©rr{rrzZnntp_implementation©rrwr r r Ú test_capsæs  zNNTPv1Tests.test_capsN)rr r rzrârÝržr r r r r›àsr›c@seZdZdZeZdd„ZdS)Ú NNTPv2Testsryc CsZ|j ¡}| |ddgddgdgggd¢gggdœ¡| |jjd¡| |jjd ¡dS) NÚ2Ú3ZINNz2.5.1ZUSER)rz ACTIVE.TIMESz DISTRIB.PATSZHEADERSrru)ÚVERSIONZIMPLEMENTATIONrFZHDRrtZOVERZPOSTÚREADERrlz INN 2.5.1rœrr r r ržós ÷ zNNTPv2Tests.test_capsN)rr r rzr:rÝržr r r r rŸísrŸc@seZdZdZeZdd„ZdS)ÚCapsAfterLoginNNTPv2TestsrycCs2| |jji¡|j dd¡| d|jj¡dS)NrGrHr¢)rrrIrr;r7r r r Útest_caps_only_after_login sz4CapsAfterLoginNNTPv2Tests.test_caps_only_after_loginN)rr r rzrArÝr¥r r r r r¤sr¤c@seZdZdZeZdd„ZdS)ÚSendReaderNNTPv2TestsrycCs| d|jj¡dS)Nr£)r;rrIr7r r r Ú(test_we_are_in_reader_mode_after_connectsz>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connectN)rr r rzrBrÝr§r r r r r¦sr¦c@sPeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Ze   e d ¡dd„ƒZ dS)Ú MiscTestscsV‡fdd„}|ddƒ|ddƒ|ddƒ|ddƒ|dd ƒ|d d ƒ|d d ƒdS) Ncsˆ t |¡|¡dSr)rr(Ú decode_header)ÚarÇr7r r Úgivessz+MiscTests.test_decode_header..givesr9za plain headerz with extra spaces z%=?ISO-8859-15?Q?D=E9buter_en_Python?=uDébuter en Pythonz=?utf-8?q?Re=3A_=5Bsqlite=5D_probl=C3=A8me_avec_ORDER_BY_sur_des_cha?= =?utf-8?q?=C3=AEnes_de_caract=C3=A8res_accentu=C3=A9es?=uPRe: [sqlite] problème avec ORDER BY sur des chaînes de caractères accentuéesz,Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=uRe: problème de matricer€r ©rr«r r7r Útest_decode_headers     þÿÿzMiscTests.test_decode_headercCs¸gd¢}| t |¡gd¢¡gd¢}| t |¡gd¢¡gd¢}| t |¡gd¢¡gd¢}| t |¡gd¢¡gd¢}| t |¡gd¢¡gd¢}| t |¡gd ¢¡dS) N)úSubject:úFrom:úDate:ú Message-ID:ú References:rNrP)rQrMr0rRrOrNrP)r®r¯r°r±r²úBytes:úLines:)zsubject:zFROM:zDaTe:z message-ID:r²zBYTES:r´) r®r¯r°r±r²rNrPú Xref:fullzDistribution:full) rQrMr0rRrOrNrPrZ distribution) r®r¯r°r±r²r³r´z Xref:FULLzDistribution:FULL)r®r¯r°r±r²r³r´rµ©rQrMr0rRrOrNrPr)rr(Z_parse_overview_fmtrjr r r Útest_parse_overview_fmt.s0 ÿ ÿ ÿ ÿ ÿ ÿz!MiscTests.test_parse_overview_fmtc Cs¾tjdg}dg}t ||¡}|\\}}| |d¡| |dddddd d d d œ¡d g}t ||¡}|\\}}| |dd¡dg}t ||¡}|\\}}| |dd¡| |dd¡dS)Nrz·3000234 I am just a test article "Demo User" 6 Oct 1998 04:38:40 -0500 <45223423@example.com> <45454@example.net> 1234 17 Xref: news.example.com misc.test:3000363rVzI am just a test articlez "Demo User" z6 Oct 1998 04:38:40 -0500r z<45454@example.net>Z1234Z17z"news.example.com misc.test:3000363r¶z3000234 I am just a test article "Demo User" 6 Oct 1998 04:38:40 -0500 <45223423@example.com> <45454@example.net> 1234 17 z„3000234 I am just a test article "Demo User" 6 Oct 1998 04:38:40 -0500 <45223423@example.com> 1234 17 Xref: rOú r9)r(Z_DEFAULT_OVERVIEW_FMTZ_parse_overviewr)rr<rZoverviewr[Úfieldsr r r Útest_parse_overviewVs6 ÿ   ø ÿ  ÿ  zMiscTests.test_parse_overviewc sh‡fdd„}|dddddddd ƒ|d d dddddd ƒ|d d dddddd ƒ|d d dddddd ƒdS)Ncsˆ t ||¡tj|Ž¡dSr)rr(Z_parse_datetimer/)rªrÇÚcr7r r r«…sÿz,MiscTests.test_parse_datetime..givesZ19990623135624éÏrRéraé8éÚ19990623Ú135624Ú990623Z090623iÙr r¬r r7r Útest_parse_datetime„s  zMiscTests.test_parse_datetimec sއfdd„}|ddddddd d ƒ|d dddddd d ƒ|d dddddddƒ‡fdd„}|dddd dƒ|d ddd dƒ|d ddddƒdS)Nc sFt ||||||¡}ˆ t |¡||f¡ˆ t |d¡||f¡dSrC©r/rr(Ú_unparse_datetime© ÚyÚMÚdÚhrTÚsrrr2r7r r r«’s ÿÿz.MiscTests.test_unparse_datetime..givesr¼rRr½rar¾r¿rÀrÁéÐZ20000623rKrArbryrlZ20100605Ú010203cs@t |||¡}ˆ t |¡||f¡ˆ t |d¡||f¡dSrC©r/r0rr(rÅ©rÇrÈrÉrrr2r7r r r«œs ÿÿÚ000000r r¬r r7r Útest_unparse_datetimes  zMiscTests.test_unparse_datetimec sއfdd„}|ddddddd d ƒ|d dddddd d ƒ|d dddddddƒ‡fdd„}|dddd dƒ|d ddd dƒ|d ddddƒdS)Nc s0t ||||||¡}ˆ t |d¡||f¡dSr¾rÄrÆr7r r r«©sÿz5MiscTests.test_unparse_datetime_legacy..givesr¼rRr½rar¾r¿rÂrÁrÌZ000623rKrArbryrlZ100605rÍcs*t |||¡}ˆ t |d¡||f¡dSr¾rÎrÏr7r r r«±sÿrÐr r¬r r7r Útest_unparse_datetime_legacy¦s  z&MiscTests.test_unparse_datetime_legacyr¯cCs| ttdƒ¡dS)Nr²)rr™r(r7r r r Útest_ssl_support¹szMiscTests.test_ssl_supportN) rr r r­r·rºrÃrÑrÒr¤Ú skipUnlessÚsslrÓr r r r r¨s(.  r¨c@seZdZdd„ZdS)ÚPublicAPITestscCsD| ttdƒ¡gd¢}tdur*| d¡| ttjƒt|ƒ¡dS)NÚ__all__)rr€ÚNNTPReplyErrorrpr)ÚNNTPProtocolErrorr™r©r²)rr™r(rÕrðrÚsetr×)rZ target_apir r r Útest_module_all_attributeÁs  z(PublicAPITests.test_module_all_attributeN)rr r rÛr r r r rÖ¾srÖc@sDeZdZejZddd„Zdd„Zdd„Zdd „Z d d „Z d d „Z dS)ÚMockSocketTestsNc sºG‡fdd„dƒ}G‡‡‡fdd„dƒ‰d‰g‰td|ƒL| ||¡ |jd||dWdƒn1sn0YWdƒn1sŒ0Y| ˆ¡ˆD]}| |j¡q¤dS) NcseZdZ‡fdd„ZdS)zNMockSocketTests.check_constructor_error_conditions..mock_socket_modulecsˆƒSrr )Úaddressr”©Ú MockSocketr r Úcreate_connection×sz`MockSocketTests.check_constructor_error_conditions..mock_socket_module.create_connectionN)rr r ràr rÞr r Úmock_socket_moduleÖsrács&eZdZ‡fdd„Z‡‡fdd„ZdS)zFMockSocketTests.check_constructor_error_conditions..MockSocketcsd‰dSr¾r r7)Ú socket_closedr r rÓÛszLMockSocketTests.check_constructor_error_conditions..MockSocket.closecs ˆƒ}t|ƒ\}}ˆ |¡|Sr)rÎrð)ÚsocketÚmoder»r>r˜)ÚfilesrÝr r Úmakefileßs  zOMockSocketTests.check_constructor_error_conditions..MockSocket.makefileN)rr r rÓrær )rårÝrâr r rßÚs rßFznntplib.socketÚdummy)r}r~)rZassertRaisesRegexÚ nntp_classrrP)rrÝZexpected_error_typeZexpected_error_msgrr~rárÑr )rßrårÝrâr Ú"check_constructor_error_conditionsÑs   ÿL z2MockSocketTests.check_constructor_error_conditionscCs&Gdd„dtƒ}| |tj|j¡dS)Nc@seZdZdZdS)z1MockSocketTests.test_bad_welcome..Handlerz Bad WelcomeN©rr r rr r r r ÚHandlerðsrë)rârér(rÙr©rrër r r Útest_bad_welcomeîs ÿz MockSocketTests.test_bad_welcomecCs&Gdd„dtƒ}| |tj|j¡dS)Nc@seZdZdZdS)zEMockSocketTests.test_service_temporarily_unavailable..Handlerz#400 Service temporarily unavailableNrêr r r r rë÷srë)rârér(rprrìr r r Ú$test_service_temporarily_unavailableõs ÿz4MockSocketTests.test_service_temporarily_unavailablecCs&Gdd„dtƒ}| |tj|j¡dS)Nc@seZdZdZdS)zEMockSocketTests.test_service_permanently_unavailable..Handlerz#502 Service permanently unavailableNrêr r r r rëþsrë)rârér(r)rrìr r r Ú$test_service_permanently_unavailableüs ÿz4MockSocketTests.test_service_permanently_unavailablecs,G‡fdd„dtƒ}d‰| |tjˆ¡dS)NcseZdZ‡fdd„ZdS)z6MockSocketTests.test_bad_capabilities..Handlercs| ˆ¡dSrrr7©Zcapabilities_responser r r=szJMockSocketTests.test_bad_capabilities..Handler.handle_CAPABILITIESN)rr r r=r rðr r rësrëz201 bad capability)rârér(rØrìr rðr Útest_bad_capabilitiess ÿz%MockSocketTests.test_bad_capabilitiescs8d}d}G‡fdd„dtƒ}d‰| |tjˆ||¡dS)Nzt@e.comZpythoncseZdZ‡fdd„ZdS)z3MockSocketTests.test_login_aborted..Handlercs| ˆ¡dSrr)rrÞ©Zauthinfo_responser r r9szCMockSocketTests.test_login_aborted..Handler.handle_AUTHINFON)rr r r9r ròr r rësrëz503 Mechanism not recognized)rârér(r))rrr~rër ròr Útest_login_aborted sþz"MockSocketTests.test_login_aborted)NN) rr r r(rrèrérírîrïrñrór r r r rÜÊsý  rÜc@seZdZdd„ZdS)Úbypass_contextcKs|Srr )ÚsockrÞr r r Ú wrap_socketszbypass_context.wrap_socketN)rr r rör r r r rôsrôc@seZdZedd„ƒZdS)Ú MockSslTestscOstj|dti|¤ŽS)NZ ssl_context)r(r²rô)rÅÚkwr r r rèszMockSslTests.nntp_classN)rr r Ú staticmethodrèr r r r r÷sr÷c@s0eZdZdd„Zdd„Ze ed¡dd„ƒZdS) ÚLocalServerTestscCstt ¡}t |¡}| ¡tj|j|fd|_|j ¡|  |jj ¡t tj |dd  ¡|_|  |jjddd¡dS)N)ÚtargetrÞF)r)rãrZ bind_portÚlistenÚ threadingÚThreadÚ run_serverZ backgroundr`Z addCleanuprürZHOSTÚ __enter__ÚnntpÚ__exit__)rrõÚportr r r rØ%s ÿ zLocalServerTests.setUpcCs|| ¡\}}Wdƒn1s&0Yt ¡Ì}| |¡| | d¡¡}| d¡| ¡}|dkrz| d¡q^|dkrÐ| ¡| d¡t  ¡}|  t ¡|j |dd}| |¡| | d¡¡}q^|d kræ| d ¡qöq^t d  |¡ƒ‚q^Wdƒn1s 0YdS) NÚrbs200 Server ready sCAPABILITIES s.101 Capability list: VERSION 2 STARTTLS . s STARTTLS s382 Begin TLS negotiation now T)Z server_sidesQUIT s 205 Bye! zUnexpected command {!r})ÚacceptÚ contextlibÚ ExitStackÚ enter_contextræÚsendallr¼rÓrÕZ SSLContextZload_cert_chainÚcertfilerör•rò)rrõÚclientr>ÚcleanupÚreaderrøÚcontextr r r rÿ1s2*   ÿ  ÿ  zLocalServerTests.run_serverr¯cCs`|jj}|jj}|j ¡| ||jj¡| ||jj¡| |jjtj¡| t |jj¡dSr) rr˜rõZstarttlsZassertNotEqualr1rÕZ SSLSocketr'r•)rr˜rõr r r r³Qs zLocalServerTests.test_starttlsN) rr r rØrÿr¤rÔrÕr³r r r r rú$s  rúÚ__main__)=rµrãr/rúr¤r‹rr(Zos.pathÚosr¢rýr±rZ test.supportrrrZ unittest.mockrrÕÚ ImportErrorÚpathrüÚdirnameÚ__file__r rrörr’r›r¬Z SSLEOFErrorZTestCaser©rÔr°r¶r´rÎrÏrÕrárâr:rArBrEr›rŸr¤r¦r¨rÖrÜrôr÷rúrÚmainr r r r Ús~          , G   ÿ # N <