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@seZdZdZdZdS)ÚSSLErrorz6Non-existent exception class when we lack SSL support.zThis will never be raised.N)Ú__name__Ú __module__Ú __qualname__Ú__doc__Ú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)r2rÚ assertNotInÚ GROUP_NAME)Údesc©rr rÚ _check_descNs z=NetworkedNNTPTestsMixin.test_description.._check_descz zk.brrtt.bazÚ)rÚ descriptionr6ÚassertInÚDESCr&r)rr9r7r r8rÚtest_descriptionMs  z(NetworkedNNTPTestsMixin.test_descriptioncCs^|j |j¡\}}| | d¡p(| d¡|¡| |t¡||j}| ||j  |j¡¡dS)Nz215 z282 ) rÚ descriptionsr&rrr2Údictr6rr;)rrZdescsr7r r rÚtest_descriptions]sÿ  z)NetworkedNNTPTestsMixin.test_descriptionscCs€|j |j¡}| dt|ƒ¡|\}}}}}| ||j¡| |t¡| |t¡| |t¡| ||¡| |  d¡|¡dS)Néú211 ) rr"r6rr!r2ÚintÚassertLessEqualrr)rÚresultrÚcountÚfirstÚlastr"r r rÚ test_groupfs    z"NetworkedNNTPTestsMixin.test_groupcCs<|j ¡\}}| |tj¡| |jd¡| |jd¡dS)NiËiî)rr1r2r0ÚassertGreaterEqualZyearrE©rrr1r r rÚ test_dateqsz!NetworkedNNTPTestsMixin.test_datecCsF| |t¡| | ¡hd£¡| ¡D]}| |ttdƒf¡q(dS)N>Ú referencesú:bytesÚfromú message-idÚsubjectr1ú:lines)r2r@rKÚ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)NrBrzno articles retrieved) rr"r6Úxoverr!ÚskipTestrKrErX) rrrGrHrIÚnamerÚart_numrVr 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"r6ÚoverrXrKrE) rrrGrHrIr[Ústartrr\rVr r rÚ test_overŽs     z!NetworkedNNTPTestsMixin.test_overcCsL|j |j¡\}}}}}|j d|¡\}}|D]}| tt|dƒ¡q.dS)NrRé)rr"r6Zxhdrrrr)rrrGrHrIr[rrr r rÚ test_xhdr¡sz!NetworkedNNTPTestsMixin.test_xhdrNcCsR| |tj¡|dur$| |j|¡|jD]}| |t¡q*| |jdd¡dS)Nr_)ó.s. ó. )r2r)Z ArticleInforZnumberrÚbytesr5)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) Nrcz423 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 rlrnr rroËsÿrk)rr"r6Úheadr)ÚNNTPTemporaryErrorr,rrZrriÚbodyrhrr) rrrGrHrIr[r\rpÚerrrhZfiltered_head_linesZfiltered_linesr rnrÚ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)r2r Útupler<)ÚcapsZ caps_listr8r rÚ _check_capsÓsz>NetworkedNNTPTestsMixin.test_capabilities.._check_capsé)rKrÚ nntp_versionÚgetcapabilitiesZ capabilities)rryrrxr r8rÚ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_HOSTr8©Ú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…rŽr[rŠr r rÚ wrap_methodsòs   z$NetworkedNNTPTestsMixin.wrap_methodscCs@| t¡"|j|jdddWdƒn1s20YdS)NrF©Útimeoutr€)r(Ú ValueErrorÚ NNTP_CLASSrˆr8r 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 rrÚtest_with_statement s. þ , þ& ÿz+NetworkedNNTPTestsMixin.test_with_statement)N)rr r rrr%r'r.r4r>rArJrMrXr]r¥ZskipIfrbrdrirtr}rƒr†Ú classmethodr“r˜r¨r r r rr&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ˆr6r&r=rr—r©r®r¯r r r rrª3s rªúrequires SSL supportc@s0eZdZdZdZdZdZeeddƒZ dZ dZ dS)ÚNetworkedNNTP_SSLTestsz nntp.aioe.orgz aioe.testzaioe.*ÚtestÚNNTP_SSLN) rr r rˆr6r&r=rr)r—r%Ú test_starttlsr r r rr±Ss r±c@s@eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dS)Ú _NNTPServerIOz¤A raw IO object allowing NNTP commands to be received and processed by a handler. The handler can push responses which can then be read from the IO object.cCs>tj |¡t ¡|_t ¡|_||_|j |jj|j ¡dSr) ÚioÚ RawIOBaseÚ__init__ÚBytesIOÚc2sÚs2cÚhandlerraÚreadlineÚ push_data)rr¼r r rr¸ss    z_NNTPServerIO.__init__cCsdS©NTr r8r r rÚreadable|sz_NNTPServerIO.readablecCsdSr¿r r8r r rÚwritablesz_NNTPServerIO.writablecCs4|j ¡}|j dd¡|j |¡|j |¡dS)z.Push (buffer) some data to send to the client.rrzN)r»ÚtellÚseekÚwrite)rÚdataÚposr r rr¾‚s  z_NNTPServerIO.push_datacCs4|j ¡}|j |¡|j |¡|j ¡t|ƒS)zThe client sends us some data)rºrÂrÄrÃr¼Úprocess_pendingr!)rÚbrÆr r rrĉs     z_NNTPServerIO.writecCs2|j ¡|j t|ƒ¡}t|ƒ}||d|…<|S)z#The client wants to read a responseN)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 rrµ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 rr¸¤szNNTPServer.__init__cCs|j ¡|`dSr)r™Úcloser8r r rÚ_close©s zNNTPServer._close)N)rr r r¸rÕr r r rrТs rÐcs4eZdZdZ‡fdd„Z‡fdd„Zdd„Z‡ZS)ÚMockedNNTPTestsMixinNcstƒ ¡| ¡dSr©ÚsuperÚsetUpÚ make_serverr8©Ú __class__r rrÙ²s zMockedNNTPTestsMixin.setUpcstƒ ¡|`dSr)rØÚtearDownrr8rÛr rrݶs zMockedNNTPTestsMixin.tearDowncOs:| ¡|_t|jƒ\|_}t|dg|¢Ri|¤Ž|_|jS)Nz test.server)Ú handler_classr¼rÏrÎrÐr)rÚargsÚkwargsr™r r rrÚºs z MockedNNTPTestsMixin.make_server)rr r rÞrÙrÝrÚÚ __classcell__r r rÛrrÖ®s  rÖcseZdZ‡fdd„Z‡ZS)ÚMockedNNTPWithReaderModeMixincstƒ ¡|jdddS)NT)rÓr×r8rÛr rrÙÂs z#MockedNNTPWithReaderModeMixin.setUp)rr r rÙrár r rÛrrâÁsrâc@sþeZdZdZdZdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd8dd„Zdd„Zd d!„Zd9d"d#„Zd$d%„Zd&d'„Zdd(œd)d*„Zdd(œd+d,„Zd-Zd.Zed/eZd:d0d1„Zd;d2d3„Zd date help Report problems to .rr8r 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> retrievedrr8r r rÚ handle_NEXT3szNNTPv1Handler.handle_NEXTcCs| d¡dS)Nú,223 3000234 <45223423@example.com> retrievedrr8r r rÚ handle_LAST6szNNTPv1Handler.handle_LASTcCs¦|dur| d¡nŽ|dkr<|dkr0| d¡q¢| d¡nf|dkrP| d¡nR|dkr˜|dusdJ‚|d krx| 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" .rva 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 .rrr r rÚ handle_XOVERŽs ÿzNNTPv1Handler.handle_XOVER)rrcCsL|dur.|jr"| d¡| ¡qH| d¡n|js8J‚| d¡||_dS)Nz+340 Input article; end with .ú440 Posting not permittedú240 Article received OK©rårrúÚ posted_body)rrrr r rÚ handle_POST®s     zNNTPv1Handler.handle_POSTcCsT|dur6|jr*|dkr*| d¡| ¡qP| d¡n|js@J‚| d¡||_dS)Nú+z%335 Send it; end with .ú435 Article not wantedú235 Article transferred OKr!)rÚ message_idrrr 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_articlerr 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_headrr 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_bodyrr 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èrrér÷ró)rZ cred_typerÅr r rÚhandle_AUTHINFOüs    zNNTPv1Handler.handle_AUTHINFO)N)NN)N)N)N) rr r r rrarîrÇrúr¾rrörêrrrrrrrrrrr#r(r2r7r-r.r3r8r:r r r rrãÇs: &  6     rãc@s*eZdZdZdd„Zdd„Zd dd„ZdS) Ú NNTPv2Handlerz"A handler for RFC 3977 (NNTP "v2")cCs0d}|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 USERr:)rèrró©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)rrr r rÚ handle_OVER#szNNTPv2Handler.handle_OVER)N)rr r r r>r@rAr r r rr; sr;cs eZdZdZ‡fdd„Z‡ZS)ÚCapsAfterLoginNNTPv2Handlerz3A handler that allows CAPABILITIES only after logincs |js| d¡n tƒ ¡dS)Nz480 You must log in.)rèrrØr>r8rÛr rr>*s z/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES)rr r r r>rár r rÛrrB'srBc@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚModeSwitchingNNTPv2Handlerz$A server that starts in transit modecCs d|_dS©NF)Ú _switchedr8r r rr¸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 .r:zMODE-)rErrór<r r rr>7s z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIEScCs&|js|dksJ‚d|_| d¡dS)NÚreaderTz200 Posting allowed)rEr)rZwhatr r rr@Gsz&ModeSwitchingNNTPv2Handler.handle_MODEN)rr r r r¸r>r@r r r rrC1srCcseZdZ‡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Ùr8rÛr rrÙOszNNTPv1v2TestsMixin.setUpcCs| |jj|jj¡dSr)rrrr¼r8r r rrRszNNTPv1v2TestsMixin.test_welcomecCs<|jdkr| d|jj¡|j dd¡| d|jj¡dS)NrzÚAUTHINFOÚtestuserÚtestpw)r{r<rÚ_capsr‚r5r8r r rÚ test_authinfoUs z NNTPv1v2TestsMixin.test_authinfoc Cs:|j ¡\}}| |d¡| |t dddddd¡¡dS)NréÚé éré é7)rr1rr0rLr r rrM]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 rrhs zNNTPv1v2TestsMixin.test_helpcCs~|j ¡\}}| t|ƒd¡|d}| |tddddƒ¡|j d¡\}}| t|ƒd¡|d }| |td d d dƒ¡dS) Nércúcomp.lang.python.announceZ 0000001153Z 0000000993Úmrrzrz!gmane.comp.python.distutils.develZ 0000014104Z 0000000001)rr rr!r)rrr$Úgr r rr%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)rqr+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)NrrXr )rrIrr]r r rÚ test_last–s  zNNTPv1v2TestsMixin.test_lastcCs4|j d¡}| |d¡|j d¡}| |d¡dS)NrúThe Python computer language.úcomp.lang.pythonxr:)rr;r)rr7r r rr>œ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))rrUra)rr?rr#r r rrA¢s ÿþz$NNTPv1v2TestsMixin.test_descriptionscCs°|j d¡\}}}}}| | d¡|¡| |d¡| |d¡| |d¡| |d¡| tj¡}|j d¡Wdƒn1s†0Y|j}| |j  d¡|j ¡dS)Nr«rCiùiñiæzcomp.lang.python.develz411 No such group) rr"rrrr(r)rqr+r,)rrrGrHrIr"r-Úexcr r rrJ°s    *ÿzNNTPv1v2TestsMixin.test_groupcCst dddddd¡}|j d|¡\}}d |j¡}| ||¡| |d d g¡t dddddd¡}|j d |¡\}}| |d ¡| |g¡dS) NrMrNé ééé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)r0rÚnewnewsrór{r)rr3rZidsZexpectedr r rÚ test_newnews½sÿý þ zNNTPv1v2TestsMixin.test_newnewscCsZ| t|ƒd¡| |d d¡d¡| |dd¡| |dd¡| |d d ¡dS) Nrfr_rëu-- Signed by André.rðrkéýÿÿÿ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)Nrfrs&From: "Demo User" és7Message-ID: )rr!rlr r rÚ_check_article_head×sz&NNTPv1v2TestsMixin._check_article_headcCsH| t|ƒd¡| |dd…¡| |dd…¡| |dd¡dS)NrNrfrjrk)rr!rormrlr 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)r[r rXr+r*rúr ) rrhrrpr(r)rqr+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)r[r ó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¹rrhrÚgetvaluerrÚasciirò©rrÒrrsr\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/r[r rXr1r0rrqr ) rrprror(r)rqr+r,rrr r rÚ test_heads*               ,zNNTPv1v2TestsMixin.test_headcCsŒt ¡}|jj|d\}}| |d¡|\}}}| |d¡| |d¡| |g¡| ¡}| | d¡t|ƒ¡|  |  d¡t|ƒ¡dS)Nrur/r[r rvrw) r¶r¹rrprrxrrryr¢ròrzr 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) Nr4r[r rXr6r5rrqr ) rrrrrmr(r)rqr+r,rrr r rÚ test_bodyAs*               ,zNNTPv1v2TestsMixin.test_bodycCsŒt ¡}|jj|d\}}| |d¡|\}}}| |d¡| |d¡| |g¡| ¡}| | d¡t|ƒ¡|  |  d¡t|ƒ¡dS)Nrur4r[r rvrw) r¶r¹rrrrrxr¢rryrròrzr 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 rnré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)rPrRr1rQrNrOrSÚxrefrcrrzrRõ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€é;)rrYr„©rrrƒr r rr]…szNNTPv1v2TestsMixin.test_xovercCs |j d¡\}}| ||¡dS)N)r€r…)rr`r„r†r r rrb‰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_rfrðs-- Signed by André. rió rjs ..Here is a dot-starting line. rs(From: "Demo User" )r¼r"rr!rlr 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)NrcSst|jddƒS)NT©Úkeepends©Úiterrþ©rÈr r rÚ iterlinesÀsz6NNTPv1v2TestsMixin.check_post_ihave..iterlinescSst|jddƒS)NFrr’r”r r rr•Ås)rrgrÚ 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)Nr Fr) r—rrŽr¼rår(r)rqrŠ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)rqrŠrr+r,r˜r r rÚ test_ihaveÒs ÿ. ÿzNNTPv1v2TestsMixin.test_ihavecCs.t dddddd¡}| tj|jjd|¡dS)NrMrcrNrr)r0r(r)Ú NNTPDataErrorrrg)rr3r r rÚtest_too_long_linesÚs ÿz&NNTPv1v2TestsMixin.test_too_long_lines)%rr r rÙrrLrMrSrr%rZr^r_r>rArJrhrmrorprtr{r|r}r~rr„r]rbrŠrˆrr—r™ršrœrár r rÛrrGMsD   ÿ  rGc@s eZdZdZdZeZdd„ZdS)Ú NNTPv1Testsz*Tests an NNTP v1 server (no capabilities).rccCs:|j ¡}| |i¡| |jjd¡| |jjd¡dS)Nrc©rr|rr{Znntp_implementation©rrxr r rÚ test_capsæs  zNNTPv1Tests.test_capsN)rr r r r{rãrÞr r r r rràsrc@s eZdZdZdZeZdd„ZdS)Ú NNTPv2Testsz,Tests an NNTP v2 server (with capabilities).rzc CsZ|j ¡}| |ddgddgdgggd¢gggdœ¡| |jjd¡| |jjd ¡dS) NÚ2Ú3ZINNz2.5.1ZUSER)rz ACTIVE.TIMESz DISTRIB.PATSZHEADERSrrv)ÚVERSIONZIMPLEMENTATIONrHZHDRruZOVERZPOSTÚREADERrnz INN 2.5.1ržrŸr r rr ós ÷ zNNTPv2Tests.test_capsN)rr r r r{r;rÞr r r r rr¡ísr¡c@s eZdZdZdZeZdd„ZdS)ÚCapsAfterLoginNNTPv2TestszCTests a probably NNTP v2 server with capabilities only after login.rzcCs2| |jji¡|j dd¡| d|jj¡dS)NrIrJr¤)rrrKr‚r<r8r r rÚtest_caps_only_after_login sz4CapsAfterLoginNNTPv2Tests.test_caps_only_after_loginN)rr r r r{rBrÞr§r r r rr¦sr¦c@s eZdZdZdZeZdd„ZdS)ÚSendReaderNNTPv2TestszoSame tests as for v2 but we tell NTTP to send MODE READER to a server that isn't in READER mode by default.rzcCs| d|jj¡dS)Nr¥)r<rrKr8r r rÚ(test_we_are_in_reader_mode_after_connectsz>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connectN)rr r r r{rCrÞr©r r r rr¨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Èr8r rÚgivessz+MiscTests.test_decode_header..givesr:za 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 r8rÚ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:rOrS)rRrPr1rQrNrOrS)r°r±r²r³r´úBytes:úLines:)zsubject:zFROM:zDaTe:z message-ID:r´zBYTES:r¶) r°r±r²r³r´rOrSú Xref:fullzDistribution:full) rRrPr1rQrNrOrSrZ distribution) r°r±r²r³r´rµr¶z Xref:FULLzDistribution:FULL)r°r±r²r³r´rµr¶r·©rRrPr1rQrNrOrSr)rr)Z_parse_overview_fmtrlr 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:3000363rXzI 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: rNú r:)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_datetimer0)r¬rÈÚcr8r rr­…sÿz,MiscTests.test_parse_datetime..givesZ19990623135624éÏrTércé8éÚ19990623Ú135624Ú990623Z090623iÙr r®r r8rÚ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¡dSrD©r0rr)Ú_unparse_datetime© ÚyÚMÚdÚhrVÚsrrr3r8r rr­’s ÿÿz.MiscTests.test_unparse_datetime..givesr¾rTr¿rcrÀrÁrÂrÃéÐZ20000623rMrBrcrzrnZ20100605Ú010203cs@t |||¡}ˆ t |¡||f¡ˆ t |d¡||f¡dSrD©r0r1rr)rÇ©rÉrÊrËrrr3r8r rr­œs ÿÿÚ000000r r®r r8rÚ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Èr8r rr­©sÿz5MiscTests.test_unparse_datetime_legacy..givesr¾rTr¿rcrÀrÁrÄrÃrÎZ000623rMrBrcrzrnZ100605rÏcs*t |||¡}ˆ t |d¡||f¡dSr¿rÐrÑr8r rr­±sÿrÒr r®r r8rÚtest_unparse_datetime_legacy¦s  z&MiscTests.test_unparse_datetime_legacyr°cCs| ttdƒ¡dS)Nr³)rršr)r8r r rÚtest_ssl_support¹szMiscTests.test_ssl_supportN) rr r r¯r¹r¼rÅrÓrÔr¥Ú skipUnlessÚsslrÕr r r rrªs(.  rªc@seZdZdZdd„ZdS)ÚPublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsD| ttdƒ¡gd¢}tdur*| d¡| ttjƒt|ƒ¡dS)NÚ__all__)rrÚNNTPReplyErrorrqr*Ú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 rrؾsrØc@sHeZdZdZejZddd„Zdd„Zdd„Z d d „Z d d „Z d d„Z dS)ÚMockSocketTestszaTests involving a mock socket object Used where the _NNTPServerIO file object is not enough.Nc 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 r8)Ú socket_closedr rrÔÛ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 rráÚs ráFznntplib.socketÚdummy)r~r)rZassertRaisesRegexÚ nntp_classrrR)rrÞZexpected_error_typeZexpected_error_msgr‚rrã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 rrí÷srí)rãrër)rqrrî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 rríþ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| ˆ¡dSrrr8©Zcapabilities_responser rr>szJMockSocketTests.test_bad_capabilities..Handler.handle_CAPABILITIESN)rr r r>r ròr rrí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 rr:szCMockSocketTests.test_login_aborted..Handler.handle_AUTHINFON)rr r r:r rôr rrísríz503 Mechanism not recognized)rãrër)r*)rr‚rrír rôrÚtest_login_aborted sþz"MockSocketTests.test_login_aborted)NN) rr r r r)rrêrërïrðrñrórõr r r rrÞÊsý  rÞc@seZdZdZdd„ZdS)Úbypass_contextz'Bypass encryption and actual SSL modulecKs|Srr )Úsockrßr r rÚ wrap_socketszbypass_context.wrap_socketN)rr r r rør r r rrösröc@seZdZedd„ƒZdS)Ú MockSslTestscOstj|dti|¤ŽS)NZ ssl_context)r)r³rö)rÆÚkwr r rrêszMockSslTests.nntp_classN)rr r Ú staticmethodrêr r r rrù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 backgroundraZ addCleanuprýrZHOSTÚ __enter__ÚnntpÚ__exit__)rr÷Úportr r rrÙ%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?ÚcleanuprFrùÚcontextr r rr1s2*   ÿ  ÿ  zLocalServerTests.run_serverr°cCs`|jj}|jj}|j ¡| ||jj¡| ||jj¡| |jjtj¡| t |jj¡dSr) rr™r÷ZstarttlsZassertNotEqualr2r×Z SSLSocketr(r–)rr™r÷r r rr´Qs zLocalServerTests.test_starttlsN) rr r rÙrr¥rÖr×r´r r r rrü$s  rüÚ__main__)=r¶rår0rû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;rBrCrGrr¡r¦r¨rªrØrÞrörùrürÚmainr r r rÚs~          , G   ÿ # N <