
    z%i                        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mZ  ej                   d      Zd dlmZmZ d dlmZ 	 d dlZej0                  j3                  ej0                  j5                  e      d      Zeej:                  Zn G d d	e      Z G d
 d      ZejA                          e!fZ"ee"ejF                  fz  Z" G d deejH                        Z% ejL                  ed       G d de%             Z' G d de jP                        Z)d Z* G d dej$                        Z+ G d d      Z, G d de,      Z- G d d      Z. G d de.      Z/ G d de/      Z0 G d  d!e/      Z1 G d" d#      Z2 G d$ d%e2e,ejH                        Z3 G d& d'e2e,ejH                        Z4 G d( d)e,ejH                        Z5 G d* d+e-ejH                        Z6 G d, d-ejH                        Z7 G d. d/ejH                        Z8 G d0 d1ejH                        Z9 G d2 d3      Z: ejL                  ed       G d4 d5e9             Z; G d6 d7ejH                        Z<e=d8k(  r ej|                          yy# e$ r dZY 'w xY w)9    N)support)socket_helperwarnings_helpernntplib)NNTP	GroupInfo)patchzkeycert3.pemc                       e Zd Z	 dZy)SSLErrorzThis will never be raised.N)__name__
__module____qualname__reason     E/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/test_nntplib.pyr   r      s
    D-r   r   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Z ej"                  dd      d        Zd ZddZ ej"                  dd      d        Zd Zd Zd Zed        Zd Zd Zy)NetworkedNNTPTestsMixinNc                 v    | j                   j                         }| j                  t        t	        |             y N)server
getwelcomeassertEqualstrtype)selfwelcomes     r   test_welcomez$NetworkedNNTPTestsMixin.test_welcome*   s(    ++((*d7m,r   c                     | j                   j                         \  }}| j                  |j                  d      |       |D ]!  }| j	                  t
        t        |             # y )Nz100 )r   help
assertTrue
startswithr   r   r   )r   resplineslines       r   	test_helpz!NetworkedNNTPTestsMixin.test_help.   sR    kk&&(e/6 	.DS$t*-	.r   c                     | j                   j                         \  }}t        |      dkD  rO| j                  t        t        |d                | j                  t        t        |d   j                               y y Nr   )r   listlenr   r   r   r   groupr   r#   groupss      r   	test_listz!NetworkedNNTPTestsMixin.test_list4   s]    {{'')fv;?YVAY8S$vay"78 r   c                    | j                   j                  | j                        \  }}t        |      dkD  rO| j	                  t
        t        |d                | j	                  t        t        |d   j                               y y r(   )	r   r)   	GROUP_PATr*   r   r   r   r   r+   r,   s      r   test_list_activez(NetworkedNNTPTestsMixin.test_list_active:   sc    {{''7fv;?YVAY8S$vay"78 r   c                    | j                  t        j                        5 }| j                  j	                  d       d d d        j
                  j                  }| j                  |j                  d      |       y # 1 sw Y   AxY w)NXYZZYz500 )	assertRaisesr   NNTPPermanentErrorr   	_shortcmd	exceptionresponser!   r"   )r   cmr#   s      r   test_unknown_commandz,NetworkedNNTPTestsMixin.test_unknown_command@   se    w99: 	+bKK!!'*	+||$$/6	+ 	+s   A<<Bc                 @   t         j                  j                         t        j                  d      z
  }| j                  j                  |      \  }}t        |      dkD  r=| j                  |d   t               | j                  |d   j                  t               y y )N   )daysr   )datetimedatetoday	timedeltar   	newgroupsr*   assertIsInstancer   r+   r   )r   dtr#   r-   s       r   test_newgroupsz&NetworkedNNTPTestsMixin.test_newgroupsF   sz     ]]  "X%7%7Q%??{{,,R0fv;?!!&)Y7!!&)//37 r   c                 V     fd} j                   j                   j                        } ||        j                   j                  |        j                   j                   j
                        } ||        j                   j                  d      } j                  |d       y )Nc                 j    j                  | t               j                  j                  |        y r   )rC   r   assertNotIn
GROUP_NAME)descr   s    r   _check_descz=NetworkedNNTPTestsMixin.test_description.<locals>._check_descP   s'    !!$,T__d3r   zzk.brrtt.baz )r   descriptionrI   assertInDESCr0   r   )r   rK   rJ   s   `  r   test_descriptionz(NetworkedNNTPTestsMixin.test_descriptionO   s    	4 {{&&t7Ddii&{{&&t~~6D{{&&~6r"r   c                 p   | j                   j                  | j                        \  }}| j                  |j	                  d      xs |j	                  d      |       | j                  |t               || j                     }| j                  || j                   j                  | j                               y )Nz215 z282 )
r   descriptionsr0   r!   r"   rC   dictrI   r   rM   )r   r#   descsrJ   s       r   test_descriptionsz)NetworkedNNTPTestsMixin.test_descriptions_   s    kk..t~~>eOOF#>tv'>	FeT*T__%t{{66tGHr   c                    | j                   j                  | j                        }| j                  dt	        |             |\  }}}}}| j                  || j                         | j                  |t               | j                  |t               | j                  |t               | j                  ||       | j                  |j                  d      |       y )N   211 )
r   r+   rI   r   r*   rC   intassertLessEqualr!   r"   )r   resultr#   countfirstlastr+   s          r   
test_groupz"NetworkedNNTPTestsMixin.test_grouph   s    ""4??3CK(*0'eUD%0eS)eS)dC(UD)/6r   c                     | j                   j                         \  }}| j                  |t        j                         | j	                  |j
                  d       | j                  |j
                  d       y )Ni  i  )r   r?   rC   r>   assertGreaterEqualyearrZ   r   r#   r?   s      r   	test_datez!NetworkedNNTPTestsMixin.test_dates   sV    [[%%'
ddH$5$56		40TYY-r   c                     | j                  |t               | j                  |j                         h d       |j	                         D ]#  }| j                  |t
        t        d       f       % y )N>   r?   fromsubject
references:bytes:lines
message-id)rC   rS   ra   keysvaluesr   r   )r   art_dictvs      r   _check_art_dictz'NetworkedNNTPTestsMixin._check_art_dictz   s^    h-/	 " 	8A!!!c4:%67	8r   c                 \   | j                   j                  | j                        \  }}}}}| j                   j                  |dz
  |      \  }}t	        |      dk(  r| j                  d       |d   \  }}| j                  ||dz
         | j                  ||       | j                  |       y )NrW   r   zno articles retrieved)	r   r+   rI   xoverr*   skipTestra   rZ   rp   )	r   r#   r\   r]   r^   namer$   art_numrn   s	            r   
test_xoverz"NetworkedNNTPTestsMixin.test_xover   s    )-):):4??)K&eUD$kk''q$7eu:?MM12!!H2Wd+X&r   TzHtemporarily skipped until a permanent solution is found for issue #28971c                    | j                   j                  | j                        \  }}}}}|dz
  }| j                   j                  |d f      \  }}|d   \  }}	| j	                  |	       | j                   j                  ||f      \  }}|d   \  }}	| j                  ||       | j                  ||       | j	                  |	       y )N
   r   )r   r+   rI   overrp   ra   rZ   )
r   r#   r\   r]   r^   rt   startr$   ru   rn   s
             r   	test_overz!NetworkedNNTPTestsMixin.test_over   s     *.):):4??)K&eUD$r	kk&&t}5e!!HX&kk&&t}5e!"I/Wd+X&r   c                     | j                   j                  | j                        \  }}}}}| j                   j                  d|      \  }}|D ]$  }| j	                  t
        t        |d                & y )Nrg      )r   r+   rI   xhdrr   r   r   )r   r#   r\   r]   r^   rt   r$   r%   s           r   	test_xhdrz!NetworkedNNTPTestsMixin.test_xhdr   sf    )-):):4??)K&eUD$kk&&y$7e 	1DS$tAw-0	1r   c                    | j                  |t        j                         || j                  |j                  |       |j
                  D ]  }| j                  |t                | j                  |j
                  d   d       y )Nry   )   .s   .
   .
)rC   r   ArticleInfor   numberr$   bytesrH   )r   r#   articleru   r%   s        r   check_article_respz*NetworkedNNTPTestsMixin.check_article_resp   sq    gw':':;W^^W5MM 	/D!!$.	/ 	r*,DEr   zFIXME: see bpo-32128c                    | j                   j                  | j                        \  }}}}}|||dz
  fD ]"  }	 | j                   j                  |      \  }} n | j                  d       | j                  |j                  d      |       | j                  |       | j                   j                  |      \  }}	| j                  |j                  d      |       | j                  ||	|       | j                   j                  |      \  }}
| j                  |j                  d      |       | j                  ||
|       d }|j                  D cg c]  } ||      s| }}|
j                  D cg c]  } ||      s| }}| j                  ||dgz   |	j                  z          y # t        j
                  $ r'}|j                  j                  d      s Y d }~d }~ww xY wc c}w c c}w )	Nr~   z423 z(could not find a suitable article numberz221 z222 z220 c                 $    | j                  d      S )Ns   X-Antivirus)r"   )r%   s    r   <lambda>z@NetworkedNNTPTestsMixin.test_article_head_body.<locals>.<lambda>   s     ? r   r   )r   r+   rI   headr   NNTPTemporaryErrorr8   r"   rs   r!   r   bodyr   r$   r   )r   r#   r\   r]   r^   rt   ru   r   er   r   denylistr%   filtered_head_linesfiltered_liness                  r   test_article_head_bodyz.NetworkedNNTPTestsMixin.test_article_head_body   s   )-):):4??)K&eUD$eTAX. 
	FG![[--g6
d 
	F MMDE/6dG4[[%%g.
d/6dG4++G4g/6gw7?04

 6&.tn  $ 6 6+2== 14!)$  1 1)<u)Dtzz)QR- -- zz,,V4	$61s#   F+G(4G-+G%>G  G%c                       fd} j                   j                  j                  d        | j                  j                                 j                  j	                         \  }} ||       y )Nc                 l    | d   }j                  |t        t        f       j                  d|       y )NLISTOVERVIEW.FMT)rC   r)   tuplerN   )caps	caps_listr   s     r   _check_capsz>NetworkedNNTPTestsMixin.test_capabilities.<locals>._check_caps   s.    VI!!)dE];MM.)4r      )ra   r   nntp_versiongetcapabilitiescapabilities)r   r   r#   r   s   `   r   test_capabilitiesz)NetworkedNNTPTestsMixin.test_capabilities   sW    	5 	 8 8!<DKK//12[[--/
dDr   c                 |    d}d}| j                  t        j                  | j                  j                  ||d       y )NnotarealusernotarealpasswordF)userpasswordusenetrc)r4   r   	NNTPErrorr   login)r   baduserbadpws      r   test_zloginz#NetworkedNNTPTestsMixin.test_zlogin   s=     !"'++T[[->->& 	 	Hr   c                 v    t        |       }	 | j                  j                          d |_        y # d |_        w xY wr   )r   r   quit)r   clss     r   test_zzquitz#NetworkedNNTPTestsMixin.test_zzquit   s/    4j	KKCJCJs   / 	8c                     d }t        |       D ]?  }|j                  d      st        | |      }t        |      s-t	        | | ||             A y )Nc                 B     t        j                          fd       }|S )Nc                 ~    t        j                  | j                        5   |        d d d        y # 1 sw Y   y xY wr   )r   transient_internet	NNTP_HOST)r   meths    r   wrappedzHNetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth.<locals>.wrapped   s1    "55dnnE J  s   	3<)	functoolswraps)r   r   s   ` r   	wrap_methz7NetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth   s%    __T" # Nr   test_)dirr"   getattrcallablesetattr)r   r   rt   r   s       r   wrap_methodsz$NetworkedNNTPTestsMixin.wrap_methods   sS    	 H 	0D??7+3%DD> Cy/	0r   c                     | j                  t              5  | j                  | j                  dd       d d d        y # 1 sw Y   y xY w)Nr   Ftimeoutr   )r4   
ValueError
NNTP_CLASSr   r   s    r   test_timeoutz$NetworkedNNTPTestsMixin.test_timeout  s?    z* 	GOODNNAOF	G 	G 	Gs	   >Ac                    fd}t        t        j                  d      }| j                  | j                  |d<   	  | j                  | j
                  fi |5  | j                   |              | j                  j                                d d d        | j                   |               | j                  | j
                  fi |5  j                          d d d        | j                   |              y # 1 sw Y   nxY w# 1 sw Y   ,xY w# t        $ rK}t        j                  d|j                        r%t        j                  d| d| j
                         d }~ww xY w)Nc                  l    t         d      sy	  j                          y# t        t        f$ r Y yw xY w)NfileFT)hasattrr    OSErrorEOFError)r   s   r   is_connectedzANetworkedNNTPTestsMixin.test_with_statement.<locals>.is_connected  s<    66*  X& s   ! 33Fr   ssl_context(?i)KEY.TOO.SMALLzGot  connecting to )rS   r   INTERNET_TIMEOUTr   r   r   r!   r    assertFalser   r   researchr   unittestSkipTest)r   r   kwargsssl_errr   s       @r   test_with_statementz+NetworkedNNTPTestsMixin.test_with_statement  sG   	 ,,
 '$($4$4F=!	$T__T^^>v>F //./ \^,$T__T^^>v>F \^,/ /   	yy-w~~>''$wi 8..2nn-?)A B B	sH   D 6D =D D!D  D	D DD 	E,!AE''E,r   )r   r   r   r   r   r&   r.   r1   r:   rE   rP   rU   r_   rd   rp   rv   r   skipIfr|   r   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r   &   s    K-.9978# I	7.	8	' X__T 8 9'9'"1F X__T12S 3S<H 0 0&G!r   r   c                   @    e Zd ZdZdZdZdZeZe	d        Z
e	d        Zy)NetworkedNNTPTestsznews.trigofacile.comfr.comp.lang.pythonzfr.comp.lang.*Pythonc           	      ~   t        j                  d       t        t         j                  d      }| j                  | j                  |d<   t        j                  | j                        5  	  | j                  | j                  fi || _	        	 d d d        y # t        $ rb}t        j                  d|j                        r't        j                  |  d| d| j                        t!        | j                          d }~wt"        $ r% t        j                  |  d| j                        w xY w# 1 sw Y   y xY w)	NnetworkFr   r   r   z got r   z  got EOF error on connecting to )r   requiresrS   r   r   r   r   r   r   r   r   r   r   r   r   r   print
EOF_ERRORS)r   r   r   s      r   
setUpClasszNetworkedNNTPTests.setUpClassA  s3   #,,
 ??&$'OOF=!--cmm< 	AA+S^^CMMDVD
	A 	A  9917>>B"++se5	 B225--1B-D E Ecmm$ A''3% 0..1mm->)@ A AA	A 	As+   +D3-"B	D0"AC??1D00D33D<c                 R    | j                   | j                   j                          y y r   )r   r   )r   s    r   tearDownClassz NetworkedNNTPTests.tearDownClassX  s    ::!JJOO "r   N)r   r   r   r   rI   r0   rO   r   r   r   r   r   r   r   r   r   r   8  sC    &I&J IDJA A,  r   r   requires SSL supportc                       e Zd ZdZdZdZdZ eedd      Z	dZ
dZe> ej                         Zej                  d       ej                   j"                  e_        yy)NetworkedNNTP_SSLTestsznntp.aioe.orgz	aioe.testzaioe.*testNNTP_SSLNDEFAULT)r   r   r   r   rI   r0   rO   r   r   r   r.   test_starttlsssl_create_unverified_contextr   set_ciphers
TLSVersionTLSv1_2maximum_versionr   r   r   r   r   ]  sp      I JID*d3J I M
4c446	*&)nn&<&<# r   r   c                   2    e Zd Z	 d Zd Zd Zd Zd Zd Zy)_NNTPServerIOc                 (   t         j                  j                  |        t        j                         | _        t        j                         | _        || _        | j                  j                  | j                  j                  | j                         y r   )
io	RawIOBase__init__BytesIOc2ss2chandlerr{   readline	push_data)r   r   s     r   r   z_NNTPServerIO.__init__  sW    
d#::<::<488,,dnn=r   c                      yNTr   r   s    r   readablez_NNTPServerIO.readable      r   c                      yr  r   r   s    r   writablez_NNTPServerIO.writable  r  r   c                     	 | j                   j                         }| j                   j                  dd       | j                   j                  |       | j                   j                  |       y )Nr   r   )r   tellseekwrite)r   dataposs      r   r   z_NNTPServerIO.push_data  sF    <hhmmoatcr   c                     	 | j                   j                         }| j                   j                  |       | j                   j                  |       | j                  j                          t        |      S r   )r   r  r
  r	  r   process_pendingr*   )r   br  s      r   r
  z_NNTPServerIO.write  sM    +hhmmoqc$$&1vr   c                     	 | j                   j                          | j                  j                  t	        |            }t	        |      }||d | |S r   )r   r  r   readr*   )r   bufr  ns       r   readintoz_NNTPServerIO.readinto  sD    1$$&HHMM#c(#FBQr   N)	r   r   r   r   r  r  r   r
  r  r   r   r   r   r   |  s%    >r   r   c                 L    t        |       }t        j                  ||      }||fS r   )r   r   BufferedRWPair)r   sior   s      r   make_mock_filer    s*    

 C S#&D;r   c                       e Zd ZddZd Zy)
NNTPServerNc                 B    || _         || _        | j                  |       y r   )r   host
_base_init)r   fr  
readermodes       r   r   zNNTPServer.__init__  s    		
#r   c                 <    | j                   j                          | ` y r   )r   closer   s    r   _closezNNTPServer._close  s    		Ir   r   )r   r   r   r   r"  r   r   r   r  r    s    $
r   r  c                   2     e Zd ZdZ fdZ fdZd Z xZS )MockedNNTPTestsMixinNc                 B    t         |           | j                          y r   supersetUpmake_serverr   	__class__s    r   r(  zMockedNNTPTestsMixin.setUp  s    r   c                 &    t         |           | `y r   )r'  tearDownr   r*  s    r   r-  zMockedNNTPTestsMixin.tearDown  s    Kr   c                     | j                         | _        t        | j                        \  | _        }t	        |dg|i || _        | j
                  S )Nztest.server)handler_classr   r  r  r  r   )r   argsr   r   s       r   r)  z MockedNNTPTestsMixin.make_server  sH    ))+'5$ }FtFvF{{r   )r   r   r   r/  r(  r-  r)  __classcell__r+  s   @r   r$  r$    s    Mr   r$  c                        e Zd Z fdZ xZS )MockedNNTPWithReaderModeMixinc                 F    t         |           | j                  d       y )NT)r  r&  r*  s    r   r(  z#MockedNNTPWithReaderModeMixin.setUp  s    D)r   )r   r   r   r(  r1  r2  s   @r   r4  r4    s    * *r   r4  c                       e Zd Z	 dZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZddZd Zd Zd dZd Zd ZdddZdddZdZdZedz   ez   ZddZddZddZd Zy)!NNTPv1Handlerz200 NNTP mock serverc                 x    d| _         d| _        || _        || _        d| _        d| _        | j                          y )NFT)in_bodyallow_posting	_readline
_push_data
_logged_in
_user_senthandle_welcome)r   r   r   s      r   r{   zNNTPv1Handler.start  s9    !!#r   c                     t        |dd      S )Nutf-8surrogateescape)r   r   r  s     r   _decodezNNTPv1Handler._decode  s    4"344r   c                    | j                   rm	 | j                         }|sy | j                  j                  |       |dk(  rn5	 | j                  \  }} ||d| j                  i d | _        d | _        d| _         	 | j                  | j                               }|sy |j                  d      st        dj                  |            |d d }|j                         ^}}t        | d|j                         z   d       }|| j                          n#	  ||  | j                   r||f| _        g | _        	 # d | _        d | _        d| _         w xY w# t        $ r }t        dj                  |            |d }~ww xY w)	Nr   r   F
z line doesn't end with \r\n: {!r}handle_zcommand failed: {!r})r9  r;  r   appendbody_callbackrD  endswithr   formatsplitr   upperhandle_unknown	Exception)r   r%   r   tokenscmdr   s         r   r  zNNTPv1Handler.process_pending  ss   <<~~'		  &8# %#11ff-499-%)" 	$<< 01D==( !E!L!LT!RSS9D::<LC&4SYY[!8$?D|##%'&M ||-16\*$&	)  &*" 	$  ! Q$%;%B%B4%HIqPQs$   !D4 E 4E	E7E22E7c                     	 d| _         y r  )r9  r   s    r   expect_bodyzNNTPv1Handler.expect_body  s    Er   c                 (    	 | j                  |       y r   )r<  rC  s     r   r   zNNTPv1Handler.push_data  s    #r   c                     	 t        j                  |      }dj                  |j                               dz   }|j	                  d      }| j                  |       y )NrF  rA  )textwrapdedentjoin
splitlinesencoder   )r   lits     r   push_litzNNTPv1Handler.push_lit  sG    #ooc"kk#..*+f4jj!sr   c                 &    | j                  d       y )Nz	500 What?r]  r   s    r   rO  zNNTPv1Handler.handle_unknown  s    k"r   c                 :    | j                  | j                         y r   )r]  r   r   s    r   r?  zNNTPv1Handler.handle_welcome  s    dll#r   c                 &    | j                  d       y Nz205 Bye!r_  r   s    r   handle_QUITzNNTPv1Handler.handle_QUIT"  s    j!r   c                 &    | j                  d       y )N111 20100914001155r_  r   s    r   handle_DATEzNNTPv1Handler.handle_DATE%  s    *+r   c                 r    |dk(  r| j                  d       y | j                  dj                  |             y )Nr   z$211 486 761 1265 fr.comp.lang.pythonz411 No such group {})r]  rL  )r   r+   s     r   handle_GROUPzNNTPv1Handler.handle_GROUP(  s0    ))MM@AMM077>?r   c                 &    | j                  d       y )Nz            100 Legal commands
              authinfo user Name|pass Password|generic <prog> <args>
              date
              help
            Report problems to <root@example.org>
            .r_  r   s    r   handle_HELPzNNTPv1Handler.handle_HELP.  s      	r   Nc                     || j                  d       y |dk(  r| j                  d       y |dk(  r| j                  d       y | j                  d       y )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   message_specs     r   handle_STATzNNTPv1Handler.handle_STAT7  sM    MM56Y&MM>?55MM89MM56r   c                 &    | j                  d       y )N*223 3000237 <668929@example.org> retrievedr_  r   s    r   handle_NEXTzNNTPv1Handler.handle_NEXTA  s    BCr   c                 &    | j                  d       y )N,223 3000234 <45223423@example.com> retrievedr_  r   s    r   handle_LASTzNNTPv1Handler.handle_LASTD  s    DEr   c                 b   || j                  d       y |dk(  r)|dk(  r| j                  d       y | j                  d       y |dk(  r| j                  d       y |dk(  r@|d	k(  r| j                  d
       y |dk(  r| j                  d       y | j                  d       y | j                  d       y )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".
                    .z501 Unknown LIST keywordr_  )r   actionparams      r   handle_LISTzNNTPv1Handler.handle_LISTG  s    >MM   x%      ~%MM 
 
 |#**   --      MM45r   c                     |dk(  r|dk(  r|dk(  r| j                  d       y |dk(  r|dk(  r|dk(  r| j                  d       y |dk(  r!|dv r|dk(  r| j                  d	d
z  dz          y | j                  d       y )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
                .r_  )r   r+   date_strtime_strs       r   handle_NEWNEWSzNNTPv1Handler.handle_NEWNEWS}  s     ''H
,BH$MM  
 ))h(.BH$MM  
 ))00("MM/D0  ! MM  r   c                 T    |dk(  r| j                  d       y | j                  d       y )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_  rr  s     r   handle_XOVERzNNTPv1Handler.handle_XOVER  s.    7"MM4 MM  r   )r   c                    |@| j                   r"| j                  d       | j                          y | j                  d       y | j                  d       || _        y )Nz+340 Input article; end with <CR-LF>.<CR-LF>440 Posting not permitted240 Article received OKr:  r]  rT  posted_body)r   r   s     r   handle_POSTzNNTPv1Handler.handle_POST  sM    <!!KL  "9: MM34#Dr   c                    |E| j                   r'|dk(  r"| j                  d       | j                          y | j                  d       y | j                  d       || _        y )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_IHAVEzNNTPv1Handler.handle_IHAVE  sV    <""KKEF  "67 MM67#Dr   z        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                    || j                  d       n@|dk(  r| j                  d       n)|dk(  r| j                  d       n| j                  d       y | j                  | j                         | j                  d       y )N"220 3000237 <45223423@example.com>ro  220 0 <45223423@example.com>rm  "220 3000234 <45223423@example.com>rq  .)r]  sample_articlerr  s     r   handle_ARTICLEzNNTPv1Handler.handle_ARTICLE  sn    MM>?55MM89Y&MM>?MM56d))*cr   c                    || j                  d       n@|dk(  r| j                  d       n)|dk(  r| j                  d       n| j                  d       y | j                  | j                         | j                  d       y )N"221 3000237 <45223423@example.com>ro  221 0 <45223423@example.com>rm  "221 3000234 <45223423@example.com>rq  r  )r]  sample_headrr  s     r   handle_HEADzNNTPv1Handler.handle_HEAD  n    MM>?55MM89Y&MM>?MM56d&&'cr   c                    || j                  d       n@|dk(  r| j                  d       n)|dk(  r| j                  d       n| j                  d       y | j                  | j                         | j                  d       y )N"222 3000237 <45223423@example.com>ro  222 0 <45223423@example.com>rm  "222 3000234 <45223423@example.com>rq  r  )r]  sample_bodyrr  s     r   handle_BODYzNNTPv1Handler.handle_BODY  r  r   c                 &   | j                   r| j                  d       y |dk(  r7| j                  r| j                  d       y | j                  d       d| _        y |dk(  r| j                  d       d| _         y t        dj	                  |            )	Nz502 Already Logged Inr   z 482 User Credential Already Sentz381 Password RequiredTpassz281 Login SuccessfulzUnknown cred type {})r=  r]  r>  rP  rL  )r   	cred_typer  s      r   handle_AUTHINFOzNNTPv1Handler.handle_AUTHINFO
  sy    ??MM12& @A56"&& MM01"DO299)DEEr   r   NN)r   r   r   r   r{   rD  r  rT  r   r]  rO  r?  rc  rf  rh  rj  rt  rw  rz  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r7  r7    s    $G5$'L#$",@7DF46l>@ #' 
$ 04 $CK"K !6)K7NFr   r7  c                   "    e Zd Z	 d Zd ZddZy)NNTPv2Handlerc                     d}| j                   s!| j                  |j                  d             y | j                  |j                  d             y )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 USERrL   )r=  r]  rL  r   fmts     r   handle_CAPABILITIESz!NNTPv2Handler.handle_CAPABILITIES  s<    	 MM#**%BCDMM#**R.)r   c                     t        d      )Nz3MODE READER sent despite READER has been advertised)rP  )r   _s     r   handle_MODEzNNTPv2Handler.handle_MODE.  s    MNNr   Nc                 $    | j                  |      S r   )r  rr  s     r   handle_OVERzNNTPv2Handler.handle_OVER1  s      ..r   r   )r   r   r   r  r  r  r   r   r   r  r    s    ,*"O/r   r  c                         e Zd Z	  fdZ xZS )CapsAfterLoginNNTPv2Handlerc                 ^    | j                   s| j                  d       y t        |           y )Nz480 You must log in.)r=  r]  r'  r  r*  s    r   r  z/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES8  s"    MM01G')r   )r   r   r   r  r1  r2  s   @r   r  r  5  s    =* *r   r  c                        e Zd Z	 d Zd Zd Zy)ModeSwitchingNNTPv2Handlerc                     d| _         y NF)	_switchedr   s    r   r   z#ModeSwitchingNNTPv2Handler.__init__B  s	    r   c                     d}| j                   r!| j                  |j                  d             y | j                  |j                  d             y )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
            .rL   zMODE-)r  r]  rL  r  s     r   r  z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIESE  s;    	 >>MM#**R.)MM#**W-.r   c                 4    d| _         | j                  d       y )NTz200 Posting allowed)r  r]  )r   whats     r   r  z&ModeSwitchingNNTPv2Handler.handle_MODEU  s    +,r   N)r   r   r   r   r  r  r   r   r   r  r  ?  s    ./ -r   r  c                        e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdZd Zd Zd Z d Z!d  Z"d! Z# xZ$S )"NNTPv1v2TestsMixinc                 "    t         |           y r   )r'  r(  r*  s    r   r(  zNNTPv1v2TestsMixin.setUp]  s    r   c                 x    | j                  | j                  j                  | j                  j                         y r   )r   r   r   r   r   s    r   r   zNNTPv1v2TestsMixin.test_welcome`  s&    ,,dll.B.BCr   c                     | j                   dk(  r&| j                  d| j                  j                         | j                  j	                  dd       | j                  d| j                  j                         y )Nr   AUTHINFOtestusertestpw)r   rN   r   _capsr   rH   r   s    r   test_authinfoz NNTPv1v2TestsMixin.test_authinfoc  sX    !MM*dkk&7&78*h/ 	T[[%6%67r   c                     | j                   j                         \  }}| j                  |d       | j                  |t        j                  dddddd             y )Nre    	      r      7   )r   r?   r   r>   rc   s      r   rd   zNNTPv1v2TestsMixin.test_datek  sN    [[%%'
d34x00q"aRHIr   c                     | j                  | j                  j                         | j                  j	                         }| j                  |d       | j                  | j                  j                         y rb  )r   r  closedr   r   r   r!   )r   r#   s     r   	test_quitzNNTPv1v2TestsMixin.test_quitp  sN    ){{!z*(r   c                     | j                   j                         \  }}| j                  |d       | j                  |g d       y )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    s      r   r&   zNNTPv1v2TestsMixin.test_helpv  s>    [[%%'
d34  
 	r   c           	      r   | j                   j                         \  }}| j                  t        |      d       |d   }| j                  |t	        dddd             | j                   j                  d      \  }}| j                  t        |      d       |d	   }| j                  |t	        d
ddd             y )N   r~   comp.lang.python.announce
0000001153
0000000993mr}  r   r   z!gmane.comp.python.distutils.devel
0000014104
0000000001)r   r)   r   r*   r   )r   r#   r-   gs       r   r.   zNNTPv1v2TestsMixin.test_list  s    {{'')fVa(1I1<"C)	* {{''6fVa(1I9<"C)	*r   c                 *   | j                   j                  d      \  }}}| j                  |d       | j                  |d       | j                  |d       | j                   j                  d      \  }}}| j                  |d       | j                  |d       | j                  |d       | j                  t        j
                        5 }| j                   j                  d       d d d        | j                  j                  j                  d       | j                  t        j
                        5 }| j                   j                          d d d        | j                  |j                  j                  d       y # 1 sw Y   xY w# 1 sw Y   <xY w)	N- rn  ro  rp  r   z<non.existent.id>rq  rl  )r   statr   r4   r   r   r7   r8   )r   r#   ru   r  r9   s        r   	test_statzNNTPv1v2TestsMixin.test_stat  sL   $(KK$4$4W$=!gzCD'*%=>$(KK$4$45M$N!gz=>!$%=>w99: 	2bKK01	2..0KLw99: 	bKK	..0KL	2 	2	 	s   
E=3F	=F	Fc                     | j                   j                         \  }}}| j                  |d       | j                  |d       | j                  |d       y )Nrv  - z<668929@example.org>)r   nextr   r   r#   ru   r  s       r   	test_nextzNNTPv1v2TestsMixin.test_next  sM    $(KK$4$4$6!gzKL'*%;<r   c                     | j                   j                         \  }}}| j                  |d       | j                  |d       | j                  |d       y )Nry  r  ro  )r   r^   r   r  s       r   	test_lastzNNTPv1v2TestsMixin.test_last  sM    $(KK$4$4$6!gzMN'*%=>r   c                     | j                   j                  d      }| j                  |d       | j                   j                  d      }| j                  |d       y )Nr  The Python computer language.comp.lang.pythonxrL   )r   rM   r   )r   rJ   s     r   rP   z#NNTPv1v2TestsMixin.test_description  sM    {{&&'9:>?{{&&':;r"r   c                 R   | j                   j                  d      \  }}| j                  |d       | j                  |ddi       | j                   j                  d      \  }}| j                  |ddd       | j                   j                  d      \  }}| j                  |i        y )Nr  z-215 Descriptions in form "group description".r  r  z4Announcements about the Python language. (Moderated))r  r  r  )r   rR   r   r,   s      r   rU   z$NNTPv1v2TestsMixin.test_descriptions  s    {{//0BCfNO ?" 	 {{//0CDf ?)_" 	 {{//0CDf$r   c                 8   | j                   j                  d      \  }}}}}| j                  |j                  d      |       | j	                  |d       | j	                  |d       | j	                  |d       | j	                  |d       | j                  t        j                        5 }| j                   j                  d       d d d        j                  }| j                  |j                  j                  d      |j                         y # 1 sw Y   KxY w)Nr   rX   i  i  i  zcomp.lang.python.develz411 No such group)
r   r+   r!   r"   r   r4   r   r   r7   r8   )r   r#   r\   r]   r^   r+   r9   excs           r   r_   zNNTPv1v2TestsMixin.test_group  s    *.++*;*;<Q*R'eUD%/6$t$$ 56w99: 	8bKK67	8ll//0CD	&	8 	8s   *DDc                    t        j                   dddddd      }| j                  j                  d|      \  }}dj                  | j                        }| j                  ||       | j                  |d	d
g       t        j                   dddddd      }| j                  j                  d|      \  }}| j                  |d       | j                  |g        y )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   newnewsrL  r   r   )r   rD   r#   idsexpecteds        r   test_newnewszNNTPv1v2TestsMixin.test_newnews  s    tQAr15KK''(:B?	c=fT&&' 	 	x(PP 	
 tQAr15KK''(=rB	cJKb!r   c                     | j                  t        |      d       | j                  |d   j                  d      d       | j                  |d   d       | j                  |d   d       | j                  |d	   d
       y )Nr  ry   rA  u   -- Signed by André.rG  r   s   .Here is a dot-starting line.s   This is just a test article.)r   r*   decoder   r$   s     r   _check_article_bodyz&NNTPv1v2TestsMixin._check_article_body  st    UQ'r))'24JKrC(r$DEr$CDr   c                     | j                  t        |      d       | j                  |d   d       | j                  |d   d       y )Nr  r   s&   From: "Demo User" <nobody@example.net>   s7   Message-ID: <i.am.an.article.you.will.want@example.com>)r   r*   r  s     r   _check_article_headz&NNTPv1v2TestsMixin._check_article_head  s@    UQ'q#LMq#]^r   c                     | j                  t        |      d       | j                  |d d        | j                  |dd         | j                  |d   d       y )Nr  r  r  r   )r   r*   r
  r  r  s     r   _check_article_dataz&NNTPv1v2TestsMixin._check_article_data  sR    UQ'  r+  rs,q3'r   c                 n   | j                   j                         \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j	                  t
        j                        5 }| j                   j                  d       d d d        | j                  j                  j                  d	       y # 1 sw Y   0xY w)
Nr  r  ro  r  r  r  r   <non-existent@example.com>rq  )	r   r   r   r  r4   r   r   r7   r8   r   r#   inforu   r  r$   r9   s          r   test_articlezNNTPv1v2TestsMixin.test_article  s   [[((*
dCD%)"U'*%=>  '[[((1
dCD%)"U'*%=>  '[[(()AB
d=>%)"U!$%=>  'w99: 	>bKK <=	>..0KL	> 	>    F++F4c                    t        j                         }| j                  j                  |      \  }}| j	                  |d       |\  }}}| j	                  |d       | j	                  |d       | j	                  |g        |j                         }| j                  |j                  d      t        |             | j                  |j                  d      t        |             y )Nr   r  r  ro  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   r   r   getvaluer!   r"   asciirK  r   r  r#   r  ru   r  r$   r  s           r   test_article_filez$NNTPv1v2TestsMixin.test_article_file  s    JJL[[((a(0
dCD%)"U'*%=>#zz|5 T{	 	.
 T{	r   c                 n   | j                   j                         \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j	                  t
        j                        5 }| j                   j                  d       d d d        | j                  j                  j                  d	       y # 1 sw Y   0xY w)
Nr  r  ro  r  r  r  r   r  rq  )	r   r   r   r
  r4   r   r   r7   r8   r  s          r   	test_headzNNTPv1v2TestsMixin.test_head      [[%%'
dCD%)"U'*%=>  '[[%%g.
dCD%)"U'*%=>  '[[%%&>?
d=>%)"U!$%=>  'w99: 	;bKK9:	;..0KL	; 	;r  c                    t        j                         }| j                  j                  |      \  }}| j	                  |d       |\  }}}| j	                  |d       | j	                  |d       | j	                  |g        |j                         }| j                  |j                  d      t        |             | j                  |j                  d      t        |             y )Nr  r  r  ro  r  r  )r   r   r   r   r   r  r!   r"   r  r   rK  r  s           r   test_head_filez!NNTPv1v2TestsMixin.test_head_file;  s    JJL[[%%1%-
dCD%)"U'*%=>#zz|5 T{	 	.
 T{	r   c                 n   | j                   j                         \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j	                  t
        j                        5 }| j                   j                  d       d d d        | j                  j                  j                  d	       y # 1 sw Y   0xY w)
Nr  r  ro  r  r  r  r   r  rq  )	r   r   r   r  r4   r   r   r7   r8   r  s          r   	test_bodyzNNTPv1v2TestsMixin.test_bodyO  r  r  c                    t        j                         }| j                  j                  |      \  }}| j	                  |d       |\  }}}| j	                  |d       | j	                  |d       | j	                  |g        |j                         }| j                  |j                  d      t        |             | j                  |j                  d      t        |             y )Nr  r  r  ro  r  r  )r   r   r   r   r   r  r   r"   r  r!   rK  r  s           r   test_body_filez!NNTPv1v2TestsMixin.test_body_filej  s    JJL[[%%1%-
dCD%)"U'*%=>#zz|5 T{	 	.
 T{	r   c                 Z   | j                  |j                  d      |       | j                  t        |      d       |d   \  }}| j                  |d       | j                  |ddddd	d
ddd       |d   \  }}| j                  |d   d        |d   \  }}| j                  |d   d       y )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>710316z*news.gmane.io gmane.comp.python.authors:57)rf   rg   r?   rk   rh   ri   rj   xrefr~   r(  r   rg   0   Re: Message d'erreur incompréhensible (par moi))r!   r"   r   r*   )r   r#   	overviewsru   rz   s        r   check_over_xover_respz(NNTPv1v2TestsMixin.check_over_xover_resp~  s    /6Y+!!"%[`5L:@	  		 "!ft,!!iK	Mr   c                 f    | j                   j                  dd      \  }}| j                  ||       y )Nr%  ;   )r   rr   r+  r   r#   r*  s      r   rv   zNNTPv1v2TestsMixin.test_xover  s,    ++++B3i""43r   c                 d    | j                   j                  d      \  }}| j                  ||       y )N)r%  r-  )r   rz   r+  r.  s      r   r|   zNNTPv1v2TestsMixin.test_over  s*    ++**84i""43r   s  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                 8   | j                   j                  }| j                  t        |      d       | j                  |d   d       | j                  |d   d       | j                  |d   d       | j                  |d   d	       | j                  |d
   d       y )Nrx   ry   r   rG  s   -- Signed by André.
r     
r  s    ..Here is a dot-starting line.
r   s(   From: "Demo User" <nobody@example.net>
)r   r  r   r*   r  s     r   _check_posted_bodyz%NNTPv1v2TestsMixin._check_posted_body  s    ((UR(rH-r$EFrG,r$IJq#PQr   c                   | j                   }| ||      fz   }d | j                  _         || }| j                          | j                   j	                  dd      }| ||      fz   }d | j                  _         || }| j                          |S )Nr1     
)sample_postr   r  r2  replace)r   funcfile_factoryr0  post	func_argsr#   s          r   _check_post_ihave_subz(NNTPv1v2TestsMixin._check_post_ihave_sub  s    L.00	#' Y! ''7L.00	#' Y!r   c                     | j                   |g|dt        i}| j                  ||        | j                   |g|dt        i}| j                  ||        | j                   |g|dt        j
                  i}| j                  ||       d } | j                   |g|d|i}| j                  ||       d } | j                   |g|d|i}| j                  ||       y )Nr8  c                 8    t        | j                  d            S )NTkeependsiterrZ  r  s    r   	iterlinesz6NNTPv1v2TestsMixin.check_post_ihave.<locals>.iterlines  s    d344r   c                 8    t        | j                  d            S )NFr>  r@  rB  s    r   rC  z6NNTPv1v2TestsMixin.check_post_ihave.<locals>.iterlines  s    e455r   )r;  r   r   	bytearrayr   r   )r   r7  success_respr0  r#   rC  s         r   check_post_ihavez#NNTPv1v2TestsMixin.check_post_ihave  s    )t))$JJEJ|,)t))$NNIN|,)t))$OOBJJO|,	5)t))$NNIN|,	6)t))$NNIN|,r   c                 p   | j                  | j                  j                  d       d| j                  _        | j                  t        j                        5 }| j                  j                  | j                         d d d        | j                  j                  j                  d       y # 1 sw Y   0xY w)Nr  Fr  )rG  r   r9  r   r:  r4   r   r   r5  r   r7   r8   r   r9   s     r   	test_postzNNTPv1v2TestsMixin.test_post  s    dkk..0IJ%*"w99: 	/bKKT--.	/..4	6	/ 	/s   &B,,B5c                 R   | j                  | j                  j                  dd       | j                  t        j
                        5 }| j                  j                  d| j                         d d d        | j                  j                  j                  d       y # 1 sw Y   0xY w)Nr  r  z<another.message.id>r  )
rG  r   ihaver4   r   r   r5  r   r7   r8   rI  s     r   
test_ihavezNNTPv1v2TestsMixin.test_ihave  s    dkk//1MK	Mw99: 	HbKK4d6F6FG	H..1	3	H 	Hs   'BB&c                     t        j                   dddddd      }| j                  t        j                  | j                  j
                  d|       y )Nr  r~   r  r   r  )r>   r4   r   NNTPDataErrorr   r  )r   rD   s     r   test_too_long_linesz&NNTPv1v2TestsMixin.test_too_long_lines  sE    tQ1a3'//++--/A2	Gr   )%r   r   r   r(  r   r  rd   r  r&   r.   r  r  r  rP   rU   r_   r  r  r
  r  r  r  r  r  r!  r#  r+  rv   r|   r5  r2  r;  rG  rJ  rM  rP  r1  r2  s   @r   r  r  [  s    D8J
)*M =?#%&"&E_
(M6*M6(M6(M*44	* 	R -*63Gr   r  c                       e Zd Z	 dZeZd Zy)NNTPv1Testsr~   c                     | j                   j                         }| j                  |i        | j                  | j                   j                  d       | j                  | j                   j                  d        y )Nr~   r   r   r   r   nntp_implementationr   r   s     r   	test_capszNNTPv1Tests.test_caps  sX    {{**,r"111588$?r   N)r   r   r   r   r7  r/  rW  r   r   r   rR  rR    s    4L!M@r   rR  c                       e Zd Z	 dZeZd Zy)NNTPv2Testsr   c                    | j                   j                         }| j                  |ddgddgdgg g dg g g d       | j                  | j                   j                  d       | j                  | j                   j                  d	       y )
N23INNz2.5.1USER)r|  zACTIVE.TIMESzDISTRIB.PATSHEADERSr~  r   )VERSIONIMPLEMENTATIONr  HDRr   OVERPOSTREADERr	  z	INN 2.5.1rT  rV  s     r   rW  zNNTPv2Tests.test_caps  s    {{**,Sz$g.>
  
	 	111588+Fr   N)r   r   r   r   r  r/  rW  r   r   r   rY  rY    s    6L!MGr   rY  c                       e Zd Z	 dZeZd Zy)CapsAfterLoginNNTPv2Testsr   c                     | j                  | j                  j                  i        | j                  j                  dd       | j	                  d| j                  j                         y )Nr  r  r`  )r   r   r  r   rN   r   s    r   test_caps_only_after_loginz4CapsAfterLoginNNTPv2Tests.test_caps_only_after_login  sH    **B/*h/i!2!23r   N)r   r   r   r   r  r/  ri  r   r   r   rg  rg    s    ML/M4r   rg  c                       e Zd Z	 dZeZd Zy)SendReaderNNTPv2Testsr   c                 P    | j                  d| j                  j                         y )Nre  )rN   r   r  r   s    r   (test_we_are_in_reader_mode_after_connectz>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connect&  s    h 1 12r   N)r   r   r   r   r  r/  rm  r   r   r   rk  rk    s    - L.M3r   rk  c                   b    e Zd Zd Zd Zd Zd Zd Zd Z e	j                  ed      d        Zy	)
	MiscTestsc                       fd} |dd        |dd        |dd        |dd        |dd        |d	d
        |dd       y )Nc                 P    j                  t        j                  |       |       y r   )r   r   decode_header)ar  r   s     r   givesz+MiscTests.test_decode_header.<locals>.gives-  s    W2215q9r   rL   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   rt  s   ` r   test_decode_headerzMiscTests.test_decode_header,  sh    	:b2 01$&<=57KL J`	b 	<(	* 	@@	Br   c                    g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d	       y )
N)Subject:From:Date:Message-ID:References:ri   rj   )rg   rf   r?   rk   rh   ri   rj   )rx  ry  rz  r{  r|  Bytes:Lines:)zsubject:zFROM:zDaTe:zmessage-ID:r|  zBYTES:r~  )	rx  ry  rz  r{  r|  ri   rj   	Xref:fullzDistribution:full)	rg   rf   r?   rk   rh   ri   rj   r(  distribution)	rx  ry  rz  r{  r|  r}  r~  z	Xref:FULLzDistribution:FULL)rx  ry  rz  r{  r|  r}  r~  r  rg   rf   r?   rk   rh   ri   rj   r(  )r   r   _parse_overview_fmtr  s     r   test_parse_overview_fmtz!MiscTests.test_parse_overview_fmt<  s    444U;!	"444U;!	"444U;!	"& 	44U;9	:& 	44U;9	:A44U;)	*r   c                    t         j                  dgz   }dg}t         j                  ||      }|\  \  }}| j                  |d       | j                  |dddddd	d
dd       dg}t         j                  ||      }|\  \  }}| j                  |d   d        dg}t         j                  ||      }|\  \  }}| j                  |d   d       | j                  |d   d       y )Nr(  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	Xref: news.example.com misc.test:3000363r  zI am just a test articlez "Demo User" <nobody@example.com>z6 Oct 1998 04:38:40 -0500ro  z<45454@example.net>1234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		z3000234	I am just a test article	"Demo User" <nobody@example.com>	6 Oct 1998 04:38:40 -0500	<45223423@example.com>	 	1234	17	Xref: 	rh    rL   )r   _DEFAULT_OVERVIEW_FMT_parse_overviewr   )r   r  r$   overviewru   fieldss         r   test_parse_overviewzMiscTests.test_parse_overviewd  s   ++vh6;
 **5#6%&'*16/2/8	"
 		
 **5#6%&.
 **5#6%&-s3,r   c           
            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       y )Nc                 r    j                  t        j                  | |      t        j                  |        y r   )r   r   _parse_datetimer>   )rs  r  cr   s      r   rt  z,MiscTests.test_parse_datetime.<locals>.gives  s.    W44Q:%..24r   19990623135624  r     r  8      19990623135624990623090623i  r   ru  s   ` r   test_parse_datetimezMiscTests.test_parse_datetime  sc    	4 	dAr2r2>j(D!RR<h$2r2r:h$2r2r:r   c           
            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        fd} |ddddd        |d
dddd        |ddddd       y )Nc                     t        j                   | |||||      }	j                  t        j                  |      ||f       	j                  t        j                  |d      ||f       y r  r>   r   r   _unparse_datetime
yMdhr  sr  r  rD   r   s
            r   rt  z.MiscTests.test_unparse_datetime.<locals>.gives  se    ""1aAq!4BW66r:&13W66r5A&13r   r  r  r  r  r  r  r  r    20000623r  rW   r~   r   r	  20100605010203c                     t        j                  | ||      }j                  t        j	                  |      ||f       j                  t        j	                  |d      ||f       y r  r>   r?   r   r   r  r  r  r  r  r  rD   r   s         r   rt  z.MiscTests.test_unparse_datetime.<locals>.gives  s]    q!Q'BW66r:&13W66r5A&13r   000000r   ru  s   ` r   test_unparse_datetimezMiscTests.test_unparse_datetime  s    	3 	dAr2r2z8<dAr2r2z8<dAq!Q:x8	3 	dAr:x0dAr:x0dAq*h/r   c           
            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        fd} |ddddd        |d
dddd        |ddddd       y )Nc                     t        j                   | |||||      }	j                  t        j                  |d      ||f       y r  r  r  s
            r   rt  z5MiscTests.test_unparse_datetime_legacy.<locals>.gives  sB    ""1aAq!4BW66r4@&13r   r  r  r  r  r  r  r  r  r  000623r  rW   r~   r   r	  100605r  c                     t        j                  | ||      }j                  t        j	                  |d      ||f       y r  r  r  s         r   rt  z5MiscTests.test_unparse_datetime_legacy.<locals>.gives  s:    q!Q'BW66r4@&13r   r  r   ru  s   ` r   test_unparse_datetime_legacyz&MiscTests.test_unparse_datetime_legacy  s    	3 	dAr2r2x:dAr2r2x:dAq!Q8X6	3 	dAr8X.dAr8X.dAq(H-r   r   c                 B    | j                  t        t        d             y )Nr   )r!   r   r   r   s    r   test_ssl_supportzMiscTests.test_ssl_support  s    45r   N)r   r   r   rv  r  r  r  r  r  r   
skipUnlessr   r  r   r   r   ro  ro  *  sG    B &*P,-\	;0..& X456 66r   ro  c                       e Zd Z	 d Zy)PublicAPITestsc                     | j                  t        t        d             g d}t        |j	                  d       | j                  t        t        j                        t        |             y )N__all__)r   r   NNTPReplyErrorr   r5   NNTPProtocolErrorrO  rr  r   )r!   r   r   r   rI  r   setr  )r   
target_apis     r   test_module_all_attributez(PublicAPITests.test_module_all_attribute  sO    34M
 ?j)W__-s:?r   N)r   r   r   r  r   r   r   r  r    s    H@r   r  c                   N    e Zd Z	 ej                  Z	 ddZd Zd Zd Z	d Z
d Zy)	MockSocketTestsNc                 f  	
  G fdd      } G 	
fdd      d
g 	t        d|      5  | j                  ||      5  | j                  d||       d d d        d d d        | j                  
       	D ]  }| j                  |j                          y # 1 sw Y   ExY w# 1 sw Y   IxY w)	Nc                       e Zd Z fdZy)NMockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_modulec                             S r   r   )addressr   
MockSockets     r   create_connectionz`MockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_module.create_connection  s    !|#r   N)r   r   r   r  )r  s   r   mock_socket_moduler    s    $r   r  c                   $    e Zd ZfdZ fdZy)FMockSocketTests.check_constructor_error_conditions.<locals>.MockSocketc                 
    dy r  r   )r   socket_closeds    r   r!  zLMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.close  s     $r   c                 T            }t        |      \  }}j                  |       |S r   )r  rI  )socketmoder   r  r   filesr/  s        r   makefilezOMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.makefile  s)    '/(14T"r   N)r   r   r   r!  r  )r  r/  r  s   r   r  r    s    %r   r  Fznntplib.socketdummy)r   r   )r	   assertRaisesRegex
nntp_classr!   r  )r   r/  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 	D##$79KL	DOOG%(OC	D 	D 	& 	&AOOAHH%	&		D 	D 	D 	Ds#   B'BB'B$	 B''B0c                 x     G d dt               }| j                  |t        j                  |j                         y )Nc                       e Zd ZdZy)1MockSocketTests.test_bad_welcome.<locals>.HandlerzBad WelcomeNr   r   r   r   r   r   r   Handlerr    s    #Gr   r  )r7  r  r   r  r   r   r  s     r   test_bad_welcomez MockSocketTests.test_bad_welcome  s.    	$m 	$//W..	Ar   c                 x     G d dt               }| j                  |t        j                  |j                         y )Nc                       e Zd ZdZy)EMockSocketTests.test_service_temporarily_unavailable.<locals>.Handlerz#400 Service temporarily unavailableNr  r   r   r   r  r        ;Gr   r  )r7  r  r   r   r   r  s     r   $test_service_temporarily_unavailablez4MockSocketTests.test_service_temporarily_unavailable  .    	<m 	<//W//	Br   c                 x     G d dt               }| j                  |t        j                  |j                         y )Nc                       e Zd ZdZy)EMockSocketTests.test_service_permanently_unavailable.<locals>.Handlerz#502 Service permanently unavailableNr  r   r   r   r  r    r  r   r  )r7  r  r   r5   r   r  s     r   $test_service_permanently_unavailablez4MockSocketTests.test_service_permanently_unavailable
  r  r   c                 n     G fddt               }d| j                  |t        j                         y )Nc                       e Zd Z fdZy)6MockSocketTests.test_bad_capabilities.<locals>.Handlerc                 (    | j                         y r   r_  )r   capabilities_responses    r   r  zJMockSocketTests.test_bad_capabilities.<locals>.Handler.handle_CAPABILITIES  s    34r   N)r   r   r   r  )r  s   r   r  r    s    5r   r  z201 bad capability)r7  r  r   r  )r   r  r  s     @r   test_bad_capabilitiesz%MockSocketTests.test_bad_capabilities  s4    	5m 	5 !5//W++-B	Dr   c                 z    d}d} G fddt               }d| j                  |t        j                  ||       y )Nzt@e.compythonc                       e Zd Z fdZy)3MockSocketTests.test_login_aborted.<locals>.Handlerc                 (    | j                         y r   r_  )r   r0  authinfo_responses     r   r  zCMockSocketTests.test_login_aborted.<locals>.Handler.handle_AUTHINFO  s    /0r   N)r   r   r   r  )r  s   r   r  r    s    1r   r  z503 Mechanism not recognized)r7  r  r   r5   )r   r   r   r  r  s       @r   test_login_abortedz"MockSocketTests.test_login_aborted  sB    	1m 	1 ;//W//1B8	r   r  )r   r   r   r   r   r  r  r  r  r  r  r  r   r   r   r  r    s9    ? J
 "&&:ABBD
r   r  c                       e Zd Z	 d Zy)bypass_contextc                     | S r   r   )sockr0  s     r   wrap_socketzbypass_context.wrap_socket(  s    r   N)r   r   r   r  r   r   r   r  r  &  s
    1r   r  c                       e Zd Zed        Zy)MockSslTestsc                  8    t        j                  | dt        i|S )Nr   )r   r   r  )r  kws     r   r  zMockSslTests.nntp_class-  s    G.GBGGr   N)r   r   r   staticmethodr  r   r   r   r  r  +  s    H Hr   r  c                   J    e Zd Zd Zd Z ej                  ed      d        Zy)LocalServerTestsc                    t        j                          }t        j                  |      }|j                          t	        j
                  | j                  |f      | _        | j                  j                          | j                  | j                  j                         | j                  t        t        j                  |d            | _        y )N)targetr0  F)r   )r  r   	bind_portlisten	threadingThread
run_server
backgroundr{   
addCleanuprY  enterContextr   HOSTnntp)r   r  ports      r   r(  zLocalServerTests.setUp3  s    }}&&t,#**??$2,,-%%d=+=+=te&TU	r   c                 ,   |5  |j                         \  }}d d d        t        j                         5 }|j                         |j                  |j	                  d            }|j                  d       	 |j                         }|dk(  r|j                  d       n|dk(  r|j                          |j                  d       t        j                  t        j                        }|j                  t               |j                  |d      }|j                  |       |j                  |j	                  d            }n1|d	k(  r|j                  d
       nt        dj                  |            	 d d d        y # 1 sw Y   hxY w# 1 sw Y   y xY w)Nrbs   200 Server ready
Ts   CAPABILITIES
s.   101 Capability list:
VERSION 2
STARTTLS
.
s
   STARTTLS
s   382 Begin TLS negotiation now
)server_sides   QUIT
s
   205 Bye!
zUnexpected command {!r})accept
contextlib	ExitStackenter_contextr  sendallr   r!  r   
SSLContextPROTOCOL_TLS_SERVERload_cert_chaincertfiler  r   rL  )r   r  clientr  cleanupreaderrR  contexts           r   r	  zLocalServerTests.run_server>  sn    	(++-KVQ	(!!# 	Lw!!&)**6??4+@AFNN23oo'--NN! O+LLNNN#GH!nnS-D-DEG++H5$00D 1 2F))&1$226??43HIFK'NN?3$%>%E%Ec%JKK- ( 1	L 	L	( 	(	L 	Ls   E=E F
=F
Fr   c                    | j                   j                  }| j                   j                  }| j                   j                          | j	                  || j                   j                         | j	                  || j                   j                         | j                  | j                   j                  t        j                         | j                  t        | j                   j                         y r   )
r  r   r  starttlsassertNotEqualrC   r   	SSLSocketr4   r   )r   r   r  s      r   r   zLocalServerTests.test_starttls^  s    yy~~yy~~		 	D$))..1D$))..1diinncmm<*dii&8&89r   N)	r   r   r   r(  r	  r   r  r   r   r   r   r   r  r  2  s3    	VL@ X45: 6:r   r  __main__)?r   r  r>   rW  r   r   r  os.pathosr   r  r   r   test.supportr   r   import_deprecatedr   r   r   unittest.mockr	   r   ImportErrorpathrY  dirname__file__r  r   rP  r   r   r   r   SSLEOFErrorTestCaser   r  r   r   r   r  r  r$  r4  r7  r  r  r  r  rR  rY  rg  rk  ro  r  r  r  r  r  r   mainr   r   r   <module>r1     s   	        	   7
+/
+
+I
6 # 
 77<<1>B?||H.9 .G GT  $ $ & [
?3??$$J#0(2C2C #J S01=/ = 2=<)BLL )X	 	 &*$8 *BF BFJ
/M /6*- *- -8PG PGf
@$&:H<M<M 
@G$&:H<M<M G.	4 4h6G6G 	4	39	3_6!! _6D
@X&& 
@Lh'' L\ 
 S01H? H 2H8:x(( 8:v zHMMO u2  
Cs   I9 9JJ