Your IP : 216.73.216.213


Current Path : /opt/alt/python34/lib64/python3.4/test/__pycache__/
Upload File :
Current File : //opt/alt/python34/lib64/python3.4/test/__pycache__/test_nntplib.cpython-34.pyo

�
g f���@s�ddlZddlZddlZddlZddlZddlZddlZddlmZddl	m
Z
mZddl	Z	ddlm
Z
yddlZWnek
r�dZYnXdZGdd�d�Zej�Gdd	�d	eej�Zejed
�Gdd�de��ZGd
d�dej�Zdd�ZGdd�d�ZGdd�de�ZGdd�d�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�d�Z Gdd �d e eej�Z!Gd!d"�d"e eej�Z"Gd#d$�d$eej�Z#Gd%d&�d&eej�Z$Gd'd(�d(ej�Z%Gd)d*�d*ej�Z&Gd+d,�d,ej�Z'Gd-d.�d.�Z(ejed
�Gd/d0�d0e'��Z)e*d1kr�ej+�ndS)2�N)�support)�NNTP�	GroupInfo)�patch�c@s3eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zddd�Zd d!�Zd"d#�Zejed$�d%d&��Zd'd(�Zd)d*�Zed+d,��Zd-d.�ZdS)/�NetworkedNNTPTestsMixincCs)|jj�}|jtt|��dS)N)�serverZ
getwelcome�assertEqual�str�type)�self�welcome�r�6/opt/alt/python34/lib64/python3.4/test/test_nntplib.py�test_welcomesz$NetworkedNNTPTestsMixin.test_welcomecCsY|jj�\}}|j|jd�|�x$|D]}|jtt|��q5WdS)Nz100 )r�help�
assertTrue�
startswithr	r
r)r�resp�lines�linerrr�	test_helps
z!NetworkedNNTPTestsMixin.test_helpcCse|jj�\}}t|�dkra|jtt|d��|jtt|dj��ndS)Nr)r�list�lenr	rrr
�group)rr�groupsrrr�	test_list%sz!NetworkedNNTPTestsMixin.test_listcCsk|jj|j�\}}t|�dkrg|jtt|d��|jtt|dj��ndS)Nr)	rr�	GROUP_PATrr	rrr
r)rrrrrr�test_list_active+sz(NetworkedNNTPTestsMixin.test_list_activec	CsT|jtj��}|jjd�WdQX|jj}|j|jd�|�dS)NZXYZZYz500 )	�assertRaises�nntplib�NNTPPermanentErrorrZ	_shortcmd�	exception�responserr)r�cmrrrr�test_unknown_command1sz,NetworkedNNTPTestsMixin.test_unknown_commandcCs{tjj�tjdd�}|jj|�\}}t|�dkrw|j|dt�|j|dj	t
�ndS)NZdays�r)�datetime�dateZtodayZ	timedeltarZ	newgroupsr�assertIsInstancerrr
)r�dtrrrrr�test_newgroups7s
z&NetworkedNNTPTestsMixin.test_newgroupscs��fdd�}�jj�j�}||��jd|��jj�j�}||��jjd�}�j|d�dS)Ncs'�j|t��j�j|�dS)N)r)r
�assertNotIn�
GROUP_NAME)�desc)rrr�_check_descAsz=NetworkedNNTPTestsMixin.test_description.<locals>._check_desc�Pythonzzk.brrtt.baz�)r�descriptionr-�assertInrr	)rr/r.r)rr�test_description@s

z(NetworkedNNTPTestsMixin.test_descriptioncCs�|jj|j�\}}|j|jd�p<|jd�|�|j|t�||j}|j||jj	|j��dS)Nz215 z282 )
r�descriptionsrrrr)�dictr-r	r2)rrZdescsr.rrr�test_descriptionsPs"
z)NetworkedNNTPTestsMixin.test_descriptionscCs�|jj|j�}|jdt|��|\}}}}}|j||j�|j|t�|j|t�|j|t�|j||�|j|j	d�|�dS)N�z211 )
rrr-r	rr)�int�assertLessEqualrr)r�resultr�count�first�lastrrrr�
test_groupYsz"NetworkedNNTPTestsMixin.test_groupcCsR|jj�\}}|j|tj�|j|jd�|j|jd�dS)Ni�i�)rr(r)r'�assertGreaterEqualZyearr:)rrr(rrr�	test_datedsz!NetworkedNNTPTestsMixin.test_datec	Csr|j|t�|j|j�dddddddh�x0|j�D]"}|j|ttd�f�qHWdS)N�subject�fromr(z
message-id�
referencesz:bytesz:lines)r)r6r@�keys�valuesr
r)r�art_dict�vrrr�_check_art_dictksz'NetworkedNNTPTestsMixin._check_art_dictc	Cs�|jj|j�\}}}}}|jj|d|�\}}t|�dkre|jd�n|d\}}|j||d�|j||�|j|�dS)Nr8rzno articles retrieved)	rrr-�xoverr�skipTestr@r:rI)	rrr<r=r>�namer�art_numrGrrr�
test_xovervs$z"NetworkedNNTPTestsMixin.test_xoverc
Cs�|jj|j�\}}}}}|d}|jj|df�\}}|d\}}	|j|	�|jj||f�\}}|d\}}	|j||�|j||�|j|	�dS)N�
r����)rrr-�overrIr@r:)
rrr<r=r>rL�startrrMrGrrr�	test_over�s$

z!NetworkedNNTPTestsMixin.test_overcCsn|jj|j�\}}}}}|jjd|�\}}x(|D] }|jtt|d��qFWdS)NrBrP)rrr-Zxhdrr	r
r)rrr<r=r>rLrrrrr�	test_xhdr�s$
z!NetworkedNNTPTestsMixin.test_xhdrNcCst|j|tj�|dk	r5|j|j|�nx!|jD]}|j|t�q?W|j|jdd�dS)NrP�.�.
�.
rQ)rVrWrX)r)r ZArticleInfor	Znumberr�bytesr,)rr�articlerMrrrr�check_article_resp�sz*NetworkedNNTPTestsMixin.check_article_respc
s�|jj|j�\}}}}}x�|||dfD]i}y|jj|�\}}WnCtjk
r�}z |jjd�s��nw8WYdd}~XnXPq8W|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)
NrPz423 z(could not find a suitable article numberz221 z222 z220 cSs
|jd�S)NsX-Antivirus)r)rrrr�<lambda>�sz@NetworkedNNTPTestsMixin.test_article_head_body.<locals>.<lambda>cs"g|]}�|�s|�qSrr)�.0r)�	blacklistrr�
<listcomp>�s	zBNetworkedNNTPTestsMixin.test_article_head_body.<locals>.<listcomp>cs"g|]}�|�s|�qSrr)r]r)r^rrr_�s	�)rrr-�headr �NNTPTemporaryErrorr#rrKrr[�bodyrZrr	)
rrr<r=r>rLrMra�ercrZZfiltered_head_linesZfiltered_linesr)r^r�test_article_head_body�s,$
z.NetworkedNNTPTestsMixin.test_article_head_bodycs^�fdd�}�j�jjd�|�jj���jj�\}}||�dS)Ncs4|d}�j|ttf��jd|�dS)N�LISTzOVERVIEW.FMT)r)r�tupler3)�capsZ	caps_list)rrr�_check_caps�s
z>NetworkedNNTPTestsMixin.test_capabilities.<locals>._check_caps�)r@r�nntp_version�getcapabilitiesZcapabilities)rrirrhr)rr�test_capabilities�s
z)NetworkedNNTPTestsMixin.test_capabilitieszrequires SSL supportcCs�|jj}|jj}y|jj�Wn"tjk
rM|jd�Yn\X|j||jj�|j||jj�|j|jjt	j
�|jt|jj�dS)Nz!STARTTLS not supported by server.)
r�file�sockZstarttlsr r!rKZassertNotEqualr)�sslZ	SSLSocketr�
ValueError)rrnrorrr�
test_starttls�sz%NetworkedNNTPTestsMixin.test_starttlsc	Cs;d}d}|jtj|jjd|d|dd�dS)NZnotarealuserZnotarealpassword�user�password�usenetrcF)rr �	NNTPErrorr�login)rZbaduserZbadpwrrr�test_zlogin�sz#NetworkedNNTPTestsMixin.test_zlogincCs.t|�}z|jj�Wdd|_XdS)N)rr�quit)r�clsrrr�test_zzquit�sz#NetworkedNNTPTestsMixin.test_zzquitcCssdd�}x`t|�D]R}|jd�s4qnt||�}t|�sUqnt||||��qWdS)Ncs%tj���fdd��}|S)Nc	s'tj|j���|�WdQXdS)N)r�transient_internet�	NNTP_HOST)r)�methrr�wrapped�szHNetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth.<locals>.wrapped)�	functools�wraps)r~rr)r~r�	wrap_meth�s!z7NetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_methZtest_)�dirr�getattr�callable�setattr)rzr�rLr~rrr�wrap_methods�sz$NetworkedNNTPTestsMixin.wrap_methodscs��fdd�}|j|jdtdd��*�|j|��|j�j��WdQX|j|��|j|jdtdd����j�WdQX|j|��dS)NcsDt�d�sdSy�j�Wnttfk
r?dSYnXdS)NrnFT)�hasattrr�OSError�EOFErrorr)rrr�is_connected	s	zANetworkedNNTPTestsMixin.test_with_statement.<locals>.is_connected�timeoutruF)�
NNTP_CLASSr}�TIMEOUTrr�assertFalsery)rr�r)rr�test_with_statements	!!z+NetworkedNNTPTestsMixin.test_with_statement)�__name__�
__module__�__qualname__rrrrr%r+r4r7r?rArIrNrTrUr[rerm�unittest�
skipUnlessrprrrxr{�classmethodr�r�rrrrrs,			
rc@sLeZdZdZdZdZeZedd��Z	edd��Z
dS)	�NetworkedNNTPTestsznews.trigofacile.comzfr.comp.lang.pythonzfr.comp.lang.*c
CsKtjd�tj|j��&|j|jdtdd�|_WdQXdS)NZnetworkr�ruF)rZrequiresr|r}r�r�r)rzrrr�
setUpClass's
zNetworkedNNTPTests.setUpClasscCs#|jdk	r|jj�ndS)N)rry)rzrrr�
tearDownClass-sz NetworkedNNTPTests.tearDownClassN)r�r�r�r}r-rrr�r�r�r�rrrrr�sr�zrequires SSL supportc@s@eZdZdZdZdZeedd�ZdZ	dZ
dS)�NetworkedNNTP_SSLTestsz
nntp.aioe.orgzcomp.lang.pythonzcomp.lang.*�NNTP_SSLN)r�r�r�r}r-rr�r r�rrrrrrrr�2s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.cCsWtjj|�tj�|_tj�|_||_|jj|jj|j	�dS)N)
�io�	RawIOBase�__init__�BytesIO�c2s�s2c�handlerrS�readline�	push_data)rr�rrrr�Os
	z_NNTPServerIO.__init__cCsdS)NTr)rrrr�readableXsz_NNTPServerIO.readablecCsdS)NTr)rrrr�writable[sz_NNTPServerIO.writablecCsF|jj�}|jjdd�|jj|�|jj|�dS)z.Push (buffer) some data to send to the client.rrjN)r��tell�seek�write)r�data�posrrrr�^sz_NNTPServerIO.push_datacCsF|jj�}|jj|�|jj|�|jj�t|�S)zThe client sends us some data)r�r�r�r�r��process_pendingr)r�br�rrrr�es

z_NNTPServerIO.writecCsE|jj�|jjt|��}t|�}||d|�<|S)z#The client wants to read a responseN)r�r�r��readr)rZbufr��nrrr�readintoms

z_NNTPServerIO.readintoN)
r�r�r��__doc__r�r�r�r�r�r�rrrrr�Js	r�cCs(t|�}tj||�}||fS)N)r�r��BufferedRWPair)r��siornrrr�make_mock_filevsr�csFeZdZdZ�fdd�Z�fdd�Zdd�Z�S)�MockedNNTPTestsMixinNcst�j�|j�dS)N)�super�setUp�make_server)r)�	__class__rrr��s
zMockedNNTPTestsMixin.setUpcst�j�|`dS)N)r��tearDownr)r)r�rrr��s
zMockedNNTPTestsMixin.tearDowncOsI|j�|_t|j�\|_}tj|d||�|_|jS)Nztest.server)�
handler_classr�r�r�r Z	_NNTPBaser)r�args�kwargsrnrrrr��sz MockedNNTPTestsMixin.make_server)r�r�r�r�r�r�r�rr)r�rr�~sr�cs"eZdZ�fdd�Z�S)�MockedNNTPWithReaderModeMixincs!t�j�|jdd�dS)NZ
readermodeT)r�r�r�)r)r�rrr��s
z#MockedNNTPWithReaderModeMixin.setUp)r�r�r�r�rr)r�rr��sr�c@steZdZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zddd�Zdd�Zd d!�Zddd"d#�Zd$d%�Zd&d'�Zd(dd)d*�Zd(dd+d,�Zd-Zd.Zed/eZdd0d1�Zdd2d3�Zdd4d5�Zd6d7�ZdS)8�
NNTPv1HandlerzA handler for RFC 977z200 NNTP mock servercCsDd|_d|_||_||_d|_d|_|j�dS)NFT)�in_body�
allow_posting�	_readline�
_push_data�
_logged_in�
_user_sent�handle_welcome)rr�r�rrrrS�s						zNNTPv1Handler.startcCst|dd�S)Nzutf-8�surrogateescape)r
)rr�rrr�_decode�szNNTPv1Handler._decodecCs�|jr�x:|j�}|s"dS|jj|�|dkrPqqWz&|j\}}|d|j|�Wdd|_d|_d|_Xnx|j|j��}|s�dS|jd�s�tdj|���n|dd	�}|j	�^}}t
|d|j�d�}|dkr.|j�q�y||�Wn=t
k
r{}ztdj|��|�WYdd}~Xq�X|jr�||f|_g|_q�q�WdS)
Ns.
rcFz
z line doesn't end with \r\n: {!r}rjZhandle_zcommand failed: {!r}���)r�r�rc�appendZ
body_callbackr��endswithrq�format�splitr��upper�handle_unknown�	Exception)rrr~�tokens�cmdrdrrrr��s@			

+	zNNTPv1Handler.process_pendingcCs
d|_dS)z7Flag that the client is expected to post a request bodyTN)r�)rrrr�expect_body�szNNTPv1Handler.expect_bodycCs|j|�dS)zPush some binary dataN)r�)rr�rrrr��szNNTPv1Handler.push_datacCsHtj|�}dj|j��d}|jd�}|j|�dS)zPush a string literalz
zutf-8N)�textwrap�dedent�join�
splitlines�encoder�)rZlitrrr�push_lit�szNNTPv1Handler.push_litcCs|jd�dS)Nz	500 What?)r�)rrrrr��szNNTPv1Handler.handle_unknowncCs|j|j�dS)N)r�r
)rrrrr��szNNTPv1Handler.handle_welcomecCs|jd�dS)Nz205 Bye!)r�)rrrr�handle_QUIT�szNNTPv1Handler.handle_QUITcCs|jd�dS)Nz111 20100914001155)r�)rrrr�handle_DATE�szNNTPv1Handler.handle_DATEcCs6|dkr|jd�n|jdj|��dS)Nzfr.comp.lang.pythonz$211 486 761 1265 fr.comp.lang.pythonz411 No such group {})r�r�)rrrrr�handle_GROUP�s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�)rrrr�handle_HELP�szNNTPv1Handler.handle_HELPNcCse|dkr|jd�nE|dkr8|jd�n)|dkrT|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_specrrr�handle_STAT�szNNTPv1Handler.handle_STATcCs|jd�dS)Nz*223 3000237 <668929@example.org> retrieved)r�)rrrr�handle_NEXTszNNTPv1Handler.handle_NEXTcCs|jd�dS)Nz,223 3000234 <45223423@example.com> retrieved)r�)rrrr�handle_LASTszNNTPv1Handler.handle_LASTcCs�|dkr|jd�n�|dkrT|dkrD|jd�q�|jd�n}|dkrp|jd�na|dkr�|d	kr�|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�actionZparamrrr�handle_LIST	s,







zNNTPv1Handler.handle_LISTcCs�|dkr4|dkr4|dkr4|jd�n}|dkrh|dkrh|dkrh|jd�nI|dkr�|dkr�|d	kr�|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�)rr�date_str�time_strrrr�handle_NEWNEWS?s


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�)rr�rrr�handle_XOVER^s

zNNTPv1Handler.handle_XOVERrccCsY|dkr?|jr/|jd�|j�qU|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)rrcrrr�handle_POST~s	


zNNTPv1Handler.handle_POSTcCse|dkrK|jr;|dkr;|jd�|j�qa|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_idrcrrr�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

cCs�|dkr|jd�nI|dkr8|jd�n-|dkrT|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)rr�rrr�handle_ARTICLE�s
zNNTPv1Handler.handle_ARTICLEcCs�|dkr|jd�nI|dkr8|jd�n-|dkrT|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)rr�rrr�handle_HEAD�s
zNNTPv1Handler.handle_HEADcCs�|dkr|jd�nI|dkr8|jd�n-|dkrT|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)rr�rrr�handle_BODY�s
zNNTPv1Handler.handle_BODYcCs�|jr|jd�nx|dkrW|jr>|jd�q�|jd�d|_n:|dkr||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�)rZ	cred_typer�rrr�handle_AUTHINFO�s		

zNNTPv1Handler.handle_AUTHINFO) r�r�r�r�r
rSr�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�rrrrr��s:
&	
6 


r�c@s=eZdZdZdd�Zdd�Zddd�ZdS)	�
NNTPv2Handlerz"A handler for RFC 3977 (NNTP "v2")cCsBd}|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 USERr1)r�r�r�)r�fmtrrr�handle_CAPABILITIES�s
	z!NNTPv2Handler.handle_CAPABILITIEScCstd��dS)Nz3MODE READER sent despite READER has been advertised)r�)r�_rrr�handle_MODE�szNNTPv2Handler.handle_MODENcCs
|j|�S)N)r�)rr�rrr�handle_OVER�szNNTPv2Handler.handle_OVER)r�r�r�r�r�r�rrrrrr��sr�cs(eZdZdZ�fdd�Z�S)�CapsAfterLoginNNTPv2Handlerz3A handler that allows CAPABILITIES only after logincs*|js|jd�n
t�j�dS)Nz480 You must log in.)r�r�r�r�)r)r�rrr��s	z/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES)r�r�r�r�r�rr)r�rr�src@s:eZdZdZdd�Zdd�Zdd�ZdS)	�ModeSwitchingNNTPv2Handlerz$A server that starts in transit modecCs
d|_dS)NF)�	_switched)rrrrr�sz#ModeSwitchingNNTPv2Handler.__init__cCsBd}|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
            .r1zMODE-)rr�r�)rr�rrrr�s
	z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIEScCsd|_|jd�dS)NTz200 Posting allowed)rr�)rZwhatrrrr�s	z&ModeSwitchingNNTPv2Handler.handle_MODEN)r�r�r�r�r�r�r�rrrrrsrcs�eZdZ�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#�S)B�NNTPv1v2TestsMixincst�j�dS)N)r�r�)r)r�rrr�szNNTPv1v2TestsMixin.setUpcCs |j|jj|jj�dS)N)r	rr
r�)rrrrr"szNNTPv1v2TestsMixin.test_welcomecCsU|jdkr(|jd|jj�n|jjdd�|jd|jj�dS)Nrj�AUTHINFO�testuser�testpw)rkr3r�_capsrwr,)rrrr�
test_authinfo%sz NNTPv1v2TestsMixin.test_authinfoc	CsQ|jj�\}}|j|d�|j|tjdddddd��dS)Nz111 20100914001155i��	�r��7)rr(r	r')rrr(rrrrA-szNNTPv1v2TestsMixin.test_datecCsI|j|jj�|jj�}|j|d�|j|jj�dS)Nz205 Bye!)r�r��closedrryr	r)rrrrr�	test_quit2szNNTPv1v2TestsMixin.test_quitcCsE|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	)rrrrrrr8s	zNNTPv1v2TestsMixin.test_helpcCs�|jj�\}}|jt|�d�|d}|j|tdddd��|jjd�\}}|jt|�d�|d	}|j|td
ddd��dS)
N�rPzcomp.lang.python.announceZ
0000001153Z
0000000993�mz*distutils*rjrz!gmane.comp.python.distutils.develZ
0000014104Z
0000000001)rrr	rr)rrr�grrrrBs
		

		zNNTPv1v2TestsMixin.test_listcCs|jjd�\}}}|j|d�|j|d�|j|d�|jjd�\}}}|j|d�|j|d�|j|d�|jtj��}|jjd�WdQX|j|jjd�|jtj��}|jj�WdQX|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�statr	rr rbr"r#)rrrMr�r$rrr�	test_statPszNNTPv1v2TestsMixin.test_statcCsL|jj�\}}}|j|d�|j|d�|j|d�dS)Nz*223 3000237 <668929@example.org> retrievedi��-z<668929@example.org>)r�nextr	)rrrMr�rrr�	test_next`szNNTPv1v2TestsMixin.test_nextcCsL|jj�\}}}|j|d�|j|d�|j|d�dS)Nz,223 3000234 <45223423@example.com> retrievedi��-z<45223423@example.com>)rr>r	)rrrMr�rrr�	test_lastfszNNTPv1v2TestsMixin.test_lastcCsH|jjd�}|j|d�|jjd�}|j|d�dS)Nzcomp.lang.pythonzThe Python computer language.zcomp.lang.pythonxr1)rr2r	)rr.rrrr4lsz#NNTPv1v2TestsMixin.test_descriptioncCs�|jjd�\}}|j|d�|j|idd6�|jjd�\}}|j|idd6dd6�|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.python.announcezcomp.lang.pythonx)rr5r	)rrrrrrr7rsz$NNTPv1v2TestsMixin.test_descriptionsc	Cs�|jjd�\}}}}}|j|jd�|�|j|d�|j|d�|j|d�|j|d�|jtj��}|jjd�WdQX|j}|j|j	jd�|j	�dS)Nzfr.comp.lang.pythonz211 i�i�i�zcomp.lang.python.develz411 No such group)
rrrrr	rr rbr"r#)rrr<r=r>rr$�excrrrr?�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�rkr	)rr*rZidsZexpectedrrr�test_newnews�s	
zNNTPv1v2TestsMixin.test_newnewscCss|jt|�d�|j|d
jd�d�|j|dd�|j|dd�|j|d
d	�dS)NrrPzutf-8u-- Signed by André.rjr`�s.Here is a dot-starting line.sThis is just a test article.rQr�������)r	r�decode)rrrrr�_check_article_body�s
z&NNTPv1v2TestsMixin._check_article_bodycCsB|jt|�d�|j|dd�|j|dd�dS)Nrrs&From: "Demo User" <nobody@example.net>rs7Message-ID: <i.am.an.article.you.will.want@example.com>)r	r)rrrrr�_check_article_head�sz&NNTPv1v2TestsMixin._check_article_headcCs\|jt|�d�|j|dd��|j|dd��|j|dd�dS)Nr
rr`r!)r	rr$r#)rrrrr�_check_article_data�sz&NNTPv1v2TestsMixin._check_article_datac	Csn|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�WdQX|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)	rrZr	r%rr rbr"r#)rr�inforMr�rr$rrr�test_article�s*


zNNTPv1v2TestsMixin.test_articlecCs�tj�}|jjd|�\}}|j|d�|\}}}|j|d�|j|d�|j|g�|j�}|j|jd�t|��|j|j	d�t|��dS)Nrnz"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�rrZr	�getvaluerr�asciir�)r�frr&rMr�rr�rrr�test_article_file�s
z$NNTPv1v2TestsMixin.test_article_filec	Csn|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�WdQX|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)	rrar	r$rr rbr"r#)rrr&rMr�rr$rrr�	test_head�s*


zNNTPv1v2TestsMixin.test_headcCs�tj�}|jjd|�\}}|j|d�|\}}}|j|d�|j|d�|j|g�|j�}|j|jd�t|��|j	|j
d�t|��dS)Nrnz"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�rrar	r(rrr)r�r�)rr*rr&rMr�rr�rrr�test_head_file�s
z!NNTPv1v2TestsMixin.test_head_filec	Csn|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�WdQX|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)	rrcr	r#rr rbr"r#)rrr&rMr�rr$rrr�	test_bodys*


zNNTPv1v2TestsMixin.test_bodycCs�tj�}|jjd|�\}}|j|d�|\}}}|j|d�|j|d�|j|g�|j�}|j|jd�t|��|j	|j
d�t|��dS)Nrnz"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�rrcr	r(r�rr)rr�)rr*rr&rMr�rr�rrr�test_body_file,s
z!NNTPv1v2TestsMixin.test_body_filecCs�|j|jd�|�|jt|�d�|d\}}|j|d�|j|idd6dd6d	d
6dd6d
d6dd6dd6dd6�|d\}}|j|dd�|d\}}|j|dd�dS)Nz224 rr�9zEDoug Hellmann <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>rCzGRe: ANN: New Plone book with strong Python (and Zope) themes throughoutrBzSat, 19 Jun 2010 18:04:08 -0400r(z0<4FD05F05-F98B-44DC-8111-C6009C925F0C@gmail.com>z
message-idz<hvalf7$ort$1@dough.gmane.org>rDZ7103z:bytesZ16z:linesz+news.gmane.org gmane.comp.python.authors:57�xrefrPrju0Re: Message d'erreur incompréhensible (par moi))rrr	r)rr�	overviewsrMrRrrr�check_over_xover_resp@s$
z(NNTPv1v2TestsMixin.check_over_xover_respcCs/|jjdd�\}}|j||�dS)Nr0�;)rrJr3)rrr2rrrrNUszNNTPv1v2TestsMixin.test_xovercCs,|jjd�\}}|j||�dS)Nr0r4)r0r4)rrRr3)rrr2rrrrTYszNNTPv1v2TestsMixin.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é.
cCs�|jj}|jt|�d�|j|dd�|j|d
d�|j|dd�|j|dd	�|j|d
d�dS)NrOrPs.
rjs-- Signed by André.
rs
rs ..Here is a dot-starting line.
rs(From: "Demo User" <nobody@example.net>
rQr�r r!)r�r�r	r)rrrrr�_check_posted_bodyjsz%NNTPv1v2TestsMixin._check_posted_bodycGs�|j}|||�f}d|j_||�}|j�|jjdd�}|||�f}d|j_||�}|j�|S)Ns
s
)�sample_postr�r�r5�replace)r�func�file_factoryr��postZ	func_argsrrrr�_check_post_ihave_subus	

z(NNTPv1v2TestsMixin._check_post_ihave_subcGs�|j|dt|�}|j||�|j|dt|�}|j||�|j|dtj|�}|j||�dd�}|j|d||�}|j||�dd�}|j|d||�}|j||�dS)Nr9cSst|jdd��S)N�keependsT)�iterr�)r�rrr�	iterlines�sz6NNTPv1v2TestsMixin.check_post_ihave.<locals>.iterlinescSst|jdd��S)Nr<F)r=r�)r�rrrr>�s)r;rYr	�	bytearrayr�r�)rr8Zsuccess_respr�rr>rrr�check_post_ihave�sz#NNTPv1v2TestsMixin.check_post_ihavec	Csj|j|jjd�d|j_|jtj��}|jj|j�WdQX|j	|j
jd�dS)Nz240 Article received OKFz440 Posting not permitted)r@rr:r�r�rr rbr6r	r"r#)rr$rrr�	test_post�szNNTPv1v2TestsMixin.test_postc
Csd|j|jjdd�|jtj��}|jjd|j�WdQX|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)
r@rZihaverr rbr6r	r"r#)rr$rrr�
test_ihave�szNNTPv1v2TestsMixin.test_ihavecCsAtjdddddd�}|jtj|jjd|�dS)Ni�rPr
rzcomp.lang.python)r'rr �
NNTPDataErrorrr)rr*rrr�test_too_long_lines�sz&NNTPv1v2TestsMixin.test_too_long_lines)$r�r�r�r�rr	rArrrrrrr4r7r?rr#r$r%r'r+r,r-r.r/r3rNrTr6r5r;r@rArBrDrr)r�rrsB

rc@s.eZdZdZdZeZdd�ZdS)�NNTPv1Testsz*Tests an NNTP v1 server (no capabilities).rPcCsO|jj�}|j|i�|j|jjd�|j|jjd�dS)NrP)rrlr	rk�nntp_implementation)rrhrrr�	test_caps�szNNTPv1Tests.test_capsN)r�r�r�r�rkr�r�rGrrrrrE�srEc@s.eZdZdZdZeZdd�ZdS)�NNTPv2Testsz,Tests an NNTP v2 server (with capabilities).rjc	Cs�|jj�}|j|iddgd6ddgd6dgd6gd	6d
ddd
ddgd6gd6gd6gd6�|j|jjd�|j|jjd�dS)N�2�3�VERSIONZINNz2.5.1ZIMPLEMENTATIONZUSERrZHDRr�zACTIVE.TIMESzDISTRIB.PATSZHEADERSr�zOVERVIEW.FMTrfZOVERZPOST�READERrz	INN 2.5.1)rrlr	rkrF)rrhrrrrG�s


	zNNTPv2Tests.test_capsN)r�r�r�r�rkr�r�rGrrrrrH�srHc@s.eZdZdZdZeZdd�ZdS)�CapsAfterLoginNNTPv2TestszCTests a probably NNTP v2 server with capabilities only after login.rjcCsC|j|jji�|jjdd�|jd|jj�dS)NrrrK)r	rrrwr3)rrrr�test_caps_only_after_login�sz4CapsAfterLoginNNTPv2Tests.test_caps_only_after_loginN)r�r�r�r�rkrr�rNrrrrrM�srMc@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.rjcCs|jd|jj�dS)NrL)r3rr)rrrr�(test_we_are_in_reader_mode_after_connect�sz>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connectN)r�r�r�r�rkrr�rPrrrrrO�srOc@sveZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Ze	j
ed
�dd��ZdS)�	MiscTestscsq�fdd�}|dd�|dd�|dd�|dd�|dd	�|d
d�|dd�dS)
Ncs�jtj|�|�dS)N)r	r �
decode_header)�ar�)rrr�gives�sz+MiscTests.test_decode_header.<locals>.givesr1za 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)rrTr)rr�test_decode_header�s



zMiscTests.test_decode_headercCs�dddddddg}|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:linesrBrCr(z
message-idrDzBytes:zLines:zsubject:zFROM:zDaTe:zmessage-ID:zBYTES:z	Xref:fullzDistribution:fullr1Zdistributionz	Xref:FULLzDistribution:FULL)r	r Z_parse_overview_fmt)rrrrr�test_parse_overview_fmt�s@


		z!MiscTests.test_parse_overview_fmtcCs&tjdg}dg}tj||�}|\\}}|j|d�|j|idd6dd6dd	6d
d6dd
6dd6dd6dd6�dg}tj||�}|\\}}|j|dd�dg}tj||�}|\\}}|j|d
d�|j|dd�dS)Nr1z�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 articlerBz "Demo User" <nobody@example.com>rCz6 Oct 1998 04:38:40 -0500r(z<45223423@example.com>z
message-idz<45454@example.net>rDZ1234z:bytesZ17z:linesz"news.example.com misc.test:3000363z�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: 	� r1)r Z_DEFAULT_OVERVIEW_FMTZ_parse_overviewr	)rr�rZoverviewrMZfieldsrrr�test_parse_overview&s.			zMiscTests.test_parse_overviewc	s��fdd�}|dddddddd	�|d
ddddddd	�|dddddddd	�|d
ddddddd	�dS)Ncs)�jtj||�tj|��dS)N)r	r Z_parse_datetimer')rSr��c)rrrrTUsz,MiscTests.test_parse_datetime.<locals>.givesZ19990623135624i�r�r�8��19990623�135624�990623Z090623i�r)rrTr)rr�test_parse_datetimeTs
zMiscTests.test_parse_datetimec	s��fdd�}|ddddddd	d
�|dddddddd
�|d
ddddddd��fdd�}|dddd	d�|ddddd�|d
dddd�dS)Nc	sctj||||||�}�jtj|�||f��jtj|d�||f�dS)NF)r'r	r �_unparse_datetime)	�y�M�d�hr�sr�r�r*)rrrrTbs

z.MiscTests.test_unparse_datetime.<locals>.givesi�rrZrr[r\r]r^i�Z20000623i�r8rPrjrZ20100605�010203csZtj|||�}�jtj|�||f��jtj|d�||f�dS)NF)r'r(r	r ra)rbrcrdr�r�r*)rrrrTls

�000000r)rrTr)rr�test_unparse_datetime_szMiscTests.test_unparse_datetimec	s��fdd�}|ddddddd	d
�|dddddddd
�|d
ddddddd��fdd�}|dddd	d�|ddddd�|d
dddd�dS)Nc	sDtj||||||�}�jtj|d�||f�dS)NT)r'r	r ra)	rbrcrdrerrfr�r�r*)rrrrTysz5MiscTests.test_unparse_datetime_legacy.<locals>.givesi�rrZrr[r\r_r^i�Z000623i�r8rPrjrZ100605rgcs;tj|||�}�jtj|d�||f�dS)NT)r'r(r	r ra)rbrcrdr�r�r*)rrrrT�srhr)rrTr)rr�test_unparse_datetime_legacyvsz&MiscTests.test_unparse_datetime_legacyzrequires SSL supportcCs|jttd��dS)Nr�)rr�r )rrrr�test_ssl_support�szMiscTests.test_ssl_supportN)
r�r�r�rUrVrXr`rirjr�r�rprkrrrrrQ�s(.rQc@s"eZdZdZdd�ZdS)�PublicAPITestsz>Ensures that the correct values are exposed in the public API.cCss|jttd��dddddddd	g}tdk	rP|jd
�n|jttj�t|��dS)N�__all__rrv�NNTPReplyErrorrbr!�NNTPProtocolErrorrCrRr�)rr�r rpr�r	�setrm)rZ
target_apirrr�test_module_all_attribute�s	z(PublicAPITests.test_module_all_attributeN)r�r�r�r�rqrrrrrl�srlc@smeZdZdZejZdddd�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.Ncs�G�fdd�d�}G���fdd�d��d�g�td|��7|j||��|jdd|d	|�WdQXWdQX|j��x�D]}|j|j�q�WdS)
Ncs"eZdZ�fdd�ZdS)zNMockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_modulecs��S)Nr)Zaddressr�)�
MockSocketrr�create_connection�sz`MockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_module.create_connectionN)r�r�r�rtr)rsrr�mock_socket_module�srucs7eZdZ�fdd�Z��fdd�ZdS)zFMockSocketTests.check_constructor_error_conditions.<locals>.MockSocketcs
d�dS)NTr)r)�
socket_closedrr�close�szLMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.closecs,��}t|�\}}�j|�|S)N)r�r�)�socket�moder�r�rn)�filesr�rr�makefile�s	
zOMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.makefileN)r�r�r�rwr{r)rzr�rvrrrs�srsFznntplib.socketZdummyrsrt)rZassertRaisesRegex�
nntp_classrr)rr�Zexpected_error_typeZexpected_error_msgrwrtrur*r)rsrzr�rvr�"check_constructor_error_conditions�s%

z2MockSocketTests.check_constructor_error_conditionscCs3Gdd�dt�}|j|tj|j�dS)Nc@seZdZdZdS)z1MockSocketTests.test_bad_welcome.<locals>.HandlerzBad WelcomeN)r�r�r�r
rrrr�Handler�sr~)r�r}r ror
)rr~rrr�test_bad_welcome�sz MockSocketTests.test_bad_welcomecCs3Gdd�dt�}|j|tj|j�dS)Nc@seZdZdZdS)zEMockSocketTests.test_service_temporarily_unavailable.<locals>.Handlerz"400 Service temporarily unavilableN)r�r�r�r
rrrrr~�sr~)r�r}r rbr
)rr~rrr�$test_service_temporarily_unavailable�sz4MockSocketTests.test_service_temporarily_unavailablecCs3Gdd�dt�}|j|tj|j�dS)Nc@seZdZdZdS)zEMockSocketTests.test_service_permanently_unavailable.<locals>.Handlerz"502 Service permanently unavilableN)r�r�r�r
rrrrr~�sr~)r�r}r r!r
)rr~rrr�$test_service_permanently_unavailable�sz4MockSocketTests.test_service_permanently_unavailablecs<G�fdd�dt�}d�|j|tj��dS)Ncs"eZdZ�fdd�ZdS)z6MockSocketTests.test_bad_capabilities.<locals>.Handlercs|j��dS)N)r�)r)�capabilities_responserrr��szJMockSocketTests.test_bad_capabilities.<locals>.Handler.handle_CAPABILITIESN)r�r�r�r�r)r�rrr~�sr~z201 bad capability)r�r}r rn)rr~r)r�r�test_bad_capabilities�sz%MockSocketTests.test_bad_capabilitiescsNd}d}G�fdd�dt�}d�|j|tj�||�dS)Nzt@e.com�pythoncs"eZdZ�fdd�ZdS)z3MockSocketTests.test_login_aborted.<locals>.Handlercs|j��dS)N)r�)rr�)�authinfo_responserrr��szCMockSocketTests.test_login_aborted.<locals>.Handler.handle_AUTHINFON)r�r�r�r�r)r�rrr~�sr~z503 Mechanism not recognized)r�r}r r!)rrwrtr~r)r�r�test_login_aborted�sz"MockSocketTests.test_login_aborted)
r�r�r�r�r rr|r}rr�r�r�r�rrrrrr�s		rrc@s"eZdZdZdd�ZdS)�bypass_contextz'Bypass encryption and actual SSL modulecKs|S)Nr)ror�rrr�wrap_socket�szbypass_context.wrap_socketN)r�r�r�r�r�rrrrr��sr�c@s"eZdZedd��ZdS)�MockSslTestscOstjdt||�S)NZssl_context)r r�r�)r��kwrrrr|�szMockSslTests.nntp_classN)r�r�r��staticmethodr|rrrrr��sr��__main__),r�rxr'r�r�r��
contextlibZtestrr rrZ
unittest.mockrrp�ImportErrorr�rr�ZTestCaser�r�r�r�r�r�r�r�r�r�rrrrErHrMrOrQrlrrr�r�r��mainrrrr�<module>sZ
�
,�F
��
�N