B
    ˦Z^                @   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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mZ d dlm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!m"Z" d dl#Z#d dl$m%Z%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+ yd dl,Z,d dl-Z-d dl.Z.W n" e/k
rr   d Z, Z-Z.Y nX yd dl0Z0W n e/k
r   Y nX G dd dej1Z2G d	d
 d
e2Z3G dd de2Z4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>e?e>e5d Z@e5de6de7de8de9de:de;de<de=d e>d!i
ZAG d"d# d#e jBZCG d$d% d%e jBZDG d&d' d'e2ZEG d(d) d)e2ZFG d*d+ d+eGZHG d,d- d-e jIZJG d.d/ d/eGZKG d0d1 d1e2ZLG d2d3 d3e#jMZNG d4d5 d5eGZOG d6d7 d7eOe!ZPG d8d9 d9eOe*ZQG d:d; d;eOe(ZReSed<r6G d=d> d>eQZTG d?d@ d@eRZUG dAdB dBe2ZVG dCdD dDe2ZWG dEdF dFe jXZYG dGdH dHe2ZZG dIdJ dJe2Z[dKdL Z\e]eSed<dMG dNdO dOe[Z^G dPdQ dQe2Z_e]eSed<dMG dRdS dSe_Z`G dTdU dUe2Zae]eSed<dMG dVdW dWeaZbe]ejcdXG dYdZ dZeaZdG d[d\ d\e2ZeG d]d^ d^e2ZfG d_d` d`e2ZgG dadb dbe2ZhddcddZidedf ZjG dgdh dhe jIZkG didj dje2ZlG dkdl dle2ZmG dmdn dne2ZnG dodp dpe joZpG dqdr dre2ZqG dsdt dte2ZreSe jsdur,d dltZtd dvlumvZv G dwdx dxe2Zwexd ZyG dydz dzejzZ{e{ Z|G d{d| d|ej1Z}G d}d~ d~e j~ZG dd dej1ZG dd de2ZG dd de2ZG dd dZG dd de jZG dd de2ZG dd de2ZG dd de2ZG dd dej1ZG dd dej1ZG dd de2ZG dd de2ZG dd deZG dd deZG dd deZdd ZxHddddddedddffD ](\ZZeefddZeede e qW e]e,dG dd de2ZG dd dej1Zedddd Zedkre  dS )    N)assert_python_okassert_python_failure)support)
HTTPServerBaseHTTPRequestHandler)urlparseparse_qs)ThreadingUDPServerDatagramRequestHandlerThreadingTCPServerStreamRequestHandlerc               @   s:   e Zd ZdZdZdZdd Zdd Zdd	d
Zdd Z	dS )BaseTestz&%(name)s -> %(levelname)s: %(message)sz^([\w.]+) -> (\w+): (\d+)$r   c             C   s  t  | _t jj}t  zrtj	 | _
tjd d  | _|	  | _}tj	 | _tj	 | _i  | _}x |D ]}t|| dd ||< qrW W d t  X td| _td| _td| _| j | _t | _| jtj t| j| _ t!| j"| _#| j $| j# | j% r6| jj&| jj& }t'd| | j% r^| jj&| jj& }t'd| | j(| j  | )| j%  | )| j%  d S )Ndisabledu   «×»u   ĿÖG zUnexpected handlers: %s)*r   Zthreading_setup_threading_keylogging	getLoggermanager
loggerDict_acquireLock	_handlerscopysaved_handlers_handlerListsaved_handler_listsaved_loggers_nameToLevelsaved_name_to_level_levelToNamesaved_level_to_namelogger_statesgetattr_releaseLocklogger1logger2root_loggergetEffectiveLeveloriginal_logging_levelioStringIOstreamsetLevelDEBUGStreamHandler	root_hdlr	Formatter
log_formatroot_formattersetFormatterhasHandlershandlersAssertionError
addHandler
assertTrue)selfZlogger_dictr   r    nameZhlist r:   C/work/yifan.wang/lscsoft/opt/python37/lib/python3.7/test_logging.pysetUpM   s@    




zBaseTest.setUpc             C   s8  | j   | j| j x,| jjrD| jjd }| j| |  qW | j| j t	  ztj
  tj
| j tj  tj| j tj  tj| j | jtjd d < t j}d|_|j}|  || j | j}x*| jD ] }|| d k	r|| | j| _qW W d t  X |   tj| j  d S )Nr   ) r*   closer%   removeHandlerr.   r4   r+   r'   r   r   r   clearupdater   r   r   r   r   r   r   r   r   disabler   r   r    r   r"   Z
doCleanupsr   Zthreading_cleanupr   )r8   hr   r   r    r9   r:   r:   r;   tearDownw   s8    






zBaseTest.tearDownNc       	      C   s   |p| j }t|p| j}|  }| t|t| xFt||D ]8\}}|	|}|sj| 
d|  | t| | qFW | }|r| 
d|  d S )Nz*Log line does not match expected pattern:
z'Remaining output at end of log stream:
)r*   recompileexpected_log_patgetvalue
splitlinesassertEquallenzipsearchfailtuplegroupsread)	r8   Zexpected_valuesr*   patZactual_linesactualexpectedmatchsr:   r:   r;   assert_log_lines   s    

zBaseTest.assert_log_linesc             C   s   |  j d7  _ d| j  S )N   z%d)message_num)r8   r:   r:   r;   next_message   s    zBaseTest.next_message)NN)
__name__
__module____qualname__r0   rF   rX   r<   rC   rV   rY   r:   r:   r:   r;   r   E   s   *"
r   c               @   sL   e 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S )BuiltinLevelsTestc             C   s4  | j }td}|tj ttdi }|tj td}|tj |tj	|  |
|  |tj	|  |
|  ||  ||  |tj	|  |
|  ||  ||  ||  ||  ||  ||  ||  | dddddd	d
ddddg d S )NERRINFDEB)r^   CRITICAL1)r^   ERROR2)r_   ra   3)r_   rc   4)r_   WARNING5)r_   INFO6)r`   ra   7)r`   rc   8)r`   rg   9)r`   ri   10)r`   r,   11)rY   r   r   r+   rc   LoggerAdapterri   r,   logra   errorwarninginfodebugrV   )r8   mr^   r_   r`   r:   r:   r;   	test_flat   sD    

zBuiltinLevelsTest.test_flatc             C   s   | j }td}|tj td}|tj |tj|  ||  |	|  |
|  ||  | ddg d S )Nr_   zINF.ERR)zINF.ERRra   rb   )zINF.ERRrc   rd   )rY   r   r   r+   ri   rc   rq   ra   rr   rs   rt   ru   rV   )r8   rv   r_   INF_ERRr:   r:   r;   test_nested_explicit   s    

z&BuiltinLevelsTest.test_nested_explicitc             C   s   | j }td}|tj td}|tj td}td}td}|tj|  ||  |	|  |
|  |tj|  ||  ||  |	|  |
|  ||  | dddd	d
dg d S )Nr_   zINF.ERRz	INF.UNDEFzINF.ERR.UNDEFUNDEF)z	INF.UNDEFra   rb   )z	INF.UNDEFrc   rd   )z	INF.UNDEFrg   re   )z	INF.UNDEFri   rf   )zINF.ERR.UNDEFra   rh   )zINF.ERR.UNDEFrc   rj   )rY   r   r   r+   ri   rc   rq   ra   rr   rs   rt   ru   rV   )r8   rv   r_   rx   Z	INF_UNDEFZINF_ERR_UNDEFrz   r:   r:   r;   test_nested_inherited   s2    




z'BuiltinLevelsTest.test_nested_inheritedc             C   s   | j }td}td}td}|tj |tj|  ||  |tj|  ||  ||  ||  | 	ddddg d S )Nr_   zINF.BADPARENT.UNDEFzINF.BADPARENT)zINF.BADPARENT.UNDEFra   rb   )zINF.BADPARENT.UNDEFri   rd   )zINF.BADPARENTra   re   )zINF.BADPARENTri   rf   )
rY   r   r   r+   ri   rq   FATALrt   ru   rV   )r8   rv   r_   Z
GRANDCHILDZCHILDr:   r:   r;   test_nested_with_virtual_parent  s     


z1BuiltinLevelsTest.test_nested_with_virtual_parentc             C   s,   |  tdtj |  ttjd d S )Nri   )rI   r   getLevelNameri   )r8   r:   r:   r;   test_regression_223868  s    z'BuiltinLevelsTest.test_regression_22386c             C   s8   t t jd | t jt jd | t t jd d S )Nr   ri   )r   addLevelNameri   
addCleanuprI   r~   )r8   r:   r:   r;   test_regression_29220=  s    z'BuiltinLevelsTest.test_regression_29220c             C   s   t d}| |t j d S )Nr|   )r   r~   rI   r|   )r8   Zfatalr:   r:   r;   test_issue27935C  s    
z!BuiltinLevelsTest.test_issue27935c             C   s`   t t jd | t jt jd | t t jd | t t jd | t dt j d S )Nr   ri   NOTSET)r   r   ri   r   rI   r~   r   )r8   r:   r:   r;   r   G  s
    N)
rZ   r[   r\   rw   ry   r{   r}   r   r   r   r:   r:   r:   r;   r]      s   /#r]   c               @   s$   e Zd Zdd Zdd Zdd ZdS )BasicFilterTestc          	   C   s   t d}| jjd }z||| t d}t d}t d}t d}||   ||   ||   ||   | ddg W d |	| X d S )Nz	spam.eggsr   spamzspam.eggs.fishzspam.bakedbeans)z	spam.eggsri   rd   )zspam.eggs.fishri   re   )
r   Filterr%   r4   	addFilterr   rt   rY   rV   removeFilter)r8   Zfilter_handlerr   	spam_eggsspam_eggs_fishspam_bakedbeansr:   r:   r;   test_filterS  s     





zBasicFilterTest.test_filterc          	   C   s   dd }| j jd }z||| td}td}td}td}||   ||   ||   ||   | dd	g W d || X d S )
Nc             S   s&   | j d}d|d d }|dkS )N.   z	spam.eggs)r9   splitjoin)recordpartsprefixr:   r:   r;   
filterfunco  s    z8BasicFilterTest.test_callable_filter.<locals>.filterfuncr   r   z	spam.eggszspam.eggs.fishzspam.bakedbeans)z	spam.eggsri   rd   )zspam.eggs.fishri   re   )	r%   r4   r   r   r   rt   rY   rV   r   )r8   r   r   r   r   r   r   r:   r:   r;   test_callable_filterk  s     




z$BasicFilterTest.test_callable_filterc             C   s*   t  }t ddi}| || d S )Nr9   z	spam.eggs)r   r   makeLogRecordr7   filter)r8   frr:   r:   r;   test_empty_filter  s    z!BasicFilterTest.test_empty_filterN)rZ   r[   r\   r   r   r   r:   r:   r:   r;   r   O  s   r   x   w   v   u   t   s   r   q   p   o   rW   SilentTaciturnTerseEffusiveSociableVerbose	TalkativeZ	Garrulous
ChatterboxBoringc               @   s   e Zd Zdd ZdS )GarrulousFilterc             C   s
   |j tkS )N)levelno	GARRULOUS)r8   r   r:   r:   r;   r     s    zGarrulousFilter.filterN)rZ   r[   r\   r   r:   r:   r:   r;   r     s   r   c               @   s   e Zd Zdd ZdS )VerySpecificFilterc             C   s   |j ttgkS )N)r   SOCIABLETACITURN)r8   r   r:   r:   r;   r     s    zVerySpecificFilter.filterN)rZ   r[   r\   r   r:   r:   r:   r;   r     s   r   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )CustomLevelsAndFiltersTestz^[\w.]+ -> (\w+): (\d+)$c             C   s0   t |  x t D ]\}}t|| qW d S )N)r   r<   my_logging_levelsitemsr   r   )r8   kvr:   r:   r;   r<     s    
z CustomLevelsAndFiltersTest.setUpc             C   s"   xt D ]}|||   qW d S )N)LEVEL_RANGErq   rY   )r8   loggerZlvlr:   r:   r;   log_at_all_levels  s    
z,CustomLevelsAndFiltersTest.log_at_all_levelsc             C   s2   | j t | | j  | ddddddg d S )N)r   rh   )r   rj   )r   rk   )r   rl   )r   rm   )r   rn   )r%   r+   VERBOSEr   rV   )r8   r:   r:   r;   test_logger_filter  s    z-CustomLevelsAndFiltersTest.test_logger_filterc          	   C   sR   | j jd t z$| | j  | dddddg W d | j jd tj X d S )Nr   )r   rj   )r   rk   )r   rl   )r   rm   )r   rn   )r%   r4   r+   r   r   rV   r   r   )r8   r:   r:   r;   test_handler_filter  s    z.CustomLevelsAndFiltersTest.test_handler_filterc          
   C   s   | j jd }d }t }|| zj| | j  dddddddd	d
g	}| | t }| j | | | j  | |dddddddg  W d |r| j | || X d S )Nr   )r   rb   )r   rd   )r   rf   )r   rh   )r   rj   )r   rk   )r   rl   )r   rm   )r   rn   )r   ro   )r   Z12)r   Z14)r   Z15)r   Z17)r   Z18)r   Z20)r%   r4   r   r   r   rV   r   r   )r8   r   Zspecific_filterZgarrZfirst_linesr:   r:   r;   test_specific_filters  s<    

z0CustomLevelsAndFiltersTest.test_specific_filtersN)	rZ   r[   r\   rF   r<   r   r   r   r   r:   r:   r:   r;   r     s   r   c               @   sZ   e Zd Zdd Zdd Zdd Zeej	dkdd	d
 Z
eeed ddd ZdS )HandlerTestc             C   sD   t  }d|_| |jd d|_| |jd | t|jd  d S )NgenericZanothergeneric)r   Handlerr9   rI   assertRaisesNotImplementedErroremit)r8   rB   r:   r:   r;   	test_name  s    zHandlerTest.test_namec       
      C   s  t jdkr^xdD ]}t \}}t| |s:t| tjj	|dd}|r|j
|j }}| |d | |d tddi}|| t| | tj| || | tj| n| |j
d | |jd |  |rt| qW t jdkrd	}nd
}y4tj|}| |j|j | |j |  W n tk
r\   Y nX xHdD ]@}	|	dkr| ttjjdd|	 ntjdd|	}|  qdW tjd}ti }| || |  tjd}| || |  d S )N)linuxdarwin)TFT)delaymsgZTestr   z/var/run/syslogz/dev/log)GETPOSTPUTr   	localhostz/logr   rW   )sysplatformtempfilemkstemposr=   unlinkr   r4   WatchedFileHandlerdevinorI   r   handleassertFalsepathexistsr7   SysLogHandlerZfacilityZLOG_USERZ
unixsocketOSErrorr   
ValueErrorHTTPHandlerZBufferingHandlerZshouldFlush)
r8   ZexistingfdfnrB   r   r   r   Zsocknamemethodr:   r:   r;   test_builtin_handlers$  sZ    








z!HandlerTest.test_builtin_handlersc             C   s   t  \}}t| t| t|}tj|dfftj	j
|dfftj	j|dfff}tjdkrv|tj	j|dfff7 }x<|D ]4\}}|| }| tj| |  t| q|W d S )NwarB   )r   r   )r   r   r   r=   r   pathlibZPathr   FileHandlerr4   RotatingFileHandlerTimedRotatingFileHandlerr   r   r   r7   r   r   )r8   r   r   ZpfnZcasesclsargsrB   r:   r:   r;   test_path_objectsZ  s    



zHandlerTest.test_path_objectsntz/WatchedFileHandler not appropriate for Windows.c          
      s2   fdd}d}d}d  _ d  _x
dD ] }tdd\}}t| tj|||fd}d|_|	  t
jj||d	}t
d
}	||	 zrxlt|D ]`}
td t
ddi}yt  _ || W q tk
r   td j j f   Y qX qW W d |  |  tj|r(t| X q(W d S )Nc          	      sZ   xTt |D ]H}yt|  t  _W n tk
r:   Y nX tdtdd  q
W d S )NgMbp?r      )	ranger   r   timedeletion_timer   sleeprandomZrandint)ZfnameZtries_)r8   r:   r;   remove_loopt  s    
z*HandlerTest.test_race.<locals>.remove_loopi  )FTz.logztest_logging-3-)targetr   T)r   z'%(asctime)s: %(levelname)s: %(message)sg{Gzt?r   ZtestingzDeleted at %s, opened at %s)Zhandle_timer   r   r   r   r=   	threadingThreadZdaemonstartr   r4   r   r/   r2   r   r   r   r   r   	Exceptionprintr   r   r   r   )r8   r   Z	del_countZ	log_countr   r   r   ZremoverrB   r   r   r   r:   )r8   r;   	test_raceq  s<    	




zHandlerTest.test_raceforkzTest requires os.fork().c       	   	      s  G dd dt j}| tt jd | | jjj d_	| 
tt jd | 
tt jd t d}| |t j t t   fdd}tj|d	d
}|    t }|dkrz|d W d td X n|d    |  t }xL|d t|tj\}}||kr<P t | dkrPP t d qW |d ||krt!|t"j# t|d\}}| $d | j|ddd d S )Nc                   s$   e Zd Z fddZdd Z  ZS )zAHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandlerc                s"   t    tjtddd| _d S )Nz	/dev/nullZwt)r*   )super__init__r   r-   opensub_handler)r8   )	__class__r:   r;   r    s    
zJHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandler.__init__c             S   s,   | j   z| j | W d | j   X d S )N)r  acquirer   release)r8   r   r:   r:   r;   r     s    
zFHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandler.emit)rZ   r[   r\   r  r   __classcell__r:   r:   )r  r;   _OurHandler  s   r	  r   z*because we need at least one for this testrW    test_post_fork_child_no_deadlockc                  sF   t   z.  z   d W d   X W d t   X d S )Ng      ?)r   r   r  setwaitr  r"   r:   )+fork_happened__release_locks_and_end_threadlocks_held__ready_to_forkrefed_hr:   r;   lock_holder_thread_fn  s    zKHandlerTest.test_post_fork_child_no_deadlock.<locals>.lock_holder_thread_fnz,test_post_fork_child_no_deadlock lock holder)r   r9   z#Child process did not deadlock. \o/z&Parent process returned from fork. \o/zWaiting for child process.   g?zDone waiting.zchild process deadlocked.zchild process error)r   )%r   r   rI   rJ   r   r   r  r*   r=   r9   assertGreaterZ_at_fork_reinit_lock_weaksetr   r6   r+   r,   r   Eventr   r   r  r   r   rt   _exitr  r   r   Z	monotonicru   waitpidWNOHANGr   killsignalSIGKILLrM   )	r8   r	  Ztest_loggerr  Zlock_holder_threadpidZ
start_timeZ
waited_pidstatusr:   )r  r  r  r;   r
    sR    







z,HandlerTest.test_post_fork_child_no_deadlockN)rZ   r[   r\   r   r   r   unittestZskipIfr   r9   r   hasattrr
  r:   r:   r:   r;   r     s
   61r   c               @   s   e Zd Zdd ZdS )	BadStreamc             C   s   t dd S )Nzdeliberate mistake)RuntimeError)r8   datar:   r:   r;   write  s    zBadStream.writeN)rZ   r[   r\   r!  r:   r:   r:   r;   r    s   r  c               @   s   e Zd Zdd ZdS )TestStreamHandlerc             C   s
   || _ d S )N)error_record)r8   r   r:   r:   r;   handleError  s    zTestStreamHandler.handleErrorN)rZ   r[   r\   r$  r:   r:   r:   r;   r"    s   r"  c               @   s   e Zd ZejZdZdS )StreamWithIntNamer   N)rZ   r[   r\   r   r   levelr9   r:   r:   r:   r;   r%    s   r%  c               @   s$   e Zd Zdd Zdd Zdd ZdS )StreamHandlerTestc          	   C   s   t t }ti }tj}z|| | |j| tt }t	
 $}|| d}| ||  W d Q R X dt_t	
  }|| | d|  W d Q R X W d |t_X d S )Nz"
RuntimeError: deliberate mistake
Fr   )r"  r  r   r   raiseExceptionsr   assertIsr#  r-   r   captured_stderrassertInrG   rI   )r8   rB   r   Z	old_raisestderrr   r:   r:   r;   test_error_handling  s     






z%StreamHandlerTest.test_error_handlingc             C   sV   t  }t }||}| |tj ||}| || ||}| | d S )N)	r   r-   r(   r)   Z	setStreamr)  r   r,  assertIsNone)r8   rB   r*   oldrR   r:   r:   r;   test_stream_setting  s    


z%StreamHandlerTest.test_stream_settingc             C   s    t t }| t|d d S )Nz<StreamHandler 2 (NOTSET)>)r   r-   r%  rI   repr)r8   rB   r:   r:   r;   'test_can_represent_stream_with_int_name*  s    z9StreamHandlerTest.test_can_represent_stream_with_int_nameN)rZ   r[   r\   r-  r0  r2  r:   r:   r:   r;   r'    s   r'  c               @   s6   e Zd Zdd Zdd Zdd Zdd Zdd
dZd	S )TestSMTPServerc             C   s<   t jj| |d |dd | j d | _|| _d | _|| _d S )NT)mapZdecode_datarW   )	smtpd
SMTPServerr  socketgetsocknameport_handler_threadpoll_interval)r8   addrr   r<  sockmapr:   r:   r;   r  F  s    zTestSMTPServer.__init__c             C   s   |  |||| d S )N)r:  )r8   peermailfromrcpttosr   r:   r:   r;   process_messageN  s    
zTestSMTPServer.process_messagec             C   s0   t j| j| jfd | _}|d |  d S )N)r   r   T)r   r   serve_foreverr<  r;  	setDaemonr   )r8   tr:   r:   r;   r   Z  s    
zTestSMTPServer.startc             C   s   t j|| jd d S )N)r4  )asyncoreZloop_map)r8   r<  r:   r:   r;   rC  c  s    zTestSMTPServer.serve_foreverNc             C   s0   |    t| j| d | _tj| jdd d S )NT)r4  Z
ignore_all)r=   r   join_threadr;  rF  Z	close_allrG  )r8   timeoutr:   r:   r;   stopm  s    zTestSMTPServer.stop)N)rZ   r[   r\   r  rB  r   rC  rJ  r:   r:   r:   r;   r3  1  s
   	
r3  c                   s6   e Zd Zdd Zdd Z fddZd
dd	Z  ZS )ControlMixinc             C   s    d | _ || _|| _t | _d S )N)r;  r<  r:  r   r  ready)r8   r   r<  r:   r:   r;   r    s    zControlMixin.__init__c             C   s0   t j| j| jfd | _}|d |  d S )N)r   r   T)r   r   rC  r<  r;  rD  r   )r8   rE  r:   r:   r;   r     s    
zControlMixin.startc                s   | j   tt| | d S )N)rL  r  r  rK  rC  )r8   r<  )r  r:   r;   rC    s    
zControlMixin.serve_foreverNc             C   s<   |    | jd k	r&t| j| d | _|   | j  d S )N)shutdownr;  r   rH  server_closerL  r?   )r8   rI  r:   r:   r;   rJ    s    
zControlMixin.stop)N)rZ   r[   r\   r  r   rC  rJ  r  r:   r:   )r  r;   rK  {  s   	rK  c               @   s   e Zd ZdddZdd ZdS )	TestHTTPServer      ?FNc                s<   G  fdddt  t| |  t| || || _d S )Nc                   s2   e Zd ZdddZdd Z fddZ  ZS )	z=TestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandlerNc             S   s   | dr| jS t|d S )NZdo_)
startswithprocess_requestAttributeError)r8   r9   defaultr:   r:   r;   __getattr__  s    
zITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.__getattr__c             S   s   | j |  d S )N)serverr:  )r8   r:   r:   r;   rR    s    zMTestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.process_requestc                s   rt  | j|f|  d S )N)r  log_message)r8   formatr   )DelegatingHTTPRequestHandlerr  rq   r:   r;   rW    s    zITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.log_message)N)rZ   r[   r\   rU  rR  rW  r  r:   )rY  rq   )r  r;   rY    s   
rY  )r   r   r  rK  sslctx)r8   r=  r   r<  rq   rZ  r:   )rY  rq   r;   r    s    zTestHTTPServer.__init__c          
   C   sf   y(| j  \}}| jr&| jj|dd}W n4 tk
r\ } ztjd|   W d d }~X Y nX ||fS )NT)Zserver_sidezGot an error:
%s
)r7  ZacceptrZ  Zwrap_socketr   r   r,  r!  )r8   sockr=  er:   r:   r;   get_request  s    zTestHTTPServer.get_request)rP  FN)rZ   r[   r\   r  r]  r:   r:   r:   r;   rO    s    
rO  c                   s*   e Zd ZdZdddZ fddZ  ZS )TestTCPServerT      ?c             C   s2   G dd dt }t| ||| t| || d S )Nc               @   s   e Zd Zdd ZdS )z;TestTCPServer.__init__.<locals>.DelegatingTCPRequestHandlerc             S   s   | j |  d S )N)rV  r:  )r8   r:   r:   r;   r     s    zBTestTCPServer.__init__.<locals>.DelegatingTCPRequestHandler.handleN)rZ   r[   r\   r   r:   r:   r:   r;   DelegatingTCPRequestHandler  s   r`  )r   r   r  rK  )r8   r=  r   r<  bind_and_activater`  r:   r:   r;   r    s    
zTestTCPServer.__init__c                s"   t t|   | j d | _d S )NrW   )r  r^  server_bindr7  r8  r9  )r8   )r  r:   r;   rb    s    zTestTCPServer.server_bind)r_  T)rZ   r[   r\   Zallow_reuse_addressr  rb  r  r:   r:   )r  r;   r^    s    
	r^  c                   s2   e Zd Zd	ddZ fddZ fddZ  ZS )
TestUDPServer      ?Tc                s<   G  fdddt  t| | | t| || d| _d S )Nc                   s&   e Zd Zdd Z fddZ  ZS )z;TestUDPServer.__init__.<locals>.DelegatingUDPRequestHandlerc             S   s   | j |  d S )N)rV  r:  )r8   r:   r:   r;   r     s    zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.handlec                sD   | j  }|r@yt |   W n tk
r>   | jjs: Y nX d S )N)ZwfilerG   r  finishr   rV  _closed)r8   r   )DelegatingUDPRequestHandlerr  r:   r;   re    s    
zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.finish)rZ   r[   r\   r   re  r  r:   )rg  )r  r;   rg    s   rg  F)r
   r	   r  rK  rf  )r8   r=  r   r<  ra  r:   )rg  r;   r  	  s    zTestUDPServer.__init__c                s"   t t|   | j d | _d S )NrW   )r  rc  rb  r7  r8  r9  )r8   )r  r:   r;   rb    s    zTestUDPServer.server_bindc                s   t t|   d| _d S )NT)r  rc  rN  rf  )r8   )r  r:   r;   rN  #  s    zTestUDPServer.server_close)rd  T)rZ   r[   r\   r  rb  rN  r  r:   r:   )r  r;   rc    s    
rc  AF_UNIXc               @   s   e Zd ZejZdS )TestUnixStreamServerN)rZ   r[   r\   r7  rh  address_familyr:   r:   r:   r;   ri  (  s   ri  c               @   s   e Zd ZejZdS )TestUnixDatagramServerN)rZ   r[   r\   r7  rh  rj  r:   r:   r:   r;   rk  +  s   rk  c               @   s    e Zd ZdZdd Zdd ZdS )SMTPHandlerTestg      N@c       
      C   s
  i }t tjdf| jd|}|  tj|jf}tjj|ddd| j	d}| 
|jdg g | _tddi}t | _|| | j| j	 |  | | j  | 
t| jd	 | jd \}}}}	| 
|d | 
|dg | d
|	 | |	d |  d S )Nr   gMbP?meZyouZLog)rI  r   u	   Hello ✓rW   z
Subject: Log
u   

Hello ✓)r3  r   ZHOSTrB  r   r9  r   r4   ZSMTPHandlerTIMEOUTrI   Ztoaddrsmessagesr   r   r  handledr   r  rJ  r7   Zis_setrJ   r+  endswithr=   )
r8   r>  rV  r=  rB   r   r?  r@  rA  r   r:   r:   r;   
test_basic4  s,    


zSMTPHandlerTest.test_basicc             G   s   | j | | j  d S )N)ro  appendrp  r  )r8   r   r:   r:   r;   rB  L  s    zSMTPHandlerTest.process_messageN)rZ   r[   r\   rn  rr  rB  r:   r:   r:   r;   rl  0  s   rl  c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )MemoryHandlerTestz^[\w.]+ -> (\w+): (\d+)$c             C   sF   t |  tjdtj| j| _td| _	d| j	_
| j	| j d S )N
   Zmemr   )r   r<   r   r4   MemoryHandlerrg   r.   mem_hdlrr   
mem_logger	propagater6   )r8   r:   r:   r;   r<   W  s    

zMemoryHandlerTest.setUpc             C   s   | j   t|  d S )N)rw  r=   r   rC   )r8   r:   r:   r;   rC   _  s    
zMemoryHandlerTest.tearDownc             C   s   | j |   | g  | j |   | g  | j |   dddg}| | xndD ]f}x tdD ]}| j |   qlW | | | j |   |dd t||d D  }| | q^W | j |   | | d S )	N)r,   rb   )ri   rd   )rg   re   )r      	   c             S   s   g | ]}d t |fqS )r,   )str).0ir:   r:   r;   
<listcomp>y  s    z0MemoryHandlerTest.test_flush.<locals>.<listcomp>ru  )rx  ru   rY   rV   rt   rs   r   )r8   linesnr~  r:   r:   r;   
test_flushc  s$    




zMemoryHandlerTest.test_flushc             C   s   | j |   | g  | j |   | g  | j | j | j  ddg}| | tj	
dtj| jd| _| j | j | j |   | | | j |   | | | j | j | j  | | d S )N)r,   rb   )ri   rd   ru  F)rx  ru   rY   rV   rt   r>   rw  r=   r   r4   rv  rg   r.   r6   )r8   r  r:   r:   r;   test_flush_on_close  s(    






z%MemoryHandlerTest.test_flush_on_closeN)rZ   r[   r\   rF   r<   rC   r  r  r:   r:   r:   r;   rt  P  s
   rt  c               @   s   e Zd Zdd ZdS )ExceptionFormatterc             C   s   d|d j  S )Nz
Got a [%s]r   )rZ   )r8   Zeir:   r:   r;   formatException  s    z"ExceptionFormatter.formatExceptionN)rZ   r[   r\   r  r:   r:   r:   r;   r    s   r  c               @   s   e Zd ZejZdZdZdZdZe	ddZ
e	ddZd	e  d
 Ze	ddZdZdZdZdZdd Zdd Zdd Ze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+S ),ConfigFileTestz^(\w+) \+\+ (\w+)$aN  
    [loggers]
    keys=root

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=WARNING
    handlers=hand1

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stdout,)

    [formatter_form1]
    format=%(levelname)s ++ %(message)s
    datefmt=
    a  
    [loggers]
    keys=root,parser

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=WARNING
    handlers=

    [logger_parser]
    level=DEBUG
    handlers=hand1
    propagate=1
    qualname=compiler.parser

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stdout,)

    [formatter_form1]
    format=%(levelname)s ++ %(message)s
    datefmt=
    a  
    [loggers]
    keys=root,parser

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=WARNING
    handlers=hand1

    [logger_parser]
    level=DEBUG
    handlers=
    propagate=1
    qualname=compiler.parser

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stdout,)

    [formatter_form1]
    format=%(levelname)s ++ %(message)s
    datefmt=
    z
sys.stdoutz
sys.stboutzformatter=form1zformatter=misspelled_namea  
    [loggers]
    keys=root

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=NOTSET
    handlers=hand1

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stdout,)

    [formatter_form1]
    class=zS.ExceptionFormatter
    format=%(levelname)s:%(name)s:%(message)s
    datefmt=
    zclass=StreamHandlerzclass=logging.StreamHandlerag  
    [loggers]
    keys=root,parser

    [handlers]
    keys=hand1, hand2

    [formatters]
    keys=form1, form2

    [logger_root]
    level=WARNING
    handlers=

    [logger_parser]
    level=DEBUG
    handlers=hand1
    propagate=1
    qualname=compiler.parser

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stdout,)

    [handler_hand2]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stderr,)

    [formatter_form1]
    format=%(levelname)s ++ %(message)s
    datefmt=

    [formatter_form2]
    format=%(message)s
    datefmt=
    a%  
    [loggers]
    keys=root,parser,compiler

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=WARNING
    handlers=hand1

    [logger_compiler]
    level=DEBUG
    handlers=
    propagate=1
    qualname=compiler

    [logger_parser]
    level=DEBUG
    handlers=
    propagate=1
    qualname=compiler.parser

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    kwargs={'stream': sys.stdout,}

    [formatter_form1]
    format=%(levelname)s ++ %(message)s
    datefmt=
    z
    [loggers]
    keys=root

    [handlers]
    keys=file

    [formatters]
    keys=

    [logger_root]
    level=DEBUG
    handlers=file

    [handler_file]
    class=FileHandler
    level=DEBUG
    args=("{tempfile}",)
    z
    [loggers]
    keys=root

    [handlers]
    keys=screen

    [formatters]
    keys=

    [logger_root]
    level=DEBUG
    handlers=screen

    [handler_screen]
    level=DEBUG
    class=StreamHandler
    args=(sys.stdout,)
    formatter=
    c             K   s$   t t|}tjj|f| d S )N)r(   r)   textwrapdedentr   config
fileConfig)r8   confkwargsfiler:   r:   r;   apply_config  s    zConfigFileTest.apply_configc          	   C   sb   t  P}| | j t }||   ||   | j	dg|d | 	g  W d Q R X d S )N)rc   rd   )r*   )
r   captured_stdoutr  config0r   r   rt   rY   rr   rV   )r8   outputr   r:   r:   r;   test_config0_ok  s    
zConfigFileTest.test_config0_okc          	   C   s   t  t}tt| j}t }|	| t
j| t
 }||   ||   | jdg|d | g  W d Q R X d S )N)rc   rd   )r*   )r   r  r(   r)   r  r  r  configparserZConfigParserZ	read_filer   r  r  r   rt   rY   rr   rV   )r8   r  r  Zcpr   r:   r:   r;   test_config0_using_cp_ok  s    

z'ConfigFileTest.test_config0_using_cp_okc          	   C   sd   t  R}| | td}||   ||   | jddg|d | g  W d Q R X d S )Nzcompiler.parser)ri   rb   )rc   rd   )r*   )	r   r  r  r   r   rt   rY   rr   rV   )r8   r  r  r   r:   r:   r;   test_config1_ok  s    


zConfigFileTest.test_config1_okc             C   s   |  t| j| j d S )N)r   r   r  config2)r8   r:   r:   r;   test_config2_failure  s    z#ConfigFileTest.test_config2_failurec             C   s   |  t| j| j d S )N)r   r   r  config3)r8   r:   r:   r;   test_config3_failure  s    z#ConfigFileTest.test_config3_failurec          	   C   s|   t  j}| | j t }y
t W n tk
rF   td Y nX tj	
d | | d | g  W d Q R X d S )Nzjust testingr   z-ERROR:root:just testing
Got a [RuntimeError]
)r   r  r  config4r   r   r  	exceptionr   stdoutseekrI   rG   rV   )r8   r  r   r:   r:   r;   test_config4_ok  s    


zConfigFileTest.test_config4_okc             C   s   | j | jd d S )N)r  )r  config5)r8   r:   r:   r;   test_config5_ok  s    zConfigFileTest.test_config5_okc             C   s   | j | jd d S )N)r  )r  config6)r8   r:   r:   r;   test_config6_ok  s    zConfigFileTest.test_config6_okc          	   C   s&  t  n}| | j td}td}||   ||   |	|   | j
dddg|d | 
g  W d Q R X t  }| | j td}| |j ||   ||   td}||   ||   |	|   | j
dd	d
dg|d | 
g  W d Q R X d S )Nzcompiler.parserzcompiler-hyphenated)ri   rb   )rc   rd   )ra   re   )r*   zcompiler.lexer)ri   rf   )rc   rh   )ri   rj   )rc   rk   )r   r  r  config1ar   r   rt   rY   rr   criticalrV   config7r   r   )r8   r  r   
hyphenatedr:   r:   r;   test_config7_ok  s<    





zConfigFileTest.test_config7_okc          	   C   s   dd }|   X tdd\}}t| tjdkrB|dd}| jj|d}| 	| | 	| W d Q R X t
jjd	 }| ||| d S )
Nc             S   s   |    t| d S )N)r=   r   remove)h1r   r:   r:   r;   cleanup!  s    z/ConfigFileTest.test_config8_ok.<locals>.cleanupz.logztest_logging-X-r   \z\\)r   r   )check_no_resource_warningr   r   r   r=   r9   replaceconfig8rX  r  r   rootr4   r   )r8   r  r   r   r  r   r:   r:   r;   test_config8_ok  s    



zConfigFileTest.test_config8_okc             C   sZ   |  | j td}| |j |  | j | |j | j | jdd | |j d S )NZsome_pristine_loggerF)disable_existing_loggers)r  disable_testr   r   r   r   r7   )r8   r   r:   r:   r;   test_logger_disabling6  s    
z$ConfigFileTest.test_logger_disablingc          
   C   sx   t d }tjddd\}}zFt||d t| t	j
j|tdddd	d
ddidd W d t| X d S )Nat  
            [formatters]
            keys=default

            [formatter_default]

            [handlers]
            keys=console

            [handler_console]
            class=logging.StreamHandler
            args=tuple()

            [loggers]
            keys=root

            [logger_root]
            formatter=default
            handlers=console
            test_logging_z.ini)r   suffixasciirW   Fr   z5%(asctime)s [%(process)d] [%(levelname)s] %(message)sz[%Y-%m-%d %H:%M:%S %z]zlogging.Formatter)rX  datefmtclass)versionr  
formatters)defaults)r  r  stripr   r   r   r!  encoder=   r   r  r  dictr   )r8   Zinir   r   r:   r:   r;   !test_defaults_do_no_interpolation?  s     

z0ConfigFileTest.test_defaults_do_no_interpolationN)rZ   r[   r\   r   r  rF   r  config1r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r:   r:   r:   r;   r    s6     *&+	r  c               @   s<   e Zd ZeZdZdd Zdd Zdd Zdd	 Z	d
d Z
dS )SocketHandlerTest)r   r   c          
   C   s   t |  d  | _ | _| _y$| | j| jd | _}|  W n( t	k
rh } z
|| _d S d }~X Y nX |j
  tjj}t|jtr|d|j| _n||jd | _d| _| j| jjd  | j| j td| _d S )Ng{Gz?r   r   r   )r   r<   rV  	sock_hdlrserver_exceptionserver_classaddresshandle_socketr   r   rL  r  r   r4   ZSocketHandler
isinstanceserver_addressrN   r9  
log_outputr%   r>   r6   r   Z	Semaphorerp  )r8   rV  r\  hclsr:   r:   r;   r<   r  s$    

zSocketHandlerTest.setUpc          	   C   sF   z4| j r | j| j  | j   | jr2| jd W d t|  X d S )Ng       @)r  r%   r>   r=   rV  rJ  r   rC   )r8   r:   r:   r;   rC     s    
zSocketHandlerTest.tearDownc             C   s   |j }x|d}t|dk r P td|d }||}x&t||k r`|||t|  }q<W t|}t|}|  j	|j
d 7  _	| j  qW d S )Nr   z>Lr   
)Z
connectionZrecvrJ   structunpackpickleloadsr   r   r  r   rp  r  )r8   requestZconnchunkslenobjr   r:   r:   r;   r    s    



zSocketHandlerTest.handle_socketc             C   sV   | j r| | j  td}|d | j  |d | j  | | j	d d S )NZtcpr   eggsz
spam
eggs
)
r  skipTestr   r   rr   rp  r  ru   rI   r  )r8   r   r:   r:   r;   test_output  s    




zSocketHandlerTest.test_outputc             C   s   | j r| | j  d| j_| jd ytdW n  tk
rR   | jd Y nX | j	d t

 }| | jj| t
| jj| d  | j	d d S )Ng      @g       @zDeliberate mistakez
Never sentzNever sent, eithergMbP?zNor this)r  r  r  Z
retryStartrV  rJ  r  r%   r  rr   r   r  Z	retryTimer   )r8   nowr:   r:   r;   test_noserver  s    zSocketHandlerTest.test_noserverN)rZ   r[   r\   r^  r  r  r<   rC   r  r  r  r:   r:   r:   r;   r  k  s   r  c              C   s*   t jddd\} }t|  t| |S )Nr  z.sock)r   r  )r   r   r   r=   r  )r   r   r:   r:   r;   _get_temp_domain_socket  s    

r  zUnix sockets requiredc               @   s*   e Zd ZeedreZdd Zdd ZdS )UnixSocketHandlerTestrh  c             C   s   t  | _t|  d S )N)r  r  r  r<   )r8   r:   r:   r;   r<     s    zUnixSocketHandlerTest.setUpc             C   s   t |  t| j d S )N)r  rC   r   r   r  )r8   r:   r:   r;   rC     s    
zUnixSocketHandlerTest.tearDownN)	rZ   r[   r\   r  r7  ri  r  r<   rC   r:   r:   r:   r;   r    s   
r  c               @   s4   e Zd ZeZdZdd Zdd Zdd Zdd	 Z	d
S )DatagramHandlerTest)r   r   c          
   C   s   t |  d  | _ | _| _y$| | j| jd | _}|  W n( t	k
rh } z
|| _d S d }~X Y nX |j
  tjj}t|jtr|d|j| _n||jd | _d| _| j| jjd  | j| j t | _d S )Ng{Gz?r   r   r   )r   r<   rV  r  r  r  r  handle_datagramr   r   rL  r  r   r4   ZDatagramHandlerr  r  rN   r9  r  r%   r>   r6   r   r  rp  )r8   rV  r\  r  r:   r:   r;   r<     s$    

zDatagramHandlerTest.setUpc          	   C   sF   z4| j r| j d | jr2| j| j | j  W d t|  X d S )Ng       @)rV  rJ  r  r%   r>   r=   r   rC   )r8   r:   r:   r;   rC     s    zDatagramHandlerTest.tearDownc             C   sT   t dd}|jt|d  }t|}t|}|  j|j	d 7  _| j
  d S )Nz>Lr   r  )r  packpacketrJ   r  r  r   r   r  r   rp  r  )r8   r  r  r  r  r   r:   r:   r;   r  	  s    

z#DatagramHandlerTest.handle_datagramc             C   s`   | j r| | j  td}|d | j  | j  |d | j  | | j	d d S )NZudpr   r  z
spam
eggs
)
r  r  r   r   rr   rp  r  r?   rI   r  )r8   r   r:   r:   r;   r    s    





zDatagramHandlerTest.test_outputN)
rZ   r[   r\   rc  r  r  r<   rC   r  r  r:   r:   r:   r;   r    s   r  c               @   s*   e Zd ZeedreZdd Zdd ZdS )UnixDatagramHandlerTestrh  c             C   s   t  | _t|  d S )N)r  r  r  r<   )r8   r:   r:   r;   r<   %  s    zUnixDatagramHandlerTest.setUpc             C   s   t |  t| j d S )N)r  rC   r   r   r  )r8   r:   r:   r;   rC   *  s    
z UnixDatagramHandlerTest.tearDownN)	rZ   r[   r\   r  r7  rk  r  r<   rC   r:   r:   r:   r;   r    s   
r  c               @   s4   e Zd ZeZdZdd Zdd Zdd Zdd	 Z	d
S )SysLogHandlerTest)r   r   c          
   C   s   t |  d  | _ | _| _y$| | j| jd | _}|  W n( t	k
rh } z
|| _d S d }~X Y nX |j
  tjj}t|jtr||jd |jf| _n||j| _d| _| j| jjd  | j| j t | _d S )Ng{Gz?r   r   )r   r<   rV  sl_hdlrr  r  r  r  r   r   rL  r  r   r4   r   r  r  rN   r9  r  r%   r>   r6   r   r  rp  )r8   rV  r\  r  r:   r:   r;   r<   5  s$    

zSysLogHandlerTest.setUpc          	   C   sF   z4| j r| j d | jr2| j| j | j  W d t|  X d S )Ng       @)rV  rJ  r  r%   r>   r=   r   rC   )r8   r:   r:   r;   rC   O  s    zSysLogHandlerTest.tearDownc             C   s   |j | _| j  d S )N)r  r  rp  r  )r8   r  r:   r:   r;   r  Z  s    z!SysLogHandlerTest.handle_datagramc             C   s   | j r| | j  td}|d | j  | | jd | j	  d| j
_|d | j  | | jd | j	  d| j
_|d | j  | | jd d S )NZslhu   späms
   <11>späm Fs	   <11>spämu   häm-s   <11>häm-späm)r  r  r   r   rr   rp  r  rI   r  r?   r  Z
append_nulident)r8   r   r:   r:   r;   r  ^  s     








zSysLogHandlerTest.test_outputN)
rZ   r[   r\   rc  r  r  r<   rC   r  r  r:   r:   r:   r;   r  .  s   r  c               @   s*   e Zd ZeedreZdd Zdd ZdS )UnixSysLogHandlerTestrh  c             C   s   t  | _t|  d S )N)r  r  r  r<   )r8   r:   r:   r;   r<   y  s    zUnixSysLogHandlerTest.setUpc             C   s   t |  t| j d S )N)r  rC   r   r   r  )r8   r:   r:   r;   rC   ~  s    
zUnixSysLogHandlerTest.tearDownN)	rZ   r[   r\   r  r7  rk  r  r<   rC   r:   r:   r:   r;   r  q  s   
r  z$IPv6 support required for this test.c                   s0   e Zd ZeZdZ fddZ fddZ  ZS )IPv6SysLogHandlerTest)z::1r   c                s   t j| j_tt|   d S )N)r7  ZAF_INET6r  rj  r  r  r<   )r8   )r  r:   r;   r<     s    
zIPv6SysLogHandlerTest.setUpc                s   t j| j_tt|   d S )N)r7  AF_INETr  rj  r  r  rC   )r8   )r  r:   r;   rC     s    
zIPv6SysLogHandlerTest.tearDown)	rZ   r[   r\   rc  r  r  r<   rC   r  r:   r:   )r  r;   r    s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )HTTPHandlerTestc             C   s   t |  t | _d S )N)r   r<   r   r  rp  )r8   r:   r:   r;   r<     s    
zHTTPHandlerTest.setUpc             C   sr   |j | _ t|j| _| j dkrRy t|jd }|j|| _W n   d | _Y nX |	d |
  | j  d S )Nr   zContent-Length   )commandr   r   log_dataintZheadersZrfilerP   	post_dataZsend_responseZend_headersrp  r  )r8   r  Zrlenr:   r:   r;   handle_request  s    

zHTTPHandlerTest.handle_requestc          	   C   s  t d}| j}|| jjd  xdD ]}d}|rydd l}W n tk
r\   d }Y qX tj	t
}tj|d}||j}|| |j|d}	nd }d }	t|| jd|d | _}
|
  |
j  d	|
j }|o|}t jj|d
||	dd| _d | _|| j xdD ]}|| j_| j  d}|| | j  | | jjd
 | | j | |dkrtt!| jj"}nt!| j#$d}| |d dg | |d dg | |d |g qW | j%d | j| j | j&  q*W d S )NZhttpr   )FT)r   r   zkeycert.pem)Zcafileg{Gz?)rZ  zlocalhost:%dz/frob)foobar)securecontextZcredentials)r   r   u   spämr   zutf-8r9   ZfuncNamer  r   g       @)'r   r   r%   r>   r4   sslImportErrorr   r   dirname__file__r   Z
SSLContextZPROTOCOL_TLS_SERVERZload_cert_chainZcreate_default_contextrO  r  rV  r   rL  r  Zserver_portr   Zh_hdlrr  r6   r   rp  r?   rr   rI   r  r   Zqueryr  decoderJ  r=   )r8   r   r%   r  r=  r  rZ  hereZlocalhost_certr  rV  ZhostZsecure_clientr   r   dr:   r:   r;   r    s\    











zHTTPHandlerTest.test_outputN)rZ   r[   r\   r<   r  r  r:   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	S )

MemoryTestc             C   s   t |  i | _d S )N)r   r<   
_survivors)r8   r:   r:   r;   r<     s    
zMemoryTest.setUpc             G   s2   x,|D ]$}t |t|f}t|| j|< qW d S )N)idr1  weakrefrefr  )r8   r   r  keyr:   r:   r;   _watch_for_survival  s    
zMemoryTest._watch_for_survivalc             C   s`   t   g }x.| j D ] \\}}}| d kr|| qW |r\| dt|d|f  d S )Nz;%d objects should have survived but have been destroyed: %sz, )gcZcollectr  r   rs  rM   rJ   r   )r8   ZdeadZid_repr_r  r:   r:   r;   _assertTruesurvival  s    
zMemoryTest._assertTruesurvivalc             C   s   | j tj td}| | |tj | j |   ||   | 	dg ~| 
  td}||   | 	ddg d S )Nr  )r  r,   rd   )r  r,   re   )r%   r+   r   ri   r   r  r,   ru   rY   rV   r  )r8   r  r  r:   r:   r;   test_persistent_loggers  s    


z"MemoryTest.test_persistent_loggersN)rZ   r[   r\   r<   r  r  r  r:   r:   r:   r;   r    s   r  c               @   s   e Zd Zdd Zdd ZdS )EncodingTestc          	   C   s   t d}tdd\}}t| d}zpt j|dd}|| z|| W d |	| |  X t
|dd}z| |  | W d |  X W d tj|rt| X d S )Ntestz.logztest_logging-1-u   foozutf-8)encoding)r   r   r   r   r   r=   r   r6   rs   r>   r  rI   rP   rstripr   isfiler  )r8   rq   r   r   r   r   r   r:   r:   r;   test_encoding_plain_file  s"    




z%EncodingTest.test_encoding_plain_filec          	   C   s   t d}d}td}d|_t }||d}t |}|| z|	| W d |
| |  X | }| |d d S )Nr  u   до свиданияcp1251stricts    
)r   r   codecs	getwriterr  r(   BytesIOr-   r6   rs   r>   r=   rG   rI   )r8   rq   messageZwriter_classr*   writerr   rU   r:   r:   r;   test_encoding_cyrillic_unicode/  s    






z+EncodingTest.test_encoding_cyrillic_unicodeN)rZ   r[   r\   r  r  r:   r:   r:   r;   r    s   r  c               @   s   e Zd Zdd Zdd ZdS )WarningsTestc          	   C   s   t   td | tjd t jdtd t }t	|}t
d}|| t d || | }|  | |dd t }t d	td
d|d | }|  | |d W d Q R X d S )NTFalways)categoryzpy.warningszI'm warning you...z UserWarning: I'm warning you...
r   Explicitzdummy.py*   z
Dummy linez0dummy.py:42: UserWarning: Explicit
  Dummy line
)warningscatch_warningsr   captureWarningsr   filterwarningsUserWarningr(   r)   r-   r   r6   warnr>   rG   r=   r  findshowwarningrI   )r8   r*   rB   r   rU   Za_filer:   r:   r;   test_warningsG  s(    






zWarningsTest.test_warningsc          	   C   s~   t  l td | tjd td}| |jg  t dt	dd | t
|jd | |jd tj W d Q R X d S )	NTFzpy.warningsr  zdummy.pyr  rW   r   )r  r  r   r  r   r   rI   r4   r  r  rJ   assertIsInstanceNullHandler)r8   r   r:   r:   r;   test_warnings_no_handlers_  s    


z&WarningsTest.test_warnings_no_handlersN)rZ   r[   r\   r  r!  r:   r:   r:   r;   r  E  s   r  c             C   s   t | |S )N)r   r/   )rX  r  r:   r:   r;   
formatFuncm  s    r"  c               C   s   t  S )N)r   r-   r:   r:   r:   r;   handlerFuncp  s    r#  c               @   s   e Zd ZdS )CustomHandlerN)rZ   r[   r\   r:   r:   r:   r;   r$  s  s   r$  c            
   @   s  e Zd ZejZdZddddiiddddd	d
iddgddZddddiiddddd	d
idddgdiddidZddddiiddddd	d
idddiiddgddZddddiidddddd
idddgdiddidZ	ddddiiddddd	d
idddgdiddidZ
ddddiiddddd	d
idddgdiddidZddddiiddddd	d
idddgdiddidZdde d ddiddddd	d
iddgddZdedde d ddeddddddd	d
deidddgddZddddiide d ddd	d
idddgdiddidZddddiide d ddd	ddidddgdiddidZddddiiddddd	d
id ddgdiddidZdd!dddiiddddd	d
iddgdi d"ddid#Zdd$dddiiddddd	d
iddgdi d"ddid#Zddddiiddddd	d
idddgdiddidZdd$dddiiddd%iid&Zdd$ddd%iiddd%iid&Zddddiid'd(diiddddd	d'gd)iddd'gd*iddgdd+Zddddiiddddd	d
id,dd-idddgdiddid.Zdddiiddddd	d
id,dd-idddgdiddid/Zd0dddiiddddd	d
id,dd-idddgdiddid.Zddddiiddddd	d1d2d3d4iddgddZdd5d6d7d8iddd5d9d:d;d5d<dd=d>d?dd@gdAdBidCZdDdE Z dFdG Z!efdHdIZ"dJdK Z#dLdM Z$dNdO Z%dPdQ Z&dRdS Z'dTdU Z(dVdW Z)dXdY Z*dZd[ Z+d\d] Z,d^d_ Z-d`da Z.dbdc Z/ddde Z0dfdg Z1dhdi Z2djdk Z3dldm Z4d{dodpZ5dqdr Z6dsdt Z7dudv Z8dwdx Z9dydz Z:dnS )|ConfigDictTestz^(\w+) \+\+ (\w+)$rW   form1rX  z%(levelname)s ++ %(message)shand1zlogging.StreamHandlerr   zext://sys.stdout)r  	formatterr&  r*   rg   )r&  r4   )r  r  r4   r  zcompiler.parserr,   r&  )r  r  r4   loggersr  zext://sys.stdboutZNTOSETZWRANINGZmisspelled_namez.ExceptionFormatterz"%(levelname)s:%(name)s:%(message)s)z()rX  z.formatFunc)r&  Zform2Zform3z())r'  Zhand2z.CustomHandlerzinvalid parameter name)r  r(  r&  r*   rm   zcompiler.lexerF)compilerzcompiler.lexer)r  r  r  r4   r)  r  Tri   )r  Zincrementalr4   r)  Zfilt1r9   )r  r(  r&  r*   filters)r&  r+  )r  r  r+  r4   r)  r  zcfg://true_formatterszcfg://handler_configs[hand1])r  true_formattershandler_configsr  r4   r)  r  )r,  r-  r  r4   r)  r  r   r  z!
)r  
terminator)r  r(  r&  r*   r   ZmySimpleFormatterz1%(asctime)s (%(name)s) %(levelname)s: %(message)s$)rX  style)r  r&  r(  zlogging.handlers.MemoryHandler   
fileGlobal)r  Zcapacityr(  r   r&  )r2  bufferGlobalmymoduler3  true)r&  r4   ry  )r  r  r4   r)  c             C   s   t j| d S )N)r   r  Z
dictConfig)r8   r  r:   r:   r;   r  
  s    zConfigDictTest.apply_configc          	   C   sb   t  P}| | j t }||   ||   | j	dg|d | 	g  W d Q R X d S )N)rc   rd   )r*   )
r   r  r  r  r   r   rt   rY   rr   rV   )r8   r  r   r:   r:   r;   r  
  s    
zConfigDictTest.test_config0_okc          	   C   sd   t  R}| | td}||   ||   | jddg|d | g  W d Q R X d S )Nzcompiler.parser)ri   rb   )rc   rd   )r*   )	r   r  r  r   r   rt   rY   rr   rV   )r8   r  r  r   r:   r:   r;   r    s    


zConfigDictTest.test_config1_okc             C   s   |  t| j| j d S )N)r   r   r  r  )r8   r:   r:   r;   r    s    z#ConfigDictTest.test_config2_failurec             C   s   |  t| j| j d S )N)r   r   r  config2a)r8   r:   r:   r;   test_config2a_failure  s    z$ConfigDictTest.test_config2a_failurec             C   s   |  t| j| j d S )N)r   r   r  config2b)r8   r:   r:   r;   test_config2b_failure  s    z$ConfigDictTest.test_config2b_failurec             C   s   |  t| j| j d S )N)r   r   r  r  )r8   r:   r:   r;   r    s    z#ConfigDictTest.test_config3_failurec          	   C   st   t  b}| | j y
t W n tk
r>   td Y nX tj	d | 
| d | g  W d Q R X d S )Nzjust testingr   z-ERROR:root:just testing
Got a [RuntimeError]
)r   r  r  r  r  r   r  r   r  r  rI   rG   rV   )r8   r  r:   r:   r;   r  !  s    


zConfigDictTest.test_config4_okc          	   C   st   t  b}| | j y
t W n tk
r>   td Y nX tj	d | 
| d | g  W d Q R X d S )Nzjust testingr   z-ERROR:root:just testing
Got a [RuntimeError]
)r   r  r  config4ar  r   r  r   r  r  rI   rG   rV   )r8   r  r:   r:   r;   test_config4a_ok0  s    


zConfigDictTest.test_config4a_okc             C   s   | j | jd d S )N)r  )r  r  )r8   r:   r:   r;   r  ?  s    zConfigDictTest.test_config5_okc             C   s   |  t| j| j d S )N)r   r   r  r  )r8   r:   r:   r;   test_config6_failureB  s    z#ConfigDictTest.test_config6_failurec          	   C   s   t  T}| | j td}||   ||   | j	ddg|d | 	g  W d Q R X t  j}| | j
 td}| |j td}||   ||   | j	ddg|d | 	g  W d Q R X d S )Nzcompiler.parser)ri   rb   )rc   rd   )r*   zcompiler.lexer)ri   re   )rc   rf   )r   r  r  r  r   r   rt   rY   rr   rV   r  r7   r   )r8   r  r   r:   r:   r;   r  E  s,    




zConfigDictTest.test_config7_okc          	   C   s   t  T}| | j td}||   ||   | j	ddg|d | 	g  W d Q R X t  }| | j
 td}| |j ||   ||   td}||   ||   | j	dddd	g|d | 	g  W d Q R X d S )
Nzcompiler.parser)ri   rb   )rc   rd   )r*   zcompiler.lexer)ri   re   )rc   rf   )ri   rh   )rc   rj   )r   r  r  r  r   r   rt   rY   rr   rV   r  r   r   )r8   r  r   r:   r:   r;   test_config_8_okb  s4    




zConfigDictTest.test_config_8_okc          	   C   s&  t  n}| | j td}td}||   ||   |	|   | j
dddg|d | 
g  W d Q R X t  }| | j td}| |j ||   ||   td}||   ||   |	|   | j
dd	d
dg|d | 
g  W d Q R X d S )Nzcompiler.parserzcompiler-hyphenated)ri   rb   )rc   rd   )ra   re   )r*   zcompiler.lexer)ri   rf   )rc   rh   )ri   rj   )rc   rk   )r   r  r  r  r   r   rt   rY   rr   r  rV   config8ar   r   )r8   r  r   r  r:   r:   r;   test_config_8a_ok  s<    





z ConfigDictTest.test_config_8a_okc          	   C   s   t  }| | j td}||   | jg |d | | j	 ||   | jg |d | | j
 ||   | jdg|d W d Q R X d S )Nzcompiler.parser)r*   )ri   re   )r   r  r  config9r   r   rt   rY   rV   config9aconfig9b)r8   r  r   r:   r:   r;   test_config_9_ok  s    

zConfigDictTest.test_config_9_okc          	   C   s   t  }| | j td}||   td}||   td}||   td}||   | j	ddg|d W d Q R X d S )Nzcompiler.parserr*  zcompiler.lexerzcompiler.parser.codegen)rg   rb   )rc   rf   )r*   )
r   r  r  config10r   r   rs   rY   rr   rV   )r8   r  r   r:   r:   r;   test_config_10_ok  s    




z ConfigDictTest.test_config_10_okc             C   s   |  | j d S )N)r  config11)r8   r:   r:   r;   test_config11_ok  s    zConfigDictTest.test_config11_okc             C   s   |  t| j| j d S )N)r   r   r  config12)r8   r:   r:   r;   test_config12_failure  s    z$ConfigDictTest.test_config12_failurec             C   s   |  t| j| j d S )N)r   r   r  config13)r8   r:   r:   r;   test_config13_failure  s    z$ConfigDictTest.test_config13_failurec          	   C   sh   t  V}| | j tjd }| |jd | |jd t	d | 
| d W d Q R X d S )Nr'  r  z!
ZExclamationzExclamation!
)r   r  r  config14r   r   rI   r  r.  rs   r7   rG   rq  )r8   r  rB   r:   r:   r;   test_config14_ok  s    


zConfigDictTest.test_config14_okc          	   C   s   dd }|   P tdd\}}t| ddd|did	dgid
}| | | | W d Q R X tjjd }| 	||| d S )Nc             S   s   |    t| d S )N)r=   r   r  )r  r   r:   r:   r;   r    s    z0ConfigDictTest.test_config15_ok.<locals>.cleanupz.logztest_logging-X-rW   r  zlogging.FileHandler)r  filenamer4   )r  r4   r  r   )
r  r   r   r   r=   r  r   r  r4   r   )r8   r  r   r   r  r   r:   r:   r;   test_config15_ok  s    


zConfigDictTest.test_config15_okNc          
   C   s   | d}tjd|}|  |j  |j}|j  zt		t	j
t	j}|d |d|f tdt|}|| }d}t|}	x.|	dkr|||d  }
||
7 }|	|
8 }	qW |  W d |jd tj  t|d X d S )Nzutf-8r   g       @r   z>L)r  r   r  Zlistenr   rL  r  r9  r?   r7  r  ZSOCK_STREAMZ
settimeoutZconnectr  r  rJ   sendr=   ZstopListeningr   rH  )r8   textZverifyrE  r9  r[  r  rU   Z	sentsofarleftZsentr:   r:   r;   setup_via_listener  s,    





z!ConfigDictTest.setup_via_listenerc          	   C   s   t  }| t| j td}|| 	  td}|| 	  td}|| 	  td}|
| 	  | jddg|d W d Q R X d S )Nzcompiler.parserr*  zcompiler.lexerzcompiler.parser.codegen)rg   rb   )rc   rf   )r*   )r   r  rS  jsondumpsrD  r   r   rs   rY   rr   rV   )r8   r  r   r:   r:   r;   test_listen_config_10_ok  s    




z'ConfigDictTest.test_listen_config_10_okc          	   C   sl   t  Z}| ttj td}|	| 
  || 
  | jddg|d | g  W d Q R X d S )Nzcompiler.parser)ri   rb   )rc   rd   )r*   )r   r  rS  r  r  r  r  r   r   rt   rY   rr   rV   )r8   r  r   r:   r:   r;   test_listen_config_1_ok1  s    

z&ConfigDictTest.test_listen_config_1_okc          	   C   sb  dd }dd }t d}ttj}t .}| || |	| 
  || 
  W d Q R X | jg |d | jddgd	d
 t 6}| | t d}|	| 
  || 
  W d Q R X | jddg|d | jddgd	d
 t B}| |d d d | t d}|	| 
  || 
  W d Q R X | jddg|d | jddgd	d
 d S )Nc             S   s   d S )Nr:   )stuffr:   r:   r;   verify_failA  s    z6ConfigDictTest.test_listen_verify.<locals>.verify_failc             S   s   | d d d S )Nr   r:   )rX  r:   r:   r;   verify_reverseD  s    z9ConfigDictTest.test_listen_verify.<locals>.verify_reversezcompiler.parser)r*   )ri   rb   )rc   rd   z^[\w.]+ -> (\w+): (\d+)$)rQ   )ri   re   )rc   rf   r   )ri   rh   )rc   rj   )r   r   r  r  r  r  r   r  rS  rt   rY   rr   rV   )r8   rY  rZ  r   Zto_sendr  r:   r:   r;   test_listen_verify?  sN    






z!ConfigDictTest.test_listen_verifyc             C   sB   |  | j tdjd }| |jtj | |jj	tj
 d S )Nr4  r   )r  out_of_orderr   r   r4   r  r   r   r(  _styleStringTemplateStyle)r8   r   r:   r:   r;   test_out_of_order}  s
    
z ConfigDictTest.test_out_of_orderc             C   s   ddddgddddd	d
dgdgdddgd}t j|}| |dd | |dd | |dd | |dd | |dd | |dd |d}| |ddddg | t|jd | t|jd | t|jd d S )N)rW   r      r   bcr\  r`  )r  r   )g)rB   r~  jr   lrv   r  ozcfg://alistp)ZatupleZalistZadictZnest1Znest2Znest3zcfg://atuple[1]r   zcfg://alist[1]zcfg://nest1[1][0]rB   zcfg://nest2[1][1]zcfg://adict.dzcfg://adict[f]zcfg://nest3rW   zcfg://nosuchzcfg://!zcfg://adict[2])	r   r  ZBaseConfiguratorrI   Zconvertpopr   KeyErrorr   )r8   r  Zbcr   r:   r:   r;   test_baseconfig  s$    
zConfigDictTest.test_baseconfig)N);rZ   r[   r\   r   r  rF   r  r  r  r  r6  r8  r  r  r  r"  r#  r:  r  r  r  r  r>  r@  rA  rB  rD  rF  rH  rJ  rL  r\  r  r  r  r  r7  r9  r  r  r;  r  r<  r  r=  r?  rC  rE  rG  rI  rK  rM  rO  rS  rV  rW  r[  r_  rj  r:   r:   r:   r;   r%  v  sh  
















!+	
>r%  c               @   s   e Zd Zdd Zdd ZdS )ManagerTestc                sn   g  G  fdddt j}t d }| t|jt || |d}|d t d | 	 dg d S )Nc                   s   e Zd Zd fdd	ZdS )z6ManagerTest.test_manager_loggerclass.<locals>.MyLoggerNc                s     | d S )N)rs  )r8   r&  r   r   exc_infoextra)loggedr:   r;   _log  s    z;ManagerTest.test_manager_loggerclass.<locals>.MyLogger._log)NN)rZ   r[   r\   ro  r:   )rn  r:   r;   MyLogger  s   rp  r  zshould appear in loggedzshould not appear in logged)
r   LoggerManagerr   	TypeErrorsetLoggerClassr  r   rs   rI   )r8   rp  manr   r:   )rn  r;   test_manager_loggerclass  s    




z$ManagerTest.test_manager_loggerclassc             C   s,   t d }t }|| | |j| d S )N)r   rr  objectsetLogRecordFactoryrI   ZlogRecordFactory)r8   ru  rS   r:   r:   r;   test_set_log_record_factory  s    

z'ManagerTest.test_set_log_record_factoryN)rZ   r[   r\   rv  ry  r:   r:   r:   r;   rk    s   rk  c               @   s   e Zd Zdd ZdS )ChildLoggerTestc             C   s   t  }t d}t d}|d}|d}| |t d | |t d |d}|d}|d}| |t d | |t d | || d S )	Nabczdef.ghiZxyzzuvw.xyzdefZghizabc.defzabc.def.ghi)r   r   ZgetChildr)  )r8   r   l1l2Zc1Zc2Zc3r:   r:   r;   test_child_loggers  s    






z"ChildLoggerTest.test_child_loggersN)rZ   r[   r\   r  r:   r:   r:   r;   rz    s   rz  c               @   s   e Zd ZdS )DerivedLogRecordN)rZ   r[   r\   r:   r:   r:   r;   r    s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )LogRecordFactoryTestc             C   sB   G dd dt j}t|  |t| _| j| j t  | _	d S )Nc               @   s   e Zd Zdd Zdd ZdS )z2LogRecordFactoryTest.setUp.<locals>.CheckingFilterc             S   s
   || _ d S )N)r   )r8   r   r:   r:   r;   r    s    z;LogRecordFactoryTest.setUp.<locals>.CheckingFilter.__init__c             S   s,   t |}|| jk	r(d|| jf }t|dS )Nz)Unexpected LogRecord type %s, expected %sT)typer   rs  )r8   r   rE  r   r:   r:   r;   r     s    

z9LogRecordFactoryTest.setUp.<locals>.CheckingFilter.filterN)rZ   r[   r\   r  r   r:   r:   r:   r;   CheckingFilter  s   r  )
r   r   r   r<   r  r   r%   r   ZgetLogRecordFactoryorig_factory)r8   r  r:   r:   r;   r<     s
    

zLogRecordFactoryTest.setUpc             C   s(   | j | j t|  t| j d S )N)r%   r   r   r   rC   r   rx  r  )r8   r:   r:   r;   rC     s    
zLogRecordFactoryTest.tearDownc             C   s@   |  t| jj|   tt | j|   | 	dg d S )N)r  rc   rd   )
r   rs  r%   rs   rY   r   rx  r  rr   rV   )r8   r:   r:   r;   test_logrecord_class  s    

z)LogRecordFactoryTest.test_logrecord_classN)rZ   r[   r\   r<   rC   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e	e
ejd
ddd Ze	e
ejd
ddd Ze	e
ejd
ddd ZdS )QueueHandlerTestz^[\w.]+ -> (\w+): (\d+)$c             C   s`   t |  td| _tj| j| _d| _t	d| _
d| j
_| j
tj | j
| j d S )Nr   ZqueF)r   r<   queueQueuer   r4   QueueHandlerque_hdlrr9   r   
que_loggerry  r+   rg   r6   )r8   r:   r:   r;   r<     s    
zQueueHandlerTest.setUpc             C   s   | j   t|  d S )N)r  r=   r   rC   )r8   r:   r:   r;   rC     s    
zQueueHandlerTest.tearDownc             C   s   | j |   | tj| jj | j |   | tj| jj |  }| j | | j }| 	t
|tj | |j| j j | |j|jf|d f d S )N)r  ru   rY   r   r  Empty
get_nowaitrt   rs   r7   r  r   	LogRecordrI   r9   r   r   )r8   r   r   r:   r:   r;   test_queue_handler  s    
z#QueueHandlerTest.test_queue_handlerc             C   sx   |   }ttj}d}|j| j||d}t| j}| j	| | j
| | j }| ||j | ||j d S )Nz {name} -> {levelname}: {message})r9   	levelnamer  )rY   r   r~   rg   rX  r9   r/   r0   r  r2   r  rs   r  r  rI   r   r  )r8   r   r  Zlog_format_strZformatted_msgr(  Z
log_recordr:   r:   r;   test_formatting  s    

z QueueHandlerTest.test_formattingQueueListenerz5logging.handlers.QueueListener required for this testc             C   st  t t  }tj| j|}|  z4| j	| 
  | j| 
  | j| 
  W d |  X | |jtjdd | |jtjdd | |jtjdd |  t t  }|tj tjj| j|dd}|  z4| j	| 
  | j| 
  | j| 
  W d |  X | |jtjdd | |jtjdd | |jtjd	d |  d S )
Nrb   )r   r  rd   re   T)Zrespect_handler_levelrf   rh   rj   )r   ZTestHandlerZMatcherr   r4   r  r  r   r  rs   rY   rr   r  rJ  r7   matchesrg   rc   ra   r=   r+   r   )r8   r   listenerr:   r:   r;   test_queue_listener  s4    

z$QueueHandlerTest.test_queue_listenerc          
   C   s   t j| j| j}|  ydd  W n: tk
r` } z|}| jj| 	 |d W d d }~X Y nX |
  | | j  dd d S )NrW   r   )rl  Z	Traceback)r   r4   r  r  r.   r   ZeroDivisionErrorr  r  rY   rJ  rI   r*   rG   r  count)r8   r  r\  excr:   r:   r;   &test_queue_listener_with_StreamHandler6  s    &z7QueueHandlerTest.test_queue_listener_with_StreamHandlerc             C   sd   | j | j | j| j tj| j	| j }|
  | jd |  | | j  d d S )Nrr   zque -> ERROR: error)r  r2   r1   r  r6   r.   r   r4   r  r  r   rr   rJ  rI   r*   rG   r  )r8   r  r:   r:   r;   *test_queue_listener_with_multiple_handlersD  s    z;QueueHandlerTest.test_queue_listener_with_multiple_handlersN)rZ   r[   r\   rF   r<   rC   r  r  r  
skipUnlessr  r   r4   r  r  r  r:   r:   r:   r;   r    s   
"r  r  )patchc               @   sh   e Zd ZdZedd Zeej	j
ddd Zeej	j
ddd Zed	d
 Zdd Zdd ZdS )QueueListenerTest   c             C   s   t d| }|t j t j| }|| t j| }|  |	d |	d |	d |	d |	d |
  || |  d S )Nztest_logger_with_id_%sonetwoZthreeZfourZfive)r   r   r+   r,   r4   r  r6   r  r   rt   rJ  r>   r=   )	log_queuer  r   r   r  r:   r:   r;   setup_and_log]  s    






zQueueListenerTest.setup_and_logr   c             C   sN   x2t | jD ]$}t }| |d|  |f  qW | |jd| j d d S )Nz%s_%sr1  z&correct number of handled log messages)r   repeatr  r  r  r  rI   
call_count)r8   mock_handler~  r  r:   r:   r;   #test_handle_called_with_queue_queueu  s
    z5QueueListenerTest.test_handle_called_with_queue_queuec             C   sh   t d xBt| jD ]4}t }| |d|  |f  |  |	  qW | 
|jd| j d d S )Nzmultiprocessing.synchronizez%s_%sr1  z&correct number of handled log messages)r   import_moduler   r  multiprocessingr  r  r  r=   rH  rI   r  )r8   r  r~  r  r:   r:   r;    test_handle_called_with_mp_queue}  s    
z2QueueListenerTest.test_handle_called_with_mp_queuec             c   s0   yx|   V  qW W n tjk
r*   g S X d S )N)r  r  r  )r  r:   r:   r;   get_all_from_queue  s
    z$QueueListenerTest.get_all_from_queuec             C   s   t d x|t| jD ]n}t }| |d|  |f  t| 	|}|
  |  g tjjjgg}| ||ddd |D   qW d S )Nzmultiprocessing.synchronizez%s_%sz&Found unexpected messages in queue: %sc             S   s"   g | ]}t |tjr|jn|qS r:   )r  r   r  r   )r}  rv   r:   r:   r;   r    s   zJQueueListenerTest.test_no_messages_in_queue_after_stop.<locals>.<listcomp>)r   r  r   r  r  r  r  r  listr  r=   rH  r   r4   r  Z	_sentinelr+  )r8   r~  r  r   rS   r:   r:   r;   $test_no_messages_in_queue_after_stop  s    	
z6QueueListenerTest.test_no_messages_in_queue_after_stopc          	   C   sF   t  }tj|}|  |  | t |	  W d Q R X d S )N)
r  r  r   r4   r  r   rJ  r   r   Z	task_done)r8   r  r  r:   r:   r;   test_calls_task_done_after_stop  s    z1QueueListenerTest.test_calls_task_done_after_stopN)rZ   r[   r\   r  staticmethodr  r  rw  r   r4   r  r  r  r  r  r  r:   r:   r:   r;   r  U  s   r  c               @   s    e Zd Zdd ZeZdd ZdS )UTCc             C   s   t S )N)ZERO)r8   dtr:   r:   r;   	utcoffset  s    zUTC.utcoffsetc             C   s   dS )Nr  r:   )r8   r  r:   r:   r;   tzname  s    z
UTC.tznameN)rZ   r[   r\   r  dstr  r:   r:   r:   r;   r    s   r  c               @   sF   e Zd Zdd ZdddZdd Zdd	 Zd
d Zdd Zdd Z	dS )FormatterTestc          	   C   s0   dt jtjddddd d ddd| _i | _d S )	Nzformatter.testr   toz	dummy.extr  zMessage with %d %s)r   Zplaceholders)r9   r&  pathnamelinenorl  funcr   r   )r   r,   r   r   r   commonvariants)r8   r:   r:   r;   r<     s    
zFormatterTest.setUpNc             C   s,   t | j}|d k	r"|| j|  t|S )N)r  r  r@   r  r   r   )r8   r9   resultr:   r:   r;   
get_record  s    
zFormatterTest.get_recordc             C   s   |   }td}| ||d td}| t|j| | |  td}| 	|  td}| 	|  td}| |  d S )Nz${%(message)s}z${Message with 2 placeholders}z
%(random)sz%(asctime)sz%(asctime)-15sasctime)
r  r   r/   rI   rX  r   ri  r   usesTimer7   )r8   r   r   r:   r:   r;   test_percent  s    




zFormatterTest.test_percentc             C   s   |   }tjddd}| ||d tjddd}| t|j| | |  tjddd}| 	|  tjddd}| 	|  tjddd}| 	|  tjd	dd}| |  d S )
Nz$%{message}%${)r0  z$%Message with 2 placeholders%$z{random}z	{asctime}z{asctime!s:15}z{asctime:15}r  )
r  r   r/   rI   rX  r   ri  r   r  r7   )r8   r   r   r:   r:   r;   test_braces  s    zFormatterTest.test_bracesc             C   s   |   }tjddd}| ||d tjddd}| ||d tjddd}| t|j| | |  tjddd}| 	|  tjd	dd}| |  tjd
dd}| 	|  tjddd}| |  d S )Nz$messager/  )r0  zMessage with 2 placeholdersz$$%${message}%$$z$%Message with 2 placeholders%$z	${random}z
${asctime}z	${asctimez$asctimer  )
r  r   r/   rI   rX  r   ri  r   r  r7   )r8   r   r   r:   r:   r;   test_dollars  s     zFormatterTest.test_dollarsc             C   s   |  ttjd d d d S )Nx)r   r   r   r/   )r8   r:   r:   r;   test_invalid_style
  s    z FormatterTest.test_invalid_stylec          
   C   s   |   }tdddddddt}t|d  |_d|_t	
d}tj|_| ||d	 | ||d
d || | |jd	 d S )Ni  r         r`  r   {   z%(asctime)s %(message)sz1993-04-21 08:03:00,123z%Y:%dz1993:21)r  datetimeutcr   ZmktimeZ
astimezoneZ	timetupleZcreatedZmsecsr   r/   gmtimeZ	converterrI   Z
formatTimerX  r  )r8   r   r  r   r:   r:   r;   	test_time  s    

zFormatterTest.test_time)N)
rZ   r[   r\   r<   r  r  r  r  r  r  r:   r:   r:   r;   r    s   
r  c               @   s   e Zd Zdd Zdd ZdS )TestBufferingFormatterc             C   s   dt | S )Nz[(%d))rJ   )r8   recordsr:   r:   r;   formatHeader  s    z#TestBufferingFormatter.formatHeaderc             C   s   dt | S )Nz(%d)])rJ   )r8   r  r:   r:   r;   formatFooter  s    z#TestBufferingFormatter.formatFooterN)rZ   r[   r\   r  r  r:   r:   r:   r;   r    s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )BufferingFormatterTestc             C   s"   t ddit ddig| _d S )Nr   r  r  )r   r   r  )r8   r:   r:   r;   r<   #  s    zBufferingFormatterTest.setUpc             C   s2   t  }| d|g  | d|| j d S )Nr   Zonetwo)r   BufferingFormatterrI   rX  r  )r8   r   r:   r:   r;   test_default)  s    z#BufferingFormatterTest.test_defaultc             C   sD   t  }| d|| j td}t |}| d|| j d S )Nz[(2)onetwo(2)]z<%(message)s>z[(2)<one><two>(2)])r  rI   rX  r  r   r/   )r8   r   Zlfr:   r:   r;   test_custom.  s
    
z"BufferingFormatterTest.test_customN)rZ   r[   r\   r<   r  r  r:   r:   r:   r;   r  "  s   r  c               @   s   e Zd Zdd ZdS )ExceptionTestc             C   s   | j }t }|| ytdW n   tjddd Y nX || |  |jd }| 	|j
d | 	|j
d | 	|jd | 	|jd	 d S )
Nzdeliberate mistakeZfailedT)
stack_infor   z#Traceback (most recent call last):
z!
RuntimeError: deliberate mistakezStack (most recent call last):
z,logging.exception('failed', stack_info=True))r%   RecordingHandlerr6   r  r   r  r>   r=   r  r7   Zexc_textrQ  rq  r  )r8   r   rB   r:   r:   r;   r  6  s    


zExceptionTest.test_formattingN)rZ   r[   r\   r  r:   r:   r:   r;   r  5  s   r  c               @   s   e Zd Zdd ZdS )LastResortTestc          	   C   s,  | j }|| j tj}tj}zt :}|d | 	|
 d |d | 	|
 d W d Q R X d t_t $}|d d}| 	|
 | W d Q R X t  }|d | 	|
 d W d Q R X d|j_dt_t  }|d | 	|
 d W d Q R X W d || j |t_|t_X d S )NzThis should not appearr   zFinal chance!zFinal chance!
z-No handlers could be found for logger "root"
F)r%   r>   r.   r   Z
lastResortr(  r   r*  ru   rI   rG   rs   r   ZemittedNoHandlerWarningr6   )r8   r  Zold_lastresortZold_raise_exceptionsr,  r   r:   r:   r;   test_last_resortL  s4    








zLastResortTest.test_last_resortN)rZ   r[   r\   r  r:   r:   r:   r;   r  K  s   r  c               @   s   e Zd Zdd Zdd ZdS )FakeHandlerc          	   C   s(   x"dD ]}t | || ||| qW d S )N)r  flushr=   r  )setattrrecord_call)r8   
identifiercalledr   r:   r:   r;   r  t  s    
zFakeHandler.__init__c                s    fdd}|S )Nc                  s     d d S )Nz{} - {})rs  rX  r:   )r  r  method_namer:   r;   innery  s    z&FakeHandler.record_call.<locals>.innerr:   )r8   r  r  r  r  r:   )r  r  r  r;   r  x  s    zFakeHandler.record_callN)rZ   r[   r\   r  r  r:   r:   r:   r;   r  r  s   r  c                   s$   e Zd Z fddZdd Z  ZS )r  c                s   t t| j|| g | _d S )N)r  r  r  r  )r8   r   r  )r  r:   r;   r    s    zRecordingHandler.__init__c             C   s   | j | d S )N)r  rs  )r8   r   r:   r:   r;   r     s    zRecordingHandler.handle)rZ   r[   r\   r  r   r  r:   r:   )r  r;   r  ~  s   r  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  ZS )!ShutdownTestc                s.   t t|   g | _tj}| ttd| d S )Nr(  )r  r  r<   r  r   r(  r   r  )r8   Zraise_exceptions)r  r:   r;   r<     s    zShutdownTest.setUpc                s    fdd}|S )Nc                  s
     d S )Nr:   r:   )rr   r:   r;   r    s    z'ShutdownTest.raise_error.<locals>.innerr:   )r8   rr   r  r:   )rr   r;   raise_error  s    zShutdownTest.raise_errorc             C   sv   t d| j}t d| j}t d| j}ttjj|||g}tjt|d ddddd	d
ddddddg}| || j d S )Nr   rW   r   )handlerListz2 - acquirez	2 - flushz	2 - closez2 - releasez1 - acquirez	1 - flushz	1 - closez1 - releasez0 - acquirez	0 - flushz	0 - closez0 - release)	r  r  r4  r   r  r  rM  r  rI   )r8   Zhandler0Zhandler1Zhandler2r4   rS   r:   r:   r;   test_no_failure  s    zShutdownTest.test_no_failurec             C   sR   t d| j}t||| | tj|g}tjt|d | 	d| jd  d S )Nr   )r  z0 - releaser   )
r  r  r  r  r   r  r  rM  r  rI   )r8   r   rr   r   r4   r:   r:   r;   _test_with_failure_in_method  s
    z)ShutdownTest._test_with_failure_in_methodc             C   s   |  dt d S )Nr  )r  r   )r8   r:   r:   r;   test_with_ioerror_in_acquire  s    z)ShutdownTest.test_with_ioerror_in_acquirec             C   s   |  dt d S )Nr  )r  r   )r8   r:   r:   r;   test_with_ioerror_in_flush  s    z'ShutdownTest.test_with_ioerror_in_flushc             C   s   |  dt d S )Nr=   )r  r   )r8   r:   r:   r;   test_with_ioerror_in_close  s    z'ShutdownTest.test_with_ioerror_in_closec             C   s   |  dt d S )Nr  )r  r   )r8   r:   r:   r;   test_with_valueerror_in_acquire  s    z,ShutdownTest.test_with_valueerror_in_acquirec             C   s   |  dt d S )Nr  )r  r   )r8   r:   r:   r;   test_with_valueerror_in_flush  s    z*ShutdownTest.test_with_valueerror_in_flushc             C   s   |  dt d S )Nr=   )r  r   )r8   r:   r:   r;   test_with_valueerror_in_close  s    z*ShutdownTest.test_with_valueerror_in_closec             C   s   dt _| dt d S )NFr  )r   r(  r  
IndexError)r8   r:   r:   r;   .test_with_other_error_in_acquire_without_raise  s    z;ShutdownTest.test_with_other_error_in_acquire_without_raisec             C   s   dt _| dt d S )NFr  )r   r(  r  r  )r8   r:   r:   r;   ,test_with_other_error_in_flush_without_raise  s    z9ShutdownTest.test_with_other_error_in_flush_without_raisec             C   s   dt _| dt d S )NFr=   )r   r(  r  r  )r8   r:   r:   r;   ,test_with_other_error_in_close_without_raise  s    z9ShutdownTest.test_with_other_error_in_close_without_raisec             C   s   dt _| t| jdt d S )NTr  )r   r(  r   r  r  )r8   r:   r:   r;   +test_with_other_error_in_acquire_with_raise  s    
z8ShutdownTest.test_with_other_error_in_acquire_with_raisec             C   s   dt _| t| jdt d S )NTr  )r   r(  r   r  r  )r8   r:   r:   r;   )test_with_other_error_in_flush_with_raise  s    
z6ShutdownTest.test_with_other_error_in_flush_with_raisec             C   s   dt _| t| jdt d S )NTr=   )r   r(  r   r  r  )r8   r:   r:   r;   )test_with_other_error_in_close_with_raise  s    
z6ShutdownTest.test_with_other_error_in_close_with_raise)rZ   r[   r\   r<   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r:   r:   )r  r;   r    s    	r  c               @   st   e Zd Zdd Zd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jdd Zdd ZdS )ModuleLevelMiscTestc             C   s`   t jjj}| |d | t j| t d | t jjjd t   | t jjjt j d S )Nr   S   )r   r  r   rA   rI   r   ra   )r8   old_disabler:   r:   r;   test_disable  s    

z ModuleLevelMiscTest.test_disableNc                s   g  t | td fdd t }tj| tt|}|d k	rN||d| n
|d| | t|j	d |j	d }| |
 d|  |d k	r|ntt| }| |j| |  g  d S )NbasicConfigc                 s     | |fS )N)rs  )r   kw)r  r:   r;   <lambda>      z/ModuleLevelMiscTest._test_log.<locals>.<lambda>ztest me: %rrW   r   )r   r  r   r  r  r6   r!   rI   rJ   r  Z
getMessageupperr   )r8   r   r&  	recording
log_methodr   Zexpected_levelr:   )r  r;   	_test_log  s    



zModuleLevelMiscTest._test_logc             C   s   |  dtj d S )Nrq   )r  r   rc   )r8   r:   r:   r;   test_log
  s    zModuleLevelMiscTest.test_logc             C   s   |  d d S )Nru   )r  )r8   r:   r:   r;   
test_debug  s    zModuleLevelMiscTest.test_debugc             C   s   |  d d S )Nrt   )r  )r8   r:   r:   r;   	test_info  s    zModuleLevelMiscTest.test_infoc             C   s   |  d d S )Nrs   )r  )r8   r:   r:   r;   test_warning  s    z ModuleLevelMiscTest.test_warningc             C   s   |  d d S )Nrr   )r  )r8   r:   r:   r;   
test_error  s    zModuleLevelMiscTest.test_errorc             C   s   |  d d S )Nr  )r  )r8   r:   r:   r;   test_critical  s    z!ModuleLevelMiscTest.test_criticalc             C   s^   |  ttjt G dd dtj}t| | t | ttj | t tj d S )Nc               @   s   e Zd ZdS )z;ModuleLevelMiscTest.test_set_logger_class.<locals>.MyLoggerN)rZ   r[   r\   r:   r:   r:   r;   rp    s   rp  )r   rs  r   rt  rw  rq  rI   getLoggerClass)r8   rp  r:   r:   r;   test_set_logger_class  s    
z)ModuleLevelMiscTest.test_set_logger_classc          	      s   g  G  fdddt  }t | t d}|  dg t }t |}|| zh|	t j
 |d | |  d |d |d |	t j |d | | d W d || |  t t j X d S )Nc                   s&   e Zd Zdejf fdd	Z  ZS )z@ModuleLevelMiscTest.test_subclass_logger_cache.<locals>.MyLoggerrp  c                s   t  || d d S )Ninitialized)r  r  rs  )r8   r9   r&  )r  r  r:   r;   r  -  s    zIModuleLevelMiscTest.test_subclass_logger_cache.<locals>.MyLogger.__init__)rZ   r[   r\   r   r   r  r  r:   )r  )r  r;   rp  ,  s   rp  Zjust_some_loggerr  Zhellor   r   )r   r  rt  r   rI   r(   r)   r-   r6   r+   r,   ru   rG   r  truncater  ri   r>   r=   rq  )r8   rp  r   r*   rB   r:   )r  r;   test_subclass_logger_cache(  s(    








z.ModuleLevelMiscTest.test_subclass_logger_cachec             C   s8   d}t d|\}}}| }| d| | d| d S )Na&  if 1:
            import logging

            class A:
                def __del__(self):
                    try:
                        raise ValueError("some error")
                    except Exception:
                        logging.exception("exception in __del__")

            a = A()z-czexception in __del__zValueError: some error)r   r  r+  )r8   codercouterrr:   r:   r;   test_logging_at_shutdownG  s
    z,ModuleLevelMiscTest.test_logging_at_shutdownc             C   s8   d}t d|\}}}| }| d| | |d d S )Nzif 1:
            import logging

            def rec():
                logging.error("foo")
                rec()

            rec()z-cz#Cannot recover from stack overflow.rW   )r   r  ZassertNotInrI   )r8   r  r  r  r  r:   r:   r;   test_recursion_errorZ  s
    	z(ModuleLevelMiscTest.test_recursion_error)N)rZ   r[   r\   r  r  r   r  r  r  r  r  r  r
  r   Zrequires_type_collectingr  r  r:   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	S )
LogRecordTestc             C   s6   t i }t|}| |d | |d d S )Nz<LogRecord: >)r   r   r|  r7   rQ  rq  )r8   r   rU   r:   r:   r;   test_str_repk  s    
zLogRecordTest.test_str_repc             C   sj   t  }t }|| ddi}td| | |jd j| | |jd j	d |
| |  d S )NZlessZmorezless is %(less)sr   zless is more)r  r   r   r6   rs   r)  r  r   rI   r  r>   r=   )r8   rB   r   r  r:   r:   r;   test_dict_argq  s    

zLogRecordTest.test_dict_argc             C   s\   t i }| |jd y*dd l}t i }| |j| j W n tk
rV   Y nX d S )NZMainProcessr   )r   r   rI   processNamer  Zcurrent_processr9   r  )r8   r   Zmpr:   r:   r;   test_multiprocessing|  s    

z"LogRecordTest.test_multiprocessingc             C   s   t i }| j}||j ||j ||j ||j t j}t j}t j	}zNdt _dt _dt _	t i }| j
}||j ||j ||j ||j W d |t _|t _|t _	X d S )NF)r   r   assertIsNotNoneZthreadZ
threadNameprocessr  
logThreadslogProcesseslogMultiprocessingr.  )r8   r   ZNOT_NONEZlog_threadsZlog_processesZlog_multiprocessingZNONEr:   r:   r;   test_optional  s,    








zLogRecordTest.test_optionalN)rZ   r[   r\   r  r  r  r  r:   r:   r:   r;   r  j  s   
r  c                   s   e Zd Z fd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 d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Z  ZS )/BasicConfigTestc                sV   t t|   tjj| _tj | _tj	d d  | _
tjj| _| | j g tj_d S )N)r  r  r<   r   r  r4   r   r   r   r   r   r&  r'   r   r  )r8   )r  r:   r;   r<     s    

zBasicConfigTest.setUpc                s@   x,t jjd d  D ]}t j| |  qW tt|   d S )N)r   r  r4   r>   r=   r  r  rC   )r8   rB   )r  r:   r;   rC     s    zBasicConfigTest.tearDownc             C   sJ   t tjd| j tj  tj| j | jtj	d d < tj
| j d S )Nr4   )r  r   r  r4   r   r?   r@   r   r   r   r+   r'   )r8   r:   r:   r;   r    s
    
zBasicConfigTest.cleanupc             C   s   t   | tt jjd t jjd }| |t j | |jt	j
 |j}| |jjt j | |j | |jt j | t jj| j d S )NrW   r   )r   r  rI   rJ   r  r4   r  r-   r*   r   r,  r(  r]  _fmtZBASIC_FORMATr.  r  PercentStyler&  r'   )r8   r   r(  r:   r:   r;   test_no_kwargs  s    zBasicConfigTest.test_no_kwargsc          	   C   sR   t  @}tjtjdd td tjd | |	 
 d W d Q R X d S )Nr  )r*   r0  zLog an errorr   zERROR:root:Log an error)r   r  r   r  r   r  rr   r  rI   rG   r  )r8   r  r:   r:   r;   test_strformatstyle  s    

z#BasicConfigTest.test_strformatstylec          	   C   sR   t  @}tjtjdd td tjd | |	 
 d W d Q R X d S )Nr/  )r*   r0  zLog an errorr   zERROR:root:Log an error)r   r  r   r  r   r  rr   r  rI   rG   r  )r8   r  r:   r:   r;   test_stringtemplatestyle  s    

z(BasicConfigTest.test_stringtemplatestylec             C   s   dd }t jdd | tt jjd t jjd }| |t j t dd}| |jj	|jj	 | |jj
|jj
 | |||d d S )Nc             S   s   |    |   t| d S )N)r=   r   r  )r  h2r   r:   r:   r;   r    s    z.BasicConfigTest.test_filename.<locals>.cleanupztest.log)rN  rW   r   r   )r   r  rI   rJ   r  r4   r  r   r*   moder9   r   )r8   r  r   rS   r:   r:   r;   test_filename  s    zBasicConfigTest.test_filenamec             C   sV   dd }t jddd t jjd }t dd}| |jj|jj | |||d d S )Nc             S   s   |    |   t| d S )N)r=   r   r  )r  r#  r   r:   r:   r;   r    s    z.BasicConfigTest.test_filemode.<locals>.cleanupztest.logwb)rN  filemoder   )	r   r  r  r4   r   rI   r*   r$  r   )r8   r  r   rS   r:   r:   r;   test_filemode  s    zBasicConfigTest.test_filemodec             C   s`   t  }| |j tj|d | ttjj	d tjj	d }| 
|tj | |j| d S )N)r*   rW   r   )r(   r)   r   r=   r   r  rI   rJ   r  r4   r  r-   r*   )r8   r*   r   r:   r:   r;   test_stream  s    zBasicConfigTest.test_streamc             C   s.   t jdd t jjd j}| |jjd d S )Nr  )rX  r   )r   r  r  r4   r(  rI   r]  r  )r8   r(  r:   r:   r;   test_format  s    zBasicConfigTest.test_formatc             C   s,   t jdd t jjd j}| |jd d S )Nr  )r  r   )r   r  r  r4   r(  rI   r  )r8   r(  r:   r:   r;   test_datefmt  s    zBasicConfigTest.test_datefmtc             C   s.   t jdd t jjd j}| |jt j d S )Nr/  )r0  r   )r   r  r  r4   r(  r  r]  r^  )r8   r(  r:   r:   r;   
test_style  s    zBasicConfigTest.test_stylec             C   sT   t jj}| t jj| t jdd | t jjd t jdd | t jjd d S )N9   )r&  :   )r   r  r&  r   r+   r  rI   )r8   	old_levelr:   r:   r;   
test_level  s    zBasicConfigTest.test_levelc             C   sp   | j }t g}tj}|ttjd|d |ttjd|d |ttj||d |ttjtjd tjd dd d S )Nztest.log)rN  r*   )rN  r4   )r*   r4   )Zloglevelr   )rN  r'  )r   r   r-   r   r,  r   r  ri   )r8   r   r4   r*   r:   r:   r;   test_incompatible#  s    



z!BasicConfigTest.test_incompatiblec             C   s   t  t tjt  g}t  }|d | t j|d | |d t jj	d  | |d t jj	d  | |d t jj	d  | 
|d j | 
|d j | |d j| | |d j|d j d S )Nr   )r4   r   rW   )r   r-   r   r  r/   r2   r  r)  r  r4   r  r(  )r8   r4   r   r:   r:   r;   test_handlers2  s    

zBasicConfigTest.test_handlersNc                sf   g  t j fdd}tt d| tt |}|d k	rH||d n|d  di fg d S )Nc                 s<     t jj}t jd t jj|  | |f d S )Nd   )r   r  r&  r+   r   rs  )r   r  r/  )r  old_basic_configr8   r:   r;   my_basic_configH  s
    z2BasicConfigTest._test_log.<locals>.my_basic_configr  ztest mer:   )r   r  r   r  r!   rI   )r8   r   r&  r5  r  r:   )r  r4  r8   r;   r  C  s    
zBasicConfigTest._test_logc             C   s   |  dtj d S )Nrq   )r  r   rg   )r8   r:   r:   r;   r   Z  s    zBasicConfigTest.test_logc             C   s   |  d d S )Nru   )r  )r8   r:   r:   r;   r  ]  s    zBasicConfigTest.test_debugc             C   s   |  d d S )Nrt   )r  )r8   r:   r:   r;   r  `  s    zBasicConfigTest.test_infoc             C   s   |  d d S )Nrs   )r  )r8   r:   r:   r;   r  c  s    zBasicConfigTest.test_warningc             C   s   |  d d S )Nrr   )r  )r8   r:   r:   r;   r  f  s    zBasicConfigTest.test_errorc             C   s   |  d d S )Nr  )r  )r8   r:   r:   r;   r  i  s    zBasicConfigTest.test_critical)N)rZ   r[   r\   r<   rC   r  r   r!  r"  r%  r(  r)  r*  r+  r,  r0  r1  r2  r  r   r  r  r  r  r  r  r:   r:   )r  r;   r    s,   	


r  c                   sL   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	  Z
S )LoggerAdapterTestc                s   t t|   tjd d   t | _tj| _| j	| j | 
| jj| j | 
| jj  fdd}| 
| | 
tj tj| jd d| _d S )Nc                  s    t jd d < d S )N)r   r   r:   )old_handler_listr:   r;   r  x  s    z(LoggerAdapterTest.setUp.<locals>.cleanup)r   rm  )r  r6  r<   r   r   r  r  r  r   r6   r   r>   r=   rM  rp   adapter)r8   r  )r  )r7  r;   r<   n  s    
zLoggerAdapterTest.setUpc          
   C   s   d}d }ydd  W n6 t k
rJ } z|}| j|| j W d d }~X Y nX | t| jjd | jjd }| |jtj	 | |j
| | |j| jf | |j|j||jf d S )Nztesting exception: %rrW   r   )r  r8  r  r  rI   rJ   r  r   r   rc   r   r   rl  r  __traceback__)r8   r   r  r\  r   r:   r:   r;   test_exception  s    "z LoggerAdapterTest.test_exceptionc          
   C   s   ydd  W n& t k
r2 } z|}W d d }~X Y nX | jjd|d | t| jjd | jjd }| |j|j||j	f d S )NrW   r   zexc_info test)rl  )
r  r8  r  rI   rJ   r  r  rl  r  r9  )r8   r\  r  r   r:   r:   r;   test_exception_excinfo  s    z(LoggerAdapterTest.test_exception_excinfoc             C   sh   d}| j || j | t| jjd | jjd }| |jtj | |j	| | |j
| jf d S )Nzcritical test! %rrW   r   )r8  r  r  rI   rJ   r  r   r   ra   r   r   )r8   r   r   r:   r:   r;   r    s    zLoggerAdapterTest.test_criticalc             C   sD   | j jjj}d| j jj_| t| j jjd| | | j d d S )N!   rA       )r8  r   r   rA   r   r  r   isEnabledFor)r8   r  r:   r:   r;   test_is_enabled_for  s
    z%LoggerAdapterTest.test_is_enabled_forc             C   sR   |  | j  x| jjD ]}| j| qW | | j  | | j  d S )N)r7   r8  r3   r   r4   r>   r   )r8   r   r:   r:   r;   test_has_handlers  s
    z#LoggerAdapterTest.test_has_handlersc             C   sL  G dd dt j}d}|| jd d}||d d}d|_| t|t| |t j|| j | t	| jj
d | jj
d }| |jt j | |jd|  | |j| jf |j}| |j| | | jj| t }z6||_| |j| | |j| | | jj| W d ||_X | |j| | |j| | | jj| d S )	Nc               @   s   e Zd ZdZdd ZdS )z.LoggerAdapterTest.test_nested.<locals>.AdapterAdapterc             S   s   | j  d| |fS )N )r   )r8   r   r  r:   r:   r;   r    s    z6LoggerAdapterTest.test_nested.<locals>.Adapter.processN)rZ   r[   r\   r   r  r:   r:   r:   r;   rA    s   rA  zAdapters can be nested, yo.)r   rm  ZAdapterAdapterrW   r   zAdapter AdapterAdapter )r   rp   r   r   rI   r1  rq   ra   r  rJ   r  r   r   r   r   r)  rw  )r8   rA  r   r8  Zadapter_adapterr   Zorig_managerZtemp_managerr:   r:   r;   test_nested  s2    zLoggerAdapterTest.test_nested)rZ   r[   r\   r<   r:  r;  r  r?  r@  rC  r  r:   r:   )r  r;   r6  m  s   
	r6  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  ZS )
LoggerTestc                sb   t t|   t | _tjdd| _| j| j | 	| jj
| j | 	| jj | 	tj d S )NZblah)r9   )r  rD  r<   r  r  r   rq  r   r6   r   r>   r=   rM  )r8   )r  r:   r;   r<     s    zLoggerTest.setUpc             C   s   |  t| jjt  d S )N)r   rs  r   r+   rw  )r8   r:   r:   r;   test_set_invalid_level  s    z!LoggerTest.test_set_invalid_levelc          
   C   s   d}d }ydd  W n6 t k
rJ } z|}| j|| j W d d }~X Y nX | t| jjd | jjd }| |jtj	 | |j
| | |j| jf | |j|j||jf d S )Nztesting exception: %rrW   r   )r  r   r  r  rI   rJ   r  r   r   rc   r   r   rl  r  r9  )r8   r   r  r\  r   r:   r:   r;   r:    s    "zLoggerTest.test_exceptionc          	   C   s2   t tdd | t| jjdd W d Q R X d S )Nr(  Trn   ztest message)r   	swap_attrr   r   rs  r   rq   )r8   r:   r:   r;   !test_log_invalid_level_with_raise  s    z,LoggerTest.test_log_invalid_level_with_raisec          	   C   s,   t tdd | jdd W d Q R X d S )Nr(  Frn   ztest message)r   rF  r   r   rq   )r8   r:   r:   r;   test_log_invalid_level_no_raise  s    z*LoggerTest.test_log_invalid_level_no_raisec                sP   g  t | tjd fdd | jjdd | t d | d d  d S )	Nprint_stackc                s     | S )N)rs  rG   )r   r  )r  r:   r;   r    r  z=LoggerTest.test_find_caller_with_stack_info.<locals>.<lambda>T)r  rW   zStack (most recent call last):
r   )r   r  r   	tracebackr   Z
findCallerrI   rJ   )r8   r:   )r  r;    test_find_caller_with_stack_info   s    z+LoggerTest.test_find_caller_with_stack_infoc             C   s   d}d}d  } } } } } }}	t |||||||||		}
xFdt|
j  D ]0}|di}| jt| jj|||||||||	d qRW d S )Nz	my record   )r  r  z
some value)rm  sinfo)	r   Z_logRecordFactoryrN   __dict__keysr   ri  r   
makeRecord)r8   r9   r&  r   lnor   r   rl  r  rM  rvr  rm  r:   r:   r;   %test_make_record_with_extra_overwrite
  s    

z0LoggerTest.test_make_record_with_extra_overwritec             C   s\   d}d}d  } } } } } }}	ddi}
| j j||||||||
|	d	}| d|j d S )Nz	my recordrL  Z	valid_keyz
some value)rm  rM  )r   rP  r+  rN  )r8   r9   r&  r   rQ  r   r   rl  r  rM  rm  r  r:   r:   r;   (test_make_record_with_extra_no_overwrite  s    z3LoggerTest.test_make_record_with_extra_no_overwritec             C   sB   |  | j  x| jjD ]}| j| qW | | j  d S )N)r7   r   r3   r4   r>   r   )r8   r   r:   r:   r;   r@     s    zLoggerTest.test_has_handlersc             C   s"   t d}d|_| |  d S )Nz
blah.childF)r   r   ry  r   r3   )r8   Zchild_loggerr:   r:   r;   test_has_handlers_no_propagate'  s    
z)LoggerTest.test_has_handlers_no_propagatec             C   s>   | j jj}d| j j_| t| j jd| | | j d d S )N   rA      )r   r   rA   r   r  r   r>  )r8   r  r:   r:   r;   r?  ,  s    

zLoggerTest.test_is_enabled_forc             C   s   t  }| |t j | |t d  | |t d | |t dj | |t dj | |t dj | |t d | |t dj d S )Nr   r  zfoo.bar )r   r   r)  r  parentZassertIsNot)r8   r  r:   r:   r;   test_root_logger_aliases2  s    z#LoggerTest.test_root_logger_aliasesc             C   s$   |  ttjt |  ttjd d S )Ns   foo)r   rs  r   r   any)r8   r:   r:   r;   test_invalid_names>  s    zLoggerTest.test_invalid_namesc             C   sV   xPt tjd D ]>}x8dD ]0}t|}t||}t|}| || qW qW d S )NrW   )r   r  r  zfoo.barzbaz.bar)r   r  ZHIGHEST_PROTOCOLr   r   rU  r  r)  )r8   protor9   r   rU   Z	unpickledr:   r:   r;   test_picklingB  s    


zLoggerTest.test_picklingc             C   s6  | j }td}td}|tj | | tj | |ji  | |	tj | 
|	tj | |jtjdtjdi | |ji  | |	tj | |ji  | |	tj | |jtjdi |tj | | tj | |ji  | 
|	tj |tj | | tj | |ji  | |ji  | |ji  | 
|	tj | |	tj | 
|	tj | |	tj | |	tj t  | | tj | |ji  | |ji  | |ji  | 
|	tj | 
|	tj | 
|	tj d S )Nr{  zabc.defTF)r%   r   r   r+   rc   rI   r&   _cacher7   r>  r   r,   ra   r   rA   )r8   r  r#   r$   r:   r:   r;   test_cachingJ  sH    

zLoggerTest.test_caching)rZ   r[   r\   r<   rE  r:  rG  rH  rK  rS  rT  r@  rU  r?  rZ  r\  r^  r`  r  r:   r:   )r  r;   rD    s   	
	rD  c               @   s$   e Zd Zdd Zdd Zdd ZdS )BaseFileTestc             C   s0   t |  tdd\}| _t| g | _d S )Nz.logztest_logging-2-)r   r<   r   r   r   r   r=   rmfiles)r8   r   r:   r:   r;   r<     s    

zBaseFileTest.setUpc             C   sB   x| j D ]}t| qW tj| jr4t| j t|  d S )N)rb  r   r   r   r   r   r   rC   )r8   r   r:   r:   r;   rC     s
    zBaseFileTest.tearDownc             C   s*   | j tj|d| d | j| d S )NzLog file %r does not exist)r   )r7   r   r   r   rb  rs  )r8   rN  r:   r:   r;   assertLogFile  s    zBaseFileTest.assertLogFileN)rZ   r[   r\   r<   rC   rc  r:   r:   r:   r;   ra    s   ra  c               @   s   e Zd Zdd ZdS )FileHandlerTestc             C   sx   t | j tj| jdd}| |j | t j	| j |
ti  | |j | t j	| j |  d S )NT)r   )r   r   r   r   r   r.  r*   r   r   r   r   r   r  r7   r=   )r8   fhr:   r:   r;   
test_delay  s    zFileHandlerTest.test_delayN)rZ   r[   r\   rf  r:   r:   r:   r;   rd    s   rd  c               @   sB   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zej	dd Z
dS )RotatingFileHandlerTestc          
   C   s   t dt jdd|  d d d S )Nr  rg  rW   )r   r  r,   rY   )r8   r:   r:   r;   next_rec  s    z RotatingFileHandlerTest.next_recc             C   s.   t jj| jdd}| |d  |  d S )Nr   )maxBytes)r   r4   r   r   r   shouldRolloverr=   )r8   rhr:   r:   r;   test_should_not_rollover  s    z0RotatingFileHandlerTest.test_should_not_rolloverc             C   s2   t jj| jdd}| ||   |  d S )NrW   )ri  )r   r4   r   r   r7   rj  rh  r=   )r8   rk  r:   r:   r;   test_should_rollover  s    z,RotatingFileHandlerTest.test_should_rolloverc             C   s4   t j| j}||   | | j |  d S )N)r   r4   r   r   r   rh  rc  r=   )r8   rk  r:   r:   r;   test_file_created  s    z)RotatingFileHandlerTest.test_file_createdc             C   s   dd }t jj| jddd}||_||   | | j ||   | || jd  ||   | || jd  | t	j
|| jd  |  d S )	Nc             S   s   | d S )Nz.testr:   )r9   r:   r:   r;   namer  s    z>RotatingFileHandlerTest.test_rollover_filenames.<locals>.namerr   rW   )backupCountri  z.1z.2z.3)r   r4   r   r   ro  r   rh  rc  r   r   r   r   r=   )r8   ro  rk  r:   r:   r;   test_rollover_filenames  s    z/RotatingFileHandlerTest.test_rollover_filenamesc          	   C   s  dd }dd }t jj| jddd}||_||_|  }|| | | j |  }|| || jd }| | t	j
}t|d	0}| }	t|	}
| |
d
|j|  W d Q R X ||   || jd }| | t|d	0}| }	t|	}
| |
d
|j|  W d Q R X ||   || jd }t|d	0}| }	t|	}
| |
d
|j|  W d Q R X | t	j|| jd  |  d S )Nc             S   s   | d S )Nz.gzr:   )r9   r:   r:   r;   ro    s    z3RotatingFileHandlerTest.test_rotator.<locals>.namerc          
   S   sX   t | d:}| }t|d}t |d}|| W d Q R X W d Q R X t|  d S )Nrbr{  r&  )r  rP   zlibcompressr!  r   r  )sourcedestZsfr   
compressedZdfr:   r:   r;   rotator  s    z5RotatingFileHandlerTest.test_rotator.<locals>.rotatorr   rW   )rp  ri  z.1rr  r  z.2z.3)r   r4   r   r   rx  ro  rh  r   rc  r   linesepr  rP   rs  Z
decompressrI   r  r   r   r   r   r=   )r8   ro  rx  rk  Zm1Zm2r   newliner   rw  r   r:   r:   r;   test_rotator  sB    



"

"
"z$RotatingFileHandlerTest.test_rotatorN)rZ   r[   r\   rh  rl  rm  rn  rq  r   Zrequires_zlibr{  r:   r:   r:   r;   rg    s   rg  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TimedRotatingFileHandlerTestc          
      s  t jj| jddd}t d}|| t ddi}|| | | j t	
d t ddi}|| |  d	}tj }d
}xNt|D ]B}|tj|d }	| j|	d  tj }|r| j  P qW d| }
|stj| j\}  fddt|D }td|d tjd td| tjd xJ|D ]B}td|  tj||}t|d}t|  W d Q R X q@W | j||
d d S )NSrW   )rp  z%(asctime)s %(message)sr   ztesting - initialg?ztesting - after delayFi,  )secondsz.%Y-%m-%d_%H-%M-%Sz,No rotated files found, went back %d secondsc                s   g | ]}|  r|qS r:   )rQ  )r}  r   )r   r:   r;   r    s    z>TimedRotatingFileHandlerTest.test_rollover.<locals>.<listcomp>zTest time: %sz%Y-%m-%d %H-%M-%S)r  zThe only matching files are: %szContents of %s:r   )r   )r   r4   r   r   r/   r2   r   r   rc  r   r   r=   r  r  r   	timedeltaZstrftimer   r   r   rb  rs  r   listdirr   r   r,  r   r  rP   r7   )r8   re  ZfmtZr1Zr2foundr  GO_BACKsecsprevr   Zdnfilesr   r   Ztfr:   )r   r;   test_rollover  sB    






z*TimedRotatingFileHandlerTest.test_rolloverc             C   sR   | j }|ttjj| jddd |ttjj| jddd |ttjj| jddd d S )NXT)r   WZW7)r   r   r   r4   r   r   )r8   r   r:   r:   r;   test_invalid%  s    


z)TimedRotatingFileHandlerTest.test_invalidc             C   sx   d}t ddd}tjj| jdddd|d}z<||}| ||d  ||d }| ||d	  W d |  X d S )
Nr      MIDNIGHTrW   T)whenintervalrp  r  atTimei  iж  i@ )	r  r   r   r4   r   r   computeRolloverrI   r=   )r8   currentTimer  rk  rR   r:   r:   r;   "test_compute_rollover_daily_attime.  s    
z?TimedRotatingFileHandlerTest.test_compute_rollover_daily_attimec       	   	   C   s6  t t }||d  }tddd}t|j}xtdD ]}tjj| j	d| ddd|d}z||krvd| | }n|| }|d9 }|d	7 }||7 }|
|}||krtd
tj  tdt   | || ||kr|d7 }|
|d }||krtd
tj  tdt   | || W d |  X q<W d S )NiQ r  r   r  zW%drW   T)r  r  rp  r  r  i  zfailed in timezone: %dzlocal vars: %si:	 iж  )r  r   r  r  Ztm_wdayr   r   r4   r   r   r  r   ZtimezonelocalsrI   r=   )	r8   r  Ztodayr  ZwdayZdayrk  rS   rR   r:   r:   r;   #test_compute_rollover_weekly_attime>  s8    

z@TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attimeN)rZ   r[   r\   r  r  r  r  r:   r:   r:   r;   r|    s   *	r|  c              K   s   t jf | t jdd S )NrW   )r~  )r  r  )r  r:   r:   r;   r  g  s    r  )r}  rW   )M<   )Hi  )DiQ )r  iQ ZW0r      )ZdaysZhoursc             C   sR  t jj| j|dddd}d}||}||kr:|dkr:y|jrNt|}n
t|}|d }|d }|d	 }	t jj	|d
 | d
 |	  }
||
 }t
d||jf tjd t
d| tjd t
d| tjd t
d|	 tjd t
d|
 tjd t
d| tjd W n0 tk
r8   t
dt d  tjd Y nX | || |  d S )NrW   r   T)r  r  rp  r  g        r  r`  r   r1  r  z
t: %s (%s))r  zcurrentHour: %szcurrentMinute: %szcurrentSecond: %szr: %sz
result: %sz exception in diagnostic code: %s)r   r4   r   r   r  r  r   r  Z	localtimeZ	_MIDNIGHTr   r   r,  r   rl  rI   r=   )r8   r  exprk  r  rR   rE  ZcurrentHourZcurrentMinuteZcurrentSecondr   r  r:   r:   r;   test_compute_rolloverr  s6    



 r  ztest_compute_rollover_%sz>win32evtlog/win32evtlogutil/pywintypes required for this test.c               @   s   e Zd Zdd ZdS )NTEventLogHandlerTestc          
   C   s
  d}t d |}t |}ytjd}W n: tjk
rd } z|jdkrRt	
d W d d }~X Y nX tddi}|| |  | |t | t jt jB }d}d}	t |||	}
x4|
D ],}|jdkrqt||}|d	krqd
}P qW d|	 }| j||d d S )NZApplicationZtest_loggingr1  z#Insufficient privileges to run testr   zTest Log MessageFr3  zTest Log Message
Tz3Record not found in event log, went back %d records)r   )win32evtlogZOpenEventLogZGetNumberOfEventLogRecordsr   r4   ZNTEventLogHandler
pywintypesrr   Zwinerrorr  ZSkipTestr   r   r=   Z
assertLessZEVENTLOG_BACKWARDS_READZEVENTLOG_SEQUENTIAL_READZReadEventLogZ
SourceNamewin32evtlogutilZSafeFormatMessager7   )r8   ZlogtypeZelhZnum_recsrB   r\  r   flagsr  r  Zeventsr   r:   r:   r;   rr    s8    





z NTEventLogHandlerTest.test_basicN)rZ   r[   r\   rr  r:   r:   r:   r;   r    s   r  c               @   s   e Zd Zdd ZdS )MiscTestCasec             C   s2   ddddddddd	d
dddh}t j| t|d d S )Nr  r  r  Zcurrentframer  ZStrFormatStyler^  ZFiltererZPlaceHolderrr  Z
RootLoggerr  r   )	blacklist)r   Zcheck__all__r   )r8   r  r:   r:   r;   test__all__  s    zMiscTestCase.test__all__N)rZ   r[   r\   r  r:   r:   r:   r;   r    s   r  LC_ALLr   c           '   C   sv   t ttttttttt	t
tttttttttttttttttttttt t!t"t#t$t%t&g'} t't(j)drh| *t+ t,j-|   d S )Nr  ).r]   r   r   r   rt  r  r  r  r  r  r  r%  rk  r  r  r'  r  rz  r  r  r  r  r6  rD  rl  rd  rg  r  r  r  r  r  r  r  r|  r  r  r  r  r  r   r4   rs  r  r   Zrun_unittest)Ztestsr:   r:   r;   	test_main  s    
r  __main__)N)r   Zlogging.handlersZlogging.configr  r  r  r   r  r(   r  rT  r   r  r   rD   r  r7  r  r   r   Ztest.support.script_helperr   r   r  r   r  r   r   r  r  r  rF  Zhttp.serverr   r   r5  Zurllib.parser   r   Zsocketserverr	   r
   r   r   r  r  r  r  rs  ZTestCaser   r]   r   ZSILENTr   ZTERSEZEFFUSIVEr   r   Z	TALKATIVEr   Z
CHATTERBOXZBORINGr   r   r   r   r   r   r   r   rw  r  r-   r"  r%  r'  r6  r3  rK  rO  r^  rc  r  ri  rk  rl  rt  r/   r  r  r  r  r  r  r  r  r  r  ZIPV6_ENABLEDr  r  r  r  r  r"  r#  r$  r%  rk  rz  r  r  r  r  r4   r  Zunittest.mockr  r  r  r  Ztzinfor  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r6  rD  ra  rd  rg  r|  r  r  r  r  r  r  r  Zrun_with_localer  rZ   r:   r:   r:   r;   <module>   sJ  m FY _,J5)/ N   JY@CM41(
        ,#i`
	Y'W 5 Ol +Tn!#
