a ze@sddlZddlZddlZddlZddlZddlZddlZddlZddlZ ddl Z ddl Z ddl m Z ddlmZddlmZmZddlmZz ddlZWneydZYn0e je jedZedurejZnGdddeZGd d d ZeefZ edure ej!f7Z Gd d d eej"Z#e$ed Gddde#Z%Gdddej&Z'ddZ(GdddejZ)GdddZ*Gddde*Z+GdddZ,Gddde,Z-Gddde-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"Z6Gd0d1d1ej"Z7Gd2d3d3Z8e$ed Gd4d5d5e7Z9Gd6d7d7ej"Z:e;d8kre<dS)9N)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__reasonr r E/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_nntplib.pyrsrc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZeddddZddZd1d d!Zedd"d#d$Zd%d&Zd'd(Zd)d*Zed+d,Zd-d.Zd/d0ZdS)2NetworkedNNTPTestsMixincCs|j}|tt|dSN)serverZ getwelcome assertEqualstrtype)selfwelcomer r r test_welcome(s z$NetworkedNNTPTestsMixin.test_welcomecCs>|j\}}||d||D]}|tt|q$dS)Nz100 )rhelp assertTrue startswithrrr)rresplinesliner r r test_help,sz!NetworkedNNTPTestsMixin.test_helpcCsH|j\}}t|dkrD|tt|d|tt|djdSNr)rlistlenrrrrgrouprrgroupsr r r test_list2s z!NetworkedNNTPTestsMixin.test_listcCsL|j|j\}}t|dkrH|tt|d|tt|djdSr) rr GROUP_PATr!rrrrr"r#r r rtest_list_active8s z(NetworkedNNTPTestsMixin.test_list_activecCsV|tj}|jdWdn1s.0Y|jj}||d|dS)NZXYZZYz500 ) assertRaisesnntplibNNTPPermanentErrorrZ _shortcmd exceptionresponserr)rcmrr r rtest_unknown_command>s*z,NetworkedNNTPTestsMixin.test_unknown_commandcCsXtjtjdd}|j|\}}t|dkrT||dt||dj t dS)N)Zdaysr) datetimedateZtodayZ timedeltarZ newgroupsr!assertIsInstancerr"r)rdtrr$r r rtest_newgroupsDs  z&NetworkedNNTPTestsMixin.test_newgroupscsbfdd}jj}||j|jj}||jd}|ddS)Ncs|tj|dSr)r2r assertNotIn GROUP_NAME)descrr r _check_descNs z=NetworkedNNTPTestsMixin.test_description.._check_descz zk.brrtt.baz)r descriptionr6assertInDESCr&r)rr9r7r r8rtest_descriptionMs  z(NetworkedNNTPTestsMixin.test_descriptioncCs^|j|j\}}||dp(|d|||t||j}|||j |jdS)Nz215 z282 ) r descriptionsr&rrr2dictr6rr;)rrZdescsr7r r rtest_descriptions]s  z)NetworkedNNTPTestsMixin.test_descriptionscCs|j|j}|dt||\}}}}}|||j||t||t||t||||| d|dS)N211 ) rr"r6rr!r2intassertLessEqualrr)rresultrcountfirstlastr"r r r test_groupfs    z"NetworkedNNTPTestsMixin.test_groupcCs<|j\}}||tj||jd||jddS)Nii)rr1r2r0assertGreaterEqualZyearrErrr1r r r test_dateqsz!NetworkedNNTPTestsMixin.test_datecCsF||t||hd|D]}||ttdfq(dS)N>:lines message-id references:bytesfromr1subject)r2r@rKkeysvaluesrr)rart_dictvr 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"r6xoverr!skipTestrKrErX) rrrGrHrInamerart_numrVr r r test_xovers    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"r6overrXrKrE) rrrGrHrIr[startrr\rVr r r test_overs     z!NetworkedNNTPTestsMixin.test_overcCsL|j|j\}}}}}|jd|\}}|D]}|tt|dq.dS)NrS)rr"r6Zxhdrrrr)rrrGrHrIr[rrr r r test_xhdrsz!NetworkedNNTPTestsMixin.test_xhdrNcCsR||tj|dur$||j||jD]}||tq*||jdddS)Nr_).s. . )r2r)Z ArticleInforZnumberrbytesr5)rrarticler\rr r rcheck_article_resps  z*NetworkedNNTPTestsMixin.check_article_respzFIXME: see bpo-32128c s\|j|j\}}}}}|||dfD]^}z|j|\}}Wn@tjy~}z&|jds^WYd}~q&WYd}~n d}~00qq&|d| |d|| ||||j |\}} | |d|| || ||j |\}} | |d|| || |ddfd d |j D} fd d | j D} || | d g| j dS) Nrcz423 z(could not find a suitable article numberz221 z222 z220 cSs |dS)Ns X-Antivirus)r)rr r rz@NetworkedNNTPTestsMixin.test_article_head_body..csg|]}|s|qSr r .0rZ blacklistr r szBNetworkedNNTPTestsMixin.test_article_head_body..csg|]}|s|qSr r rlrnr rrosrk)rr"r6headr)NNTPTemporaryErrorr,rrZrribodyrhrr) rrrGrHrIr[r\rperrrhZfiltered_head_linesZfiltered_linesr rnrtest_article_head_bodys, " z.NetworkedNNTPTestsMixin.test_article_head_bodycsDfdd}jjd|jj\}}||dS)Ncs(|d}|ttfd|dS)NLIST OVERVIEW.FMT)r2r tupler<)capsZ caps_listr8r r _check_capssz>NetworkedNNTPTestsMixin.test_capabilities.._check_caps)rKr nntp_versiongetcapabilitiesZ capabilities)rryrrxr r8rtest_capabilitiess  z)NetworkedNNTPTestsMixin.test_capabilitiescCs&d}d}|jtj|jj||dddS)NZ notarealuserZnotarealpasswordF)userpasswordusenetrc)r(r) NNTPErrorrlogin)rZbaduserZbadpwr r r test_zlogins z#NetworkedNNTPTestsMixin.test_zlogincCs*t|}z|jWd|_nd|_0dSr)rrquit)rclsr r r test_zzquits z#NetworkedNNTPTestsMixin.test_zzquitcCsJdd}t|D]4}|ds qt||}t|s4qt||||qdS)Ncstfdd}|S)Ncs8t|j|Wdn1s*0YdSr)rtransient_internet NNTP_HOSTr8methr rwrappedszHNetworkedNNTPTestsMixin.wrap_methods..wrap_meth..wrapped) functoolswraps)rrr rr wrap_methsz7NetworkedNNTPTestsMixin.wrap_methods..wrap_methZtest_)dirrgetattrcallablesetattr)rrr[rr r r wrap_methodss   z$NetworkedNNTPTestsMixin.wrap_methodscCs@|t"|j|jdddWdn1s20YdS)NrFtimeoutr)r( ValueError NNTP_CLASSrr8r r r test_timeouts z$NetworkedNNTPTestsMixin.test_timeoutc sfdd}z|j|jtjdd*|||Wdn1sV0Y|||j|jtjddWdn1s0Y||WnNty}z4t d|j rt d|d|jWYd}~n d}~00dS)Nc s8tdsdSz Wnttfy2YdS0dS)NfileFT)hasattrrOSErrorEOFErrorr rr r is_connected s  zANetworkedNNTPTestsMixin.test_with_statement..is_connectedFr(?i)KEY.TOO.SMALLzGot  connecting to )rrrINTERNET_TIMEOUTrr assertFalserrresearchr unittestSkipTest)rrssl_errr rrtest_with_statement s.  , & z+NetworkedNNTPTestsMixin.test_with_statement)N)rr r rrr%r'r.r4r>rArJrMrXr]rZskipIfrbrdrirtr}rr classmethodrrrr r r rr&s2          rc@s8eZdZdZdZdZdZeZe ddZ e ddZ d S) NetworkedNNTPTestsznews.trigofacile.comfr.comp.lang.pythonzfr.comp.lang.*Pythonc Cstdt|jz|j|jtjdd|_Wnvty}z8t d|j rlt |d|d|jWYd}~n0d}~0tyt |d|jYn0Wdn1s0YdS)NZnetworkFrrz got rz got EOF error on connecting to )rZrequiresrrrrrrrrrr rr EOF_ERRORS)rrr r r setUpClass<s"    zNetworkedNNTPTests.setUpClasscCs|jdur|jdSr)rr)rr r r tearDownClassNs z NetworkedNNTPTests.tearDownClassN) rr r rr6r&r=rrrrrr r r rr3s rrequires SSL supportc@s0eZdZdZdZdZdZeeddZ dZ dZ dS)NetworkedNNTP_SSLTestsz nntp.aioe.orgz aioe.testzaioe.*testNNTP_SSLN) rr r rr6r&r=rr)rr% test_starttlsr r r rrSs rc@s@eZdZdZddZddZddZdd Zd d Zd d Z dS) _NNTPServerIOzA 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__BytesIOc2ss2chandlerrareadline push_data)rrr r rrss    z_NNTPServerIO.__init__cCsdSNTr r8r r rreadable|sz_NNTPServerIO.readablecCsdSrr r8r r rwritablesz_NNTPServerIO.writablecCs4|j}|jdd|j||j|dS)z.Push (buffer) some data to send to the client.rrzN)rtellseekwrite)rdataposr r rrs  z_NNTPServerIO.push_datacCs4|j}|j||j||jt|S)zThe client sends us some data)rrrrrprocess_pendingr!)rbrr r rrs     z_NNTPServerIO.writecCs2|j|jt|}t|}||d|<|S)z#The client wants to read a responseN)rrrreadr!)rbufrnr r rreadintos   z_NNTPServerIO.readintoN) rr r r rrrrrrr r r rrns rcCst|}t||}||fSr)rrBufferedRWPair)rsiorr r rmake_mock_files rc@seZdZdddZddZdS) NNTPServerNcCs||_||_||dSr)rhostZ _base_init)rfr readermoder r rrszNNTPServer.__init__cCs|j|`dSr)rcloser8r r r_closes zNNTPServer._close)N)rr r rrr r r rrs rcs4eZdZdZfddZfddZddZZS)MockedNNTPTestsMixinNcst|dSrsupersetUp make_serverr8 __class__r rrs zMockedNNTPTestsMixin.setUpcst|`dSr)rtearDownrr8rr rrs zMockedNNTPTestsMixin.tearDowncOs:||_t|j\|_}t|dg|Ri||_|jS)Nz test.server) handler_classrrrrr)rargskwargsrr r rrs z MockedNNTPTestsMixin.make_server)rr r rrrr __classcell__r r rrrs  rcseZdZfddZZS)MockedNNTPWithReaderModeMixincst|jdddS)NT)rrr8rr rrs z#MockedNNTPWithReaderModeMixin.setUp)rr r rrr r rrrsrc@seZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZddZddZd8ddZddZd d!Zd9d"d#Zd$d%Zd&d'Zdd(d)d*Zdd(d+d,Zd-Zd.Zed/eZd:d0d1Zd;d2d3Zd date help Report problems to .rr8r r r handle_HELP szNNTPv1Handler.handle_HELPNcCsJ|dur|dn2|dkr(|dn|dkr<|dn |ddS)N412 No newsgroup selected3000234"223 3000234 <45223423@example.com><45223423@example.com>223 0 <45223423@example.com>430 No Such Article FoundrrZ message_specr r r handle_STAT)s   zNNTPv1Handler.handle_STATcCs|ddS)N*223 3000237 <668929@example.org> retrievedrr8r r r handle_NEXT3szNNTPv1Handler.handle_NEXTcCs|ddS)N,223 3000234 <45223423@example.com> retrievedrr8r r r handle_LAST6szNNTPv1Handler.handle_LASTcCs|dur|dn|dkr<|dkr0|dq|dnZ|dkrP|dnF|dkr|d krl|d q|d kr|d q|d n |ddS)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 . NEWSGROUPScomp.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)ractionZparamr r r handle_LIST9s       zNNTPv1Handler.handle_LISTcCs|dkr$|dkr$|dkr$|dnZ|dkrH|dkrH|dkrH|dn6|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_strtime_strr r rhandle_NEWNEWSos"   zNNTPv1Handler.handle_NEWNEWScCs"|dkr|dn |ddS)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_XOVERs zNNTPv1Handler.handle_XOVER)rrcCsB|dur.|jr"|d|q>|dn|d||_dS)Nz+340 Input article; end with .440 Posting not permitted240 Article received OKrrr posted_body)rrrr r r handle_POSTs    zNNTPv1Handler.handle_POSTcCsJ|dur6|jr*|dkr*|d|qF|dn|d||_dS)N+z%335 Send it; end with .435 Article not wanted235 Article transferred OKr!)r message_idrrr r r handle_IHAVEs    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|dn6|dkr(|dn"|dkr<|dn|ddS||j|ddS)N"220 3000237 <45223423@example.com>r 220 0 <45223423@example.com>r "220 3000234 <45223423@example.com>r .)rsample_articlerr r rhandle_ARTICLEs     zNNTPv1Handler.handle_ARTICLEcCsd|dur|dn6|dkr(|dn"|dkr<|dn|ddS||j|ddS)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_HEADs     zNNTPv1Handler.handle_HEADcCsd|dur|dn6|dkr(|dn"|dkr<|dn|ddS||j|ddS)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_BODYs     zNNTPv1Handler.handle_BODYcCsj|jr|dnT|dkr>|jr,|dqf|dd|_n(|dkrX|dd|_ntd|dS) Nz502 Already Logged Inr~z 482 User Credential Already Sentz381 Password RequiredTpassz281 Login SuccessfulzUnknown cred type {})rrrrr)rZ cred_typerr r rhandle_AUTHINFOs    zNNTPv1Handler.handle_AUTHINFO)N)NN)N)N)N) rr r r rrarrrrrrrrrrrrrrrrrr#r(r2r7r-r.r3r8r:r r r rrs: &  6     rc@s*eZdZdZddZddZd ddZdS) NNTPv2Handlerz"A handler for RFC 3977 (NNTP "v2")cCs0d}|js||dn||ddS)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:)rrrrfmtr r rhandle_CAPABILITIESs z!NNTPv2Handler.handle_CAPABILITIEScCs tddS)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 eZdZdZfddZZS)CapsAfterLoginNNTPv2Handlerz3A handler that allows CAPABILITIES only after logincs |js|dn tdS)Nz480 You must log in.)rrrr>r8rr rr>*s z/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES)rr r r r>rr r rrrB'srBc@s(eZdZdZddZddZddZdS) ModeSwitchingNNTPv2Handlerz$A server that starts in transit modecCs d|_dSNF) _switchedr8r r rr4sz#ModeSwitchingNNTPv2Handler.__init__cCs0d}|jr||dn||ddS)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-)rErrr<r r rr>7s z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIEScCsd|_|ddS)NTz200 Posting allowed)rEr)rZwhatr r rr@Gsz&ModeSwitchingNNTPv2Handler.handle_MODEN)rr r r rr>r@r r r rrC1srCcseZdZfddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5Zd6d7Zd8d9Zd:d;Z dd?Z"d@dAZ#Z$S)BNNTPv1v2TestsMixincstdSr)rrr8rr rrOszNNTPv1v2TestsMixin.setUpcCs||jj|jjdSr)rrrrr8r r rrRszNNTPv1v2TestsMixin.test_welcomecCs<|jdkr|d|jj|jdd|d|jjdS)NrzAUTHINFOtestusertestpw)r{r<r_capsrr5r8r r r test_authinfoUs z NNTPv1v2TestsMixin.test_authinfoc Cs:|j\}}||d||tdddddddS)Nr r 7)rr1rr0rLr r rrM]s zNNTPv1v2TestsMixin.test_datecCs6||jj|j}||d||jjdSr)rrclosedrrrr)rrr r r test_quitbs  zNNTPv1v2TestsMixin.test_quitcCs.|j\}}||d||gddS)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|jd\}}|t|d|d }||td d d ddS) Nrccomp.lang.python.announceZ 0000001153Z 0000000993mrrzrz!gmane.comp.python.distutils.develZ 0000014104Z 0000000001)rr rr!r)rrr$gr r rr%rs zNNTPv1v2TestsMixin.test_listcCs|jd\}}}||d||d||d|jd\}}}||d||d||d|tj}|jdWdn1s0Y||jjd|tj}|jWdn1s0Y||jjddS) N-r r r rzr r)rstatrr(r)rqr+r,)rrr\r'r-r r r test_stats      *(zNNTPv1v2TestsMixin.test_statcCs8|j\}}}||d||d||ddS)Nr-z<668929@example.org>)rnextrrrr\r'r r r test_nexts  zNNTPv1v2TestsMixin.test_nextcCs8|j\}}}||d||d||ddS)NrrWr )rrIrr\r r r test_lasts  zNNTPv1v2TestsMixin.test_lastcCs4|jd}||d|jd}||ddS)NrThe Python computer language.comp.lang.pythonxr:)rr;r)rr7r r rr>s   z#NNTPv1v2TestsMixin.test_descriptioncCsn|jd\}}||d||ddi|jd\}}||ddd|jd\}}||idS)Nrz-215 Descriptions in form "group description".r_rz4Announcements about the Python language. (Moderated))rrTr`)rr?rr#r r rrAs z$NNTPv1v2TestsMixin.test_descriptionscCs|jd\}}}}}||d|||d||d||d||d|tj}|jdWdn1s0Y|j}||j d|j dS)NrrCiiizcomp.lang.python.develz411 No such group) rr"rrrr(r)rqr+r,)rrrGrHrIr"r-excr r rrJs    *zNNTPv1v2TestsMixin.test_groupcCstdddddd}|jd|\}}d|j}|||||d d gtdddddd}|jd |\}}||d ||gdS) NrLrM rzS230 list of newsarticles (NNTP v{0}) created after Mon Sep 13 08:20:04 2010 followszBzBrz)230 An empty list of newsarticles follows)r0rnewnewsrr{r)rr3rZidsZexpectedr r r test_newnewss  zNNTPv1v2TestsMixin.test_newnewscCsZ|t|d||ddd||dd||dd||d d dS) Nrer_ru-- Signed by André.rrks.Here is a dot-starting line.sThis is just a test article.)rr!decoderrr r r_check_article_bodys z&NNTPv1v2TestsMixin._check_article_bodycCs4|t|d||dd||dddS)Nrers&From: "Demo User" s7Message-ID: )rr!rkr r r_check_article_headsz&NNTPv1v2TestsMixin._check_article_headcCsH|t|d||dd||dd||dddS)NrMrerirk)rr!rnrlrkr r r_check_article_datasz&NNTPv1v2TestsMixin._check_article_datacCs$|j\}}||d|\}}}||d||d|||jd\}}||d|\}}}||d||d|||jd\}}||d|\}}}||d||d|||tj}|jdWdn1s0Y||jjd dS) Nr)rZr rWr+r*rr ) rrhrror(r)rqr+r,rrinfor\r'rr-r r r test_articles*               ,zNNTPv1v2TestsMixin.test_articlecCst}|jj|d\}}||d|\}}}||d||d||g|}||dt||| dt|dS)Nrr)rZr 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é. ) rrrrhrgetvaluerrasciirrrrrrr\r'rrr r rtest_article_files$     z$NNTPv1v2TestsMixin.test_article_filecCs$|j\}}||d|\}}}||d||d|||jd\}}||d|\}}}||d||d|||jd\}}||d|\}}}||d||d|||tj}|jdWdn1s0Y||jjd dS) Nr/rZr rWr1r0rrpr ) rrprrnr(r)rqr+r,rqr r r test_heads*               ,zNNTPv1v2TestsMixin.test_headcCst}|jj|d\}}||d|\}}}||d||d||g|}||dt|| | dt|dS)Nrtr/rZr rurv) rrrrprrwrrrxrrryr r rtest_head_file-s$     z!NNTPv1v2TestsMixin.test_head_filecCs$|j\}}||d|\}}}||d||d|||jd\}}||d|\}}}||d||d|||jd\}}||d|\}}}||d||d|||tj}|jdWdn1s0Y||jjd dS) Nr4rZr rWr6r5rrpr ) rrrrrlr(r)rqr+r,rqr r r test_bodyAs*               ,zNNTPv1v2TestsMixin.test_bodycCst}|jj|d\}}||d|\}}}||d||d||g|}||dt|| | dt|dS)Nrtr4rZr rurv) rrrrrrrwrrrxrrryr r rtest_body_file\s$     z!NNTPv1v2TestsMixin.test_body_filec Cs||d||t|d|d\}}||d||ddddd d d d d |d\}}||dd|d\}}||dddS)Nz224 rmr9zEDoug 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)rRrSr1rOrPrQrNxrefrcrrzrS0Re: Message d'erreur incompréhensible (par moi))rrrr!)rr overviewsr\r`r r rcheck_over_xover_respps(     z(NNTPv1v2TestsMixin.check_over_xover_respcCs"|jdd\}}|||dS)Nr;)rrYrrrrr r rr]szNNTPv1v2TestsMixin.test_xovercCs |jd\}}|||dS)N)rr)rr`rrr r rrbszNNTPv1v2TestsMixin.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_rfrs-- Signed by André. rh ris ..Here is a dot-starting line. rs(From: "Demo User" )rr"rr!rkr r r_check_posted_bodysz%NNTPv1v2TestsMixin._check_posted_bodycGsd|j}|||f}d|j_||}||jdd}|||f}d|j_||}||S)Nr ) sample_postrr"rreplace)rfunc file_factoryrpostZ func_argsrr r r_check_post_ihave_subsz(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|jddS)NTkeependsiterrrr r r iterlinessz6NNTPv1v2TestsMixin.check_post_ihave..iterlinescSst|jddS)NFrrrr r rrs)rrgr bytearrayrr)rrZ success_resprrrr r rcheck_post_ihaves    z#NNTPv1v2TestsMixin.check_post_ihavecCsf||jjdd|j_|tj}|j|jWdn1sH0Y| |j j ddS)Nr Fr) rrrrrr(r)rqrrr+r,rr-r r r test_posts, zNNTPv1v2TestsMixin.test_postcCsb||jjdd|tj }|jd|jWdn1sD0Y||jj ddS)Nr&r$zr%) rrZihaver(r)rqrrr+r,rr r r test_ihaves . zNNTPv1v2TestsMixin.test_ihavecCs.tdddddd}|tj|jjd|dS)NrLrcrMrr)r0r(r) NNTPDataErrorrrf)rr3r r rtest_too_long_liness z&NNTPv1v2TestsMixin.test_too_long_lines)%rr r rrrKrMrRrr%rYr]r^r>rArJrgrlrnrorsrzr{r|r}r~rr]rbrrrrrrrrr r rrrFMsD     rFc@s eZdZdZdZeZddZdS) NNTPv1Testsz*Tests an NNTP v1 server (no capabilities).rccCs:|j}||i||jjd||jjddS)Nrcrr|rr{Znntp_implementationrrxr r r test_capss  zNNTPv1Tests.test_capsN)rr r r r{rrrr r r rrsrc@s eZdZdZdZeZddZdS) NNTPv2Testsz,Tests an NNTP v2 server (with capabilities).rzc CsZ|j}||ddgddgdgggdgggd||jjd||jjd dS) N23ZINNz2.5.1ZUSER)rz ACTIVE.TIMESz DISTRIB.PATSZHEADERSrrv)VERSIONZIMPLEMENTATIONrGZHDRruZOVERZPOSTREADERrmz INN 2.5.1rrr r rrs  zNNTPv2Tests.test_capsN)rr r r r{r;rrr r r rrsrc@s eZdZdZdZeZddZdS)CapsAfterLoginNNTPv2TestszCTests a probably NNTP v2 server with capabilities only after login.rzcCs2||jji|jdd|d|jjdS)NrHrIr)rrrJrr<r8r r rtest_caps_only_after_login sz4CapsAfterLoginNNTPv2Tests.test_caps_only_after_loginN)rr r r r{rBrrr r r rrsrc@s eZdZdZdZeZddZdS)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|jjdS)Nr)r<rrJr8r r r(test_we_are_in_reader_mode_after_connectsz>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connectN)rr r r r{rCrrr r r rrsrc@sPeZdZddZddZddZddZd d Zd d Ze e d ddZ dS) MiscTestscsVfdd}|dd|dd|dd|dd|dd |d d |d d dS) Ncst||dSr)rr) decode_header)arr8r rgivessz+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 matricerr rrr r8rtest_decode_headers     zMiscTests.test_decode_headercCsgd}|t|gdgd}|t|gdgd}|t|gdgd}|t|gdgd}|t|gdgd}|t|gd dS) N)Subject:From:Date: Message-ID: References:rQrN)rSrRr1rOrPrQrN)rrrrrBytes:Lines:)zsubject:zFROM:zDaTe:z message-ID:rzBYTES:r) rrrrrrQrN Xref:fullzDistribution:full) rSrRr1rOrPrQrNrZ distribution) rrrrrrrz Xref:FULLzDistribution:FULL)rrrrrrrrrSrRr1rOrPrQrNr)rr)Z_parse_overview_fmtrkr r rtest_parse_overview_fmt.s0      z!MiscTests.test_parse_overview_fmtc Cstjdg}dg}t||}|\\}}||d||dddddd d d d d g}t||}|\\}}||dddg}t||}|\\}}||dd||dddS)Nrz3000234 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:3000363rWzI am just a test articlez "Demo User" z6 Oct 1998 04:38:40 -0500r z<45454@example.net>Z1234Z17z"news.example.com misc.test:3000363rz3000234 I am just a test article "Demo User" 6 Oct 1998 04:38:40 -0500 <45223423@example.com> <45454@example.net> 1234 17 z3000234 I am just a test article "Demo User" 6 Oct 1998 04:38:40 -0500 <45223423@example.com> 1234 17 Xref: rP r:)r)Z_DEFAULT_OVERVIEW_FMTZ_parse_overviewr)rr=rZoverviewr\fieldsr r rtest_parse_overviewVs6         zMiscTests.test_parse_overviewc shfdd}|dddddddd |d d dddddd |d d dddddd |d d dddddd dS)Ncst||tj|dSr)rr)Z_parse_datetimer0)rrcr8r rrsz,MiscTests.test_parse_datetime..givesZ19990623135624rSrb819990623135624990623Z090623ir rr r8rtest_parse_datetimes  zMiscTests.test_parse_datetimec sfdd}|ddddddd d |d dddddd d |d dddddddfdd}|dddd d|d ddd d|d dddddS)Nc sFt||||||}t|||ft|d||fdSrDr0rr)_unparse_datetime yMdhrUsrrr3r8r rrs z.MiscTests.test_unparse_datetime..givesrrSrrbrrrrZ20000623rLrBrcrzrmZ20100605010203cs@t|||}t|||ft|d||fdSrDr0r1rr)rrrrrrr3r8r rrs 000000r rr r8rtest_unparse_datetimes  zMiscTests.test_unparse_datetimec sfdd}|ddddddd d |d dddddd d |d dddddddfdd}|dddd d|d ddd d|d dddddS)Nc s0t||||||}t|d||fdSrrrr8r rrsz5MiscTests.test_unparse_datetime_legacy..givesrrSrrbrrrrrZ000623rLrBrcrzrmZ100605rcs*t|||}t|d||fdSrrrr8r rrsrr rr r8rtest_unparse_datetime_legacys  z&MiscTests.test_unparse_datetime_legacyrcCs|ttddS)Nr)rrr)r8r r rtest_ssl_supportszMiscTests.test_ssl_supportN) rr r rrrrrrr skipUnlesssslrr r r rrs(.  rc@seZdZdZddZdS)PublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsD|ttdgd}tdur*|d|ttjt|dS)N__all__)rrNNTPReplyErrorrqr*NNTPProtocolErrorrrr)rrr)rrrsetr)rZ target_apir r rtest_module_all_attributes  z(PublicAPITests.test_module_all_attributeN)rr r r rr r r rrsrc@sHeZdZdZejZdddZddZddZ d d Z d d Z d dZ dS)MockSocketTestszaTests involving a mock socket object Used where the _NNTPServerIO file object is not enough.Nc sGfddd}Gfddddgtd|L||| |jd||dWdn1sn0YWdn1s0Y|D]}||jqdS) NcseZdZfddZdS)zNMockSocketTests.check_constructor_error_conditions..mock_socket_modulecsSrr )addressr MockSocketr rcreate_connectionsz`MockSocketTests.check_constructor_error_conditions..mock_socket_module.create_connectionN)rr r rr rr rmock_socket_modulesrcs&eZdZfddZfddZdS)zFMockSocketTests.check_constructor_error_conditions..MockSocketcsddSrr r8) socket_closedr rrszLMockSocketTests.check_constructor_error_conditions..MockSocket.closecs }t|\}}||Sr)rr)socketmoderr?r)filesrr rmakefiles  zOMockSocketTests.check_constructor_error_conditions..MockSocket.makefileN)rr r rrr )rrrr rrs rFznntplib.socketdummy)r~r)rZassertRaisesRegex nntp_classrrQ)rrZexpected_error_typeZexpected_error_msgrrrrr )rrrrr"check_constructor_error_conditionss   L z2MockSocketTests.check_constructor_error_conditionscCs&Gdddt}||tj|jdS)Nc@seZdZdZdS)z1MockSocketTests.test_bad_welcome..Handlerz Bad WelcomeNrr r rr r r rHandlersr)rrr)rrrrr r rtest_bad_welcomes z MockSocketTests.test_bad_welcomecCs&Gdddt}||tj|jdS)Nc@seZdZdZdS)zEMockSocketTests.test_service_temporarily_unavailable..Handlerz#400 Service temporarily unavailableNrr r r rrsr)rrr)rqrrr r r$test_service_temporarily_unavailables z4MockSocketTests.test_service_temporarily_unavailablecCs&Gdddt}||tj|jdS)Nc@seZdZdZdS)zEMockSocketTests.test_service_permanently_unavailable..Handlerz#502 Service permanently unavailableNrr r r rrsr)rrr)r*rrr r r$test_service_permanently_unavailables z4MockSocketTests.test_service_permanently_unavailablecs,Gfdddt}d||tjdS)NcseZdZfddZdS)z6MockSocketTests.test_bad_capabilities..Handlercs|dSrrr8Zcapabilities_responser rr>szJMockSocketTests.test_bad_capabilities..Handler.handle_CAPABILITIESN)rr r r>r rr rrsrz201 bad capability)rrr)rrr rrtest_bad_capabilitiess z%MockSocketTests.test_bad_capabilitiescs8d}d}Gfdddt}d||tj||dS)Nzt@e.comZpythoncseZdZfddZdS)z3MockSocketTests.test_login_aborted..Handlercs|dSrr)rrZauthinfo_responser rr:szCMockSocketTests.test_login_aborted..Handler.handle_AUTHINFON)rr r r:r rr rrsrz503 Mechanism not recognized)rrr)r*)rrrrr rrtest_login_aborted sz"MockSocketTests.test_login_aborted)NN) rr r r r)rrrrrrrrr r r rrs  rc@seZdZdZddZdS)bypass_contextz'Bypass encryption and actual SSL modulecKs|Srr )sockrr r r wrap_socketszbypass_context.wrap_socketN)rr r r rr r r rrsrc@seZdZeddZdS) MockSslTestscOstj|dti|S)NZ ssl_context)r)rr)rkwr r rrszMockSslTests.nntp_classN)rr r staticmethodrr r r rrsrc@s0eZdZddZddZeedddZdS) LocalServerTestscCstt}t|}|tj|j|fd|_|j| |jj t tj |dd |_| |jjddddS)N)targetrF)r)rrZ bind_portlisten threadingThread run_serverZ backgroundraZ addCleanuprrZHOST __enter__nntp__exit__)rrportr r rr%s  zLocalServerTests.setUpcCs||\}}Wdn1s&0Yt}||||d}|d|}|dkrz|dq^|dkr||dt }| t |j |dd}||||d}q^|d kr|d qq^t d |q^Wdn1s 0YdS) Nrbs200 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_contextrsendallrrrZ SSLContextZload_cert_chaincertfilerrr)rrclientr?cleanupreaderrcontextr r rr1s2*       zLocalServerTests.run_serverrcCs`|jj}|jj}|j|||jj|||jj||jjtj|t |jjdSr) rrrZstarttlsZassertNotEqualr2rZ SSLSocketr(r)rrrr r rrQs zLocalServerTests.test_starttlsN) rr r rrrrrrr r r rr$s  r__main__)=rrr0rrrrr)Zos.pathosrrrrZ test.supportrrrZ unittest.mockrr ImportErrorpathrdirname__file__r rrrrrrZ SSLEOFErrorZTestCaserrrrrrrrrrr;rBrCrFrrrrrrrrrrrmainr r r rs~          , G    # N <