Current File : //usr/local/apps/python3/lib/python3.11/test/__pycache__/test_nntplib.cpython-311.pyc
�

�Ke�����ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZddl
mZmZejd��ZddlmZmZddlmZ	ddlZn
#e$rdZYnwxYwej�ej�e��d��Ze�ejZnGd�d	e��ZGd
�d��Ze� ��e!fZ"e�e"ej#fz
Z"Gd�d
eej$��Z%ej&ed��Gd�de%����Z'Gd�dej(��Z)d�Z*Gd�dej��Z+Gd�d��Z,Gd�de,��Z-Gd�d��Z.Gd�de.��Z/Gd�de/��Z0Gd �d!e/��Z1Gd"�d#��Z2Gd$�d%e2e,ej$��Z3Gd&�d'e2e,ej$��Z4Gd(�d)e,ej$��Z5Gd*�d+e-ej$��Z6Gd,�d-ej$��Z7Gd.�d/ej$��Z8Gd0�d1ej$��Z9Gd2�d3��Z:ej&ed��Gd4�d5e9����Z;Gd6�d7ej$��Z<e=d8krej>��dSdS)9�N)�support)�
socket_helper�warnings_helper�nntplib)�NNTP�	GroupInfo)�patchzkeycert3.pemc��eZdZdZdZdS)�SSLErrorz6Non-existent exception class when we lack SSL support.zThis will never be raised.N)�__name__�
__module__�__qualname__�__doc__�reason���;/usr/local/apps/python3/lib/python3.11/test/test_nntplib.pyrrs������D�D�-���rrc��eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zejdd��d���Zd�Zdd�Zejdd��d���Zd�Zd�Zd�Zed���Zd�Zd�ZdS)�NetworkedNNTPTestsMixinNc��|j���}|�tt	|����dS�N)�server�
getwelcome�assertEqual�str�type)�self�welcomes  r�test_welcomez$NetworkedNNTPTestsMixin.test_welcome*s7���+�(�(�*�*������d�7�m�m�,�,�,�,�,rc���|j���\}}|�|�d��|��|D]*}|�t
t
|�����+dS)Nz100 )r�help�
assertTrue�
startswithrrr)r�resp�lines�lines    r�	test_helpz!NetworkedNNTPTestsMixin.test_help.sq���k�&�&�(�(���e��������/�/��6�6�6��	.�	.�D����S�$�t�*�*�-�-�-�-�	.�	.rc�*�|j���\}}t|��dkrc|�tt|d����|�tt|dj����dSdS�Nr)r�list�lenrrrr�group�rr$�groupss   r�	test_listz!NetworkedNNTPTestsMixin.test_list4sy���{�'�'�)�)���f��v�;�;��?�?����Y��V�A�Y���8�8�8����S�$�v�a�y��"7�"7�8�8�8�8�8��?rc�6�|j�|j��\}}t|��dkrc|�t
t
|d����|�tt
|dj����dSdSr))	rr*�	GROUP_PATr+rrrrr,r-s   r�test_list_activez(NetworkedNNTPTestsMixin.test_list_active:s}���{�'�'���7�7���f��v�;�;��?�?����Y��V�A�Y���8�8�8����S�$�v�a�y��"7�"7�8�8�8�8�8��?rc��|�tj��5}|j�d��ddd��n#1swxYwY|jj}|�|�d��|��dS)N�XYZZYz500 )	�assertRaisesr�NNTPPermanentErrorr�	_shortcmd�	exception�responser"r#)r�cmr$s   r�test_unknown_commandz,NetworkedNNTPTestsMixin.test_unknown_command@s���
�
�
�w�9�
:�
:�	+�b��K�!�!�'�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+��|�$���������/�/��6�6�6�6�6s�A�A�Ac�`�tj���tjd���z
}|j�|��\}}t
|��dkrI|�|dt��|�|dj	t��dSdS)N�)�daysr)�datetime�date�today�	timedeltar�	newgroupsr+�assertIsInstancerr,r)r�dtr$r.s    r�test_newgroupsz&NetworkedNNTPTestsMixin.test_newgroupsFs����]�
 �
 �
"�
"�X�%7�Q�%?�%?�%?�
?���{�,�,�R�0�0���f��v�;�;��?�?��!�!�&��)�Y�7�7�7��!�!�&��)�/�3�7�7�7�7�7��?rc�P���fd�}�j��j��}||�����j|���j��j��}||���j�d��}��|d��dS)Nc�t����|t�����j|��dSr)rDr�assertNotIn�
GROUP_NAME)�descrs �r�_check_descz=NetworkedNNTPTestsMixin.test_description.<locals>._check_descPs7����!�!�$��,�,�,����T�_�d�3�3�3�3�3rzzk.brrtt.baz�)r�descriptionrJ�assertIn�DESCr1r)rrLrKs`  r�test_descriptionz(NetworkedNNTPTestsMixin.test_descriptionOs����	4�	4�	4�	4�	4��{�&�&�t��7�7����D�����
�
�d�i��&�&�&��{�&�&�t�~�6�6����D�����{�&�&�~�6�6������r�"�"�"�"�"rc�|�|j�|j��\}}|�|�d��p|�d��|��|�|t��||j}|�||j�	|j����dS)Nz215 z282 )
r�descriptionsr1r"r#rD�dictrJrrN)rr$�descsrKs    r�test_descriptionsz)NetworkedNNTPTestsMixin.test_descriptions_s����k�.�.�t�~�>�>���e�����O�O�F�#�#�>�t���v�'>�'>��	F�	F�	F����e�T�*�*�*��T�_�%������t�{�6�6�t��G�G�H�H�H�H�Hrc���|j�|j��}|�dt	|����|\}}}}}|�||j��|�|t��|�|t��|�|t��|�||��|�|�	d��|��dS)N��211 )
rr,rJrr+rD�int�assertLessEqualr"r#)r�resultr$�count�first�lastr,s       r�
test_groupz"NetworkedNNTPTestsMixin.test_grouphs�����"�"�4�?�3�3������C��K�K�(�(�(�*0�'��e�U�D�%�������0�0�0����e�S�)�)�)����e�S�)�)�)����d�C�(�(�(����U�D�)�)�)��������/�/��6�6�6�6�6rc���|j���\}}|�|tj��|�|jd��|�|jd��dS)Ni�i�)rr@rDr?�assertGreaterEqual�yearr[�rr$r@s   r�	test_datez!NetworkedNNTPTestsMixin.test_datessh���[�%�%�'�'�
��d����d�H�$5�6�6�6�����	�4�0�0�0����T�Y��-�-�-�-�-rc��|�|t��|�|���hd���|���D],}|�|t
t
d��f���-dS)N>r@�from�subject�
references�:bytes�:lines�
message-id)rDrTrb�keys�valuesrr)r�art_dict�vs   r�_check_art_dictz'NetworkedNNTPTestsMixin._check_art_dictzs������h��-�-�-�����
�
���
/�
/�
/�	�	�	����"�"�	8�	8�A��!�!�!�c�4��:�:�%6�7�7�7�7�	8�	8rc��|j�|j��\}}}}}|j�|dz
|��\}}t	|��dkr|�d��|d\}}|�||dz
��|�||��|�|��dS)NrXrzno articles retrieved)	rr,rJ�xoverr+�skipTestrbr[rq)	rr$r]r^r_�namer%�art_numros	         r�
test_xoverz"NetworkedNNTPTestsMixin.test_xover�s���)-��):�):�4�?�)K�)K�&��e�U�D�$��k�'�'��q��$�7�7���e��u�:�:��?�?��M�M�1�2�2�2�!�!�H�����������2�2�2����W�d�+�+�+����X�&�&�&�&�&rTzHtemporarily skipped until a permanent solution is found for issue #28971c��|j�|j��\}}}}}|dz
}|j�|df��\}}|d\}}	|�|	��|j�||f��\}}|d\}}	|�||��|�||��|�|	��dS)N�
r���)rr,rJ�overrqrbr[)
rr$r]r^r_ru�startr%rvros
          r�	test_overz!NetworkedNNTPTestsMixin.test_over�s���*.��):�):�4�?�)K�)K�&��e�U�D�$��r�	���k�&�&��t�}�5�5���e�!�!�H�������X�&�&�&��k�&�&��t�}�5�5���e�!�"�I���������/�/�/����W�d�+�+�+����X�&�&�&�&�&rc���|j�|j��\}}}}}|j�d|��\}}|D]0}|�t
t
|d�����1dS)Nrh�)rr,rJ�xhdrrrr)rr$r]r^r_rur%r&s        r�	test_xhdrz!NetworkedNNTPTestsMixin.test_xhdr�s{��)-��):�):�4�?�)K�)K�&��e�U�D�$��k�&�&�y�$�7�7���e��	1�	1�D����S�$�t�A�w�-�-�0�0�0�0�	1�	1rc��|�|tj��|�|�|j|��|jD]}|�|t���|�|jdd��dS)Nrz)�.s.
�.
)rDr�ArticleInfor�numberr%�bytesrI)rr$�articlervr&s     r�check_article_respz*NetworkedNNTPTestsMixin.check_article_resp�s������g�w�':�;�;�;������W�^�W�5�5�5��M�	/�	/�D��!�!�$��.�.�.�.������r�*�,D�E�E�E�E�ErzFIXME: see bpo-32128c���
�|j�|j��\}}}}}|||dz
fD]Y}	|j�|��\}}n7#tj$r%}|j�d��s�Yd}~�Pd}~wwxYwn|�d��|�	|�d��|��|�
|||��|j�|��\}}	|�	|�d��|��|�
||	|��|j�|��\}}
|�	|�d��|��|�
||
|��d��
�
fd�|j
D��}�
fd	�|
j
D��}|�||d
gz|	j
z��dS)Nrz423 z(could not find a suitable article numberz221 z222 z220 c�,�|�d��S)NsX-Antivirus)r#)r&s r�<lambda>z@NetworkedNNTPTestsMixin.test_article_head_body.<locals>.<lambda>�s������ ?� ?�rc�*��g|]}�|���
|��Srr��.0r&�denylists  �r�
<listcomp>zBNetworkedNNTPTestsMixin.test_article_head_body.<locals>.<listcomp>�s5���6�6�6��&.�h�t�n�n�6�t�6�6�6rc�*��g|]}�|���
|��Srrr�s  �rr�zBNetworkedNNTPTestsMixin.test_article_head_body.<locals>.<listcomp>�s5���1�1�1�4�!)��$���1�$�1�1�1rr)rr,rJ�headr�NNTPTemporaryErrorr9r#rtr"r��bodyr�r%r)rr$r]r^r_rurvr��er�r��filtered_head_lines�filtered_linesr�s             @r�test_article_head_bodyz.NetworkedNNTPTestsMixin.test_article_head_body�s#���)-��):�):�4�?�)K�)K�&��e�U�D�$��e�T�A�X�.�
	F�
	F�G�
�!�[�-�-�g�6�6�
��d�d���-�
�
�
��z�,�,�V�4�4������������	
����

�E��M�M�D�E�E�E��������/�/��6�6�6�����d�G�4�4�4��[�%�%�g�.�.�
��d��������/�/��6�6�6�����d�G�4�4�4���+�+�G�4�4�
��g��������/�/��6�6�6�����g�w�7�7�7�?�?��6�6�6�6��
�6�6�6��1�1�1�1�7�=�1�1�1������)<��u�)D�t�z�)Q�R�R�R�R�Rs�A�B�A?�?Bc�����fd�}���jjd��|�j������j���\}}||��dS)Nc���|d}��|ttf����d|��dS)N�LIST�OVERVIEW.FMT)rDr*�tuplerO)�caps�	caps_listrs  �r�_check_capsz>NetworkedNNTPTestsMixin.test_capabilities.<locals>._check_caps�s@����V��I��!�!�)�d�E�]�;�;�;��M�M�.�)�4�4�4�4�4r�)rbr�nntp_version�getcapabilities�capabilities)rr�r$r�s`   r�test_capabilitiesz)NetworkedNNTPTestsMixin.test_capabilities�s����	5�	5�	5�	5�	5�	
����� 8�!�<�<�<���D�K�/�/�1�1�2�2�2��[�-�-�/�/�
��d���D�����rc�j�d}d}|�tj|jj||d���dS)N�notarealuser�notarealpasswordF)�user�password�usenetrc)r5r�	NNTPErrorr�login)r�baduser�badpws   r�test_zloginz#NetworkedNNTPTestsMixin.test_zlogin�sM��!��"�����'�+�T�[�->�&���	�	H�	H�	H�	H�	Hrc�~�t|��}	|j���d|_dS#d|_wxYwr)rr�quit)r�clss  r�test_zzquitz#NetworkedNNTPTestsMixin.test_zzquit�sD���4�j�j��	��K�������C�J�J�J���C�J����s�3�	<c���d�}t|��D]R}|�d��s�t||��}t|��s�8t	||||�����SdS)Nc�F��tj����fd���}|S)Nc���tj|j��5�|��ddd��dS#1swxYwYdSr)r�transient_internet�	NNTP_HOST)r�meths �r�wrappedzHNetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth.<locals>.wrapped�s����"�5�d�n�E�E����D��J�J�J���������������������s�4�8�8)�	functools�wraps)r�r�s` r�	wrap_methz7NetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth�s8���
�_�T�
"�
"�
�
�
�
�#�
"�
��Nr�test_)�dirr#�getattr�callable�setattr)r�r�rur�s    r�wrap_methodsz$NetworkedNNTPTestsMixin.wrap_methods�s���	�	�	���H�H�	0�	0�D��?�?�7�+�+�
���3��%�%�D��D�>�>�
��
�C��y�y����/�/�/�/�	0�	0rc��|�t��5|�|jdd���ddd��dS#1swxYwYdS)NrF��timeoutr�)r5�
ValueError�
NNTP_CLASSr��rs r�test_timeoutz$NetworkedNNTPTestsMixin.test_timeouts���
�
�
�z�
*�
*�	G�	G��O�O�D�N�A��O�F�F�F�	G�	G�	G�	G�	G�	G�	G�	G�	G�	G�	G�	G����	G�	G�	G�	G�	G�	Gs�A�A
�
A
c�����fd�}ttjd���}|j�
|j|d<	|j|jfi|����5|�|����|�������ddd��n#1swxYwY|�|����|j|jfi|����5��	��ddd��n#1swxYwY|�|����dS#t$r?}tjd|j
��rtjd|�d|j������d}~wwxYw)Nc���t�d��sdS	����n#ttf$rYdSwxYwdS)N�fileFT)�hasattrr!�OSError�EOFError)rs�r�is_connectedzANetworkedNNTPTestsMixin.test_with_statement.<locals>.is_connected
sZ����6�6�*�*�
��u�
����
�
�
�
���X�&�
�
�
��u�u�
�����4s�*�?�?Fr��ssl_context�(?i)KEY.TOO.SMALLzGot � connecting to )rTr�INTERNET_TIMEOUTr�r�r�r"r!�assertFalser�r�re�searchr�unittest�SkipTest)rr��kwargs�ssl_errrs    @r�test_with_statementz+NetworkedNNTPTestsMixin.test_with_statements6���	�	�	�	�	���,��
�
�
����'�$(�$4�F�=�!�	�$�T�_�T�^�>�>�v�>�>�F��
/�
/��������/�/�/�������
�
�.�.�.�
/�
/�
/�
/�
/�
/�
/�
/�
/�
/�
/����
/�
/�
/�
/�
���\�\�^�^�,�,�,�$�T�_�T�^�>�>�v�>�>�F��
�
����
�
�
�
�
�
�
�
�
�
�
�
�
�
����
�
�
�
����\�\�^�^�,�,�,�,�,���	�	�	��y�-�w�~�>�>�
B��'�)A�w�)A�)A�.2�n�)A�)A�B�B�B������	���s`�D"�	AB�D"�B�D"�!B�"5D"�C8�,D"�8C<�<D"�?C<� D"�"
E+�,:E&�&E+r)rr
rr�rr'r/r2r;rFrQrVr`rerqrwr��skipIfr}r�r�r�r�r�r��classmethodr�r�r�rrrrr&s��������K�-�-�-�.�.�.�9�9�9�9�9�9�7�7�7�8�8�8�#�#�#� I�I�I�	7�	7�	7�.�.�.�	8�	8�	8�	'�	'�	'��X�_�T�8�9�9�
'�
'�9�9�
'�"1�1�1�F�F�F�F��X�_�T�1�2�2�S�S�3�2�S�<���H�H�H�����0�0��[�0�&G�G�G�!�!�!�!�!rrc�N�eZdZdZdZdZdZeZe	d���Z
e	d���ZdS)�NetworkedNNTPTestsznews.trigofacile.com�fr.comp.lang.pythonzfr.comp.lang.*�Pythonc	�2�tjd��ttjd���}|j�
|j|d<tj|j��5	|j|jfi|��|_	n�#t$rU}tjd|j
��r!tj|�d|�d|j�����t!|j���d}~wt"$rtj|�d|j�����wxYw	ddd��dS#1swxYwYdS)	N�networkFr�r�r�z got r�z  got EOF error on connecting to )r�requiresrTr�r�rr�r�r�rrr�r�rr�r��print�
EOF_ERRORS)r�r�r�s   r�
setUpClasszNetworkedNNTPTests.setUpClassAs������#�#�#���,��
�
�
���?�&�$'�O�F�=�!�
�
-�c�m�
<�
<�	A�	A�
A�+�S�^�C�M�D�D�V�D�D��
�
���
�
�
��9�1�7�>�B�B�E�"�+�s�-D�-D��-D�-D�25�-�-D�-D�E�E�E��c�m�$�$�$�������
A�
A�
A��'�3�)@�)@�.1�m�)@�)@�A�A�A�
A�����	A�	A�	A�	A�	A�	A�	A�	A�	A�	A�	A�	A����	A�	A�	A�	A�	A�	As7�D�A5�4D�5
C;�?AC�,C;�;D�D�Dc�J�|j�|j���dSdSr)rr�)r�s r�
tearDownClassz NetworkedNNTPTests.tearDownClassXs*���:�!��J�O�O������"�!rN)rr
rr�rJr1rPrr�r�r�r�rrrr�r�8sd������&�I�&�J� �I��D��J��A�A��[�A�,����[���rr��requires SSL supportc��eZdZdZdZdZdZeedd��Z	dZ
dZe�7ej
��Ze�d��ejje_dSdS)�NetworkedNNTP_SSLTestsz
nntp.aioe.orgz	aioe.testzaioe.*�test�NNTP_SSLN�DEFAULT)rr
rr�rJr1rPr�rr�r/�
test_starttls�ssl�_create_unverified_contextr��set_ciphers�
TLSVersion�TLSv1_2�maximum_versionrrrr�r�]s������� �I��J��I��D����*�d�3�3�J��I��M�
��4�c�4�6�6�����	�*�*�*�&)�n�&<��#�#�#��rr�c�6�eZdZdZd�Zd�Zd�Zd�Zd�Zd�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.c��tj�|��tj��|_tj��|_||_|j�|jj|j	��dSr)
�io�	RawIOBase�__init__�BytesIO�c2s�s2c�handlerr|�readline�	push_data)rrs  rrz_NNTPServerIO.__init__�s^��
����d�#�#�#��:�<�<����:�<�<����������4�8�,�d�n�=�=�=�=�=rc��dS�NTrr�s r�readablez_NNTPServerIO.readable�����trc��dSrrr�s r�writablez_NNTPServerIO.writable�r
rc���|j���}|j�dd��|j�|��|j�|��dS)z.Push (buffer) some data to send to the client.rr�N)r�tell�seek�write)r�data�poss   rrz_NNTPServerIO.push_data�sU���h�m�m�o�o����
�
�a���������t������
�
�c�����rc���|j���}|j�|��|j�|��|j���t
|��S)zThe client sends us some data)rrrrr�process_pendingr+)r�brs   rrz_NNTPServerIO.write�sX���h�m�m�o�o������q������
�
�c������$�$�&�&�&��1�v�v�
rc��|j���|j�t	|����}t	|��}||d|�<|S)z#The client wants to read a responseN)rrr�readr+)r�bufr�ns    r�readintoz_NNTPServerIO.readinto�sL����$�$�&�&�&��H�M�M�#�c�(�(�#�#����F�F����B�Q�B���rN)
rr
rrrr	rrrrrrrr�r�|sx��������>�>�>�����������������rr�c�R�t|��}tj||��}||fSr)r�r��BufferedRWPair)r�sior�s   r�make_mock_filer�s-��
��
 �
 �C���S�#�&�&�D���;�rc��eZdZdd�Zd�ZdS)�
NNTPServerNc�L�||_||_|�|��dSr)r��host�
_base_init)r�fr"�
readermodes    rrzNNTPServer.__init__�s(����	���	����
�#�#�#�#�#rc�<�|j���|`dSr)r��closer�s r�_closezNNTPServer._close�s���	�������I�I�Irr)rr
rrr(rrrr r �s7������$�$�$�$�
����rr c�2��eZdZdZ�fd�Z�fd�Zd�Z�xZS)�MockedNNTPTestsMixinNc�p��t�����|���dSr��super�setUp�make_server�r�	__class__s �rr.zMockedNNTPTestsMixin.setUp�s,���
���
�
�����������rc�L��t�����|`dSr)r-�tearDownrr0s �rr3zMockedNNTPTestsMixin.tearDown�s"���
���������K�K�Krc��|���|_t|j��\|_}t	|dg|�Ri|��|_|jS)Nztest.server)�
handler_classrrrr r)r�argsr�r�s    rr/z MockedNNTPTestsMixin.make_server�sS���)�)�+�+���'���5�5����$� ��}�F�t�F�F�F�v�F�F����{�r)rr
rr5r.r3r/�
__classcell__�r1s@rr*r*�se��������M�����������������rr*c���eZdZ�fd�Z�xZS)�MockedNNTPWithReaderModeMixinc�t��t�����|�d���dS)NT)r%r,r0s �rr.z#MockedNNTPWithReaderModeMixin.setUp�s1���
���
�
�������D��)�)�)�)�)r)rr
rr.r7r8s@rr:r:�s8�������*�*�*�*�*�*�*�*�*rr:c���eZdZdZdZd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zd d�Zd�Zd�Zd!d�Zd�Zd�Zdd�d�Zdd�d�ZdZdZedzezZd d�Zd d�Zd d�Zd�ZdS)"�
NNTPv1HandlerzA handler for RFC 977z200 NNTP mock serverc��d|_d|_||_||_d|_d|_|���dS)NFT)�in_body�
allow_posting�	_readline�
_push_data�
_logged_in�
_user_sent�handle_welcome)rrrs   rr|zNNTPv1Handler.start�sE�����!���!���#����������������rc�$�t|dd��S)N�utf-8�surrogateescape)r�rrs  r�_decodezNNTPv1Handler._decode�s���4��"3�4�4�4rc�@�|jr�	|���}|sdS|j�|��|dkrn�:	|j\}}||d|ji�d|_d|_d|_n#d|_d|_d|_wxYw	|�|�����}|sdS|�d��s"td�|�����|dd�}|�	��^}}t|d|���zd��}|�|���nS	||�|jr||f|_g|_n5#t$r(}td	�|����|�d}~wwxYw��)
NTr�r�F�
z line doesn't end with \r\n: {!r}����handle_zcommand failed: {!r})r?rAr��append�
body_callbackrJ�endswithr��format�splitr��upper�handle_unknown�	Exception)rr&r��tokens�cmdr�s      rrzNNTPv1Handler.process_pending�s����<�	%�
��~�~�'�'�����F��	� � ��&�&�&��8�#�#��

�
%�#�1���f���f�-�4�9�-�-�-�%)��"� ��	�$�����&*��"� ��	�$���$�$�$�$�	'��<�<���� 0� 0�1�1�D��
����=�=��(�(�
T� �!E�!L�!L�T�!R�!R�S�S�S�����9�D��:�:�<�<�L�C�&��4��S�Y�Y�[�[�!8�$�?�?�D��|��#�#�%�%�%�%�'��D�&�M�M��|�'�-1�6�\��*�$&��	���!�Q�Q�Q�$�%;�%B�%B�4�%H�%H�I�I�q�P�����Q����	's$�A1�1B�E)�)
F�3#F�Fc��d|_dS)z7Flag that the client is expected to post a request bodyTN)r?r�s r�expect_bodyzNNTPv1Handler.expect_body
s
������rc�0�|�|��dS)zPush some binary dataN)rBrIs  rrzNNTPv1Handler.push_datas����������rc���tj|��}d�|�����dz}|�d��}|�|��dS)zPush a string literalrLrGN)�textwrap�dedent�join�
splitlines�encoder)r�lits  r�push_litzNNTPv1Handler.push_litsZ���o�c�"�"���k�k�#�.�.�*�*�+�+�f�4���j�j��!�!�����s�����rc�0�|�d��dS)Nz	500 What?�rcr�s rrUzNNTPv1Handler.handle_unknowns���
�
�k�"�"�"�"�"rc�:�|�|j��dSr)rcrr�s rrEzNNTPv1Handler.handle_welcomes���
�
�d�l�#�#�#�#�#rc�0�|�d��dS�Nz205 Bye!rer�s r�handle_QUITzNNTPv1Handler.handle_QUIT"s���
�
�j�!�!�!�!�!rc�0�|�d��dS)N�111 20100914001155rer�s r�handle_DATEzNNTPv1Handler.handle_DATE%s���
�
�*�+�+�+�+�+rc��|dkr|�d��dS|�d�|����dS)Nr�z$211 486 761 1265 fr.comp.lang.pythonz411 No such group {})rcrR)rr,s  r�handle_GROUPzNNTPv1Handler.handle_GROUP(sN���)�)�)��M�M�@�A�A�A�A�A��M�M�0�7�7��>�>�?�?�?�?�?rc�0�|�d��dS)Nz�            100 Legal commands
              authinfo user Name|pass Password|generic <prog> <args>
              date
              help
            Report problems to <root@example.org>
            .rer�s r�handle_HELPzNNTPv1Handler.handle_HELP.s'���
�
��	�	�	�	�	rNc���|�|�d��dS|dkr|�d��dS|dkr|�d��dS|�d��dS)N�412 No newsgroup selected�3000234�"223 3000234 <45223423@example.com>�<45223423@example.com>�223 0 <45223423@example.com>�430 No Such Article Foundre�r�message_specs  r�handle_STATzNNTPv1Handler.handle_STAT7s������M�M�5�6�6�6�6�6�
�Y�
&�
&��M�M�>�?�?�?�?�?�
�5�
5�
5��M�M�8�9�9�9�9�9��M�M�5�6�6�6�6�6rc�0�|�d��dS)N�*223 3000237 <668929@example.org> retrievedrer�s r�handle_NEXTzNNTPv1Handler.handle_NEXTAs���
�
�B�C�C�C�C�Crc�0�|�d��dS)N�,223 3000234 <45223423@example.com> retrievedrer�s r�handle_LASTzNNTPv1Handler.handle_LASTDs���
�
�D�E�E�E�E�Erc���|�|�d��dS|dkr4|dkr|�d��dS|�d��dS|dkr|�d��dS|dkrU|�J�|d	kr|�d
��dS|dkr|�d��dS|�d
��dS|�d��dS)Na�                215 Newsgroups in form "group high low flags".
                comp.lang.python 0000052340 0000002828 y
                comp.lang.python.announce 0000001153 0000000993 m
                free.it.comp.lang.python 0000000002 0000000002 y
                fr.comp.lang.python 0000001254 0000000760 y
                free.it.comp.lang.python.learner 0000000000 0000000001 y
                tw.bbs.comp.lang.python 0000000304 0000000304 y
                .�ACTIVE�*distutils*z�                    215 Newsgroups in form "group high low flags"
                    gmane.comp.python.distutils.devel 0000014104 0000000001 m
                    gmane.comp.python.distutils.cvs 0000000000 0000000001 m
                    .zW                    215 Newsgroups in form "group high low flags"
                    .r�a                215 Order of fields in overview database.
                Subject:
                From:
                Date:
                Message-ID:
                References:
                Bytes:
                Lines:
                Xref:full
                .�
NEWSGROUPS�comp.lang.pythonz�                    215 Descriptions in form "group description".
                    comp.lang.python	The Python computer language.
                    .�comp.lang.python*z�                    215 Descriptions in form "group description".
                    comp.lang.python.announce	Announcements about the Python language. (Moderated)
                    comp.lang.python	The Python computer language.
                    .zW                    215 Descriptions in form "group description".
                    .z501 Unknown LIST keywordre)r�action�params   r�handle_LISTzNNTPv1Handler.handle_LISTGs����>��M�M��
�
�
�
�
��x�
�
��
�%�%��
�
��������
�
��������~�
%�
%��M�M�
�

�

�

�

�

��|�
#�
#��$�$�$��*�*�*��
�
��������-�-�-��
�
��������
�
�������
�M�M�4�5�5�5�5�5rc�.�|dkr#|dkr|dkr|�d��dS|dkr#|dkr|dkr|�d��dS|dkr'|dvr#|dkr|�d	d
zdz��dS|�d��dS)
Nr��20100913�082004a                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>
                .�100913a                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�100101�090000z
too long linei�z
.zK                230 An empty list of newsarticles follows
                .re)rr,�date_str�time_strs    r�handle_NEWNEWSzNNTPv1Handler.handle_NEWNEWS}s
��
�'�'�'�H�
�,B�,B��H�$�$��M�M��
�
�
�
�
�
�)�)�)�h�(�.B�.B��H�$�$��M�M��
�
�
�
�
�
�)�)�)��0�0�0��(�"�"��M�M�/�D�0�� �
!�
!�
!�
!�
!�
�M�M��
�
�
�
�
rc�j�|dkr|�d��dS|�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
                .rerxs  r�handle_XOVERzNNTPv1Handler.handle_XOVER�sY���7�"�"��M�M��
�
�
�
�
�4
�M�M��
�
�
�
�
r)r�c���|�I|jr+|�d��|���dS|�d��dS|jsJ�|�d��||_dS)Nz+340 Input article; end with <CR-LF>.<CR-LF>�440 Posting not permitted�240 Article received OK�r@rcrZ�posted_body)rr�s  r�handle_POSTzNNTPv1Handler.handle_POST�s����<��!�
;��
�
�K�L�L�L�� � �"�"�"�"�"��
�
�9�:�:�:�:�:��%�%�%�%��M�M�3�4�4�4�#�D���rc���|�O|jr1|dkr+|�d��|���dS|�d��dS|jsJ�|�d��||_dS)N�+<i.am.an.article.you.will.want@example.com>z%335 Send it; end with <CR-LF>.<CR-LF>�435 Article not wanted�235 Article transferred OKr�)r�
message_idr�s   r�handle_IHAVEzNNTPv1Handler.handle_IHAVE�s����<��"�
8��K�K�K��
�
�E�F�F�F�� � �"�"�"�"�"��
�
�6�7�7�7�7�7��%�%�%�%��M�M�6�7�7�7�#�D���rz�        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

c�2�|�|�d��nO|dkr|�d��n3|dkr|�d��n|�d��dS|�|j��|�d��dS)N�"220 3000237 <45223423@example.com>ru�220 0 <45223423@example.com>rs�"220 3000234 <45223423@example.com>rw�.)rc�sample_articlerxs  r�handle_ARTICLEzNNTPv1Handler.handle_ARTICLE�s������M�M�>�?�?�?�?�
�5�
5�
5��M�M�8�9�9�9�9�
�Y�
&�
&��M�M�>�?�?�?�?��M�M�5�6�6�6��F��
�
�d�)�*�*�*��
�
�c�����rc�2�|�|�d��nO|dkr|�d��n3|dkr|�d��n|�d��dS|�|j��|�d��dS)N�"221 3000237 <45223423@example.com>ru�221 0 <45223423@example.com>rs�"221 3000234 <45223423@example.com>rwr�)rc�sample_headrxs  r�handle_HEADzNNTPv1Handler.handle_HEAD�������M�M�>�?�?�?�?�
�5�
5�
5��M�M�8�9�9�9�9�
�Y�
&�
&��M�M�>�?�?�?�?��M�M�5�6�6�6��F��
�
�d�&�'�'�'��
�
�c�����rc�2�|�|�d��nO|dkr|�d��n3|dkr|�d��n|�d��dS|�|j��|�d��dS)N�"222 3000237 <45223423@example.com>ru�222 0 <45223423@example.com>rs�"222 3000234 <45223423@example.com>rwr�)rc�sample_bodyrxs  r�handle_BODYzNNTPv1Handler.handle_BODY�r�rc�N�|jr|�d��dS|dkr<|jr|�d��dS|�d��d|_dS|dkr|�d��d|_dStd�|�����)	Nz502 Already Logged Inr�z 482 User Credential Already Sentz381 Password RequiredT�passz281 Login SuccessfulzUnknown cred type {})rCrcrDrVrR)r�	cred_typers   r�handle_AUTHINFOzNNTPv1Handler.handle_AUTHINFO
s����?�	F��M�M�1�2�2�2�2�2�
�&�
 �
 ���
'��
�
�@�A�A�A�A�A��
�
�5�6�6�6�"&�����
�&�
 �
 ��M�M�0�1�1�1�"�D�O�O�O��2�9�9�)�D�D�E�E�Err�NN) rr
rrrr|rJrrZrrcrUrErirlrnrprzr}r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr=r=�s���������$�G����5�5�5�$'�$'�$'�L���������#�#�#�$�$�$�"�"�"�,�,�,�@�@�@����7�7�7�7�D�D�D�F�F�F�46�46�46�46�l���>���@#'�
$�
$�
$�
$�
$�04�$�$�$�$�$�C�K�"�K�!�6�)�K�7�N�������������
F�
F�
F�
F�
Frr=c�&�eZdZdZd�Zd�Zdd�ZdS)�
NNTPv2Handlerz"A handler for RFC 3977 (NNTP "v2")c��d}|js*|�|�d����dS|�|�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 USERrM)rCrcrR�r�fmts  r�handle_CAPABILITIESz!NNTPv2Handler.handle_CAPABILITIESs\��	����	*��M�M�#�*�*�%B�C�C�D�D�D�D�D��M�M�#�*�*�R�.�.�)�)�)�)�)rc� �td���)Nz3MODE READER sent despite READER has been advertised)rV)r�_s  r�handle_MODEzNNTPv2Handler.handle_MODE.s���M�N�N�NrNc�,�|�|��Sr)r�rxs  r�handle_OVERzNNTPv2Handler.handle_OVER1s��� � ��.�.�.rr)rr
rrr�r�r�rrrr�r�sO������,�,�*�*�*�"O�O�O�/�/�/�/�/�/rr�c�"��eZdZdZ�fd�Z�xZS)�CapsAfterLoginNNTPv2Handlerz3A handler that allows CAPABILITIES only after loginc���|js|�d��dSt�����dS)Nz480 You must log in.)rCrcr-r�r0s �rr�z/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES8sB�����	*��M�M�0�1�1�1�1�1��G�G�'�'�)�)�)�)�)r)rr
rrr�r7r8s@rr�r�5s>�������=�=�*�*�*�*�*�*�*�*�*rr�c�$�eZdZdZd�Zd�Zd�ZdS)�ModeSwitchingNNTPv2Handlerz$A server that starts in transit modec��d|_dS�NF)�	_switchedr�s rrz#ModeSwitchingNNTPv2Handler.__init__Bs
������rc��d}|jr*|�|�d����dS|�|�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
            .rMzMODE-)r�rcrRr�s  rr�z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIESEs[��	���>�	/��M�M�#�*�*�R�.�.�)�)�)�)�)��M�M�#�*�*�W�-�-�.�.�.�.�.rc�\�|js|dksJ�d|_|�d��dS)N�readerTz200 Posting allowed)r�rc)r�whats  rr�z&ModeSwitchingNNTPv2Handler.handle_MODEUs:���>�6�d�h�&6�&6�&6�&6�����
�
�+�,�,�,�,�,rN)rr
rrrr�r�rrrr�r�?sG������.�.����/�/�/� -�-�-�-�-rr�c����eZdZ�fd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZdZd�Zd�Zd�Z d�Z!d �Z"d!�Z#�xZ$S)"�NNTPv1v2TestsMixinc�H��t�����dSr)r-r.r0s �rr.zNNTPv1v2TestsMixin.setUp]s���
���
�
�����rc�Z�|�|jj|jj��dSr)rrrrr�s rrzNNTPv1v2TestsMixin.test_welcome`s(�������,�d�l�.B�C�C�C�C�Crc���|jdkr |�d|jj��|j�dd��|�d|jj��dS)Nr��AUTHINFO�testuser�testpw)r�rOr�_capsr�rIr�s r�
test_authinfoz NNTPv1v2TestsMixin.test_authinfocsd�����!�!��M�M�*�d�k�&7�8�8�8�����*�h�/�/�/�	
����T�[�%6�7�7�7�7�7rc���|j���\}}|�|d��|�|tjdddddd����dS)Nrk���	�r��7)rr@rr?rds   rrezNNTPv1v2TestsMixin.test_dateksa���[�%�%�'�'�
��d�����3�4�4�4�����x�0��q�"�a��R�H�H�I�I�I�I�Irc���|�|jj��|j���}|�|d��|�|jj��dSrh)r�r�closedrr�rr")rr$s  r�	test_quitzNNTPv1v2TestsMixin.test_quitps_��������)�)�)��{���!�!������z�*�*�*�������(�(�(�(�(rc��|j���\}}|�|d��|�|gd���dS)Nz100 Legal commands)z8  authinfo user Name|pass Password|generic <prog> <args>z  datez  helpz%Report problems to <root@example.org>)rr!r)rr$r!s   rr'zNNTPv1v2TestsMixin.test_helpvsc���[�%�%�'�'�
��d�����3�4�4�4����� 
� 
� 
�	�	�	�	�	rc	��|j���\}}|�t|��d��|d}|�|t	dddd����|j�d��\}}|�t|��d��|d	}|�|t	d
ddd����dS)
N�r�comp.lang.python.announce�
0000001153�
0000000993�mr�r�rz!gmane.comp.python.distutils.devel�
0000014104�
0000000001)rr*rr+r)rr$r.�gs    rr/zNNTPv1v2TestsMixin.test_list�s����{�'�'�)�)���f�����V���a�(�(�(��1�I�������1�<�"�C�
)�
)�	*�	*�	*��{�'�'�
�6�6���f�����V���a�(�(�(��1�I�������9�<�"�C�
)�
)�	*�	*�	*�	*�	*rc�H�|j�d��\}}}|�|d��|�|d��|�|d��|j�d��\}}}|�|d��|�|d��|�|d��|�tj��5}|j�d��ddd��n#1swxYwY|�|jjd��|�tj��5}|j���ddd��n#1swxYwY|�|jjd��dS)	N��-rtrurvrz<non.existent.id>rwrr)r�statrr5rr�r8r9)rr$rvr�r:s     r�	test_statzNNTPv1v2TestsMixin.test_stat�s���$(�K�$4�$4�W�$=�$=�!��g�z�����C�D�D�D�����'�*�*�*�����%=�>�>�>�$(�K�$4�$4�5M�$N�$N�!��g�z�����=�>�>�>�����!�$�$�$�����%=�>�>�>�
�
�
�w�9�
:�
:�	2�b��K���0�1�1�1�	2�	2�	2�	2�	2�	2�	2�	2�	2�	2�	2����	2�	2�	2�	2������.�0K�L�L�L�
�
�
�w�9�
:�
:�	�b��K������	�	�	�	�	�	�	�	�	�	�	����	�	�	�	������.�0K�L�L�L�L�Ls$� D�D�D�E7�7E;�>E;c���|j���\}}}|�|d��|�|d��|�|d��dS)Nr|��-z<668929@example.org>)r�nextr�rr$rvr�s    r�	test_nextzNNTPv1v2TestsMixin.test_next�sf��$(�K�$4�$4�$6�$6�!��g�z�����K�L�L�L�����'�*�*�*�����%;�<�<�<�<�<rc���|j���\}}}|�|d��|�|d��|�|d��dS)Nrr�ru)rr_rr�s    r�	test_lastzNNTPv1v2TestsMixin.test_last�sf��$(�K�$4�$4�$6�$6�!��g�z�����M�N�N�N�����'�*�*�*�����%=�>�>�>�>�>rc���|j�d��}|�|d��|j�d��}|�|d��dS)Nr��The Python computer language.�comp.lang.pythonxrM)rrNr)rrKs  rrQz#NNTPv1v2TestsMixin.test_description�sa���{�&�&�'9�:�:������>�?�?�?��{�&�&�':�;�;������r�"�"�"�"�"rc�n�|j�d��\}}|�|d��|�|ddi��|j�d��\}}|�|ddd���|j�d��\}}|�|i��dS)Nr�z-215 Descriptions in form "group description".r�r�z4Announcements about the Python language. (Moderated))r�r�r�)rrSrr-s   rrVz$NNTPv1v2TestsMixin.test_descriptions�s����{�/�/�0B�C�C���f�����N�O�O�O������ ?�"�	�	�	��{�/�/�0C�D�D���f����� ?�)_�"�"�	�	�	��{�/�/�0C�D�D���f������$�$�$�$�$rc�^�|j�d��\}}}}}|�|�d��|��|�|d��|�|d��|�|d��|�|d��|�tj��5}|j�d��ddd��n#1swxYwY|j}|�|j	�d��|j	��dS)Nr�rYi�i�i�zcomp.lang.python.develz411 No such group)
rr,r"r#rr5rr�r8r9)rr$r]r^r_r,r:�excs        rr`zNNTPv1v2TestsMixin.test_group�s[��*.�+�*;�*;�<Q�*R�*R�'��e�U�D�%��������/�/��6�6�6������$�$�$�����t�$�$�$������$�$�$����� 5�6�6�6�
�
�
�w�9�
:�
:�	8�b��K���6�7�7�7�	8�	8�	8�	8�	8�	8�	8�	8�	8�	8�	8����	8�	8�	8�	8��l�������/�/�0C�D�D���	&�	&�	&�	&�	&s�C(�(C,�/C,c���tjdddddd��}|j�d|��\}}d�|j��}|�||��|�|d	d
g��tjdddddd��}|j�d|��\}}|�|d��|�|g��dS)
Nr�r��
���r�zS230 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>r�z)230 An empty list of newsarticles follows)r?r�newnewsrRr�r)rrEr$�ids�expecteds     r�test_newnewszNNTPv1v2TestsMixin.test_newnews�s���
�
�t�Q��A�r�1�
5�
5���K�'�'�(:�B�?�?�	��c�
=��f�T�&�'�'�	�	
����x�(�(�(�����P�P��	�	�	�
�
�t�Q��A�r�1�
5�
5���K�'�'�(=�r�B�B�	��c�����J�K�K�K�����b�!�!�!�!�!rc�R�|�t|��d��|�|d�d��d��|�|dd��|�|dd��|�|d	d
��dS)NrrzrGu-- Signed by André.rMr���s.Here is a dot-starting line.���sThis is just a test article.)rr+�decode�rr%s  r�_check_article_bodyz&NNTPv1v2TestsMixin._check_article_body�s�������U���Q�'�'�'�����r��)�)�'�2�2�4J�K�K�K�����r��C�(�(�(�����r��$D�E�E�E�����r��$C�D�D�D�D�Drc��|�t|��d��|�|dd��|�|dd��dS)Nrrs&From: "Demo User" <nobody@example.net>�s7Message-ID: <i.am.an.article.you.will.want@example.com>)rr+r
s  r�_check_article_headz&NNTPv1v2TestsMixin._check_article_head�sZ������U���Q�'�'�'�����q��#L�M�M�M�����q��#]�^�^�^�^�^rc��|�t|��d��|�|dd���|�|dd���|�|dd��dS)Nr�rrr)rr+rrr
s  r�_check_article_dataz&NNTPv1v2TestsMixin._check_article_data�sv������U���Q�'�'�'�� � ��r��r��+�+�+�� � ��r�s�s��,�,�,�����q��3�'�'�'�'�'rc���|j���\}}|�|d��|\}}}|�|d��|�|d��|�|��|j�d��\}}|�|d��|\}}}|�|d��|�|d��|�|��|j�d��\}}|�|d��|\}}}|�|d��|�|d��|�|��|�t
j��5}|j�d��ddd��n#1swxYwY|�|jjd	��dS)
Nr�r�rur�r�r�r�<non-existent@example.com>rw)	rr�rrr5rr�r8r9�rr$�inforvr�r%r:s       r�test_articlezNNTPv1v2TestsMixin.test_article�s���[�(�(�*�*�
��d�����C�D�D�D�%)�"���U�����'�*�*�*�����%=�>�>�>�� � ��'�'�'��[�(�(��1�1�
��d�����C�D�D�D�%)�"���U�����'�*�*�*�����%=�>�>�>�� � ��'�'�'��[�(�(�)A�B�B�
��d�����=�>�>�>�%)�"���U�����!�$�$�$�����%=�>�>�>�� � ��'�'�'�
�
�
�w�9�
:�
:�	>�b��K��� <�=�=�=�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>����	>�	>�	>�	>������.�0K�L�L�L�L�L��
F4�4F8�;F8c�$�tj��}|j�|���\}}|�|d��|\}}}|�|d��|�|d��|�|g��|���}|�|�d��t|����|�|�	d��t|����dS)N�r�r�r�ru�KFrom: "Demo User" <nobody@example.net>
Subject: I am just a test article
�UThis is just a test article.
.Here is a dot-starting line.

-- Signed by André.
)
r�rrr�r�getvaluer"r#�asciirQ�rr$r$rrvr�r%rs        r�test_article_filez$NNTPv1v2TestsMixin.test_article_files���J�L�L���[�(�(�a�(�0�0�
��d�����C�D�D�D�%)�"���U�����'�*�*�*�����%=�>�>�>������#�#�#��z�z�|�|��������
5����T�{�{�	�	�	�	
����
�
�
.���
�T�{�{�	�	�	�	�	rc���|j���\}}|�|d��|\}}}|�|d��|�|d��|�|��|j�d��\}}|�|d��|\}}}|�|d��|�|d��|�|��|j�d��\}}|�|d��|\}}}|�|d��|�|d��|�|��|�t
j��5}|j�d��ddd��n#1swxYwY|�|jjd	��dS)
Nr�r�rur�r�r�rrrw)	rr�rrr5rr�r8r9rs       r�	test_headzNNTPv1v2TestsMixin.test_head ����[�%�%�'�'�
��d�����C�D�D�D�%)�"���U�����'�*�*�*�����%=�>�>�>�� � ��'�'�'��[�%�%�g�.�.�
��d�����C�D�D�D�%)�"���U�����'�*�*�*�����%=�>�>�>�� � ��'�'�'��[�%�%�&>�?�?�
��d�����=�>�>�>�%)�"���U�����!�$�$�$�����%=�>�>�>�� � ��'�'�'�
�
�
�w�9�
:�
:�	;�b��K���9�:�:�:�	;�	;�	;�	;�	;�	;�	;�	;�	;�	;�	;����	;�	;�	;�	;������.�0K�L�L�L�L�Lrc�$�tj��}|j�|���\}}|�|d��|\}}}|�|d��|�|d��|�|g��|���}|�|�d��t|����|�	|�
d��t|����dS)Nrr�r�rurr)r�rrr�rrr"r#rr�rQr s        r�test_head_filez!NNTPv1v2TestsMixin.test_head_file;s���J�L�L���[�%�%�1�%�-�-�
��d�����C�D�D�D�%)�"���U�����'�*�*�*�����%=�>�>�>������#�#�#��z�z�|�|��������
5����T�{�{�	�	�	�	
������
.���
�T�{�{�	�	�	�	�	rc���|j���\}}|�|d��|\}}}|�|d��|�|d��|�|��|j�d��\}}|�|d��|\}}}|�|d��|�|d��|�|��|j�d��\}}|�|d��|\}}}|�|d��|�|d��|�|��|�t
j��5}|j�d��ddd��n#1swxYwY|�|jjd	��dS)
Nr�r�rur�r�r�rrrw)	rr�rrr5rr�r8r9rs       r�	test_bodyzNNTPv1v2TestsMixin.test_bodyOr$rc�$�tj��}|j�|���\}}|�|d��|\}}}|�|d��|�|d��|�|g��|���}|�|�d��t|����|�	|�
d��t|����dS)Nrr�r�rurr)r�rrr�rrr�r#rr"rQr s        r�test_body_filez!NNTPv1v2TestsMixin.test_body_filejs���J�L�L���[�%�%�1�%�-�-�
��d�����C�D�D�D�%)�"���U�����'�*�*�*�����%=�>�>�>������#�#�#��z�z�|�|��������
5����T�{�{�	�	�	�	
����
�
�
.���
�T�{�{�	�	�	�	�	rc��|�|�d��|��|�t|��d��|d\}}|�|d��|�|ddddd	d
ddd
���|d\}}|�|dd��|d\}}|�|dd��dS)Nz224 rr�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>�7103�16z*news.gmane.io gmane.comp.python.authors:57)rgrhr@rlrirjrk�xrefrr/r�rh�0Re: Message d'erreur incompréhensible (par moi))r"r#rr+)rr$�	overviewsrvr{s     r�check_over_xover_respz(NNTPv1v2TestsMixin.check_over_xover_resp~s���������/�/��6�6�6�����Y����+�+�+�!�!��
�������"�%�%�%�����[�`�5�L�:���@�	 �	 �		�		�		�"�!��
�������f��t�,�,�,�!�!��
�������i��K�	M�	M�	M�	M�	Mrc�n�|j�dd��\}}|�||��dS)Nr,�;)rrsr2�rr$r1s   rrwzNNTPv1v2TestsMixin.test_xover�s9���+�+�+�B��3�3���i��"�"�4��3�3�3�3�3rc�l�|j�d��\}}|�||��dS)N)r,r4)rr{r2r5s   rr}zNNTPv1v2TestsMixin.test_over�s7���+�*�*�8�4�4���i��"�"�4��3�3�3�3�3rsFrom: "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é.
c�|�|jj}|�t|��d��|�|dd��|�|dd��|�|dd��|�|dd	��|�|d
d��dS)Nryrzr�rMs-- Signed by André.
r
�
rs ..Here is a dot-starting line.
rs(From: "Demo User" <nobody@example.net>
)rr�rr+r
s  r�_check_posted_bodyz%NNTPv1v2TestsMixin._check_posted_body�s�����(������U���R�(�(�(�����r��H�-�-�-�����r��$E�F�F�F�����r��G�,�,�,�����r��$I�J�J�J�����q��#P�Q�Q�Q�Q�Qrc��|j}|||��fz}d|j_||�}|���|j�dd��}|||��fz}d|j_||�}|���|S)Nr8�
)�sample_postrr�r9�replace)r�func�file_factoryr6�post�	func_argsr$s       r�_check_post_ihave_subz(NNTPv1v2TestsMixin._check_post_ihave_sub�s�������L�L��.�.�0�0�	�#'��� ��t�Y������!�!�!���'�'���7�7���L�L��.�.�0�0�	�#'��� ��t�Y������!�!�!��rc��|j|g|�Rdti�}|�||��|j|g|�Rdti�}|�||��|j|g|�Rdtji�}|�||��d�}|j|g|�Rd|i�}|�||��d�}|j|g|�Rd|i�}|�||��dS)Nr?c�H�t|�d�����S)NT��keepends��iterr`�rs r�	iterlinesz6NNTPv1v2TestsMixin.check_post_ihave.<locals>.iterlines�s������d��3�3�4�4�4rc�H�t|�d�����S)NFrErGrIs rrJz6NNTPv1v2TestsMixin.check_post_ihave.<locals>.iterlines�s������e��4�4�5�5�5r)rBr�r�	bytearrayr�r)rr>�success_respr6r$rJs      r�check_post_ihavez#NNTPv1v2TestsMixin.check_post_ihave�s@��)�t�)�$�J��J�J�J�E�J�J������|�,�,�,�)�t�)�$�N��N�N�N�I�N�N������|�,�,�,�)�t�)�$�O��O�O�O�B�J�O�O������|�,�,�,�	5�	5�	5�)�t�)�$�N��N�N�N�I�N�N������|�,�,�,�	6�	6�	6�)�t�)�$�N��N�N�N�I�N�N������|�,�,�,�,�,rc�J�|�|jjd��d|j_|�tj��5}|j�|j��ddd��n#1swxYwY|�	|j
jd��dS)Nr�Fr�)rNrr@rr@r5rr�r<rr8r9�rr:s  r�	test_postzNNTPv1v2TestsMixin.test_post�s������d�k�.�0I�J�J�J�%*���"�
�
�
�w�9�
:�
:�	/�b��K���T�-�.�.�.�	/�	/�	/�	/�	/�	/�	/�	/�	/�	/�	/����	/�	/�	/�	/������.�4�	6�	6�	6�	6�	6s� A8�8A<�?A<c�6�|�|jjdd��|�tj��5}|j�d|j��ddd��n#1swxYwY|�|jj	d��dS)Nr�r�z<another.message.id>r�)
rNr�ihaver5rr�r<rr8r9rPs  r�
test_ihavezNNTPv1v2TestsMixin.test_ihave�s������d�k�/�1M�K�	M�	M�	M�
�
�
�w�9�
:�
:�	H�b��K���4�d�6F�G�G�G�	H�	H�	H�	H�	H�	H�	H�	H�	H�	H�	H����	H�	H�	H�	H������.�1�	3�	3�	3�	3�	3s�!A.�.A2�5A2c��tjdddddd��}|�tj|jjd|��dS)Nr�rr�rr�)r?r5r�
NNTPDataErrorrr)rrEs  r�test_too_long_linesz&NNTPv1v2TestsMixin.test_too_long_lines�sU��
�
�t�Q��1�a��
3�
3�����'�/��+�-�/A�2�	G�	G�	G�	G�	Gr)%rr
rr.rr�rer�r'r/r�r�r�rQrVr`rrrrrr!r#r&r(r*r2rwr}r<r9rBrNrQrTrWr7r8s@rr�r�[s8������������D�D�D�8�8�8�J�J�J�
)�)�)����*�*�*�M�M�M� =�=�=�?�?�?�#�#�#�%�%�%�&�&�&�"�"�"�&E�E�E�_�_�_�
(�(�(�M�M�M�6���*M�M�M�6���(M�M�M�6���(M�M�M�*4�4�4�4�4�4�	*��	R�	R�	R���� -�-�-�*6�6�6�3�3�3�G�G�G�G�G�G�Grr�c� �eZdZdZdZeZd�ZdS)�NNTPv1Testsz*Tests an NNTP v1 server (no capabilities).rc���|j���}|�|i��|�|jjd��|�|jjd��dS)Nr�rr�rr��nntp_implementation�rr�s  r�	test_capszNNTPv1Tests.test_caps�sg���{�*�*�,�,������r�"�"�"������1�1�5�5�5������8�$�?�?�?�?�?rN)rr
rrr�r=r5r^rrrrYrY�s8������4�4��L�!�M�@�@�@�@�@rrYc� �eZdZdZdZeZd�ZdS)�NNTPv2Testsz,Tests an NNTP v2 server (with capabilities).r�c��|j���}|�|ddgddgdgggd�gggd���|�|jjd��|�|jjd	��dS)
N�2�3�INNz2.5.1�USER)r�zACTIVE.TIMESzDISTRIB.PATS�HEADERSr�r�)�VERSION�IMPLEMENTATIONr��HDRr��OVER�POST�READERrz	INN 2.5.1r[r]s  rr^zNNTPv2Tests.test_capss����{�*�*�,�,�������S�z�$�g�.����>�>�>����
 �
 �
	�
	�
	�	
�����1�1�5�5�5������8�+�F�F�F�F�FrN)rr
rrr�r�r5r^rrrr`r`�s8������6�6��L�!�M�G�G�G�G�Grr`c� �eZdZdZdZeZd�ZdS)�CapsAfterLoginNNTPv2TestszCTests a probably NNTP v2 server with capabilities only after login.r�c��|�|jji��|j�dd��|�d|jj��dS)Nr�r�rg)rrr�r�rOr�s r�test_caps_only_after_loginz4CapsAfterLoginNNTPv2Tests.test_caps_only_after_loginsT�������*�B�/�/�/�����*�h�/�/�/��
�
�i���!2�3�3�3�3�3rN)rr
rrr�r�r5rprrrrnrns3������M�M��L�/�M�4�4�4�4�4rrnc� �eZdZdZdZeZd�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.r�c�F�|�d|jj��dS)Nrl)rOrr�r�s r�(test_we_are_in_reader_mode_after_connectz>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connect&s!���
�
�h��� 1�2�2�2�2�2rN)rr
rrr�r�r5rtrrrrrrrs9������-�-��L�.�M�3�3�3�3�3rrrc�f�eZdZd�Zd�Zd�Zd�Zd�Zd�Ze	j
ed��d���Zd	S)
�	MiscTestsc����fd�}|dd��|dd��|dd��|dd��|dd��|d	d
��|dd��dS)Nc�d����t�|��|��dSr)rr�
decode_header)�arrs  �r�givesz+MiscTests.test_decode_header.<locals>.gives-s-������W�2�2�1�5�5�q�9�9�9�9�9rrMza 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 matricer0r�rr{s` r�test_decode_headerzMiscTests.test_decode_header,s����	:�	:�	:�	:�	:�
��b�2����
��� 0�1�1�1�
��$�&<�=�=�=�
��5�7K�L�L�L�
��J�`�	b�	b�	b�	��<�(�	*�	*�	*�	��@�@�	B�	B�	B�	B�	Brc�v�gd�}|�t�|��gd���gd�}|�t�|��gd���gd�}|�t�|��gd���gd�}|�t�|��gd���gd�}|�t�|��gd���gd�}|�t�|��gd	���dS)
N)�Subject:�From:�Date:�Message-ID:�References:rjrk)rhrgr@rlrirjrk)rr�r�r�r��Bytes:�Lines:)zsubject:zFROM:zDaTe:zmessage-ID:r�zBYTES:r�)	rr�r�r�r�rjrk�	Xref:fullzDistribution:full)	rhrgr@rlrirjrkr/�distribution)	rr�r�r�r�r�r�z	Xref:FULLzDistribution:FULL)rr�r�r�r�r�r�r��rhrgr@rlrirjrkr/)rr�_parse_overview_fmtr
s  r�test_parse_overview_fmtz!MiscTests.test_parse_overview_fmt<s���4�4�4������4�4�U�;�;�
!�
!�
!�	"�	"�	"�4�4�4������4�4�U�;�;�
!�
!�
!�	"�	"�	"�4�4�4������4�4�U�;�;�
!�
!�
!�	"�	"�	"�&�&�&��	
����4�4�U�;�;�
9�
9�
9�	:�	:�	:�&�&�&��	
����4�4�U�;�;�
9�
9�
9�	:�	:�	:�A�A�A������4�4�U�;�;�
)�
)�
)�	*�	*�	*�	*�	*rc��tjdgz}dg}t�||��}|\\}}|�|d��|�|dddddd	d
dd���d
g}t�||��}|\\}}|�|dd��dg}t�||��}|\\}}|�|dd��|�|dd��dS)Nr/z�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:3000363r�zI am just a test articlez "Demo User" <nobody@example.com>z6 Oct 1998 04:38:40 -0500ruz<45454@example.net>�1234�17z"news.example.com misc.test:3000363r�z�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� rM)r�_DEFAULT_OVERVIEW_FMT�_parse_overviewr)rr�r%�overviewrv�fieldss      r�test_parse_overviewzMiscTests.test_parse_overviewdsH���+�v�h�6��
;�
���*�*�5�#�6�6��%����&�����'�*�*�*�����1�6�/�2�/���8�	"
�	"
�		�		�		�
�
���*�*�5�#�6�6��%����&��������.�.�.�
�
���*�*�5�#�6�6��%����&������-�s�3�3�3��������,�,�,�,�,rc
����fd�}|dddddddd��|d	d
dddddd��|dd
dddddd��|dd
d
ddddd��dS)Nc�~����t�||��tj|���dSr)rr�_parse_datetimer?)rzr�crs   �rr{z,MiscTests.test_parse_datetime.<locals>.gives�sB������W�4�4�Q��:�:�%�.��2�
4�
4�
4�
4�
4r�19990623135624��r��r�8��19990623�135624�990623�090623i�rr|s` r�test_parse_datetimezMiscTests.test_parse_datetime�s����	4�	4�	4�	4�	4�	����d�A�r�2�r�2�>�>�>�
��j�(�D�!�R��R��<�<�<�
��h��$��2�r�2�r�:�:�:�
��h��$��2�r�2�r�:�:�:�:�:rc
�����fd�}|dddddddd	��|d
ddddddd	��|ddd
ddddd���fd�}|ddddd��|d
dddd��|ddd
dd��dS)Nc���tj||||||��}�	�t�|��||f���	�t�|d��||f��dSr��r?rr�_unparse_datetime�
�y�M�d�hr��sr�r�rErs
         �rr{z.MiscTests.test_unparse_datetime.<locals>.gives�s�����"�1�a��A�q�!�4�4�B����W�6�6�r�:�:�&��1�
3�
3�
3����W�6�6�r�5�A�A�&��1�
3�
3�
3�
3�
3rr�r�r�rr�r�r�r����20000623r�rXrr�r�20100605�010203c���tj|||��}��t�|��||f����t�|d��||f��dSr��r?r@rrr��r�r�r�r�r�rErs      �rr{z.MiscTests.test_unparse_datetime.<locals>.gives�s������q�!�Q�'�'�B����W�6�6�r�:�:�&��1�
3�
3�
3����W�6�6�r�5�A�A�&��1�
3�
3�
3�
3�
3r�000000rr|s` r�test_unparse_datetimezMiscTests.test_unparse_datetime�s����	3�	3�	3�	3�	3�	��d�A�r�2�r�2�z�8�<�<�<�
��d�A�r�2�r�2�z�8�<�<�<�
��d�A�q�!�Q��:�x�8�8�8�	3�	3�	3�	3�	3�	��d�A�r�:�x�0�0�0�
��d�A�r�:�x�0�0�0�
��d�A�q�*�h�/�/�/�/�/rc
�����fd�}|dddddddd	��|d
ddddddd	��|ddd
ddddd���fd�}|ddddd��|d
dddd��|ddd
dd��dS)Nc���tj||||||��}�	�t�|d��||f��dSrr�r�s
         �rr{z5MiscTests.test_unparse_datetime_legacy.<locals>.gives�sY����"�1�a��A�q�!�4�4�B����W�6�6�r�4�@�@�&��1�
3�
3�
3�
3�
3rr�r�r�rr�r�r�r�r��000623r�rXrr�r�100605r�c���tj|||��}��t�|d��||f��dSrr�r�s      �rr{z5MiscTests.test_unparse_datetime_legacy.<locals>.gives�sR�����q�!�Q�'�'�B����W�6�6�r�4�@�@�&��1�
3�
3�
3�
3�
3rr�rr|s` r�test_unparse_datetime_legacyz&MiscTests.test_unparse_datetime_legacy�s����	3�	3�	3�	3�	3�	��d�A�r�2�r�2�x��:�:�:�
��d�A�r�2�r�2�x��:�:�:�
��d�A�q�!�Q��8�X�6�6�6�	3�	3�	3�	3�	3�	��d�A�r�8�X�.�.�.�
��d�A�r�8�X�.�.�.�
��d�A�q�(�H�-�-�-�-�-rr�c�V�|�ttd����dS)Nr�)r"r�rr�s r�test_ssl_supportzMiscTests.test_ssl_support�s$��������4�4�5�5�5�5�5rN)
rr
rr}r�r�r�r�r�r��
skipUnlessr�r�rrrrvrv*s�������B�B�B� &*�&*�&*�P,-�,-�,-�\	;�	;�	;�0�0�0�..�.�.�&�X���4�5�5�6�6�6�5�6�6�6rrvc��eZdZdZd�ZdS)�PublicAPITestsz>Ensures that the correct values are exposed in the public API.c�
�|�ttd����gd�}t�|�d��|�t
tj��t
|����dS)N�__all__)rr��NNTPReplyErrorr�r6�NNTPProtocolErrorrVryr�)r"r�rr�rOr�setr�)r�
target_apis  r�test_module_all_attributez(PublicAPITests.test_module_all_attribute�sy��������3�3�4�4�4�M�M�M�
��?����j�)�)�)�����W�_�-�-�s�:���?�?�?�?�?rN)rr
rrr�rrrr�r��s.������H�H�@�@�@�@�@rr�c�H�eZdZdZejZ	d	d�Zd�Zd�Z	d�Z
d�Zd�ZdS)
�MockSocketTestszaTests involving a mock socket object

    Used where the _NNTPServerIO file object is not enough.Nc����	�
�G�fd�d��}G�	��
fd�d���d�
g�	td|��5|�||��5|�d||���ddd��n#1swxYwYddd��n#1swxYwY|��
���	D]}|�|j���dS)	Nc���eZdZ�fd�ZdS)�NMockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_modulec������Srr)�addressr��
MockSockets  �r�create_connectionz`MockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_module.create_connection�s���!�z�|�|�#rN)rr
rr�)r�s�r�mock_socket_moduler��s.�������
$�
$�
$�
$�
$�
$�
$rr�c�&��eZdZ�fd�Z��fd�ZdS)�FMockSocketTests.check_constructor_error_conditions.<locals>.MockSocketc���d�dSrr)r�
socket_closeds �rr'zLMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.close�s��� $�
�
�
rc�j�����}t|��\}}��|��|Sr)rrO)�socket�moderr�r��filesr5s     ��r�makefilezOMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.makefile�s6���'�-�/�/��(��1�1���4����T�"�"�"��rN)rr
rr'r�)r�r5r�s���rr�r��sL�������
%�
%�
%�
%�
%�
�
�
�
�
�
�
�
rr�Fznntplib.socket�dummy)r�r�)r	�assertRaisesRegex�
nntp_classr"r�)rr5�expected_error_type�expected_error_msgr�r�r�r$r�r�r�s `      @@@r�"check_constructor_error_conditionsz2MockSocketTests.check_constructor_error_conditions�s�������
	$�	$�	$�	$�	$�	$�	$�	$�	$�	$�		�		�		�		�		�		�		�		�		�		�		�		��
���
�#�%7�
8�
8�	D�	D�
�
#�
#�$7�9K�
L�
L�	D�	D��O�O�G�%�(�O�C�C�C�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D����	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D����	D�	D�	D�	D�	
���
�&�&�&��	&�	&�A��O�O�A�H�%�%�%�%�	&�	&s5�B�A5�)B�5A9	�9B�<A9	�=B�B�Bc�x�Gd�dt��}|�|tj|j��dS)Nc��eZdZdZdS)�1MockSocketTests.test_bad_welcome.<locals>.HandlerzBad WelcomeN�rr
rrrrr�Handlerr��s������#�G�G�Grr�)r=r�rr�r�rr�s  r�test_bad_welcomez MockSocketTests.test_bad_welcome�s_��	$�	$�	$�	$�	$�m�	$�	$�	$��/�/��W�.���	A�	A�	A�	A�	Arc�x�Gd�dt��}|�|tj|j��dS)Nc��eZdZdZdS)�EMockSocketTests.test_service_temporarily_unavailable.<locals>.Handlerz#400 Service temporarily unavailableNr�rrrr�r��������;�G�G�Grr�)r=r�rr�rr�s  r�$test_service_temporarily_unavailablez4MockSocketTests.test_service_temporarily_unavailable�_��	<�	<�	<�	<�	<�m�	<�	<�	<��/�/��W�/���	B�	B�	B�	B�	Brc�x�Gd�dt��}|�|tj|j��dS)Nc��eZdZdZdS)�EMockSocketTests.test_service_permanently_unavailable.<locals>.Handlerz#502 Service permanently unavailableNr�rrrr�r�r�rr�)r=r�rr6rr�s  r�$test_service_permanently_unavailablez4MockSocketTests.test_service_permanently_unavailable
r�rc�x��G�fd�dt��}d�|�|tj���dS)Nc���eZdZ�fd�ZdS)�6MockSocketTests.test_bad_capabilities.<locals>.Handlerc�2��|����dSrre)r�capabilities_responses �rr�zJMockSocketTests.test_bad_capabilities.<locals>.Handler.handle_CAPABILITIESs����
�
�3�4�4�4�4�4rN)rr
rr�)r�s�rr�r�s.�������
5�
5�
5�
5�
5�
5�
5rr�z201 bad capability)r=r�rr�)rr�r�s  @r�test_bad_capabilitiesz%MockSocketTests.test_bad_capabilitiessq���	5�	5�	5�	5�	5�	5�	5�m�	5�	5�	5�!5���/�/��W�+�-B�	D�	D�	D�	D�	Drc���d}d}G�fd�dt��}d�|�|tj�||��dS)Nzt@e.com�pythonc���eZdZ�fd�ZdS)�3MockSocketTests.test_login_aborted.<locals>.Handlerc�2��|����dSrre)rr6�authinfo_responses  �rr�zCMockSocketTests.test_login_aborted.<locals>.Handler.handle_AUTHINFOs����
�
�/�0�0�0�0�0rN)rr
rr�)r�s�rr�r�s.�������
1�
1�
1�
1�
1�
1�
1rr�z503 Mechanism not recognized)r=r�rr6)rr�r�r�r�s    @r�test_login_abortedz"MockSocketTests.test_login_aborteds{�������	1�	1�	1�	1�	1�	1�	1�m�	1�	1�	1�;���/�/��W�/�1B��8�	�	�	�	�	rr�)
rr
rrrrr�r�r�r�r�r�r�rrrr�r��s�������?�?���J�
"&�&�&�&�&�:A�A�A�B�B�B�B�B�B�D�D�D�
�
�
�
�
rr�c��eZdZdZd�ZdS)�bypass_contextz'Bypass encryption and actual SSL modulec��|Srr)�sockr6s  r�wrap_socketzbypass_context.wrap_socket(s���rN)rr
rrrrrrr�r�&s)������1�1�����rr�c�$�eZdZed���ZdS)�MockSslTestsc�2�tj|dti|��S)Nr�)rr�r�)r�kws  rr�zMockSslTests.nntp_class-s�����G�.�G�B�G�G�GrN)rr
r�staticmethodr�rrrrr+s2�������H�H��\�H�H�Hrrc�N�eZdZd�Zd�Zejed��d���ZdS)�LocalServerTestsc��tj��}tj|��}|���t	j|j|f���|_|j���|�	|jj
��|�ttj
|d�����|_dS)N)�targetr6F)r�)r�r�	bind_port�listen�	threading�Thread�
run_server�
backgroundr|�
addCleanupr_�enterContextr�HOST�nntp)rr�ports   rr.zLocalServerTests.setUp3s����}�����&�t�,�,�����
�
�
�#�*��?�$��2�2�2���������������,�-�-�-��%�%�d�=�+=�t�e�&T�&T�&T�U�U��	�	�	rc��|5|���\}}ddd��n#1swxYwYtj��5}|�|��|�|�d����}|�d��	|���}|dkr|�d��n�|dkr�|���|�d��tj	tj
��}|�t��|�
|d���}|�|��|�|�d����}n>|d	kr|�d
��n$td�|�������,	ddd��dS#1swxYwYdS)N�rbs200 Server ready
TsCAPABILITIES
s.101 Capability list:
VERSION 2
STARTTLS
.
s
STARTTLS
s382 Begin TLS negotiation now
)�server_sidesQUIT
s
205 Bye!
zUnexpected command {!r})�accept�
contextlib�	ExitStack�
enter_contextr��sendallrr'r��
SSLContext�PROTOCOL_TLS_SERVER�load_cert_chain�certfilerr�rR)rr�clientr��cleanupr�rX�contexts        rrzLocalServerTests.run_server>sg��
�	(�	(��+�+�-�-�K�V�Q�	(�	(�	(�	(�	(�	(�	(�	(�	(�	(�	(����	(�	(�	(�	(�
�
!�
#�
#�	L�w��!�!�&�)�)�)��*�*�6�?�?�4�+@�+@�A�A�F��N�N�2�3�3�3�
L��o�o�'�'���-�-�-��N�N�!������O�+�+��L�L�N�N�N��N�N�#G�H�H�H�!�n�S�-D�E�E�G��+�+�H�5�5�5�$�0�0��D�1�2�2�F��)�)�&�1�1�1�$�2�2�6�?�?�4�3H�3H�I�I�F�F��K�'�'��N�N�?�3�3�3��$�%>�%E�%E�c�%J�%J�K�K�K�-
L�(�1	L�	L�	L�	L�	L�	L�	L�	L�	L�	L�	L�	L����	L�	L�	L�	L�	L�	Ls�'�+�+�FG�G�Gr�c��|jj}|jj}|j���|�||jj��|�||jj��|�|jjtj��|�t|jj��dSr)
rr�r�starttls�assertNotEqualrDr��	SSLSocketr5r�)rr�rs   rr�zLocalServerTests.test_starttls^s����y�~���y�~���	������	
���D�$�)�.�1�1�1����D�$�)�.�1�1�1����d�i�n�c�m�<�<�<����*�d�i�&8�9�9�9�9�9rN)	rr
rr.rr�r�r�r�rrrr	r	2se������	V�	V�	V�L�L�L�@�X���4�5�5�:�:�6�5�:�:�:rr	�__main__)?r�r�r?r]r�r�r�os.path�osr�rr�r�test.supportrr�import_deprecatedrrr�
unittest.mockr	r��ImportError�pathr_�dirname�__file__r"rrVrr�r�r��SSLEOFError�TestCaser�r�r�r�r�rr r*r:r=r�r�r�r�rYr`rnrrrvr�r�r�rr	r�mainrrr�<module>r7s(��	�	�	�	�
�
�
�
�������������������������	�	�	�	�����������7�7�7�7�7�7�7�7�
+�/�
+�I�
6�
6��#�#�#�#�#�#�#�#���������J�J�J�J������
�C�C�C������7�<�<������1�1�>�B�B���?��|�H�H�.�.�.�.�.�9�.�.�.�G�G�G�G�G�G�G�G�T�$�$�&�&�&��[�
��?��3�?�$�$�J�#�#�#�#�#�0�(�2C�#�#�#�J���S�0�1�1�=�=�=�=�=�/�=�=�2�1�=�<)�)�)�)�)�B�L�)�)�)�X���	�	�	�	�	���	�	�	���������&*�*�*�*�*�$8�*�*�*�BF�BF�BF�BF�BF�BF�BF�BF�J
/�/�/�/�/�M�/�/�/�6*�*�*�*�*�-�*�*�*�-�-�-�-�-��-�-�-�8PG�PG�PG�PG�PG�PG�PG�PG�f
@�
@�
@�
@�
@�$�&:�H�<M�
@�
@�
@�G�G�G�G�G�$�&:�H�<M�G�G�G�.	4�	4�	4�	4�	4� 4�h�6G�	4�	4�	4�	3�	3�	3�	3�	3�9���	3�	3�	3�_6�_6�_6�_6�_6��!�_6�_6�_6�D
@�
@�
@�
@�
@�X�&�
@�
@�
@�L�L�L�L�L�h�'�L�L�L�\��������
���S�0�1�1�H�H�H�H�H�?�H�H�2�1�H�8:�8:�8:�8:�8:�x�(�8:�8:�8:�v�z����H�M�O�O�O�O�O��s�A�A%�$A%