o
    HXîh¼ú  ã                   @   s¼  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
Z
d dlZd dlmZ d dlmZ d dlmZmZ d dlmZ zd dlZW n eyW   dZY nw e	j e	j e¡d¡ZedurkejZnG dd„ deƒZG d	d
„ d
ƒZe ¡  efZ edur‹e ej!f7 Z G dd„ deej"ƒZ#e $ed¡G dd„ de#ƒƒZ%G dd„ de j&ƒZ'dd„ Z(G dd„ dejƒZ)G dd„ dƒZ*G dd„ de*ƒZ+G dd„ dƒZ,G dd„ de,ƒZ-G dd„ de-ƒZ.G d d!„ d!e-ƒZ/G d"d#„ d#ƒZ0G d$d%„ d%e0e*ej"ƒZ1G d&d'„ d'e0e*ej"ƒZ2G d(d)„ d)e*ej"ƒZ3G d*d+„ d+e+ej"ƒZ4G d,d-„ d-ej"ƒZ5G d.d/„ d/ej"ƒZ6G d0d1„ d1ej"ƒZ7G d2d3„ d3ƒZ8e $ed¡G d4d5„ d5e7ƒƒZ9G d6d7„ d7ej"ƒZ:e;d8kr\e <¡  dS dS )9é    N)Úsupport)Úsocket_helper)ÚNNTPÚ	GroupInfo)Úpatchzkeycert3.pemc                   @   s   e Zd Z	 dZdS )ÚSSLErrorzThis will never be raised.N)Ú__name__Ú
__module__Ú__qualname__Úreason© r   r   ú;/opt/python-3.10.19/usr/lib/python3.10/test/test_nntplib.pyr      s    r   c                   @   sÞ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze dd¡dd„ ƒZdd„ Zd1d d!„Ze dd"¡d#d$„ ƒZd%d&„ Zd'd(„ Zd)d*„ Zed+d,„ ƒZd-d.„ Zd/d0„ ZdS )2ÚNetworkedNNTPTestsMixinNc                 C   s   | j  ¡ }|  tt|ƒ¡ d S ©N)ÚserverZ
getwelcomeÚassertEqualÚstrÚtype)ÚselfÚwelcomer   r   r   Útest_welcome*   s   
z$NetworkedNNTPTestsMixin.test_welcomec                 C   s>   | j  ¡ \}}|  | d¡|¡ |D ]
}|  tt|ƒ¡ qd S )Nz100 )r   ÚhelpÚ
assertTrueÚ
startswithr   r   r   )r   ÚrespÚlinesÚliner   r   r   Ú	test_help.   s
   ÿz!NetworkedNNTPTestsMixin.test_helpc                 C   sL   | j  ¡ \}}t|ƒdkr$|  tt|d ƒ¡ |  tt|d jƒ¡ d S d S ©Nr   )r   ÚlistÚlenr   r   r   r   Úgroup©r   r   Úgroupsr   r   r   Ú	test_list4   s
   þz!NetworkedNNTPTestsMixin.test_listc                 C   sP   | j  | j¡\}}t|ƒdkr&|  tt|d ƒ¡ |  tt|d jƒ¡ d S d S r   )	r   r   Ú	GROUP_PATr    r   r   r   r   r!   r"   r   r   r   Útest_list_active:   s
   þz(NetworkedNNTPTestsMixin.test_list_activec                 C   sV   |   tj¡}| j d¡ W d   ƒ n1 sw   Y  |jj}|  | d¡|¡ d S )NZXYZZYz500 )	ÚassertRaisesÚnntplibÚNNTPPermanentErrorr   Z	_shortcmdÚ	exceptionÚresponser   r   )r   Úcmr   r   r   r   Útest_unknown_command@   s
   ÿz,NetworkedNNTPTestsMixin.test_unknown_commandc                 C   s\   t j ¡ t jdd }| j |¡\}}t|ƒdkr,|  |d t¡ |  |d j	t
¡ d S d S )Né   )Zdaysr   )ÚdatetimeÚdateZtodayZ	timedeltar   Z	newgroupsr    ÚassertIsInstancer   r!   r   )r   Údtr   r#   r   r   r   Útest_newgroupsF   s   þz&NetworkedNNTPTestsMixin.test_newgroupsc                    sb   ‡ fdd„}ˆ j  ˆ j¡}||ƒ ˆ  ˆ j|¡ ˆ j  ˆ j¡}||ƒ ˆ j  d¡}ˆ  |d¡ d S )Nc                    s   ˆ   | t¡ ˆ  ˆ j| ¡ d S r   )r1   r   ÚassertNotInÚ
GROUP_NAME)Údesc©r   r   r   Ú_check_descP   s   z=NetworkedNNTPTestsMixin.test_description.<locals>._check_desczzk.brrtt.bazÚ )r   Údescriptionr5   ÚassertInÚDESCr%   r   )r   r8   r6   r   r7   r   Útest_descriptionO   s   z(NetworkedNNTPTestsMixin.test_descriptionc                 C   s^   | j  | j¡\}}|  | d¡p| d¡|¡ |  |t¡ || j }|  || j  	| j¡¡ d S )Nz215 z282 )
r   Údescriptionsr%   r   r   r1   Údictr5   r   r:   )r   r   Zdescsr6   r   r   r   Útest_descriptions_   s   ÿ
z)NetworkedNNTPTestsMixin.test_descriptionsc                 C   s€   | j  | j¡}|  dt|ƒ¡ |\}}}}}|  || j¡ |  |t¡ |  |t¡ |  |t¡ |  ||¡ |  | 	d¡|¡ d S )Né   ú211 )
r   r!   r5   r   r    r1   ÚintÚassertLessEqualr   r   )r   Úresultr   ÚcountÚfirstÚlastr!   r   r   r   Ú
test_grouph   s   z"NetworkedNNTPTestsMixin.test_groupc                 C   s<   | j  ¡ \}}|  |tj¡ |  |jd¡ |  |jd¡ d S )NiË  iî  )r   r0   r1   r/   ÚassertGreaterEqualZyearrD   ©r   r   r0   r   r   r   Ú	test_dates   s   z!NetworkedNNTPTestsMixin.test_datec                 C   sF   |   |t¡ |  | ¡ h d£¡ | ¡ D ]}|   |ttd ƒf¡ qd S )N>   ú
message-idú:bytesÚ
referencesú:linesr0   ÚfromÚsubject)r1   r?   rJ   ÚkeysÚvaluesr   r   )r   Úart_dictÚvr   r   r   Ú_check_art_dictz   s   
ÿÿz'NetworkedNNTPTestsMixin._check_art_dictc           	      C   sz   | j  | j¡\}}}}}| j  |d |¡\}}t|ƒdkr"|  d¡ |d \}}|  ||d ¡ |  ||¡ |  |¡ d S )NrA   r   zno articles retrieved)	r   r!   r5   Úxoverr    ÚskipTestrJ   rD   rW   )	r   r   rF   rG   rH   Únamer   Úart_numrU   r   r   r   Ú
test_xover…   s   
z"NetworkedNNTPTestsMixin.test_xoverTzHtemporarily skipped until a permanent solution is found for issue #28971c           
      C   s   | j  | j¡\}}}}}|d }| j  |d f¡\}}|d \}}	|  |	¡ | j  ||f¡\}}|d \}}	|  ||¡ |  ||¡ |  |	¡ d S )Né
   r   éÿÿÿÿ)r   r!   r5   ÚoverrW   rJ   rD   )
r   r   rF   rG   rH   rZ   Ústartr   r[   rU   r   r   r   Ú	test_over   s   
z!NetworkedNNTPTestsMixin.test_overc                 C   sL   | j  | j¡\}}}}}| j  d|¡\}}|D ]}|  tt|d ƒ¡ qd S )NrR   é   )r   r!   r5   Zxhdrr   r   r   )r   r   rF   rG   rH   rZ   r   r   r   r   r   Ú	test_xhdr£   s
   ÿz!NetworkedNNTPTestsMixin.test_xhdrc                 C   sR   |   |tj¡ |d ur|  |j|¡ |jD ]}|   |t¡ q|  |jd d¡ d S )Nr^   )ó   .s   .
ó   .
)r1   r(   ZArticleInfor   Únumberr   Úbytesr4   )r   r   Úarticler[   r   r   r   r   Úcheck_article_resp©   s   
z*NetworkedNNTPTestsMixin.check_article_respzFIXME: see bpo-32128c                    sN  | j  | j¡\}}}}}|||d fD ](}z
| j  |¡\}}W n tjy9 } z|j d¡s/‚ W Y d }~qd }~ww  n|  d¡ |  	| d¡|¡ |  
|||¡ | j  |¡\}}	|  	| d¡|¡ |  
||	|¡ | j  |¡\}}
|  	| d¡|¡ |  
||
|¡ dd„ ‰ ‡ fd	d
„|jD ƒ}‡ fdd
„|
jD ƒ}|  ||dg |	j ¡ d S )Nrb   z423 z(could not find a suitable article numberz221 z222 z220 c                 S   s
   |   d¡S )Ns   X-Antivirus)r   )r   r   r   r   Ú<lambda>Ê   s   
 z@NetworkedNNTPTestsMixin.test_article_head_body.<locals>.<lambda>c                    ó   g | ]}ˆ |ƒs|‘qS r   r   ©Ú.0r   ©Zdenylistr   r   Ú
<listcomp>Ë   ó    
ÿzBNetworkedNNTPTestsMixin.test_article_head_body.<locals>.<listcomp>c                    rk   r   r   rl   rn   r   r   ro   Í   rp   ó    )r   r!   r5   Úheadr(   ÚNNTPTemporaryErrorr+   r   rY   r   ri   Úbodyrh   r   r   )r   r   rF   rG   rH   rZ   r[   rr   Úert   rh   Zfiltered_head_linesZfiltered_linesr   rn   r   Útest_article_head_body²   s0   €ü
z.NetworkedNNTPTestsMixin.test_article_head_bodyc                    sD   ‡ fdd„}ˆ   ˆ jjd¡ |ˆ j ¡ ƒ ˆ j ¡ \}}||ƒ d S )Nc                    s(   | d }ˆ   |ttf¡ ˆ  d|¡ d S )NÚLISTúOVERVIEW.FMT)r1   r   Útupler;   )ÚcapsZ	caps_listr7   r   r   Ú_check_capsÕ   s   z>NetworkedNNTPTestsMixin.test_capabilities.<locals>._check_capsé   )rJ   r   Únntp_versionÚgetcapabilitiesZcapabilities)r   r{   r   rz   r   r7   r   Útest_capabilitiesÑ   s
   z)NetworkedNNTPTestsMixin.test_capabilitiesc                 C   s&   d}d}| j tj| jj||dd d S )NZnotarealuserZnotarealpasswordF)ÚuserÚpasswordÚusenetrc)r'   r(   Ú	NNTPErrorr   Úlogin)r   ZbaduserZbadpwr   r   r   Útest_zloginß   s
   
ÿz#NetworkedNNTPTestsMixin.test_zloginc                 C   s(   t | ƒ}z| j ¡  W d |_d S d |_w r   )r   r   Úquit)r   Úclsr   r   r   Útest_zzquitì   s   z#NetworkedNNTPTestsMixin.test_zzquitc                 C   sJ   dd„ }t | ƒD ]}| d¡sqt| |ƒ}t|ƒsqt| |||ƒƒ qd S )Nc                    s   t  ˆ ¡‡ fdd„ƒ}|S )Nc                    s:   t  | j¡ ˆ | ƒ W d   ƒ d S 1 sw   Y  d S r   )r   Útransient_internetÚ	NNTP_HOSTr7   ©Úmethr   r   Úwrappedù   s   
"ÿzHNetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth.<locals>.wrapped)Ú	functoolsÚwraps)rŒ   r   r   r‹   r   Ú	wrap_methø   s   z7NetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_methZtest_)Údirr   ÚgetattrÚcallableÚsetattr)r‡   r   rZ   rŒ   r   r   r   Úwrap_methodsô   s   

øz$NetworkedNNTPTestsMixin.wrap_methodsc                 C   sB   |   t¡ | j| jddd W d   ƒ d S 1 sw   Y  d S )Nr   F©Útimeoutr‚   )r'   Ú
ValueErrorÚ
NNTP_CLASSrŠ   r7   r   r   r   Útest_timeout  s   "ÿz$NetworkedNNTPTestsMixin.test_timeoutc              
      s   ‡ fdd„}t tjdd}| jd ur| j|d< zX| j| jfi |¤Ž‰ ˆ  |  |ƒ ¡ |  ˆ  ¡ ¡ W d   ƒ n1 s<w   Y  |  |ƒ ¡ | j| jfi |¤Ž‰ ˆ  ˆ  	¡  W d   ƒ n1 sbw   Y  |  |ƒ ¡ W d S  t
y } zt d|j¡rŠt d|› d| j›¡‚‚ d }~ww )	Nc                	      s6   t ˆ dƒsdS zˆ  ¡  W dS  ttfy   Y dS w )NÚfileFT)Úhasattrr   ÚOSErrorÚEOFErrorr   ©r   r   r   Úis_connected  s   

þÿzANetworkedNNTPTestsMixin.test_with_statement.<locals>.is_connectedFr–   Ússl_contextú(?i)KEY.TOO.SMALLzGot ú connecting to )r?   r   ÚINTERNET_TIMEOUTr¡   r™   rŠ   r   r   ÚassertFalser†   r   ÚreÚsearchr   ÚunittestÚSkipTest)r   r    ÚkwargsÚssl_errr   rŸ   r   Útest_with_statement  s6   	þ

þ
ÿÿ€ûz+NetworkedNNTPTestsMixin.test_with_statementr   )r   r	   r
   r¡   r   r   r$   r&   r-   r3   r=   r@   rI   rL   rW   r\   r¨   ZskipIfra   rc   ri   rv   r   r…   rˆ   Úclassmethodr•   rš   r¬   r   r   r   r   r   &   s6    		



	

r   c                   @   s8   e Zd ZdZdZdZdZeZe	dd„ ƒZ
e	dd„ ƒZd	S )
ÚNetworkedNNTPTestsznews.trigofacile.comúfr.comp.lang.pythonzfr.comp.lang.*ÚPythonc                 C   sê   t  d¡ tt jdd}| jd ur| j|d< t | j¡O z| j| jfi |¤Ž| _	W n8 t
yQ } zt d|j¡rGt | › d|› d| j›¡‚t| jƒ ‚ d }~w tyb   t | › d| j›¡‚w W d   ƒ d S 1 snw   Y  d S )	NÚnetworkFr–   r¡   r¢   z got r£   z  got EOF error on connecting to )r   Zrequiresr?   r¤   r¡   r   r‰   rŠ   r™   r   r   r¦   r§   r   r¨   r©   ÚprintÚ
EOF_ERRORS)r‡   rª   r«   r   r   r   Ú
setUpClassA  s2   
þ

ÿ
€
ÿÿø"þzNetworkedNNTPTests.setUpClassc                 C   s   | j d ur| j  ¡  d S d S r   )r   r†   )r‡   r   r   r   ÚtearDownClassX  s   
ÿz NetworkedNNTPTests.tearDownClassN)r   r	   r
   rŠ   r5   r%   r<   r   r™   r­   r´   rµ   r   r   r   r   r®   8  s    
r®   úrequires SSL supportc                   @   sX   e Zd ZdZdZdZdZeeddƒZ	dZ
dZedur*e ¡ Ze d¡ ejje_dS dS )ÚNetworkedNNTP_SSLTestsznntp.aioe.orgz	aioe.testzaioe.*ÚtestÚNNTP_SSLNZDEFAULT)r   r	   r
   rŠ   r5   r%   r<   r’   r(   r™   r$   Útest_starttlsÚsslZ_create_unverified_contextr¡   Zset_ciphersZ
TLSVersionZTLSv1_2Zmaximum_versionr   r   r   r   r·   ]  s    
ýr·   c                   @   s>   e Zd Z	 dd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú_NNTPServerIOc                 C   s>   t j | ¡ t  ¡ | _t  ¡ | _|| _| j | jj| j	¡ d S r   )
ÚioÚ	RawIOBaseÚ__init__ÚBytesIOÚc2sÚs2cÚhandlerr`   ÚreadlineÚ	push_data)r   rÃ   r   r   r   r¿     s
   

z_NNTPServerIO.__init__c                 C   ó   dS ©NTr   r7   r   r   r   ÚreadableŠ  ó   z_NNTPServerIO.readablec                 C   rÆ   rÇ   r   r7   r   r   r   Úwritable  rÉ   z_NNTPServerIO.writablec                 C   s6   	 | j  ¡ }| j  dd¡ | j  |¡ | j  |¡ d S )Nr   r|   )rÂ   ÚtellÚseekÚwrite)r   ÚdataÚposr   r   r   rÅ     s
   
z_NNTPServerIO.push_datac                 C   s6   	 | j  ¡ }| j  |¡ | j  |¡ | j ¡  t|ƒS r   )rÁ   rË   rÍ   rÌ   rÃ   Úprocess_pendingr    )r   ÚbrÏ   r   r   r   rÍ   —  s   

z_NNTPServerIO.writec                 C   s4   	 | j  ¡  | j t|ƒ¡}t|ƒ}||d |…< |S r   )rÃ   rÐ   rÂ   Úreadr    )r   ÚbufrÑ   Únr   r   r   ÚreadintoŸ  s   
z_NNTPServerIO.readintoN)	r   r	   r
   r¿   rÈ   rÊ   rÅ   rÍ   rÕ   r   r   r   r   r¼   |  s    	r¼   c                 C   s   t | ƒ}t ||¡}||fS r   )r¼   r½   ÚBufferedRWPair)rÃ   Úsior›   r   r   r   Úmake_mock_file¨  s   rØ   c                   @   s   e Zd Zddd„Zdd„ ZdS )Ú
NNTPServerNc                 C   s   || _ || _|  |¡ d S r   )r›   ÚhostZ
_base_init)r   ÚfrÚ   Ú
readermoder   r   r   r¿   ²  s   zNNTPServer.__init__c                 C   s   | j  ¡  | ` d S r   )r›   Úcloser7   r   r   r   Ú_close·  ó   
zNNTPServer._closer   )r   r	   r
   r¿   rÞ   r   r   r   r   rÙ   °  s    
rÙ   c                       s4   e Zd ZdZ‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚMockedNNTPTestsMixinNc                    s   t ƒ  ¡  |  ¡  d S r   ©ÚsuperÚsetUpÚmake_serverr7   ©Ú	__class__r   r   rã   À  s   
zMockedNNTPTestsMixin.setUpc                    s   t ƒ  ¡  | `d S r   )râ   ÚtearDownr   r7   rå   r   r   rç   Ä  rß   zMockedNNTPTestsMixin.tearDownc                 O   s:   |   ¡ | _t| jƒ\| _}t|dg|¢R i |¤Ž| _| jS )Nztest.server)Úhandler_classrÃ   rØ   r×   rÙ   r   )r   Úargsrª   r›   r   r   r   rä   È  s   
z MockedNNTPTestsMixin.make_server)r   r	   r
   rè   rã   rç   rä   Ú__classcell__r   r   rå   r   rà   ¼  s
    rà   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚMockedNNTPWithReaderModeMixinc                    s   t ƒ  ¡  | jdd d S )NT)rÜ   rá   r7   rå   r   r   rã   Ð  s   
z#MockedNNTPWithReaderModeMixin.setUp)r   r	   r
   rã   rê   r   r   rå   r   rë   Ï  s    rë   c                   @   sü   e Zd Z	 dZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd7dd„Zdd„ Zdd „ Zd8d!d"„Zd#d$„ Zd%d&„ Zdd'œd(d)„Zdd'œd*d+„Zd,Zd-Zed. e Zd7d/d0„Zd7d1d2„Zd7d3d4„Zd5d6„ ZdS )9ÚNNTPv1Handlerz200 NNTP mock serverc                 C   s0   d| _ d| _|| _|| _d| _d| _|  ¡  d S )NFT)Úin_bodyÚallow_postingÚ	_readlineÚ
_push_dataÚ
_logged_inÚ
_user_sentÚhandle_welcome)r   rÄ   rÅ   r   r   r   r`   Ú  s   zNNTPv1Handler.startc                 C   s   t |ddƒS )Núutf-8Úsurrogateescape)r   ©r   rÎ   r   r   r   Ú_decodeä  s   zNNTPv1Handler._decodec              
   C   s2  | j r;	 |  ¡ }|sd S | j |¡ |dkrnqz| j\}}||d| jiŽ W d | _d | _d| _ n
d | _d | _d| _ w 	 |  |  ¡ ¡}|sGd S | d¡sStd |¡ƒ‚|d d… }| 	¡ ^}}t
| d| ¡  d ƒ}|d u rr|  ¡  n&z||Ž  W n tyŒ } ztd	 |¡ƒ|‚d }~ww | j r˜||f| _g | _q<)
NTre   rt   Fú
z line doesn't end with \r\n: {!r}éþÿÿÿZhandle_zcommand failed: {!r})rí   rï   rt   ÚappendZbody_callbackr÷   Úendswithr˜   ÚformatÚsplitr’   ÚupperÚhandle_unknownÚ	Exception)r   r   rŒ   ÚtokensÚcmdru   r   r   r   rÐ   ç  sN   ú
þ

€ÿ
ìzNNTPv1Handler.process_pendingc                 C   s   	 d| _ d S rÇ   )rí   r7   r   r   r   Úexpect_body  s   
zNNTPv1Handler.expect_bodyc                 C   s   	 |   |¡ d S r   )rð   rö   r   r   r   rÅ     s   zNNTPv1Handler.push_datac                 C   s6   	 t  |¡}d | ¡ ¡d }| d¡}|  |¡ d S )Nrø   rô   )ÚtextwrapÚdedentÚjoinÚ
splitlinesÚencoderÅ   )r   Zlitr   r   r   Úpush_lit  s
   

zNNTPv1Handler.push_litc                 C   ó   |   d¡ d S )Nz	500 What?©r	  r7   r   r   r   rÿ     ó   zNNTPv1Handler.handle_unknownc                 C   s   |   | j¡ d S r   )r	  r   r7   r   r   r   ró     ó   zNNTPv1Handler.handle_welcomec                 C   r
  ©Nz205 Bye!r  r7   r   r   r   Úhandle_QUIT"  r  zNNTPv1Handler.handle_QUITc                 C   r
  )Nú111 20100914001155r  r7   r   r   r   Úhandle_DATE%  r  zNNTPv1Handler.handle_DATEc                 C   s*   |dkr|   d¡ d S |   d |¡¡ d S )Nr¯   z$211 486 761 1265 fr.comp.lang.pythonz411 No such group {})r	  rü   )r   r!   r   r   r   Úhandle_GROUP(  s   zNNTPv1Handler.handle_GROUPc                 C   r
  )NzÉ            100 Legal commands
              authinfo user Name|pass Password|generic <prog> <args>
              date
              help
            Report problems to <root@example.org>
            .r  r7   r   r   r   Úhandle_HELP.  r  zNNTPv1Handler.handle_HELPNc                 C   sP   |d u r|   d¡ d S |dkr|   d¡ d S |dkr!|   d¡ d S |   d¡ d S )Nú412 No newsgroup selectedÚ3000234ú"223 3000234 <45223423@example.com>ú<45223423@example.com>ú223 0 <45223423@example.com>ú430 No Such Article Foundr  ©r   Zmessage_specr   r   r   Úhandle_STAT7  s   zNNTPv1Handler.handle_STATc                 C   r
  )Nú*223 3000237 <668929@example.org> retrievedr  r7   r   r   r   Úhandle_NEXTA  r  zNNTPv1Handler.handle_NEXTc                 C   r
  )Nú,223 3000234 <45223423@example.com> retrievedr  r7   r   r   r   Úhandle_LASTD  r  zNNTPv1Handler.handle_LASTc                 C   s¨   |d u r|   d¡ d S |dkr!|dkr|   d¡ d S |   d¡ d S |dkr,|   d¡ d S |dkrM|d	kr;|   d
¡ d S |dkrF|   d¡ d S |   d¡ d S |   d¡ d S )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"
                    .rx   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".
                    .z501 Unknown LIST keywordr  )r   ÚactionZparamr   r   r   Úhandle_LISTG  s   	zNNTPv1Handler.handle_LISTc                 C   sˆ   |dkr|dkr|dkr|   d¡ d S |dkr&|dkr&|dkr&|   d¡ d S |dkr=|dv r=|dkr=|   d	d
 d ¡ d S |   d¡ d S )Nr#  Z20100913Z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>
                .Z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>
                .)Z20100101Z100101Z090000ztoo long linei¸  z
.zK                230 An empty list of newsarticles follows
                .r  )r   r!   Údate_strÚtime_strr   r   r   Úhandle_NEWNEWS}  s   

ÿzNNTPv1Handler.handle_NEWNEWSc                 C   s$   |dkr|   d¡ d S |   d¡ d S )Nz57-59uK  224 Overview information for 57-58 follows
57	Re: ANN: New Plone book with strong Python (and Zope) themes throughout	Doug Hellmann <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>	Sat, 19 Jun 2010 18:04:08 -0400	<4FD05F05-F98B-44DC-8111-C6009C925F0C@gmail.com>	<hvalf7$ort$1@dough.gmane.org>	7103	16	Xref: news.gmane.io gmane.comp.python.authors:57
58	Looking for a few good bloggers	Doug Hellmann <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>	Thu, 22 Jul 2010 09:14:14 -0400	<A29863FA-F388-40C3-AA25-0FD06B09B5BF@gmail.com>		6683	16	
59	Re: Message d'erreur incomprÃ©hensible (par moi)	Eric Brunel <eric.brunel@pragmadev.nospam.com>	Wed, 15 Sep 2010 18:09:15 +0200	<eric.brunel-2B8B56.18091515092010@news.wanadoo.fr>	<4c90ec87$0$32425$ba4acef3@reader.news.orange.fr>	1641	27	Xref: saria.nerim.net fr.comp.lang.python:1265
.
z1                224 No articles
                .r  r  r   r   r   Úhandle_XOVERœ  s
   ÿzNNTPv1Handler.handle_XOVER)rt   c                C   sF   |d u r| j r|  d¡ |  ¡  d S |  d¡ d S |  d¡ || _d S )Nz+340 Input article; end with <CR-LF>.<CR-LF>ú440 Posting not permittedú240 Article received OK©rî   r	  r  Úposted_body)r   rt   r   r   r   Úhandle_POST¼  s   


zNNTPv1Handler.handle_POSTc                C   sN   |d u r| j r|dkr|  d¡ |  ¡  d S |  d¡ d S |  d¡ || _d S )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_idrt   r   r   r   Úhandle_IHAVEÈ  s   


zNNTPv1Handler.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

c                 C   ód   |d u r
|   d¡ n|dkr|   d¡ n|dkr|   d¡ n|   d¡ d S |   | j¡ |   d¡ d S )Nú"220 3000237 <45223423@example.com>r  ú220 0 <45223423@example.com>r  ú"220 3000234 <45223423@example.com>r  Ú.)r	  Úsample_articler  r   r   r   Úhandle_ARTICLEã  ó   
zNNTPv1Handler.handle_ARTICLEc                 C   r5  )Nú"221 3000237 <45223423@example.com>r  ú221 0 <45223423@example.com>r  ú"221 3000234 <45223423@example.com>r  r9  )r	  Úsample_headr  r   r   r   Úhandle_HEADð  r<  zNNTPv1Handler.handle_HEADc                 C   r5  )Nú"222 3000237 <45223423@example.com>r  ú222 0 <45223423@example.com>r  ú"222 3000234 <45223423@example.com>r  r9  )r	  Úsample_bodyr  r   r   r   Úhandle_BODYý  r<  zNNTPv1Handler.handle_BODYc                 C   sn   | j r
|  d¡ d S |dkr"| jr|  d¡ d S |  d¡ d| _d S |dkr0|  d¡ d| _ d S td |¡ƒ‚)	Nz502 Already Logged Inr€   z 482 User Credential Already Sentz381 Password RequiredTÚpassz281 Login SuccessfulzUnknown cred type {})rñ   r	  rò   r   rü   )r   Z	cred_typerÎ   r   r   r   Úhandle_AUTHINFO
  s   



zNNTPv1Handler.handle_AUTHINFOr   ©NN)r   r	   r
   r   r`   r÷   rÐ   r  rÅ   r	  rÿ   ró   r  r  r  r  r  r  r  r&  r)  r*  r/  r4  r@  rE  r:  r;  rA  rF  rH  r   r   r   r   rì   Õ  s<    
&
	

6 


rì   c                   @   s(   e Zd Z	 dd„ Zdd„ Zddd„ZdS )	ÚNNTPv2Handlerc                 C   s2   d}| j s|  | d¡¡ d S |  | d¡¡ d S )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 USERr9   )rñ   r	  rü   ©r   Úfmtr   r   r   Úhandle_CAPABILITIES  s   z!NNTPv2Handler.handle_CAPABILITIESc                 C   s   t dƒ‚)Nz3MODE READER sent despite READER has been advertised)r   )r   Ú_r   r   r   Úhandle_MODE.  s   zNNTPv2Handler.handle_MODENc                 C   s
   |   |¡S r   )r*  r  r   r   r   Úhandle_OVER1  ó   
zNNTPv2Handler.handle_OVERr   )r   r	   r
   rM  rO  rP  r   r   r   r   rJ    s
    rJ  c                       s   e Zd Z	 ‡ fdd„Z‡  ZS )ÚCapsAfterLoginNNTPv2Handlerc                    s"   | j s
|  d¡ d S tƒ  ¡  d S )Nz480 You must log in.)rñ   r	  râ   rM  r7   rå   r   r   rM  8  s   z/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES)r   r	   r
   rM  rê   r   r   rå   r   rR  5  s    rR  c                   @   s&   e Zd Z	 dd„ Zdd„ Zdd„ ZdS )ÚModeSwitchingNNTPv2Handlerc                 C   s
   d| _ d S ©NF)Ú	_switchedr7   r   r   r   r¿   B  rQ  z#ModeSwitchingNNTPv2Handler.__init__c                 C   s2   d}| j r|  | d¡¡ d S |  | d¡¡ d S )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
            .r9   zMODE-)rU  r	  rü   rK  r   r   r   rM  E  s   
z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIESc                 C   s   d| _ |  d¡ d S )NTz200 Posting allowed)rU  r	  )r   Zwhatr   r   r   rO  U  s   z&ModeSwitchingNNTPv2Handler.handle_MODEN)r   r	   r
   r¿   rM  rO  r   r   r   r   rS  ?  s
    rS  c                       s  e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#‡  Z$S )BÚNNTPv1v2TestsMixinc                    s   t ƒ  ¡  d S r   )râ   rã   r7   rå   r   r   rã   ]  r  zNNTPv1v2TestsMixin.setUpc                 C   s   |   | jj| jj¡ d S r   )r   r   r   rÃ   r7   r   r   r   r   `  s   zNNTPv1v2TestsMixin.test_welcomec                 C   s<   | j dkr|  d| jj¡ | j dd¡ |  d| jj¡ d S )Nr|   ÚAUTHINFOÚtestuserÚtestpw)r}   r;   r   Ú_capsr„   r4   r7   r   r   r   Útest_authinfoc  s   
z NNTPv1v2TestsMixin.test_authinfoc                 C   s:   | j  ¡ \}}|  |d¡ |  |t dddddd¡¡ d S )Nr  éÚ  é	   é   r   é   é7   )r   r0   r   r/   rK   r   r   r   rL   k  s    zNNTPv1v2TestsMixin.test_datec                 C   s6   |   | jj¡ | j ¡ }|  |d¡ |  | jj¡ d S r  )r¥   r×   Úclosedr   r†   r   r   )r   r   r   r   r   Ú	test_quitp  s   
zNNTPv1v2TestsMixin.test_quitc                 C   s.   | j  ¡ \}}|  |d¡ |  |g d¢¡ d S )Nz100 Legal commands)z8  authinfo user Name|pass Password|generic <prog> <args>z  datez  helpz%Report problems to <root@example.org>)r   r   r   )r   r   r   r   r   r   r   v  s   zNNTPv1v2TestsMixin.test_helpc                 C   s~   | j  ¡ \}}|  t|ƒd¡ |d }|  |tddddƒ¡ | j  d¡\}}|  t|ƒd¡ |d	 }|  |td
dddƒ¡ d S )Né   rb   úcomp.lang.python.announceZ
0000001153Z
0000000993Úmr!  r|   r   z!gmane.comp.python.distutils.develZ
0000014104Z
0000000001)r   r   r   r    r   )r   r   r#   Úgr   r   r   r$   €  s    ÿÿÿÿzNNTPv1v2TestsMixin.test_listc                 C   sþ   | j  d¡\}}}|  |d¡ |  |d¡ |  |d¡ | j  d¡\}}}|  |d¡ |  |d¡ |  |d¡ |  tj¡}| j  d¡ W d   ƒ n1 sMw   Y  |  |jjd¡ |  tj¡}| j  ¡  W d   ƒ n1 spw   Y  |  |jjd¡ d S )	NéªÇ- r  r  r  r   z<non.existent.id>r  r  )r   Ústatr   r'   r(   rs   r*   r+   )r   r   r[   r3  r,   r   r   r   Ú	test_statŽ  s    ÿÿzNNTPv1v2TestsMixin.test_statc                 C   ó8   | j  ¡ \}}}|  |d¡ |  |d¡ |  |d¡ d S )Nr  é­Ç- z<668929@example.org>)r   Únextr   ©r   r   r[   r3  r   r   r   Ú	test_nextž  ó   zNNTPv1v2TestsMixin.test_nextc                 C   rj  )Nr  rg  r  )r   rH   r   rm  r   r   r   Ú	test_last¤  ro  zNNTPv1v2TestsMixin.test_lastc                 C   s4   | j  d¡}|  |d¡ | j  d¡}|  |d¡ d S )Nr#  úThe Python computer language.úcomp.lang.pythonxr9   )r   r:   r   )r   r6   r   r   r   r=   ª  s   z#NNTPv1v2TestsMixin.test_descriptionc                 C   sn   | j  d¡\}}|  |d¡ |  |ddi¡ | j  d¡\}}|  |dddœ¡ | j  d¡\}}|  |i ¡ d S )Nr#  z-215 Descriptions in form "group description".rq  r$  z4Announcements about the Python language. (Moderated))r#  rd  rr  )r   r>   r   r"   r   r   r   r@   °  s   ÿþz$NNTPv1v2TestsMixin.test_descriptionsc                 C   s°   | j  d¡\}}}}}|  | d¡|¡ |  |d¡ |  |d¡ |  |d¡ |  |d¡ |  tj¡}| j  d¡ W d   ƒ n1 sCw   Y  |j}|  |j	 d¡|j	¡ d S )Nr¯   rB   iù  iñ  iæ  zcomp.lang.python.develz411 No such group)
r   r!   r   r   r   r'   r(   rs   r*   r+   )r   r   rF   rG   rH   r!   r,   Úexcr   r   r   rI   ¾  s   ÿÿzNNTPv1v2TestsMixin.test_groupc                 C   s   t   dddddd¡}| j d|¡\}}d | j¡}|  ||¡ |  |d	d
g¡ t   dddddd¡}| j d|¡\}}|  |d¡ |  |g ¡ d S )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   Únewnewsrü   r}   r   )r   r2   r   ZidsZexpectedr   r   r   Útest_newnewsË  s   ýþzNNTPv1v2TestsMixin.test_newnewsc                 C   sZ   |   t|ƒd¡ |   |d  d¡d¡ |   |d d¡ |   |d d¡ |   |d	 d
¡ d S )Nrw  r^   rô   u   -- Signed by AndrÃ©.rù   rq   éýÿÿÿs   .Here is a dot-starting line.éüÿÿÿs   This is just a test article.)r   r    Údecode©r   r   r   r   r   Ú_check_article_bodyÞ  s
   z&NNTPv1v2TestsMixin._check_article_bodyc                 C   s4   |   t|ƒd¡ |   |d d¡ |   |d d¡ d S )Nrw  r   s&   From: "Demo User" <nobody@example.net>é   s7   Message-ID: <i.am.an.article.you.will.want@example.com>)r   r    r}  r   r   r   Ú_check_article_headå  s   z&NNTPv1v2TestsMixin._check_article_headc                 C   sH   |   t|ƒd¡ |  |d d… ¡ |  |dd … ¡ |   |d d¡ d S )Nr]  rw  r{  rq   )r   r    r€  r~  r}  r   r   r   Ú_check_article_dataê  s   z&NNTPv1v2TestsMixin._check_article_datac                 C   ó"  | j  ¡ \}}|  |d¡ |\}}}|  |d¡ |  |d¡ |  |¡ | j  d¡\}}|  |d¡ |\}}}|  |d¡ |  |d¡ |  |¡ | j  d¡\}}|  |d¡ |\}}}|  |d¡ |  |d¡ |  |¡ |  tj¡}| j  d¡ W d   ƒ n1 s‚w   Y  |  |jjd	¡ d S )
Nr6  rk  r  rg  r8  r7  r   ú<non-existent@example.com>r  )	r   rh   r   r  r'   r(   rs   r*   r+   ©r   r   Úinfor[   r3  r   r,   r   r   r   Útest_articleð  ó,   





ÿzNNTPv1v2TestsMixin.test_articlec                 C   sŒ   t  ¡ }| jj|d\}}|  |d¡ |\}}}|  |d¡ |  |d¡ |  |g ¡ | ¡ }|  | d¡t|ƒ¡ |  | 	d¡t|ƒ¡ d S )N©r›   r6  rk  r  óK   From: "Demo User" <nobody@example.net>
Subject: I am just a test article
óU   This is just a test article.
.Here is a dot-starting line.

-- Signed by AndrÃ©.
)
r½   rÀ   r   rh   r   Úgetvaluer   r   Úasciirû   ©r   rÛ   r   r…  r[   r3  r   rÎ   r   r   r   Útest_article_file  s$   
ÿýÿûz$NNTPv1v2TestsMixin.test_article_filec                 C   r‚  )
Nr=  rk  r  rg  r?  r>  r   rƒ  r  )	r   rr   r   r€  r'   r(   rs   r*   r+   r„  r   r   r   Ú	test_head   r‡  zNNTPv1v2TestsMixin.test_headc                 C   óŒ   t  ¡ }| jj|d\}}|  |d¡ |\}}}|  |d¡ |  |d¡ |  |g ¡ | ¡ }|  | d¡t|ƒ¡ |  	| 
d¡t|ƒ¡ d S )Nrˆ  r=  rk  r  r‰  rŠ  )r½   rÀ   r   rr   r   r‹  r   r   rŒ  r¥   rû   r  r   r   r   Útest_head_file;  ó$   
ÿýÿûz!NNTPv1v2TestsMixin.test_head_filec                 C   r‚  )
NrB  rk  r  rg  rD  rC  r   rƒ  r  )	r   rt   r   r~  r'   r(   rs   r*   r+   r„  r   r   r   Ú	test_bodyO  r‡  zNNTPv1v2TestsMixin.test_bodyc                 C   r  )Nrˆ  rB  rk  r  r‰  rŠ  )r½   rÀ   r   rt   r   r‹  r¥   r   rŒ  r   rû   r  r   r   r   Útest_body_filej  r’  z!NNTPv1v2TestsMixin.test_body_filec                 C   s”   |   | d¡|¡ |  t|ƒd¡ |d \}}|  |d¡ |  |ddddd	d
dddœ¡ |d \}}|  |d d ¡ |d \}}|  |d d¡ d S )Nz224 r  r   é9   zEDoug Hellmann <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>zGRe: ANN: New Plone book with strong Python (and Zope) themes throughoutzSat, 19 Jun 2010 18:04:08 -0400z0<4FD05F05-F98B-44DC-8111-C6009C925F0C@gmail.com>z<hvalf7$ort$1@dough.gmane.org>Z7103Z16z*news.gmane.io gmane.comp.python.authors:57)rQ   rR   r0   rM   rO   rN   rP   Úxrefrb   r–  r|   rR   õ0   Re: Message d'erreur incomprÃ©hensible (par moi))r   r   r   r    )r   r   Ú	overviewsr[   r_   r   r   r   Úcheck_over_xover_resp~  s(   ø

ÿz(NNTPv1v2TestsMixin.check_over_xover_respc                 C   s"   | j  dd¡\}}|  ||¡ d S )Nr•  é;   )r   rX   r™  ©r   r   r˜  r   r   r   r\   “  s   zNNTPv1v2TestsMixin.test_xoverc                 C   s    | j  d¡\}}|  ||¡ d S )N)r•  rš  )r   r_   r™  r›  r   r   r   ra   —  s   zNNTPv1v2TestsMixin.test_overs  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>

This is just a test article.
.Here is a dot-starting line.

-- Signed by AndrÃ©.
c                 C   sl   | j j}|  t|ƒd¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d	¡ |  |d
 d¡ d S )Nr]   r^   re   rù   s   -- Signed by AndrÃ©.
rz  ó   
r{  s    ..Here is a dot-starting line.
r   s(   From: "Demo User" <nobody@example.net>
)rÃ   r.  r   r    r}  r   r   r   Ú_check_posted_body¨  s   z%NNTPv1v2TestsMixin._check_posted_bodyc                G   sd   | j }|||ƒf }d | j_||Ž }|  ¡  | j  dd¡}|||ƒf }d | j_||Ž }|  ¡  |S )Nrœ  ó   
)Úsample_postrÃ   r.  r  Úreplace)r   ÚfuncÚfile_factoryré   ÚpostZ	func_argsr   r   r   r   Ú_check_post_ihave_sub³  s   z(NNTPv1v2TestsMixin._check_post_ihave_subc                 G   sÊ   | j |g|¢R dtiŽ}|  ||¡ | j |g|¢R dtiŽ}|  ||¡ | j |g|¢R dtjiŽ}|  ||¡ dd„ }| j |g|¢R d|iŽ}|  ||¡ dd„ }| j |g|¢R d|iŽ}|  ||¡ d S )Nr¢  c                 S   ó   t | jddƒS )NT©Úkeepends©Úiterr  ©rÑ   r   r   r   Ú	iterlinesÎ  r  z6NNTPv1v2TestsMixin.check_post_ihave.<locals>.iterlinesc                 S   r¥  )NFr¦  r¨  rª  r   r   r   r«  Ó  r  )r¤  rg   r   Ú	bytearrayr½   rÀ   )r   r¡  Zsuccess_respré   r   r«  r   r   r   Úcheck_post_ihaveÃ  s   z#NNTPv1v2TestsMixin.check_post_ihavec                 C   sf   |   | jjd¡ d| j_|  tj¡}| j | j¡ W d   ƒ n1 s$w   Y  |  	|j
jd¡ d S )Nr,  Fr+  )r­  r   r£  rÃ   rî   r'   r(   rs   rŸ  r   r*   r+   ©r   r,   r   r   r   Ú	test_postØ  s   ÿ
ÿzNNTPv1v2TestsMixin.test_postc                 C   sb   |   | jjdd¡ |  tj¡}| j d| j¡ W d   ƒ n1 s"w   Y  |  |jj	d¡ d S )Nr2  r0  z<another.message.id>r1  )
r­  r   Zihaver'   r(   rs   rŸ  r   r*   r+   r®  r   r   r   Ú
test_ihaveà  s   ÿÿ
ÿzNNTPv1v2TestsMixin.test_ihavec                 C   s.   t   dddddd¡}|  tj| jjd|¡ d S )Nr\  rb   r]  r   r#  )r/   r'   r(   ÚNNTPDataErrorr   rx  )r   r2   r   r   r   Útest_too_long_linesè  s   
ÿz&NNTPv1v2TestsMixin.test_too_long_lines)%r   r	   r
   rã   r   r[  rL   rb  r   r$   ri  rn  rp  r=   r@   rI   ry  r~  r€  r  r†  rŽ  r  r‘  r“  r”  r™  r\   ra   rŸ  r  r¤  r­  r¯  r°  r²  rê   r   r   rå   r   rV  [  sF    
ÿrV  c                   @   ó   e Zd Z	 dZeZdd„ ZdS )ÚNNTPv1Testsrb   c                 C   s:   | j  ¡ }|  |i ¡ |  | j jd¡ |  | j jd ¡ d S )Nrb   ©r   r~   r   r}   Znntp_implementation©r   rz   r   r   r   Ú	test_capsô  s   
zNNTPv1Tests.test_capsN)r   r	   r
   r}   rì   rè   r·  r   r   r   r   r´  î  ó
    r´  c                   @   r³  )ÚNNTPv2Testsr|   c                 C   sZ   | j  ¡ }|  |ddgddgdgg g d¢g g g dœ¡ |  | j jd¡ |  | j jd	¡ d S )
NÚ2Ú3ZINNz2.5.1ZUSER)r   zACTIVE.TIMESzDISTRIB.PATSZHEADERSr"  rx   )ÚVERSIONZIMPLEMENTATIONrW  ZHDRrw   ZOVERZPOSTÚREADERr  z	INN 2.5.1rµ  r¶  r   r   r   r·    s   
÷zNNTPv2Tests.test_capsN)r   r	   r
   r}   rJ  rè   r·  r   r   r   r   r¹  û  r¸  r¹  c                   @   r³  )ÚCapsAfterLoginNNTPv2Testsr|   c                 C   s2   |   | jji ¡ | j dd¡ |  d| jj¡ d S )NrX  rY  r¼  )r   r   rZ  r„   r;   r7   r   r   r   Útest_caps_only_after_login  s   z4CapsAfterLoginNNTPv2Tests.test_caps_only_after_loginN)r   r	   r
   r}   rR  rè   r¿  r   r   r   r   r¾    r¸  r¾  c                   @   r³  )ÚSendReaderNNTPv2Testsr|   c                 C   s   |   d| jj¡ d S )Nr½  )r;   r   rZ  r7   r   r   r   Ú(test_we_are_in_reader_mode_after_connect&  s   z>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connectN)r   r	   r
   r}   rS  rè   rÁ  r   r   r   r   rÀ    s
    rÀ  c                   @   sP   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Ze	 
ed¡dd„ ƒZdS )Ú	MiscTestsc                    sV   ‡ fdd„}|ddƒ |ddƒ |ddƒ |ddƒ |dd	ƒ |d
dƒ |ddƒ d S )Nc                    s   ˆ   t | ¡|¡ d S r   )r   r(   Údecode_header)ÚarÑ   r7   r   r   Úgives-  s   z+MiscTests.test_decode_header.<locals>.givesr9   za plain headerz with extra  spaces z%=?ISO-8859-15?Q?D=E9buter_en_Python?=u   DÃ©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?=uP   Re: [sqlite] problÃ¨me avec ORDER BY sur des chaÃ®nes de caractÃ¨res accentuÃ©esz,Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=u   Re: problÃ¨me de matricer—  r   ©r   rÅ  r   r7   r   Útest_decode_header,  s   



þÿÿzMiscTests.test_decode_headerc                 C   s¸   g d¢}|   t |¡g d¢¡ g d¢}|   t |¡g d¢¡ g d¢}|   t |¡g d¢¡ g d¢}|   t |¡g d¢¡ g d¢}|   t |¡g d¢¡ g d¢}|   t |¡g d	¢¡ d S )
N)úSubject:úFrom:úDate:úMessage-ID:úReferences:rN   rP   )rR   rQ   r0   rM   rO   rN   rP   )rÈ  rÉ  rÊ  rË  rÌ  úBytes:úLines:)zsubject:zFROM:zDaTe:zmessage-ID:rÌ  zBYTES:rÎ  )	rÈ  rÉ  rÊ  rË  rÌ  rN   rP   ú	Xref:fullzDistribution:full)	rR   rQ   r0   rM   rO   rN   rP   r–  Zdistribution)	rÈ  rÉ  rÊ  rË  rÌ  rÍ  rÎ  z	Xref:FULLzDistribution:FULL)rÈ  rÉ  rÊ  rË  rÌ  rÍ  rÎ  rÏ  ©rR   rQ   r0   rM   rO   rN   rP   r–  )r   r(   Z_parse_overview_fmtr}  r   r   r   Útest_parse_overview_fmt<  s0   ÿÿÿÿÿÿz!MiscTests.test_parse_overview_fmtc                 C   s¾   t jdg }dg}t  ||¡}|\\}}|  |d¡ |  |dddddd	d
ddœ¡ dg}t  ||¡}|\\}}|  |d d ¡ dg}t  ||¡}|\\}}|  |d d¡ |  |d d¡ d S )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:3000363rg  zI am just a test articlez "Demo User" <nobody@example.com>z6 Oct 1998 04:38:40 -0500r  z<45454@example.net>Z1234Z17z"news.example.com misc.test:3000363rÐ  z3000234	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: 	rO   ú r9   )r(   Z_DEFAULT_OVERVIEW_FMTZ_parse_overviewr   )r   rL  r   Zoverviewr[   Úfieldsr   r   r   Útest_parse_overviewd  s6   ÿ
øÿ
ÿ
zMiscTests.test_parse_overviewc              	      sh   ‡ f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dddd	ƒ d S )Nc                    s   ˆ   t | |¡tj|Ž ¡ d S r   )r   r(   Z_parse_datetimer/   )rÄ  rÑ   Úcr7   r   r   rÅ  “  s   ÿz,MiscTests.test_parse_datetime.<locals>.givesZ19990623135624éÏ  rc  é   rt  é8   é   Ú19990623Ú135624Ú990623Z090623iÙ  r   rÆ  r   r7   r   Útest_parse_datetime’  s
   zMiscTests.test_parse_datetimec              	      óŽ   ‡ f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ƒ ‡ fdd„}|dddd	dƒ |dddddƒ |dddddƒ d S )Nc           	         sF   t   | |||||¡}ˆ  t |¡||f¡ ˆ  t |d¡||f¡ d S rT  ©r/   r   r(   Ú_unparse_datetime©	ÚyÚMÚdÚhre  Úsr'  r(  r2   r7   r   r   rÅ     s   ÿÿz.MiscTests.test_unparse_datetime.<locals>.givesrÖ  rc  r×  rt  rØ  rÙ  rÚ  rÛ  éÐ  Z20000623r\  rA   rb   r|   r  Z20100605Ú010203c                    s@   t  | ||¡}ˆ  t |¡||f¡ ˆ  t |d¡||f¡ d S rT  ©r/   r0   r   r(   rà  ©râ  rã  rä  r'  r(  r2   r7   r   r   rÅ  ª  s   ÿÿÚ000000r   rÆ  r   r7   r   Útest_unparse_datetime  s   zMiscTests.test_unparse_datetimec              	      rÞ  )Nc           	         s0   t   | |||||¡}ˆ  t |d¡||f¡ d S rÇ   rß  rá  r7   r   r   rÅ  ·  s   ÿz5MiscTests.test_unparse_datetime_legacy.<locals>.givesrÖ  rc  r×  rt  rØ  rÙ  rÜ  rÛ  rç  Z000623r\  rA   rb   r|   r  Z100605rè  c                    s*   t  | ||¡}ˆ  t |d¡||f¡ d S rÇ   ré  rê  r7   r   r   rÅ  ¿  s   ÿrë  r   rÆ  r   r7   r   Útest_unparse_datetime_legacy´  s   z&MiscTests.test_unparse_datetime_legacyr¶   c                 C   s   |   ttdƒ¡ d S )Nr¹   )r   rœ   r(   r7   r   r   r   Útest_ssl_supportÇ  ó   zMiscTests.test_ssl_supportN)r   r	   r
   rÇ  rÑ  rÔ  rÝ  rì  rí  r¨   Ú
skipUnlessr»   rî  r   r   r   r   rÂ  *  s    (.
rÂ  c                   @   ó   e Zd Z	 dd„ ZdS )ÚPublicAPITestsc                 C   sD   |   ttdƒ¡ g d¢}td ur| d¡ |  ttjƒt|ƒ¡ d S )NÚ__all__)r   rƒ   ÚNNTPReplyErrorrs   r)   ÚNNTPProtocolErrorr±  rÃ  r¹   )r   rœ   r(   r»   rú   r   Úsetró  )r   Z
target_apir   r   r   Útest_module_all_attributeÏ  s
   
z(PublicAPITests.test_module_all_attributeN)r   r	   r
   r÷  r   r   r   r   rò  Ì  s    rò  c                   @   sH   e Zd Z	 ejZ	ddd„Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ ZdS )ÚMockSocketTestsNc              	      sº   G ‡ fdd„dƒ}G ‡‡‡fdd„dƒ‰ d‰g ‰t d|ƒ& |  ||¡ | jd||d W d   ƒ n1 s7w   Y  W d   ƒ n1 sFw   Y  |  ˆ¡ ˆD ]}|  |j¡ qRd S )	Nc                       ó   e Zd Z‡ fdd„ZdS )zNMockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_modulec                    s   ˆ ƒ S r   r   )Úaddressr—   ©Ú
MockSocketr   r   Úcreate_connectionå  s   z`MockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_module.create_connectionN)r   r	   r
   rý  r   rû  r   r   Úmock_socket_moduleä  ó    rþ  c                       s&   e Zd Z‡fdd„Z‡ ‡fdd„ZdS )zFMockSocketTests.check_constructor_error_conditions.<locals>.MockSocketc                    s   d‰ d S rÇ   r   r7   )Úsocket_closedr   r   rÝ   é  s   zLMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.closec                    s    ˆƒ }t |ƒ\}}ˆ  |¡ |S r   )rØ   rú   )ÚsocketÚmoderÃ   rN  r›   )Úfilesrè   r   r   Úmakefileí  s   
zOMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.makefileN)r   r	   r
   rÝ   r  r   )r  rè   r   r   r   rü  è  s    rü  Fznntplib.socketZdummy)r€   r   )r   ZassertRaisesRegexÚ
nntp_classr   ra  )r   rè   Zexpected_error_typeZexpected_error_msgr„   r   rþ  rÛ   r   )rü  r  rè   r   r   Ú"check_constructor_error_conditionsß  s   
ÿþ€ 
ÿz2MockSocketTests.check_constructor_error_conditionsc                 C   ó&   G dd„ dt ƒ}|  |tj|j¡ d S )Nc                   @   ó   e Zd ZdZdS )z1MockSocketTests.test_bad_welcome.<locals>.HandlerzBad WelcomeN©r   r	   r
   r   r   r   r   r   ÚHandlerþ  ó    r
  )rì   r  r(   rõ  r   ©r   r
  r   r   r   Útest_bad_welcomeü  ó   
ÿz MockSocketTests.test_bad_welcomec                 C   r  )Nc                   @   r  )zEMockSocketTests.test_service_temporarily_unavailable.<locals>.Handlerz#400 Service temporarily unavailableNr	  r   r   r   r   r
    r  r
  )rì   r  r(   rs   r   r  r   r   r   Ú$test_service_temporarily_unavailable  r  z4MockSocketTests.test_service_temporarily_unavailablec                 C   r  )Nc                   @   r  )zEMockSocketTests.test_service_permanently_unavailable.<locals>.Handlerz#502 Service permanently unavailableNr	  r   r   r   r   r
    r  r
  )rì   r  r(   r)   r   r  r   r   r   Ú$test_service_permanently_unavailable
  r  z4MockSocketTests.test_service_permanently_unavailablec                    s,   G ‡ fdd„dt ƒ}d‰ |  |tjˆ ¡ d S )Nc                       rù  )z6MockSocketTests.test_bad_capabilities.<locals>.Handlerc                    ó   |   ˆ ¡ d S r   r  r7   ©Zcapabilities_responser   r   rM    r  zJMockSocketTests.test_bad_capabilities.<locals>.Handler.handle_CAPABILITIESN)r   r	   r
   rM  r   r  r   r   r
    rÿ  r
  z201 bad capability)rì   r  r(   rô  r  r   r  r   Útest_bad_capabilities  s
   ÿz%MockSocketTests.test_bad_capabilitiesc                    s8   d}d}G ‡ fdd„dt ƒ}d‰ |  |tjˆ ||¡ d S )Nzt@e.comZpythonc                       rù  )z3MockSocketTests.test_login_aborted.<locals>.Handlerc                    r  r   r  )r   ré   ©Zauthinfo_responser   r   rH    r  zCMockSocketTests.test_login_aborted.<locals>.Handler.handle_AUTHINFON)r   r	   r
   rH  r   r  r   r   r
    rÿ  r
  z503 Mechanism not recognized)rì   r  r(   r)   )r   r„   r   r
  r   r  r   Útest_login_aborted  s   þz"MockSocketTests.test_login_abortedrI  )r   r	   r
   r(   r   r  r  r  r  r  r  r  r   r   r   r   rø  Ø  s    
ý	rø  c                   @   rñ  )Úbypass_contextc                 K   s   | S r   r   )Úsockré   r   r   r   Úwrap_socket(  rÉ   zbypass_context.wrap_socketN)r   r	   r
   r  r   r   r   r   r  &  s    r  c                   @   s   e Zd Zedd„ ƒZdS )ÚMockSslTestsc                  O   s   t j| dti|¤ŽS )Nr¡   )r(   r¹   r  )rÏ   Úkwr   r   r   r  -  rï  zMockSslTests.nntp_classN)r   r	   r
   Ústaticmethodr  r   r   r   r   r  +  s    r  c                   @   s0   e Zd Zdd„ Zdd„ Ze ed¡dd„ ƒZdS )	ÚLocalServerTestsc                 C   st   t   ¡ }t |¡}| ¡  tj| j|fd| _| j ¡  |  	| jj
¡ ttj|dd ¡ | _|  	| jjd d d ¡ d S )N)Útargetré   F)r‚   )r  r   Z	bind_portÚlistenÚ	threadingÚThreadÚ
run_serverZ
backgroundr`   Z
addCleanupr  r   ZHOSTÚ	__enter__ÚnntpÚ__exit__)r   r  Úportr   r   r   rã   3  s   
ÿ
zLocalServerTests.setUpc                 C   s  | |  ¡ \}}W d   ƒ n1 sw   Y  t ¡ i}| |¡ | | d¡¡}| d¡ 	 | ¡ }|dkr>| d¡ n>|dkrk| ¡  | d¡ t 	tj
¡}| t¡ |j|dd}| |¡ | | d¡¡}n|d	kru| d
¡ ntd |¡ƒ‚q0W d   ƒ d S 1 sˆw   Y  d S )NÚrbs   200 Server ready
Ts   CAPABILITIES
s.   101 Capability list:
VERSION 2
STARTTLS
.
s
   STARTTLS
s   382 Begin TLS negotiation now
)Zserver_sides   QUIT
s
   205 Bye!
zUnexpected command {!r})ÚacceptÚ
contextlibÚ	ExitStackÚenter_contextr  ÚsendallrÄ   rÝ   r»   Z
SSLContextZPROTOCOL_TLS_SERVERZload_cert_chainÚcertfiler  r˜   rü   )r   r  ÚclientrN  ÚcleanupÚreaderr  Úcontextr   r   r   r!  ?  s<   ÿ


ÿ

ÿ

ê"èzLocalServerTests.run_serverr¶   c                 C   s`   | j j}| j j}| j  ¡  |  || j j¡ |  || j j¡ |  | j jtj¡ |  t	| j j¡ d S r   )
r#  r›   r  ZstarttlsZassertNotEqualr1   r»   Z	SSLSocketr'   r˜   )r   r›   r  r   r   r   rº   _  s   
zLocalServerTests.test_starttlsN)	r   r	   r
   rã   r!  r¨   rð  r»   rº   r   r   r   r   r  2  s
    
 r  Ú__main__)=r½   r  r/   r  r¨   rŽ   r(  r(   Zos.pathÚosr¦   r  r¸   r   Ztest.supportr   r   r   Zunittest.mockr   r»   ÚImportErrorÚpathr  ÚdirnameÚ__file__r,  r   r   r   r•   rž   r³   ZSSLEOFErrorZTestCaser®   rð  r·   r¾   r¼   rØ   rÙ   rà   rë   rì   rJ  rR  rS  rV  r´  r¹  r¾  rÀ  rÂ  rò  rø  r  r  r  r   Úmainr   r   r   r   Ú<module>   s„    ÿ
  
%,  G
   ÿ #N

<ÿ