Your IP : 216.73.216.213


Current Path : /opt/alt/python36/lib64/python3.6/test/__pycache__/
Upload File :
Current File : //opt/alt/python36/lib64/python3.6/test/__pycache__/test_nntplib.cpython-36.opt-2.pyc

3

��2a��@s�ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZddlm
Z
mZddlZddlmZyddlZWnek
r�dZYnXyddlZWnek
r�dZYnXdZejjejje�d�Zedk	r�ejZnGdd�de�ZGd	d
�d
�Zej�Gdd�deej�Zej 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�Z-Gd&d'�d'e%ej�Z.Gd(d)�d)e&ej�Z/Gd*d+�d+ej�Z0Gd,d-�d-ej�Z1Gd.d/�d/ej�Z2Gd0d1�d1�Z3ej ed
�Gd2d3�d3e2��Z4ej ed4�Gd5d6�d6ej��Z5e6d7k�r�ej7�dS)8�N)�support)�NNTP�	GroupInfo)�patch�zkeycert3.pemc@seZdZdZdS)�SSLErrorzThis will never be raised.N)�__name__�
__module__�__qualname__�reason�rr�1/opt/alt/python36/lib64/python3.6/test_nntplib.pyrsrc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zejdd�dd��Zdd�Zd/d d!�Zejdd"�d#d$��Zd%d&�Zd'd(�Zd)d*�Zed+d,��Zd-d.�ZdS)0�NetworkedNNTPTestsMixincCs|jj�}|jtt|��dS)N)�serverZ
getwelcome�assertEqual�str�type)�self�welcomerrr
�test_welcome*s
z$NetworkedNNTPTestsMixin.test_welcomecCsB|jj�\}}|j|jd�|�x|D]}|jtt|��q&WdS)Nz100 )r�help�
assertTrue�
startswithrrr)r�resp�lines�linerrr
�	test_help.s
z!NetworkedNNTPTestsMixin.test_helpcCsH|jj�\}}t|�dkrD|jtt|d��|jtt|dj��dS)Nr)r�list�lenrrrr�group)rr�groupsrrr
�	test_list4sz!NetworkedNNTPTestsMixin.test_listcCsL|jj|j�\}}t|�dkrH|jtt|d��|jtt|dj��dS)Nr)	rr�	GROUP_PATrrrrrr)rrr rrr
�test_list_active:sz(NetworkedNNTPTestsMixin.test_list_activec
CsB|jtj��}|jjd�WdQRX|jj}|j|jd�|�dS)NZXYZZYz500 )	�assertRaises�nntplib�NNTPPermanentErrorrZ	_shortcmd�	exception�responserr)r�cmrrrr
�test_unknown_command@sz,NetworkedNNTPTestsMixin.test_unknown_commandcCsXtjj�tjdd�}|jj|�\}}t|�dkrT|j|dt�|j|dj	t
�dS)N�)Zdaysr)�datetime�dateZtodayZ	timedeltarZ	newgroupsr�assertIsInstancerrr)r�dtrr rrr
�test_newgroupsFs
z&NetworkedNNTPTestsMixin.test_newgroupscsb�fdd�}�jj�j�}||��j�j|��jj�j�}||��jjd�}�j|d�dS)Ncs�j|t��j�j|�dS)N)r.r�assertNotIn�
GROUP_NAME)�desc)rrr
�_check_descPsz=NetworkedNNTPTestsMixin.test_description.<locals>._check_desczzk.brrtt.baz�)r�descriptionr2�assertIn�DESCr"r)rr4r3r)rr
�test_descriptionOsz(NetworkedNNTPTestsMixin.test_descriptioncCs^|jj|j�\}}|j|jd�p(|jd�|�|j|t�||j}|j||jj	|j��dS)Nz215 z282 )
r�descriptionsr"rrr.�dictr2rr6)rrZdescsr3rrr
�test_descriptions_s
z)NetworkedNNTPTestsMixin.test_descriptionscCs�|jj|j�}|jdt|��|\}}}}}|j||j�|j|t�|j|t�|j|t�|j||�|j|j	d�|�dS)N�z211 )
rrr2rrr.�int�assertLessEqualrr)r�resultr�count�first�lastrrrr
�
test_grouphsz"NetworkedNNTPTestsMixin.test_groupcCs<|jj�\}}|j|tj�|j|jd�|j|jd�dS)Ni�i�)rr-r.r,�assertGreaterEqualZyearr?)rrr-rrr
�	test_datessz!NetworkedNNTPTestsMixin.test_datec	CsT|j|t�|j|j�dddddddh�x$|j�D]}|j|ttd�f�q4WdS)N�subject�fromr-z
message-id�
referencesz:bytesz:lines)r.r;rE�keys�valuesrr)r�art_dict�vrrr
�_check_art_dictzs
z'NetworkedNNTPTestsMixin._check_art_dictc	Csz|jj|j�\}}}}}|jj|d|�\}}t|�dkrD|jd�|d\}}|j||d�|j||�|j|�dS)Nr=rzno articles retrieved)	rrr2�xoverr�skipTestrEr?rN)	rrrArBrC�namer�art_numrLrrr
�
test_xover�s
z"NetworkedNNTPTestsMixin.test_xoverTzHtemporarily skipped until a permanent solution is found for issue #28971c
Cs�|jj|j�\}}}}}|d}|jj|df�\}}|d\}}	|j|	�|jj||f�\}}|d\}}	|j||�|j||�|j|	�dS)N�
r����)rrr2�overrNrEr?)
rrrArBrCrQ�startrrRrLrrr
�	test_over�s
z!NetworkedNNTPTestsMixin.test_overcCsP|jj|j�\}}}}}|jjd|�\}}x |D]}|jtt|d��q0WdS)NrGrU)rrr2Zxhdrrrr)rrrArBrCrQrrrrr
�	test_xhdr�s
z!NetworkedNNTPTestsMixin.test_xhdrNcCsV|j|tj�|dk	r$|j|j|�x|jD]}|j|t�q,W|j|jdd�dS)NrU�.�.
�.
rV)r[r\r])r.r%ZArticleInforZnumberr�bytesr1)rr�articlerRrrrr
�check_article_resp�sz*NetworkedNNTPTestsMixin.check_article_respzFIXME: see bpo-32128c
sR|jj|j�\}}}}}xl|||dfD]P}y|jj|�\}}Wn4tjk
rt}z|jjd�sb�w(WYdd}~XnXPq(W|jd�|j	|jd�|�|j
|||�|jj|�\}}	|j	|jd�|�|j
||	|�|jj|�\}}
|j	|jd�|�|j
||
|�dd���fd	d
�|j
D�}�fdd
�|
j
D�}|j||dg|	j
�dS)
NrUz423 z(could not find a suitable article numberz221 z222 z220 cSs
|jd�S)NsX-Antivirus)r)rrrr
�<lambda>�sz@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r
rd�s�)rrr2�headr%�NNTPTemporaryErrorr(rrPrr`�bodyr_rr)
rrrArBrCrQrRrf�erhr_Zfiltered_head_linesZfiltered_linesr)rcr
�test_article_head_body�s,
z.NetworkedNNTPTestsMixin.test_article_head_bodycsD�fdd�}�j�jjd�|�jj���jj�\}}||�dS)Ncs(|d}�j|ttf��jd|�dS)N�LISTzOVERVIEW.FMT)r.r�tupler7)�capsZ	caps_list)rrr
�_check_caps�sz>NetworkedNNTPTestsMixin.test_capabilities.<locals>._check_caps�)rEr�nntp_version�getcapabilitiesZcapabilities)rrnrrmr)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|jj�Wdd|_XdS)N)rr�quit)r�clsrrr
�test_zzquit�sz#NetworkedNNTPTestsMixin.test_zzquitcCsNdd�}x@t|�D]4}|jd�s"qt||�}t|�s6qt||||��qWdS)Ncstj���fdd��}|S)Nc	s$tj|j���|�WdQRXdS)N)r�transient_internet�	NNTP_HOST)r)�methrr
�wrapped�szHNetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth.<locals>.wrapped)�	functools�wraps)r~rr)r~r
�	wrap_meth�sz7NetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_methZtest_)�dirr�getattr�callable�setattr)rzr�rQr~rrr
�wrap_methods�s

z$NetworkedNNTPTestsMixin.wrap_methodscs��fdd�}yz|j|jtdd�� �|j|��|j�j��WdQRX|j|��|j|jtdd����j�WdQRX|j|��WnJtk
r�}z.tj	d|j
�r�tjd|�d|j�����WYdd}~XnXdS)Ncs8t�d�sdSy�j�Wnttfk
r2dSXdS)N�fileFT)�hasattrr�OSError�EOFErrorr)rrr
�is_connected	s
zANetworkedNNTPTestsMixin.test_with_statement.<locals>.is_connectedF)�timeoutruz(?i)KEY.TOO.SMALLzGot z connecting to )
�
NNTP_CLASSr}�TIMEOUTrr�assertFalseryr�re�searchr�unittest�SkipTest)rr��ssl_errr)rr
�test_with_statements	z+NetworkedNNTPTestsMixin.test_with_statement)N)rr	r
rrr!r#r*r0r9r<rDrFrNrSr�ZskipIfrYrZr`rjrrrxr{�classmethodr�r�rrrr
r(s*		
	
rc@s8eZdZdZdZdZdZeZe	dd��Z
e	dd��Zd	S)
�NetworkedNNTPTestsznews.trigofacile.comzfr.comp.lang.pythonzfr.comp.lang.*�PythoncCs�tjd�tj|j���y|j|jtdd�|_Wnvtk
r~}z2tj	d|j
�rltj|�d|�d|j�����WYdd}~Xn*t
k
r�tj|�d|j����YnXWdQRXdS)NZnetworkF)r�ruz(?i)KEY.TOO.SMALLz got z connecting to z  got EOF error on connecting to )rZrequiresr|r}r�r�rrr�r�rr�r�r�)rzr�rrr
�
setUpClass/s

zNetworkedNNTPTests.setUpClasscCs|jdk	r|jj�dS)N)rry)rzrrr
�
tearDownClass@s
z NetworkedNNTPTests.tearDownClassN)rr	r
r}r2r"r8rr�r�r�r�rrrr
r�&sr�zrequires SSL supportc@s0eZdZdZdZdZdZeedd�Z	dZ
dZdS)�NetworkedNNTP_SSLTestsz
nntp.aioe.orgz	aioe.testzaioe.*�test�NNTP_SSLN)rr	r
r}r2r"r8r�r%r�r!�
test_starttlsrrrr
r�Esr�c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�
_NNTPServerIOcCs>tjj|�tj�|_tj�|_||_|jj|jj|j	�dS)N)
�io�	RawIOBase�__init__�BytesIO�c2s�s2c�handlerrX�readline�	push_data)rr�rrr
r�es


z_NNTPServerIO.__init__cCsdS)NTr)rrrr
�readablensz_NNTPServerIO.readablecCsdS)NTr)rrrr
�writableqsz_NNTPServerIO.writablecCs4|jj�}|jjdd�|jj|�|jj|�dS)Nrro)r��tell�seek�write)r�data�posrrr
r�ts
z_NNTPServerIO.push_datacCs4|jj�}|jj|�|jj|�|jj�t|�S)N)r�r�r�r�r��process_pendingr)r�br�rrr
r�{s


z_NNTPServerIO.writecCs2|jj�|jjt|��}t|�}||d|�<|S)N)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�`s	r�cCst|�}tj||�}||fS)N)r�r��BufferedRWPair)r��sior�rrr
�make_mock_file�sr�cs4eZdZdZ�fdd�Z�fdd�Zdd�Z�ZS)�MockedNNTPTestsMixinNcst�j�|j�dS)N)�super�setUp�make_server)r)�	__class__rr
r��s
zMockedNNTPTestsMixin.setUpcst�j�|`dS)N)r��tearDownr)r)r�rr
r��s
zMockedNNTPTestsMixin.tearDowncOs6|j�|_t|j�\|_}tj|df|�|�|_|jS)Nztest.server)�
handler_classr�r�r�r%Z	_NNTPBaser)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�j�|jdd�dS)NT)Z
readermode)r�r�r�)r)r�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�Zdd�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|_|j�dS)NFT)�in_body�
allow_posting�	_readline�
_push_data�
_logged_in�
_user_sent�handle_welcome)rr�r�rrr
rX�szNNTPv1Handler.startcCst|dd�S)Nzutf-8�surrogateescape)r)rr�rrr
�_decode�szNNTPv1Handler._decodecCs4|jrfx*|j�}|sdS|jj|�|dkrPqWz|j\}}||d|ji�Wdd|_d|_d|_Xx�|j|j��}|s~dS|jd�s�tdj|���|dd	�}|j	�^}}t
|d|j�d�}|dkr�|j�qhy||�Wn4t
k
�r}ztdj|��|�WYdd}~XqhX|jrh||f|_g|_qhWdS)
Ns.
rhFz
z line doesn't end with \r\n: {!r}roZhandle_zcommand failed: {!r}���)r�r�rh�appendZ
body_callbackr��endswith�
ValueError�format�splitr��upper�handle_unknown�	Exception)rrr~�tokens�cmdrirrr
r��s@


"
zNNTPv1Handler.process_pendingcCs
d|_dS)NT)r�)rrrr
�expect_body�szNNTPv1Handler.expect_bodycCs|j|�dS)N)r�)rr�rrr
r��szNNTPv1Handler.push_datacCs4tj|�}dj|j��d}|jd�}|j|�dS)Nz
zutf-8)�textwrap�dedent�join�
splitlines�encoder�)rZlitrrr
�push_lit�s

zNNTPv1Handler.push_litcCs|jd�dS)Nz	500 What?)r�)rrrr
r��szNNTPv1Handler.handle_unknowncCs|j|j�dS)N)r�r)rrrr
r��szNNTPv1Handler.handle_welcomecCs|jd�dS)Nz205 Bye!)r�)rrrr
�handle_QUIT�szNNTPv1Handler.handle_QUITcCs|jd�dS)Nz111 20100914001155)r�)rrrr
�handle_DATE�szNNTPv1Handler.handle_DATEcCs(|dkr|jd�n|jdj|��dS)Nzfr.comp.lang.pythonz$211 486 761 1265 fr.comp.lang.pythonz411 No such group {})r�r�)rrrrr
�handle_GROUPszNNTPv1Handler.handle_GROUPcCs|jd�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_HELPszNNTPv1Handler.handle_HELPNcCsJ|dkr|jd�n2|dkr(|jd�n|dkr<|jd�n
|jd�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|jd�dS)Nz*223 3000237 <668929@example.org> retrieved)r�)rrrr
�handle_NEXTszNNTPv1Handler.handle_NEXTcCs|jd�dS)Nz,223 3000234 <45223423@example.com> retrieved)r�)rrrr
�handle_LASTszNNTPv1Handler.handle_LASTcCs�|dkr|jd�n�|dkr<|dkr0|jd�q�|jd�nZ|dkrP|jd�nF|dkr�|d	krl|jd
�q�|dkr�|jd�q�|jd
�n
|jd�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�)r�actionZparamrrr
�handle_LISTs,
zNNTPv1Handler.handle_LISTcCs�|dkr$|dkr$|dkr$|jd�nZ|dkrH|dkrH|dkrH|jd�n6|dkrt|dkrt|d	krt|jd
dd�n
|jd
�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>
                .�20100101�100101Z090000z
too long linei�z
.zK                230 An empty list of newsarticles follows
                .)r�r�)r�)rr�date_str�time_strrrr
�handle_NEWNEWSUs

zNNTPv1Handler.handle_NEWNEWScCs"|dkr|jd�n
|jd�dS)Nz57-59uL224 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.org 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_XOVERts
zNNTPv1Handler.handle_XOVER)rhcCsB|dkr.|jr"|jd�|j�q>|jd�n|jd�||_dS)Nz+340 Input article; end with <CR-LF>.<CR-LF>z440 Posting not permittedz240 Article received OK)r�r�r��posted_body)rrhrrr
�handle_POST�s


zNNTPv1Handler.handle_POSTcCsJ|dkr6|jr*|dkr*|jd�|j�qF|jd�n|jd�||_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�
message_idrhr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|jd�n6|dkr(|jd�n"|dkr<|jd�n|jd�dS|j|j�|jd�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|jd�n6|dkr(|jd�n"|dkr<|jd�n|jd�dS|j|j�|jd�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|jd�n6|dkr(|jd�n"|dkr<|jd�n|jd�dS|j|j�|jd�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|jd�nT|dkr>|jr,|jd�qf|jd�d|_n(|dkrX|jd�d|_ntdj|���dS)	Nz502 Already Logged Inrsz 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
rrXr�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rrr
r��s8
&	


6 



r�c@s&eZdZdd�Zdd�Zddd�ZdS)	�
NNTPv2HandlercCs0d}|js|j|jd��n|j|jd��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 USERr5)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_MODEszNNTPv2Handler.handle_MODENcCs
|j|�S)N)r�)rr�rrr
�handle_OVER	szNNTPv2Handler.handle_OVER)N)rr	r
rrrrrrr
r�srcseZdZ�fdd�Z�ZS)�CapsAfterLoginNNTPv2Handlercs |js|jd�n
t�j�dS)Nz480 You must log in.)r�r�r�r)r)r�rr
rsz/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES)rr	r
rr�rr)r�r
r
src@s$eZdZdd�Zdd�Zdd�ZdS)�ModeSwitchingNNTPv2HandlercCs
d|_dS)NF)�	_switched)rrrr
r�sz#ModeSwitchingNNTPv2Handler.__init__cCs0d}|jr|j|jd��n|j|jd��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
            .r5zMODE-)r	r�r�)rrrrr
rs
z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIEScCsd|_|jd�dS)NTz200 Posting allowed)r	r�)rZwhatrrr
r-sz&ModeSwitchingNNTPv2Handler.handle_MODEN)rr	r
r�rrrrrr
rsrcseZdZ�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�j�dS)N)r�r�)r)r�rr
r�5szNNTPv1v2TestsMixin.setUpcCs|j|jj|jj�dS)N)rrrr�)rrrr
r8szNNTPv1v2TestsMixin.test_welcomecCs<|jdkr|jd|jj�|jjdd�|jd|jj�dS)Nro�AUTHINFO�testuser�testpw)rpr7r�_capsrwr1)rrrr
�
test_authinfo;s
z NNTPv1v2TestsMixin.test_authinfoc	Cs:|jj�\}}|j|d�|j|tjdddddd��dS)Nz111 20100914001155i��	�r��7)rr-rr,)rrr-rrr
rFCszNNTPv1v2TestsMixin.test_datecCs6|j|jj�|jj�}|j|d�|j|jj�dS)Nz205 Bye!)r�r��closedrryrr)rrrrr
�	test_quitHs
zNNTPv1v2TestsMixin.test_quitcCs2|jj�\}}|j|d�|j|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r
rNszNNTPv1v2TestsMixin.test_helpcCs~|jj�\}}|jt|�d�|d}|j|tdddd��|jjd�\}}|jt|�d�|d	}|j|td
ddd��dS)
N�rUzcomp.lang.python.announceZ
0000001153Z
0000000993�mz*distutils*rorz!gmane.comp.python.distutils.develZ
0000014104Z
0000000001)rrrrr)rrr �grrr
r!Xs
zNNTPv1v2TestsMixin.test_listcCs�|jjd�\}}}|j|d�|j|d�|j|d�|jjd�\}}}|j|d�|j|d�|j|d�|jtj��}|jjd�WdQRX|j|jjd�|jtj��}|jj�WdQRX|j|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%rgr'r()rrrRr�r)rrr
�	test_statfszNNTPv1v2TestsMixin.test_statcCs8|jj�\}}}|j|d�|j|d�|j|d�dS)Nz*223 3000237 <668929@example.org> retrievedi��-z<668929@example.org>)r�nextr)rrrRr�rrr
�	test_nextvszNNTPv1v2TestsMixin.test_nextcCs8|jj�\}}}|j|d�|j|d�|j|d�dS)Nz,223 3000234 <45223423@example.com> retrievedi��-z<45223423@example.com>)rrCr)rrrRr�rrr
�	test_last|szNNTPv1v2TestsMixin.test_lastcCs4|jjd�}|j|d�|jjd�}|j|d�dS)Nzcomp.lang.pythonzThe Python computer language.zcomp.lang.pythonxr5)rr6r)rr3rrr
r9�sz#NNTPv1v2TestsMixin.test_descriptioncCsn|jjd�\}}|j|d�|j|ddi�|jjd�\}}|j|ddd��|jjd�\}}|j|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r
r<�s

z$NNTPv1v2TestsMixin.test_descriptionsc
Cs�|jjd�\}}}}}|j|jd�|�|j|d�|j|d�|j|d�|j|d�|jtj��}|jjd�WdQRX|j}|j|j	jd�|j	�dS)Nzfr.comp.lang.pythonz211 i�i�i�zcomp.lang.python.develz411 No such group)
rrrrrr$r%rgr'r()rrrArBrCrr)�excrrr
rD�szNNTPv1v2TestsMixin.test_groupcCs�tjdddddd�}|jjd|�\}}dj|j�}|j||�|j|d	d
g�tjdddddd�}|jjd|�\}}|j|d�|j|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�rpr)rr/rZidsZexpectedrrr
�test_newnews�szNNTPv1v2TestsMixin.test_newnewscCsZ|jt|�d�|j|d
jd�d�|j|dd�|j|dd�|j|d
d	�dS)Nr"rUzutf-8u-- Signed by André.rore�s.Here is a dot-starting line.sThis is just a test article.rVr�������)rr�decode)rrrrr
�_check_article_body�s
z&NNTPv1v2TestsMixin._check_article_bodycCs4|jt|�d�|j|dd�|j|dd�dS)Nr"rs&From: "Demo User" <nobody@example.net>r%s7Message-ID: <i.am.an.article.you.will.want@example.com>)rr)rrrrr
�_check_article_head�sz&NNTPv1v2TestsMixin._check_article_headcCsH|jt|�d�|j|dd��|j|dd��|j|dd�dS)Nrr"rer')rrr*r))rrrrr
�_check_article_data�sz&NNTPv1v2TestsMixin._check_article_datac
Cs|jj�\}}|j|d�|\}}}|j|d�|j|d�|j|�|jjd�\}}|j|d�|\}}}|j|d�|j|d�|j|�|jjd�\}}|j|d�|\}}}|j|d�|j|d�|j|�|jtj��}|jjd�WdQRX|j|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%rgr'r()rr�inforRr�rr)rrr
�test_article�s*





zNNTPv1v2TestsMixin.test_articlecCs�tj�}|jj|d�\}}|j|d�|\}}}|j|d�|j|d�|j|g�|j�}|j|jd�t|��|j|j	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,rRr�rr�rrr
�test_article_file�s

z$NNTPv1v2TestsMixin.test_article_filec
Cs|jj�\}}|j|d�|\}}}|j|d�|j|d�|j|�|jjd�\}}|j|d�|\}}}|j|d�|j|d�|j|�|jjd�\}}|j|d�|\}}}|j|d�|j|d�|j|�|jtj��}|jjd�WdQRX|j|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)	rrfrr*r$r%rgr'r()rrr,rRr�rr)rrr
�	test_head�s*





zNNTPv1v2TestsMixin.test_headcCs�tj�}|jj|d�\}}|j|d�|\}}}|j|d�|j|d�|j|g�|j�}|j|jd�t|��|j	|j
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�rrfrr.rrr/r�r�)rr0rr,rRr�rr�rrr
�test_head_files

z!NNTPv1v2TestsMixin.test_head_filec
Cs|jj�\}}|j|d�|\}}}|j|d�|j|d�|j|�|jjd�\}}|j|d�|\}}}|j|d�|j|d�|j|�|jjd�\}}|j|d�|\}}}|j|d�|j|d�|j|�|jtj��}|jjd�WdQRX|j|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)	rrhrr)r$r%rgr'r()rrr,rRr�rr)rrr
�	test_body's*





zNNTPv1v2TestsMixin.test_bodycCs�tj�}|jj|d�\}}|j|d�|\}}}|j|d�|j|d�|j|g�|j�}|j|jd�t|��|j	|j
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�rrhrr.r�rr/rr�)rr0rr,rRr�rr�rrr
�test_body_fileBs

z!NNTPv1v2TestsMixin.test_body_filecCs�|j|jd�|�|jt|�d�|d\}}|j|d�|j|ddddd	d
ddd
��|d\}}|j|dd�|d\}}|j|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.org gmane.comp.python.authors:57)rHrGr-z
message-idrIz:bytesz:lines�xrefrUr7rorGu0Re: Message d'erreur incompréhensible (par moi))rrrr)rr�	overviewsrRrWrrr
�check_over_xover_respVs$

z(NNTPv1v2TestsMixin.check_over_xover_respcCs"|jjdd�\}}|j||�dS)Nr6�;)rrOr9)rrr8rrr
rSkszNNTPv1v2TestsMixin.test_xovercCs |jjd�\}}|j||�dS)Nr6r:)r6r:)rrWr9)rrr8rrr
rYoszNNTPv1v2TestsMixin.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}|jt|�d�|j|dd�|j|d
d�|j|dd�|j|dd	�|j|d
d�dS)NrTrUs.
ros-- Signed by André.
r%s
r"s ..Here is a dot-starting line.
rs(From: "Demo User" <nobody@example.net>
rVr�r&r')r�r�rr)rrrrr
�_check_posted_body�sz%NNTPv1v2TestsMixin._check_posted_bodycGsd|j}|||�f}d|j_||�}|j�|jjdd�}|||�f}d|j_||�}|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||�|j|f|�dti�}|j||�|j|f|�dtji�}|j||�dd�}|j|f|�d|i�}|j||�dd�}|j|f|�d|i�}|j||�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r
rE�s)rBr^r�	bytearrayr�r�)rr?Zsuccess_respr�rrErrr
�check_post_ihave�sz#NNTPv1v2TestsMixin.check_post_ihavec
CsR|j|jjd�d|j_|jtj��}|jj|j�WdQRX|j	|j
jd�dS)Nz240 Article received OKFz440 Posting not permitted)rGrrAr�r�r$r%rgr=rr'r()rr)rrr
�	test_post�s
zNNTPv1v2TestsMixin.test_postc
CsN|j|jjdd�|jtj��}|jjd|j�WdQRX|j|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%rgr=rr'r()rr)rrr
�
test_ihave�s
zNNTPv1v2TestsMixin.test_ihavecCs.tjdddddd�}|jtj|jjd|�dS)Ni�rUrrzcomp.lang.python)r,r$r%�
NNTPDataErrorrr#)rr/rrr
�test_too_long_lines�sz&NNTPv1v2TestsMixin.test_too_long_lines)%rr	r
r�rrrFrrr!rrrr9r<rDr$r)r*r+r-r1r2r3r4r5r9rSrYr=r;rBrGrHrIrKr�rr)r�r
r
3sB

r
c@seZdZdZeZdd�ZdS)�NNTPv1TestsrUcCs:|jj�}|j|i�|j|jjd�|j|jjd�dS)NrU)rrqrrp�nntp_implementation)rrmrrr
�	test_caps�s
zNNTPv1Tests.test_capsN)rr	r
rpr�r�rNrrrr
rL�srLc@seZdZdZeZdd�ZdS)�NNTPv2TestsrocCsb|jj�}|j|ddgddgdggdddd	d
dggggd��|j|jjd
�|j|jjd�dS)N�2�3ZINNz2.5.1ZUSERr�zACTIVE.TIMESzDISTRIB.PATSZHEADERSr�zOVERVIEW.FMT)�VERSIONZIMPLEMENTATIONrZHDRrkZOVERZPOST�READERr%z	INN 2.5.1)rrqrrprM)rrmrrr
rN�s

zNNTPv2Tests.test_capsN)rr	r
rprr�rNrrrr
rO�srOc@seZdZdZeZdd�ZdS)�CapsAfterLoginNNTPv2TestsrocCs2|j|jji�|jjdd�|jd|jj�dS)Nrr
rR)rrrrwr7)rrrr
�test_caps_only_after_login�sz4CapsAfterLoginNNTPv2Tests.test_caps_only_after_loginN)rr	r
rprr�rUrrrr
rT�srTc@seZdZdZeZdd�ZdS)�SendReaderNNTPv2TestsrocCs|jd|jj�dS)NrS)r7rr)rrrr
�(test_we_are_in_reader_mode_after_connect�sz>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connectN)rr	r
rprr�rWrrrr
rV�srVc@sPeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Ze	j
ed
�dd��ZdS)�	MiscTestscsV�fdd�}|dd�|dd�|dd�|dd�|dd	�|d
d�|dd�dS)
Ncs�jtj|�|�dS)N)rr%�
decode_header)�ar�)rrr
�givessz+MiscTests.test_decode_header.<locals>.givesr5za 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_headercCsDdddddddg}|jtj|�dd	d
ddddg�dddddd
dg}|jtj|�dd	d
ddddg�dddddddg}|jtj|�dd	d
ddddg�dddddddddg	}|jtj|�dd	d
ddddddg	�dddddd
dddg	}|jtj|�dd	d
ddddddg	�dddddd
ddg}|jtj|�dd	d
dddddg�dS)NzSubject:zFrom:zDate:zMessage-ID:zReferences:z:bytesz:linesrGrHr-z
message-idrIzBytes: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_fmtcCs�tjdg}dg}tj||�}|\\}}|j|d�|j|dddddd	d
dd��d
g}tj||�}|\\}}|j|dd�dg}tj||�}|\\}}|j|dd�|j|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)rGrHr-z
message-idrIz: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: 	rI� r5)r%Z_DEFAULT_OVERVIEW_FMTZ_parse_overviewr)rrrZoverviewrRZfieldsrrr
�test_parse_overview<s.



zMiscTests.test_parse_overviewc	sh�fdd�}|dddddddd	�|d
ddddddd	�|dddddddd	�|d
ddddddd	�dS)Ncs�jtj||�tj|��dS)N)rr%Z_parse_datetimer,)rZr��c)rrr
r[ksz,MiscTests.test_parse_datetime.<locals>.givesZ19990623135624i�r�r�8��19990623�135624�990623Z090623i�r)rr[r)rr
�test_parse_datetimejs
zMiscTests.test_parse_datetimec	s��fdd�}|ddddddd	d
�|dddddddd
�|d
ddddddd��fdd�}|dddd	d�|ddddd�|d
dddd�dS)Nc	sFtj||||||�}�jtj|�||f��jtj|d�||f�dS)NF)r,rr%�_unparse_datetime)	�y�M�d�hr�sr�r�r/)rrr
r[xs

z.MiscTests.test_unparse_datetime.<locals>.givesi�rrarrbrcrdrei�Z20000623i�r=rUror%Z20100605�010203cs@tj|||�}�jtj|�||f��jtj|d�||f�dS)NF)r,r-rr%rh)rirjrkr�r�r/)rrr
r[�s

�000000r)rr[r)rr
�test_unparse_datetimeuszMiscTests.test_unparse_datetimec	s��fdd�}|ddddddd	d
�|dddddddd
�|d
ddddddd��fdd�}|dddd	d�|ddddd�|d
dddd�dS)Nc	s0tj||||||�}�jtj|d�||f�dS)NT)r,rr%rh)	rirjrkrlrrmr�r�r/)rrr
r[�sz5MiscTests.test_unparse_datetime_legacy.<locals>.givesi�rrarrbrcrfrei�Z000623i�r=rUror%Z100605rncs*tj|||�}�jtj|d�||f�dS)NT)r,r-rr%rh)rirjrkr�r�r/)rrr
r[�sror)rr[r)rr
�test_unparse_datetime_legacy�sz&MiscTests.test_unparse_datetime_legacyzrequires SSL supportcCs|jttd��dS)Nr�)rr�r%)rrrr
�test_ssl_support�szMiscTests.test_ssl_supportN)
rr	r
r\r]r_rgrprqr��
skipUnless�sslrrrrrr
rXs(.rXc@seZdZdd�ZdS)�PublicAPITestscCsP|jttd��dddddddd	g}tdk	r6|jd
�|jttj�t|��dS)N�__all__rrv�NNTPReplyErrorrgr&�NNTPProtocolErrorrJrYr�)rr�r%rtr�r�setrv)rZ
target_apirrr
�test_module_all_attribute�s

z(PublicAPITests.test_module_all_attributeN)rr	r
rzrrrr
ru�sruc@sDeZdZejZddd�Zdd�Zdd�Zdd	�Z	d
d�Z
dd
�ZdS)�MockSocketTestsNcs�G�fdd�d�}G���fdd�d��d�g�td|��.|j||��|jd||d�WdQRXWdQRX|j��x�D]}|j|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|�\}}�j|�|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r
r|�sr|Fznntplib.socketZdummy)rsrt)rZassertRaisesRegex�
nntp_classrr)rr�Zexpected_error_typeZexpected_error_msgrwrtr~r0r)r|r�r�rr
�"check_constructor_error_conditions�s$

z2MockSocketTests.check_constructor_error_conditionscCs&Gdd�dt�}|j|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�}|j|tj|j�dS)Nc@seZdZdZdS)zEMockSocketTests.test_service_temporarily_unavailable.<locals>.Handlerz#400 Service temporarily unavailableN)rr	r
rrrrr
r��sr�)r�r�r%rgr)rr�rrr
�$test_service_temporarily_unavailable�sz4MockSocketTests.test_service_temporarily_unavailablecCs&Gdd�dt�}|j|tj|j�dS)Nc@seZdZdZdS)zEMockSocketTests.test_service_permanently_unavailable.<locals>.Handlerz#502 Service permanently unavailableN)rr	r
rrrrr
r��sr�)r�r�r%r&r)rr�rrr
�$test_service_permanently_unavailable�sz4MockSocketTests.test_service_permanently_unavailablecs,G�fdd�dt�}d�|j|tj��dS)NcseZdZ�fdd�ZdS)z6MockSocketTests.test_bad_capabilities.<locals>.Handlercs|j��dS)N)r�)r)�capabilities_responserr
r�szJMockSocketTests.test_bad_capabilities.<locals>.Handler.handle_CAPABILITIESN)rr	r
rr)r�rr
r��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�|j|tj�||�dS)Nzt@e.com�pythoncseZdZ�fdd�ZdS)z3MockSocketTests.test_login_aborted.<locals>.Handlercs|j��dS)N)r�)rr�)�authinfo_responserr
r�szCMockSocketTests.test_login_aborted.<locals>.Handler.handle_AUTHINFON)rr	r
rr)r�rr
r��sr�z503 Mechanism not recognized)r�r�r%r&)rrwrtr�r)r�r
�test_login_aborted�sz"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|S)Nr)�sockr�rrr
�wrap_socketszbypass_context.wrap_socketN)rr	r
r�rrrr
r��sr�c@seZdZedd��ZdS)�MockSslTestscOstj|dti|��S)NZssl_context)r%r�r�)r��kwrrr
r�szMockSslTests.nntp_classN)rr	r
�staticmethodr�rrrr
r�sr�zrequires multithreadingc@s0eZdZdd�Zdd�Zejed�dd��ZdS)	�LocalServerTestscCsttj�}tj|�}|j�tj|j|fd�|_|jj�|j	|jj
�ttj|dd�j
�|_|j	|jjddd�dS)N)�targetr�F)ru)r�rZ	bind_portZlisten�	threadingZThread�
run_serverZ
backgroundrXZ
addCleanupr�rZHOST�	__enter__�nntp�__exit__)rr�Zportrrr
r�s

zLocalServerTests.setUpcCs�|�|j�\}}WdQRXtj���}|j|�|j|jd��}|jd�x�|j�}|dkrh|jd�qL|dkr�|j�|jd�tj	�}|j
t�|j|dd�}|j|�|j|jd��}qL|d	kr�|jd
�PqLt
dj|���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�ZclientrZcleanup�readerr��contextrrr
r�s0







zLocalServerTests.run_serverzrequires SSL supportcCs`|jj}|jj}|jj�|j||jj�|j||jj�|j|jjtj�|jt	|jj�dS)N)
r�r�r�ZstarttlsZassertNotEqualr.rtZ	SSLSocketr$r�)rr�r�rrr
r�7s
zLocalServerTests.test_starttlsN)	rr	r
r�r�r�rsrtr�rrrr
r�	s r��__main__)8r�r�r,r�r�r�r�Zos.path�osr�r�rr%rrZ
unittest.mockrrt�ImportErrorr�r��pathr��dirname�__file__r�rr�rr�ZTestCaser�rsr�r�r�r�r�r�r�rrrr
rLrOrTrVrXrur{r�r�r�r�mainrrrr
�<module>sz


|,G

#N
<