HEX
Server: Apache
System: Linux zacp120.webway.host 4.18.0-553.50.1.lve.el8.x86_64 #1 SMP Thu Apr 17 19:10:24 UTC 2025 x86_64
User: govancoz (1003)
PHP: 8.3.26
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: //usr/local/lib/python3.7/test/__pycache__/test_nntplib.cpython-37.pyc
B

��g��@s�ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZddl
mZmZddl
Z
ddlmZyddlZWnek
r�dZYnXdZej�ej�e�d�Zedk	r�ejZnGdd�de�ZGd	d
�d
�Ze��efZedk	�reej f7ZGdd�deej!�Z"e�#ed
�Gdd�de"��Z$Gdd�dej%�Z&dd�Z'Gdd�d�Z(Gdd�de(�Z)Gdd�d�Z*Gdd�de*�Z+Gdd�de+�Z,Gdd�de+�Z-Gd d!�d!�Z.Gd"d#�d#e.e(ej!�Z/Gd$d%�d%e.e(ej!�Z0Gd&d'�d'e(ej!�Z1Gd(d)�d)e)ej!�Z2Gd*d+�d+ej!�Z3Gd,d-�d-ej!�Z4Gd.d/�d/ej!�Z5Gd0d1�d1�Z6e�#ed
�Gd2d3�d3e5��Z7Gd4d5�d5ej!�Z8e9d6k�r�e�:�dS)7�N)�support)�NNTP�	GroupInfo)�patch�z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.7/test/test_nntplib.pyrsrc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Ze�dd�dd��Zdd�Zd/d d!�Ze�dd"�d#d$��Zd%d&�Zd'd(�Zd)d*�Zed+d,��Zd-d.�ZdS)0�NetworkedNNTPTestsMixincCs|j��}|�tt|��dS)N)�serverZ
getwelcome�assertEqual�str�type)�self�welcomer
r
r�test_welcome(s
z$NetworkedNNTPTestsMixin.test_welcomecCsB|j��\}}|�|�d�|�x|D]}|�tt|��q&WdS)Nz100 )r�help�
assertTrue�
startswithrrr)r�resp�lines�liner
r
r�	test_help,s
z!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��dS)Nr)	rr�	GROUP_PATrrrrrr )rrr!r
r
r�test_list_active8sz(NetworkedNNTPTestsMixin.test_list_activec	CsB|�tj��}|j�d�WdQRX|jj}|�|�d�|�dS)NZXYZZYz500 )	�assertRaises�nntplib�NNTPPermanentErrorrZ	_shortcmd�	exception�responserr)r�cmrr
r
r�test_unknown_command>sz,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|�dS)N)r/r�assertNotIn�
GROUP_NAME)�desc)rr
r�_check_descNsz=NetworkedNNTPTestsMixin.test_description.<locals>._check_desczzk.brrtt.baz�)r�descriptionr3�assertIn�DESCr#r)rr5r4r
)rr�test_descriptionMsz(NetworkedNNTPTestsMixin.test_descriptioncCs^|j�|j�\}}|�|�d�p(|�d�|�|�|t�||j}|�||j�	|j��dS)Nz215 z282 )
r�descriptionsr#rrr/�dictr3rr7)rrZdescsr4r
r
r�test_descriptions]s
z)NetworkedNNTPTestsMixin.test_descriptionscCs�|j�|j�}|�dt|��|\}}}}}|�||j�|�|t�|�|t�|�|t�|�||�|�|�	d�|�dS)N�z211 )
rr r3rrr/�int�assertLessEqualrr)r�resultr�count�first�lastr r
r
r�
test_groupfsz"NetworkedNNTPTestsMixin.test_groupcCs<|j��\}}|�|tj�|�|jd�|�|jd�dS)Ni�i�)rr.r/r-�assertGreaterEqualZyearr@)rrr.r
r
r�	test_dateqsz!NetworkedNNTPTestsMixin.test_datec
CsT|�|t�|�|��dddddddh�x$|��D]}|�|ttd�f�q4WdS)N�subject�fromr.z
message-id�
referencesz:bytesz:lines)r/r<rF�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)Nr>rzno articles retrieved)	rr r3�xoverr�skipTestrFr@rO)	rrrBrCrD�namer�art_numrMr
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 r3�overrOrFr@)
rrrBrCrDrR�startrrSrMr
r
r�	test_over�s
z!NetworkedNNTPTestsMixin.test_overcCsP|j�|j�\}}}}}|j�d|�\}}x |D]}|�tt|d��q0WdS)NrH�)rr r3Zxhdrrrr)rrrBrCrDrRrrr
r
r�	test_xhdr�s
z!NetworkedNNTPTestsMixin.test_xhdrNcCsV|�|tj�|dk	r$|�|j|�x|jD]}|�|t�q,W|�|jdd�dS)NrV)�.s.
s.
)r/r&ZArticleInforZnumberr�bytesr2)rr�articlerSrr
r
r�check_article_resp�sz*NetworkedNNTPTestsMixin.check_article_respzFIXME: see bpo-32128c
sR|j�|j�\}}}}}xl|||dfD]P}y|j�|�\}}Wn4tjk
rt}z|j�d�sb�w(Wdd}~XYnXPq(W|�d�|�	|�d�|�|�
|||�|j�|�\}}	|�	|�d�|�|�
||	|�|j�|�\}}
|�	|�d�|�|�
||
|�dd���fd	d
�|j
D�}�fdd
�|
j
D�}|�||dg|	j
�dS)
NrZz423 z(could not find a suitable article numberz221 z222 z220 cSs
|�d�S)NsX-Antivirus)r)rr
r
r�<lambda>��z@NetworkedNNTPTestsMixin.test_article_head_body.<locals>.<lambda>csg|]}�|�s|�qSr
r
)�.0r)�	blacklistr
r�
<listcomp>�szBNetworkedNNTPTestsMixin.test_article_head_body.<locals>.<listcomp>csg|]}�|�s|�qSr
r
)rbr)rcr
rrd�sra)rr r3�headr&�NNTPTemporaryErrorr)rrQrr_�bodyr^rr)
rrrBrCrDrRrSre�ergr^Zfiltered_head_linesZfiltered_linesr
)rcr�test_article_head_body�s,
z.NetworkedNNTPTestsMixin.test_article_head_bodycsD�fdd�}���jjd�|�j����j��\}}||�dS)Ncs(|d}��|ttf���d|�dS)N�LISTzOVERVIEW.FMT)r/r�tupler8)�capsZ	caps_list)rr
r�_check_caps�sz>NetworkedNNTPTestsMixin.test_capabilities.<locals>._check_caps�)rFr�nntp_version�getcapabilitiesZcapabilities)rrmrrlr
)rr�test_capabilities�s
z)NetworkedNNTPTestsMixin.test_capabilitiescCs&d}d}|jtj|jj||dd�dS)NZnotarealuserZnotarealpasswordF)�user�password�usenetrc)r%r&�	NNTPErrorr�login)rZbaduserZbadpwr
r
r�test_zlogin�sz#NetworkedNNTPTestsMixin.test_zlogincCs$t|�}z|j��Wdd|_XdS)N)rr�quit)r�clsr
r
r�test_zzquit�sz#NetworkedNNTPTestsMixin.test_zzquitcCsNdd�}x@t|�D]4}|�d�s"qt||�}t|�s6qt||||��qWdS)Ncst����fdd��}|S)Nc	s$t�|j���|�WdQRXdS)N)r�transient_internet�	NNTP_HOST)r)�methr
r�wrapped�szHNetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth.<locals>.wrapped)�	functools�wraps)r}r~r
)r}r�	wrap_meth�sz7NetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_methZtest_)�dirr�getattr�callable�setattr)ryr�rRr}r
r
r�wrap_methods�s

z$NetworkedNNTPTestsMixin.wrap_methodsc
s��fdd�}yz|j|jtdd�� �|�|��|�����WdQRX|�|��|j|jtdd������WdQRX|�|��WnJtk
r�}z,t�	d|j
�r�t�d|�d|j�����Wdd}~XYnXdS)Nc	s8t�d�sdSy���Wnttfk
r2dSXdS)N�fileFT)�hasattrr�OSError�EOFErrorr
)rr
r�is_connecteds
zANetworkedNNTPTestsMixin.test_with_statement.<locals>.is_connectedF)�timeoutrtz(?i)KEY.TOO.SMALLzGot z connecting to )
�
NNTP_CLASSr|�TIMEOUTrr�assertFalserxr�re�searchr�unittest�SkipTest)rr��ssl_errr
)rr�test_with_statements	z+NetworkedNNTPTestsMixin.test_with_statement)N)rr	r
rrr"r$r+r1r:r=rErGrOrTr�ZskipIfrYr[r_rirqrwrz�classmethodr�r�r
r
r
rr&s*		
	
rc@s8eZdZdZdZdZdZeZe	dd��Z
e	dd��Zd	S)
�NetworkedNNTPTestsznews.trigofacile.comzfr.comp.lang.pythonzfr.comp.lang.*�PythoncCs�t�d�t�|j���y|j|jtdd�|_Wnvtk
r~}z0t�	d|j
�rlt�|�d|�d|j�����Wdd}~XYn*t
k
r�t�|�d|j����YnXWdQRXdS)NZnetworkF)r�rtz(?i)KEY.TOO.SMALLz got z connecting to z  got EOF error on connecting to )rZrequiresr{r|r�r�rrr�r�rr�r��
EOF_ERRORS)ryr�r
r
r�
setUpClass2s

zNetworkedNNTPTests.setUpClasscCs|jdk	r|j��dS)N)rrx)ryr
r
r�
tearDownClassCs
z NetworkedNNTPTests.tearDownClassN)rr	r
r|r3r#r9rr�r�r�r�r
r
r
rr�)sr�zrequires SSL supportc@s0eZdZdZdZdZdZeedd�Z	dZ
dZdS)�NetworkedNNTP_SSLTestsz
nntp.aioe.orgz	aioe.testzaioe.*�test�NNTP_SSLN)rr	r
r|r3r#r9r�r&r�r"�
test_starttlsr
r
r
rr�Hs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	�dS)N)
�io�	RawIOBase�__init__�BytesIO�c2s�s2c�handlerrX�readline�	push_data)rr�r
r
rr�hs


z_NNTPServerIO.__init__cCsdS)NTr
)rr
r
r�readableqsz_NNTPServerIO.readablecCsdS)NTr
)rr
r
r�writabletsz_NNTPServerIO.writablecCs4|j��}|j�dd�|j�|�|j�|�dS)z.Push (buffer) some data to send to the client.rrnN)r��tell�seek�write)r�data�posr
r
rr�ws
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
rr�r�r�r�r�r�r
r
r
rr�cs	r�cCst|�}t�||�}||fS)N)r�r��BufferedRWPair)r��sior�r
r
r�make_mock_file�sr�cs4eZdZdZ�fdd�Z�fdd�Zdd�Z�ZS)�MockedNNTPTestsMixinNcst���|��dS)N)�super�setUp�make_server)r)�	__class__r
rr��s
zMockedNNTPTestsMixin.setUpcst���|`dS)N)r��tearDownr)r)r�r
rr��s
zMockedNNTPTestsMixin.tearDowncOs6|��|_t|j�\|_}tj|df|�|�|_|jS)Nztest.server)�
handler_classr�r�r�r&Z	_NNTPBaser)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���|jdd�dS)NT)Z
readermode)r�r�r�)r)r�r
rr��s
z#MockedNNTPWithReaderModeMixin.setUp)rr	r
r�r�r
r
)r�rr��sr�c@s�eZdZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�Zdd�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<d4d5�Zd6d7�ZdS)=�
NNTPv1HandlerzA handler for RFC 977z200 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
rrX�szNNTPv1Handler.startcCst|dd�S)Nzutf-8�surrogateescape)r)rr�r
r
r�_decode�szNNTPv1Handler._decodec
Cs4|jrfx*|��}|sdS|j�|�|dkrPqWz|j\}}||d|ji�Wdd|_d|_d|_Xx�|�|���}|s~dS|�d�s�td�|���|dd�}|�	�^}}t
|d|��d�}|dkr�|��qhy||�Wn4t
k
�r}ztd�|��|�Wdd}~XYqhX|jrh||f|_g|_qhWdS)	Ns.
rgFz
z line doesn't end with \r\n: {!r}���Zhandle_zcommand failed: {!r})r�r�rg�appendZ
body_callbackr��endswith�
ValueError�format�splitr��upper�handle_unknown�	Exception)rrr}�tokens�cmdrhr
r
rr��s@


"
zNNTPv1Handler.process_pendingcCs
d|_dS)z7Flag that the client is expected to post a request bodyTN)r�)rr
r
r�expect_body�szNNTPv1Handler.expect_bodycCs|�|�dS)zPush some binary dataN)r�)rr�r
r
rr��szNNTPv1Handler.push_datacCs4t�|�}d�|���d}|�d�}|�|�dS)zPush a string literalz
zutf-8N)�textwrap�dedent�join�
splitlines�encoder�)rZlitr
r
r�push_lit�s

zNNTPv1Handler.push_litcCs|�d�dS)Nz	500 What?)r�)rr
r
rr��szNNTPv1Handler.handle_unknowncCs|�|j�dS)N)r�r)rr
r
rr��szNNTPv1Handler.handle_welcomecCs|�d�dS)Nz205 Bye!)r�)rr
r
r�handle_QUIT�szNNTPv1Handler.handle_QUITcCs|�d�dS)Nz111 20100914001155)r�)rr
r
r�handle_DATEszNNTPv1Handler.handle_DATEcCs(|dkr|�d�n|�d�|��dS)Nzfr.comp.lang.pythonz$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 <prog> <args>
              date
              help
            Report problems to <root@example.org>
            .)r�)rr
r
r�handle_HELP	szNNTPv1Handler.handle_HELPNcCsJ|dkr|�d�n2|dkr(|�d�n|dkr<|�d�n
|�d�dS)Nz412 No newsgroup selected�3000234z"223 3000234 <45223423@example.com>z<45223423@example.com>z223 0 <45223423@example.com>z430 No Such Article Found)r�)r�message_specr
r
r�handle_STATszNNTPv1Handler.handle_STATcCs|�d�dS)Nz*223 3000237 <668929@example.org> retrieved)r�)rr
r
r�handle_NEXTszNNTPv1Handler.handle_NEXTcCs|�d�dS)Nz,223 3000234 <45223423@example.com> retrieved)r�)rr
r
r�handle_LASTszNNTPv1Handler.handle_LASTcCs�|dkr|�d�n�|dkr<|dkr0|�d�q�|�d�nf|dkrP|�d�nR|dkr�|dk	sdt�|d	krx|�d
�q�|dkr�|�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
                .�ACTIVEz*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"
                    .zOVERVIEW.FMTa                215 Order of fields in overview database.
                Subject:
                From:
                Date:
                Message-ID:
                References:
                Bytes:
                Lines:
                Xref:full
                .�
NEWSGROUPSzcomp.lang.pythonz�                    215 Descriptions in form "group description".
                    comp.lang.python	The Python computer language.
                    .zcomp.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 keyword)r��AssertionError)r�actionZparamr
r
r�handle_LIST"s.
zNNTPv1Handler.handle_LISTcCs�|dkr$|dkr$|dkr$|�d�nZ|dkrH|dkrH|dkrH|�d�n6|dkrt|dkrt|dkrt|�d	d
d�n
|�d�dS)
Nzcomp.lang.pythonZ20100913Z082004a                230 list of newsarticles (NNTP v2) created after Mon Sep 13 08:20:04 2010 follows
                <a4929a40-6328-491a-aaaf-cb79ed7309a2@q2g2000vbk.googlegroups.com>
                <f30c0419-f549-4218-848f-d7d0131da931@y3g2000vbm.googlegroups.com>
                .Z100913a                230 list of newsarticles (NNTP v1) created after Mon Sep 13 08:20:04 2010 follows
                <a4929a40-6328-491a-aaaf-cb79ed7309a2@q2g2000vbk.googlegroups.com>
                <f30c0419-f549-4218-848f-d7d0131da931@y3g2000vbm.googlegroups.com>
                .)Z20100101Z100101Z090000z
too long linei�z
.zK                230 An empty list of newsarticles follows
                .)r�)rr �date_str�time_strr
r
r�handle_NEWNEWSXs

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 <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>	Sat, 19 Jun 2010 18:04:08 -0400	<4FD05F05-F98B-44DC-8111-C6009C925F0C@gmail.com>	<hvalf7$ort$1@dough.gmane.org>	7103	16	Xref: news.gmane.io gmane.comp.python.authors:57
58	Looking for a few good bloggers	Doug Hellmann <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>	Thu, 22 Jul 2010 09:14:14 -0400	<A29863FA-F388-40C3-AA25-0FD06B09B5BF@gmail.com>		6683	16	
59	Re: Message d'erreur incompréhensible (par moi)	Eric Brunel <eric.brunel@pragmadev.nospam.com>	Wed, 15 Sep 2010 18:09:15 +0200	<eric.brunel-2B8B56.18091515092010@news.wanadoo.fr>	<4c90ec87$0$32425$ba4acef3@reader.news.orange.fr>	1641	27	Xref: saria.nerim.net fr.comp.lang.python:1265
.
z1                224 No articles
                .)r�)rr�r
r
r�handle_XOVERws
zNNTPv1Handler.handle_XOVER)rgcCsL|dkr.|jr"|�d�|��qH|�d�n|js8t�|�d�||_dS)Nz+340 Input article; end with <CR-LF>.<CR-LF>z440 Posting not permittedz240 Article received OK)r�r�r�r��posted_body)rrgr
r
r�handle_POST�s



zNNTPv1Handler.handle_POSTcCsT|dkr6|jr*|dkr*|�d�|��qP|�d�n|js@t�|�d�||_dS)Nz+<i.am.an.article.you.will.want@example.com>z%335 Send it; end with <CR-LF>.<CR-LF>z435 Article not wantedz235 Article transferred OK)r�r�r�r�r�)r�
message_idrgr
r
r�handle_IHAVE�s



zNNTPv1Handler.handle_IHAVEz�        From: "Demo User" <nobody@example.net>
        Subject: I am just a test article
        Content-Type: text/plain; charset=UTF-8; format=flowed
        Message-ID: <i.am.an.article.you.will.want@example.com>ui        This is just a test article.
        ..Here is a dot-starting line.

        -- Signed by André.z

cCsd|dkr|�d�n6|dkr(|�d�n"|dkr<|�d�n|�d�dS|�|j�|�d�dS)Nz"220 3000237 <45223423@example.com>z<45223423@example.com>z220 0 <45223423@example.com>r�z"220 3000234 <45223423@example.com>z430 No Such Article Found�.)r��sample_article)rr�r
r
r�handle_ARTICLE�s
zNNTPv1Handler.handle_ARTICLEcCsd|dkr|�d�n6|dkr(|�d�n"|dkr<|�d�n|�d�dS|�|j�|�d�dS)Nz"221 3000237 <45223423@example.com>z<45223423@example.com>z221 0 <45223423@example.com>r�z"221 3000234 <45223423@example.com>z430 No Such Article Foundr�)r��sample_head)rr�r
r
r�handle_HEAD�s
zNNTPv1Handler.handle_HEADcCsd|dkr|�d�n6|dkr(|�d�n"|dkr<|�d�n|�d�dS|�|j�|�d�dS)Nz"222 3000237 <45223423@example.com>z<45223423@example.com>z222 0 <45223423@example.com>r�z"222 3000234 <45223423@example.com>z430 No Such Article Foundr�)r��sample_body)rr�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 Inrrz 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
rrrXr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�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 USERr6)r�r�r�)r�fmtr
r
r�handle_CAPABILITIES�s
z!NNTPv2Handler.handle_CAPABILITIEScCstd��dS)Nz3MODE READER sent despite READER has been advertised)r�)r�_r
r
r�handle_MODE	szNNTPv2Handler.handle_MODENcCs
|�|�S)N)r�)rr�r
r
r�handle_OVERszNNTPv2Handler.handle_OVER)N)rr	r
rrrrr
r
r
rr�srcs eZdZdZ�fdd�Z�ZS)�CapsAfterLoginNNTPv2Handlerz3A handler that allows CAPABILITIES only after logincs |js|�d�n
t���dS)Nz480 You must log in.)r�r�r�r)r)r�r
rrsz/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES)rr	r
rrr�r
r
)r�rrsrc@s(eZdZdZdd�Zdd�Zdd�ZdS)	�ModeSwitchingNNTPv2Handlerz$A server that starts in transit modecCs
d|_dS)NF)�	_switched)rr
r
rr�sz#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
            .r6zMODE-)rr�r�)rrr
r
rr s
z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIEScCs&|js|dkst�d|_|�d�dS)N�readerTz200 Posting allowed)rr�r�)rZwhatr
r
rr0sz&ModeSwitchingNNTPv2Handler.handle_MODEN)rr	r
rr�rrr
r
r
rrsrcseZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�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 d<d=�Z!d>d?�Z"d@dA�Z#�Z$S)B�NNTPv1v2TestsMixincst���dS)N)r�r�)r)r�r
rr�8szNNTPv1v2TestsMixin.setUpcCs|�|jj|jj�dS)N)rrrr�)rr
r
rr;szNNTPv1v2TestsMixin.test_welcomecCs<|jdkr|�d|jj�|j�dd�|�d|jj�dS)Nrn�AUTHINFO�testuser�testpw)ror8r�_capsrvr2)rr
r
r�
test_authinfo>s
z NNTPv1v2TestsMixin.test_authinfocCs:|j��\}}|�|d�|�|t�dddddd��dS)Nz111 20100914001155i��	�r��7)rr.rr-)rrr.r
r
rrGFszNNTPv1v2TestsMixin.test_datecCs6|�|jj�|j��}|�|d�|�|jj�dS)Nz205 Bye!)r�r��closedrrxrr)rrr
r
r�	test_quitKs
zNNTPv1v2TestsMixin.test_quitcCs2|j��\}}|�|d�|�|ddddg�dS)Nz100 Legal commandsz8  authinfo user Name|pass Password|generic <prog> <args>z  datez  helpz%Report problems to <root@example.org>)rrr)rrrr
r
rrQszNNTPv1v2TestsMixin.test_helpcCs~|j��\}}|�t|�d�|d}|�|tdddd��|j�d�\}}|�t|�d�|d	}|�|td
ddd��dS)
N�rZzcomp.lang.python.announceZ
0000001153Z
0000000993�mz*distutils*rnrz!gmane.comp.python.distutils.develZ
0000014104Z
0000000001)rrrrr)rrr!�gr
r
rr"[s
zNNTPv1v2TestsMixin.test_listc	Cs�|j�d�\}}}|�|d�|�|d�|�|d�|j�d�\}}}|�|d�|�|d�|�|d�|�tj��}|j�d�WdQRX|�|jjd�|�tj��}|j��WdQRX|�|jjd�dS)	Ni��-z"223 3000234 <45223423@example.com>z<45223423@example.com>z223 0 <45223423@example.com>rz<non.existent.id>z430 No Such Article Foundz412 No newsgroup selected)r�statrr%r&rfr(r))rrrSr�r*r
r
r�	test_statiszNNTPv1v2TestsMixin.test_statcCs8|j��\}}}|�|d�|�|d�|�|d�dS)Nz*223 3000237 <668929@example.org> retrievedi��-z<668929@example.org>)r�nextr)rrrSr�r
r
r�	test_nextyszNNTPv1v2TestsMixin.test_nextcCs8|j��\}}}|�|d�|�|d�|�|d�dS)Nz,223 3000234 <45223423@example.com> retrievedi��-z<45223423@example.com>)rrDr)rrrSr�r
r
r�	test_lastszNNTPv1v2TestsMixin.test_lastcCs4|j�d�}|�|d�|j�d�}|�|d�dS)Nzcomp.lang.pythonzThe Python computer language.zcomp.lang.pythonxr6)rr7r)rr4r
r
rr:�sz#NNTPv1v2TestsMixin.test_descriptioncCsn|j�d�\}}|�|d�|�|ddi�|j�d�\}}|�|ddd��|j�d�\}}|�|i�dS)Nzcomp.lang.pythonz-215 Descriptions in form "group description".zThe Python computer language.zcomp.lang.python*z4Announcements about the Python language. (Moderated))zcomp.lang.pythonzcomp.lang.python.announcezcomp.lang.pythonx)rr;r)rrr!r
r
rr=�s

z$NNTPv1v2TestsMixin.test_descriptionsc	Cs�|j�d�\}}}}}|�|�d�|�|�|d�|�|d�|�|d�|�|d�|�tj��}|j�d�WdQRX|j}|�|j	�d�|j	�dS)Nzfr.comp.lang.pythonz211 i�i�i�zcomp.lang.python.develz411 No such group)
rr rrrr%r&rfr(r))rrrBrCrDr r*�excr
r
rrE�szNNTPv1v2TestsMixin.test_groupcCs�t�dddddd�}|j�d|�\}}d�|j�}|�||�|�|d	d
g�t�dddddd�}|j�d|�\}}|�|d�|�|g�dS)
Ni�r�
���zcomp.lang.pythonzS230 list of newsarticles (NNTP v{0}) created after Mon Sep 13 08:20:04 2010 followszB<a4929a40-6328-491a-aaaf-cb79ed7309a2@q2g2000vbk.googlegroups.com>zB<f30c0419-f549-4218-848f-d7d0131da931@y3g2000vbm.googlegroups.com>zfr.comp.lang.pythonz)230 An empty list of newsarticles follows)r-r�newnewsr�ror)rr0rZidsZexpectedr
r
r�test_newnews�szNNTPv1v2TestsMixin.test_newnewscCsZ|�t|�d�|�|d�d�d�|�|dd�|�|dd�|�|d	d
�dS)Nr"rVzutf-8u-- Signed by André.r�ra���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)Nr"rs&From: "Demo User" <nobody@example.net>�s7Message-ID: <i.am.an.article.you.will.want@example.com>)rr)rrr
r
r�_check_article_head�sz&NNTPv1v2TestsMixin._check_article_headcCsH|�t|�d�|�|dd��|�|dd��|�|dd�dS)Nrr"r&ra)rrr*r()rrr
r
r�_check_article_data�sz&NNTPv1v2TestsMixin._check_article_datac	Cs|j��\}}|�|d�|\}}}|�|d�|�|d�|�|�|j�d�\}}|�|d�|\}}}|�|d�|�|d�|�|�|j�d�\}}|�|d�|\}}}|�|d�|�|d�|�|�|�tj��}|j�d�WdQRX|�|jjd	�dS)
Nz"220 3000237 <45223423@example.com>i��-z<45223423@example.com>i��-z"220 3000234 <45223423@example.com>z220 0 <45223423@example.com>rz<non-existent@example.com>z430 No Such Article Found)	rr^rr+r%r&rfr(r))rr�inforSr�rr*r
r
r�test_article�s*





zNNTPv1v2TestsMixin.test_articlecCs�t��}|jj|d�\}}|�|d�|\}}}|�|d�|�|d�|�|g�|��}|�|�d�t|��|�|�	d�t|��dS)N)r�z"220 3000237 <45223423@example.com>i��-z<45223423@example.com>sKFrom: "Demo User" <nobody@example.net>
Subject: I am just a test article
sUThis is just a test article.
.Here is a dot-starting line.

-- Signed by André.
)
r�r�rr^r�getvaluerr�asciir�)r�frr,rSr�rr�r
r
r�test_article_file�s

z$NNTPv1v2TestsMixin.test_article_filec	Cs|j��\}}|�|d�|\}}}|�|d�|�|d�|�|�|j�d�\}}|�|d�|\}}}|�|d�|�|d�|�|�|j�d�\}}|�|d�|\}}}|�|d�|�|d�|�|�|�tj��}|j�d�WdQRX|�|jjd	�dS)
Nz"221 3000237 <45223423@example.com>i��-z<45223423@example.com>i��-z"221 3000234 <45223423@example.com>z221 0 <45223423@example.com>rz<non-existent@example.com>z430 No Such Article Found)	rrerr*r%r&rfr(r))rrr,rSr�rr*r
r
r�	test_head�s*





zNNTPv1v2TestsMixin.test_headcCs�t��}|jj|d�\}}|�|d�|\}}}|�|d�|�|d�|�|g�|��}|�|�d�t|��|�	|�
d�t|��dS)N)r�z"221 3000237 <45223423@example.com>i��-z<45223423@example.com>sKFrom: "Demo User" <nobody@example.net>
Subject: I am just a test article
sUThis is just a test article.
.Here is a dot-starting line.

-- Signed by André.
)r�r�rrerr.rrr/r�r�)rr0rr,rSr�rr�r
r
r�test_head_files

z!NNTPv1v2TestsMixin.test_head_filec	Cs|j��\}}|�|d�|\}}}|�|d�|�|d�|�|�|j�d�\}}|�|d�|\}}}|�|d�|�|d�|�|�|j�d�\}}|�|d�|\}}}|�|d�|�|d�|�|�|�tj��}|j�d�WdQRX|�|jjd	�dS)
Nz"222 3000237 <45223423@example.com>i��-z<45223423@example.com>i��-z"222 3000234 <45223423@example.com>z222 0 <45223423@example.com>rz<non-existent@example.com>z430 No Such Article Found)	rrgrr(r%r&rfr(r))rrr,rSr�rr*r
r
r�	test_body*s*





zNNTPv1v2TestsMixin.test_bodycCs�t��}|jj|d�\}}|�|d�|\}}}|�|d�|�|d�|�|g�|��}|�|�d�t|��|�	|�
d�t|��dS)N)r�z"222 3000237 <45223423@example.com>i��-z<45223423@example.com>sKFrom: "Demo User" <nobody@example.net>
Subject: I am just a test article
sUThis is just a test article.
.Here is a dot-starting line.

-- Signed by André.
)r�r�rrgrr.r�rr/rr�)rr0rr,rSr�rr�r
r
r�test_body_fileEs

z!NNTPv1v2TestsMixin.test_body_filecCs�|�|�d�|�|�t|�d�|d\}}|�|d�|�|ddddd	d
ddd
��|d\}}|�|dd�|d\}}|�|dd�dS)Nz224 r)r�9zEDoug Hellmann <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>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>z<hvalf7$ort$1@dough.gmane.org>Z7103Z16z*news.gmane.io gmane.comp.python.authors:57)rIrHr.z
message-idrJz:bytesz:lines�xrefrZr7rnrHu0Re: Message d'erreur incompréhensible (par moi))rrrr)rr�	overviewsrSrWr
r
r�check_over_xover_respYs$

z(NNTPv1v2TestsMixin.check_over_xover_respcCs"|j�dd�\}}|�||�dS)Nr6�;)rrPr9)rrr8r
r
rrTnszNNTPv1v2TestsMixin.test_xovercCs |j�d�\}}|�||�dS)N)r6r:)rrWr9)rrr8r
r
rrYrszNNTPv1v2TestsMixin.test_oversFrom: "Demo User" <nobody@example.net>
Subject: I am just a test article
Content-Type: text/plain; charset=UTF-8; format=flowed
Message-ID: <i.am.an.article.you.will.want@example.com>

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)NrUrVs.
r�s-- Signed by André.
r%s
r&s ..Here is a dot-starting line.
rs(From: "Demo User" <nobody@example.net>
)r�r�rr)rrr
r
r�_check_posted_body�sz%NNTPv1v2TestsMixin._check_posted_bodycGsd|j}|||�f}d|j_||�}|��|j�dd�}|||�f}d|j_||�}|��|S)Ns
�
)�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|f|�dti�}|�||�|j|f|�dti�}|�||�|j|f|�dtji�}|�||�dd�}|j|f|�d|i�}|�||�dd�}|j|f|�d|i�}|�||�dS)Nr@cSst|jdd��S)NT)�keepends)�iterr�)r�r
r
r�	iterlines�sz6NNTPv1v2TestsMixin.check_post_ihave.<locals>.iterlinescSst|jdd��S)NF)rC)rDr�)r�r
r
rrE�s)rBr]r�	bytearrayr�r�)rr?Zsuccess_respr�rrEr
r
r�check_post_ihave�sz#NNTPv1v2TestsMixin.check_post_ihavec	CsR|�|jjd�d|j_|�tj��}|j�|j�WdQRX|�	|j
jd�dS)Nz240 Article received OKFz440 Posting not permitted)rGrrAr�r�r%r&rfr=rr(r))rr*r
r
r�	test_post�s
zNNTPv1v2TestsMixin.test_postc	CsN|�|jjdd�|�tj��}|j�d|j�WdQRX|�|jj	d�dS)Nz235 Article transferred OKz+<i.am.an.article.you.will.want@example.com>z<another.message.id>z435 Article not wanted)
rGrZihaver%r&rfr=rr(r))rr*r
r
r�
test_ihave�s
zNNTPv1v2TestsMixin.test_ihavecCs.t�dddddd�}|�tj|jjd|�dS)Ni�rZrrzcomp.lang.python)r-r%r&�
NNTPDataErrorrr#)rr0r
r
r�test_too_long_lines�sz&NNTPv1v2TestsMixin.test_too_long_lines)%rr	r
r�rrrGrrr"rrrr:r=rEr$r(r*r+r-r1r2r3r4r5r9rTrYr=r;rBrGrHrIrKr�r
r
)r�rr
6sB

r
c@s eZdZdZdZeZdd�ZdS)�NNTPv1Testsz*Tests an NNTP v1 server (no capabilities).rZcCs:|j��}|�|i�|�|jjd�|�|jjd�dS)NrZ)rrprro�nntp_implementation)rrlr
r
r�	test_caps�s
zNNTPv1Tests.test_capsN)rr	r
rror�r�rNr
r
r
rrL�srLc@s eZdZdZdZeZdd�ZdS)�NNTPv2Testsz,Tests an NNTP v2 server (with capabilities).rnc
Csb|j��}|�|ddgddgdggdddd	d
dggggd��|�|jjd
�|�|jjd�dS)N�2�3ZINNz2.5.1ZUSERr�zACTIVE.TIMESzDISTRIB.PATSZHEADERSr�zOVERVIEW.FMT)�VERSIONZIMPLEMENTATIONrZHDRrjZOVERZPOST�READERr)z	INN 2.5.1)rrprrorM)rrlr
r
rrN�s

zNNTPv2Tests.test_capsN)rr	r
rrorr�rNr
r
r
rrO�srOc@s eZdZdZdZeZdd�ZdS)�CapsAfterLoginNNTPv2TestszCTests a probably NNTP v2 server with capabilities only after login.rncCs2|�|jji�|j�dd�|�d|jj�dS)Nrr
rR)rrrrvr8)rr
r
r�test_caps_only_after_login�sz4CapsAfterLoginNNTPv2Tests.test_caps_only_after_loginN)rr	r
rrorr�rUr
r
r
rrT�srTc@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.rncCs|�d|jj�dS)NrS)r8rr)rr
r
r�(test_we_are_in_reader_mode_after_connectsz>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connectN)rr	r
rrorr�rWr
r
r
rrV�srVc@sPeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Ze	�
ed
�dd��ZdS)�	MiscTestscsV�fdd�}|dd�|dd�|dd�|dd�|dd	�|d
d�|dd�dS)
Ncs��t�|�|�dS)N)rr&�
decode_header)�ar�)rr
r�givessz+MiscTests.test_decode_header.<locals>.givesr6za 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 matriceu0Re: Message d'erreur incompréhensible (par moi)r
)rr[r
)rr�test_decode_headers



zMiscTests.test_decode_headercCsDdddddddg}|�t�|�dd	d
ddddg�dddddd
dg}|�t�|�dd	d
ddddg�dddddddg}|�t�|�dd	d
ddddg�dddddddddg	}|�t�|�dd	d
ddddddg	�dddddd
dddg	}|�t�|�dd	d
ddddddg	�dddddd
ddg}|�t�|�dd	d
dddddg�dS)NzSubject:zFrom:zDate:zMessage-ID:zReferences:z:bytesz:linesrHrIr.z
message-idrJzBytes:zLines:zsubject:zFROM:zDaTe:zmessage-ID:zBYTES:z	Xref:fullzDistribution:fullr7Zdistributionz	Xref:FULLzDistribution:FULL)rr&Z_parse_overview_fmt)rrr
r
r�test_parse_overview_fmts@











z!MiscTests.test_parse_overview_fmtcCs�tjdg}dg}t�||�}|\\}}|�|d�|�|dddddd	d
dd��d
g}t�||�}|\\}}|�|dd�dg}t�||�}|\\}}|�|dd�|�|dd�dS)Nr7z�3000234	I am just a test article	"Demo User" <nobody@example.com>	6 Oct 1998 04:38:40 -0500	<45223423@example.com>	<45454@example.net>	1234	17	Xref: news.example.com misc.test:3000363i��-zI am just a test articlez "Demo User" <nobody@example.com>z6 Oct 1998 04:38:40 -0500z<45223423@example.com>z<45454@example.net>Z1234Z17z"news.example.com misc.test:3000363)rHrIr.z
message-idrJz:bytesz:linesr7z�3000234	I am just a test article	"Demo User" <nobody@example.com>	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" <nobody@example.com>	6 Oct 1998 04:38:40 -0500	<45223423@example.com>	 	1234	17	Xref: 	rJ� r6)r&Z_DEFAULT_OVERVIEW_FMTZ_parse_overviewr)rrrZoverviewrSZfieldsr
r
r�test_parse_overview?s.



zMiscTests.test_parse_overviewc	sh�fdd�}|dddddddd	�|d
ddddddd	�|dddddddd	�|d
ddddddd	�dS)Ncs��t�||�tj|��dS)N)rr&Z_parse_datetimer-)rZr��c)rr
rr[nsz,MiscTests.test_parse_datetime.<locals>.givesZ19990623135624i�r�r�8��19990623�135624�990623Z090623i�r
)rr[r
)rr�test_parse_datetimems
zMiscTests.test_parse_datetimec	s��fdd�}|ddddddd	d
�|dddddddd
�|d
ddddddd��fdd�}|dddd	d�|ddddd�|d
dddd�dS)Nc	sFt�||||||�}��t�|�||f���t�|d�||f�dS)NF)r-rr&�_unparse_datetime)	�y�M�d�hr�sr�r�r0)rr
rr[{s

z.MiscTests.test_unparse_datetime.<locals>.givesi�rrarrbrcrdrei�Z20000623i�r>rZrnr)Z20100605�010203cs@t�|||�}��t�|�||f���t�|d�||f�dS)NF)r-r.rr&rh)rirjrkr�r�r0)rr
rr[�s

�000000r
)rr[r
)rr�test_unparse_datetimexszMiscTests.test_unparse_datetimec	s��fdd�}|ddddddd	d
�|dddddddd
�|d
ddddddd��fdd�}|dddd	d�|ddddd�|d
dddd�dS)Nc	s0t�||||||�}��t�|d�||f�dS)NT)r-rr&rh)	rirjrkrlrrmr�r�r0)rr
rr[�sz5MiscTests.test_unparse_datetime_legacy.<locals>.givesi�rrarrbrcrfrei�Z000623i�r>rZrnr)Z100605rncs*t�|||�}��t�|d�||f�dS)NT)r-r.rr&rh)rirjrkr�r�r0)rr
rr[�sror
)rr[r
)rr�test_unparse_datetime_legacy�sz&MiscTests.test_unparse_datetime_legacyzrequires SSL supportcCs|�ttd��dS)Nr�)rr�r&)rr
r
r�test_ssl_support�szMiscTests.test_ssl_supportN)
rr	r
r\r]r_rgrprqr��
skipUnless�sslrrr
r
r
rrXs(.rXc@seZdZdZdd�ZdS)�PublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsP|�ttd��dddddddd	g}tdk	r6|�d
�|�ttj�t|��dS)N�__all__rru�NNTPReplyErrorrfr'�NNTPProtocolErrorrJrYr�)rr�r&rtr�r�setrv)rZ
target_apir
r
r�test_module_all_attribute�s

z(PublicAPITests.test_module_all_attributeN)rr	r
rrzr
r
r
rru�sruc@sHeZdZdZejZddd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
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|��.|�||��|jd||d�WdQRXWdQRX|���x�D]}|�|j�q~WdS)	NcseZdZ�fdd�ZdS)zNMockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_modulecs��S)Nr
)Zaddressr�)�
MockSocketr
r�create_connection�sz`MockSocketTests.check_constructor_error_conditions.<locals>.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.<locals>.MockSocketcsd�dS)NTr
)r)�
socket_closedr
r�close�szLMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.closecs ��}t|�\}}��|�|S)N)r�r�)�socket�moder�rr�)�filesr�r
r�makefile�s
zOMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.makefileN)rr	r
r�r�r
)r�r�rr
rr|�sr|Fznntplib.socketZdummy)rrrs)rZassertRaisesRegex�
nntp_classrr)rr�Zexpected_error_typeZexpected_error_msgrvrsr~r0r
)r|r�r�rr�"check_constructor_error_conditions�s$

z2MockSocketTests.check_constructor_error_conditionscCs&Gdd�dt�}|�|tj|j�dS)Nc@seZdZdZdS)z1MockSocketTests.test_bad_welcome.<locals>.HandlerzBad WelcomeN)rr	r
rr
r
r
r�Handler�sr�)r�r�r&rxr)rr�r
r
r�test_bad_welcome�sz MockSocketTests.test_bad_welcomecCs&Gdd�dt�}|�|tj|j�dS)Nc@seZdZdZdS)zEMockSocketTests.test_service_temporarily_unavailable.<locals>.Handlerz#400 Service temporarily unavailableN)rr	r
rr
r
r
rr��sr�)r�r�r&rfr)rr�r
r
r�$test_service_temporarily_unavailable�sz4MockSocketTests.test_service_temporarily_unavailablecCs&Gdd�dt�}|�|tj|j�dS)Nc@seZdZdZdS)zEMockSocketTests.test_service_permanently_unavailable.<locals>.Handlerz#502 Service permanently unavailableN)rr	r
rr
r
r
rr��sr�)r�r�r&r'r)rr�r
r
r�$test_service_permanently_unavailable�sz4MockSocketTests.test_service_permanently_unavailablecs,G�fdd�dt�}d�|�|tj��dS)NcseZdZ�fdd�ZdS)z6MockSocketTests.test_bad_capabilities.<locals>.Handlercs|���dS)N)r�)r)�capabilities_responser
rr�szJMockSocketTests.test_bad_capabilities.<locals>.Handler.handle_CAPABILITIESN)rr	r
rr
)r�r
rr��sr�z201 bad capability)r�r�r&rw)rr�r
)r�r�test_bad_capabilities�sz%MockSocketTests.test_bad_capabilitiescs8d}d}G�fdd�dt�}d�|�|tj�||�dS)Nzt@e.comZpythoncseZdZ�fdd�ZdS)z3MockSocketTests.test_login_aborted.<locals>.Handlercs|���dS)N)r�)rr�)�authinfo_responser
rr��szCMockSocketTests.test_login_aborted.<locals>.Handler.handle_AUTHINFON)rr	r
r�r
)r�r
rr��sr�z503 Mechanism not recognized)r�r�r&r')rrvrsr�r
)r�r�test_login_aborted�sz"MockSocketTests.test_login_aborted)NN)
rr	r
rr&rr�r�r�r�r�r�r�r
r
r
rr{�s
	r{c@seZdZdZdd�ZdS)�bypass_contextz'Bypass encryption and actual SSL modulecKs|S)Nr
)�sockr�r
r
r�wrap_socketszbypass_context.wrap_socketN)rr	r
rr�r
r
r
rr�sr�c@seZdZedd��ZdS)�MockSslTestscOstj|dti|��S)NZssl_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
�ttj|dd��
�|_|�	|jjddd�dS)N)�targetr�F)rt)r�rZ	bind_portZlisten�	threadingZThread�
run_serverZ
backgroundrXZ
addCleanupr�rZHOST�	__enter__�nntp�__exit__)rr�Zportr
r
rr�s

zLocalServerTests.setUpc	Cs�|�|��\}}WdQRXt����}|�|�|�|�d��}|�d�x�|��}|dkrh|�d�qL|dkr�|��|�d�t�	�}|�
t�|j|dd�}|�|�|�|�d��}qL|d	kr�|�d
�PqLt
d�|���qLWWdQRXdS)N�rbs200 Server ready
sCAPABILITIES
s.101 Capability list:
VERSION 2
STARTTLS
.
s
STARTTLS
s382 Begin TLS negotiation now
T)Zserver_sidesQUIT
s
205 Bye!
zUnexpected command {!r})Zaccept�
contextlib�	ExitStack�
enter_contextr�Zsendallr�r�rtZ
SSLContextZload_cert_chain�certfiler�r�r�)rr�ZclientrZcleanupr	r��contextr
r
rr�s0







zLocalServerTests.run_serverzrequires SSL supportcCs`|jj}|jj}|j��|�||jj�|�||jj�|�|jjtj�|�t	|jj�dS)N)
r�r�r�ZstarttlsZassertNotEqualr/rtZ	SSLSocketr%r�)rr�r�r
r
rr�:s
zLocalServerTests.test_starttlsN)	rr	r
r�r�r�rsrtr�r
r
r
rr�
s r��__main__);r�r�r-r�r�rr�Zos.path�osr�r�r�rr&rrZ
unittest.mockrrt�ImportErrorr��pathr��dirname�__file__r�rr�rr�r�r�ZSSLEOFErrorZTestCaser�rsr�r�r�r�r�r�r�rrrr
rLrOrTrVrXrur{r�r�r�r�mainr
r
r
r�<module>sx

|
,G

#N<