
    Bdu                     <   d Z dZd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 ddlmZ ddlmZmZmZmZ dd	lmZmZ dd
lmZ ddlmZ ddlm Z  ddl!m!Z!  ed          Z"dZ#ej$        %                    dd          Z&e&s8ej'        (                    ej'        )                    dd                    rdZ&ndZ&ej'        (                    ej'        )                    e&d                    Z* ej+        dej'        ,                    ej'        ,                    ej'        ,                    ej'        -                    e.                                                    G d dej/                  Z0d2dZ1d Z2 G d de0          Z3d Z4d Z5d Z6d Z7ej$        %                    d d          Z8d! Z9d" Z:d3d#Z;ddl<Z<ddl=Z= e>ej?        d$          sd4d%Z@e@ej?        _@        d&d'eAdfd(ZBeBej?        _B         e>ej?        d)          sd* ZCeCej?        _D        	 d4d,ZEeEej?        _E        d4d-ZFeFej?        _F        ej?        jG        ZHd. ZIej?        jJ        ZKd/ ZLeIej?        _G        eLej?        _J         G d0 d1ej?                  ZMejN        ZNdS )5zYaroslav Halchenkoz%Copyright (c) 2013 Yaroslav HalchenkoGPL    N)StringIOwraps   )	getLoggerstr2LogLevelgetVerbosityFormat
uni_decode)IPAddrDNSUtils)MyTime)Utils)asyncserver)versionfail2bani BFAIL2BAN_CONFIG_DIRconfigzfail2ban.confz/etc/fail2ban
PYTHONPATHc                       e Zd Zd ZdS )DefaultTestOptionsc                 *    d d dd d dddddd
| _         d S )NTF)
	log_level	verbositylog_lazylog_tracebackfull_tracebackfast	memory_dbno_gamin
no_network	negate_re)__dict__selfs    6/usr/lib/python3/dist-packages/fail2ban/tests/utils.py__init__zDefaultTestOptions.__init__H   s,    4TDu%U	 $---    N)__name__
__module____qualname__r'    r(   r&   r   r   G   s#            r(   r    c                     t           j        }t          j        dt          j        d         z  | z   dt
          z             }|                     |dddd d	           |d
ddd d           |dddt          d d           |ddddd           |ddddd           |dddd d!           |d"d#dd$d%           |d&d'dd(d)           |d*d+dd,d-           |d.d/dd01           |d2dd31          g           |S )4Nz%s [OPTIONS] [regexps]
r   z%prog )usager   z-lz--log-levelr   z4Log level for the logger to use during running tests)destdefaulthelpz-vcountr   zIncrease verbosity)actionr0   r1   r2   z--verbositystorez'Set numerical level of verbosity (0..4))r4   r0   typer1   r2   z--log-directstore_falser   Tz!Prevent lazy logging inside testsz-nz--no-network
store_truer!   z)Do not run tests that require the network)r4   r0   r2   z-gz
--no-gaminr    z'Do not run tests that require the gaminz-mz--memory-dbr   z/Run database tests using memory instead of filez-fz--fastr   zQTry to increase speed of the tests, decreasing of wait intervals, memory databasez-iz--ignorer"   zAnegate [regexps] filter to ignore tests matched specified regexpsz-tz--log-tracebackz.Enrich log-messages with compressed tracebacks)r4   r2   z--full-tracebackzBEither to make the tracebacks full, not compressed (as by default))optparseOptionOptionParsersysargvr   add_optionsint)docr:   ps      r&   getOptParserrB   S   s   
/
$sx{
2S
8w      &}AC C C 	&gK! ! ! 	&w[s46 6 6 	&.0 0 0 	&~l68 8 8 	&|L46 6 6 	&}\<> > > 	&x^` ` ` 	&z,NP P P 	& ;= = =&	LOQ Q QA" " " "F 	
r(   c           	         d }| j         /t          | j                   }t                              |           n$t                              t          j                   t          j        | _         | j        }||dny|t          j        k    rdng|t          j	        k    rdnU|t          t          j        t          j                  k    rdn+|t          t          j        t          j                  k    rdnd}|| _        t	          j        t           j                  }d}| j        rddlm} | j        rdpd	|z   }nt          j        }t/          ||          }|                     ||                     t                              |           | j        dk    rFt5          d
t6          dt9          t           j                                      dd          d           | S )N         r   r   z %(message)s)FormatterWithTraceBackz %(tb)sz %(tbc)sz	Fail2ban z test suite. Python 
r-   z. Please wait...)r   r	   logSyssetLevelloggingCRITICALlevelr   
HEAVYDEBUGDEBUGminINFONOTICEWARNINGERRORStreamHandlerr<   stdoutr   helpersrG   r   	Formatterr
   setFormatter
addHandlerprintr   strreplace)optsllevr   rV   fmtrX   s         r&   initProcessra      s   N	dn	%	%$//$
 	//'"###, ^11"""1111GL'.111111GOW]333311  $. 


+
+  ;;;;;;			*	8jC?##) )S)) YYs^^$$$6 	Na%wwCK  ((r2222
4 6 6 6 	r(   c                   <    e Zd ZdZdZd Zd Zd Zd Zd Z	dd	Z
d
S )F2B<      c                 \    |j         | _         | j        rd| _        d| _        i | j         d<   d S )NTshare_config)r#   r   r   r    )r%   r^   s     r&   r'   zF2B.__init__   s5    -$-	Y 4>4="$$-r(   c                     d S Nr,   r$   s    r&   
SkipIfFastzF2B.SkipIfFast       $r(   c                     d S ri   r,   r$   s    r&   SkipIfNoNetworkzF2B.SkipIfNoNetwork   rk   r(   c                    t           s|                    d          rt          j        d          dD ]}|                    |          }|t          j                            |          d         dk    r|dz  }t          j                            t          j                            t          |dz   |                    st          j        d	|d
|          dS dS )z4Helper to check action/filter config is available
		stockz/Skip test because of missing stock-config files)r4   filterNrD   r-   z.confz.dzSkip test because of missing z-config for )
STOCKgetunittestSkipTestospathsplitextexistsjoin
CONFIG_DIR)r%   kwargstvs       r&   SkipIfCfgMissingzF2B.SkipIfCfgMissing   s     
 Wjj O

M
N
NN  W Wq

1Ay(	w1##Q'\Q7>>"',,z1T61==>> WPQPQPQSTSTUVVVWW WW Wr(   c                     fd}|S )z>Helper decorator to check action/filter config is available
		c                 @     t                      fd            }|S )Nc                 H    t          j        j        di   | g|R i |S )Nr,   )rs   rc   r~   )r%   argsr{   decargsfs      r&   wrapperz?F2B.skip_if_cfg_missing.<locals>._deco_wrapper.<locals>.wrapper   s<    L!,,G,,,1T#D###F###r(   r   )r   r   r   s   ` r&   _deco_wrapperz.F2B.skip_if_cfg_missing.<locals>._deco_wrapper   s9    	!HH$ $ $ $ $ H$ >r(   r,   )r%   r   r   s    ` r&   skip_if_cfg_missingzF2B.skip_if_cfg_missing   s$         
r(   Tc                     t          |t                    r	|r| j        }| j        r't          |t                    rt          |          dz  }|S )N
   )
isinstanceboolMAX_WAITTIMEr   r?   float)r%   wtimes     r&   maxWaitTimezF2B.maxWaitTime   sU    t  5 
Y :eS)) <<"5	,r(   NT)r)   r*   r+   r   MID_WAITTIMEr'   rj   rm   r~   r   r   r,   r(   r&   rc   rc      s        % % %    W W W	 	 	     r(   rc   c                 <     t                      fd            }|S )zHelper decorator to create a temporary directory

	Directory gets removed after function returns, regardless
	if exception was thrown of not
	c                     t          j        d          }	  | |g|R i |t          j        |           S # t          j        |           w xY w)Nzf2b-temp)prefix)tempfilemkdtempshutilrmtree)r%   r   r{   tmpr   s       r&   r   zwith_tmpdir.<locals>.wrapper   se    
+++#
!D#
'
'
'
'
'
' 
=6=s	   9 Ar   r   r   s   ` r&   with_tmpdirr      s5     ((    ( 	r(   c                 <     t                      fd            }|S )z@Helper decorator to execute test in alternate (fixed) test time.c                 |    t                       	  | g|R i |t                       S # t                       w xY wri   )setUpMyTimetearDownMyTime)r%   r   r{   r   s      r&   r   zwith_alt_time.<locals>.wrapper   sO    ---
!D
"4
"
"
"6
"
">s   + ;r   r   s   ` r&   with_alt_timer      s3    ((    ( 	r(   c                    | st          t                                } t          |           t          _        t          j        j        r9dt
          _        dt
          _        dt
          _        d }|t          j        _	        nAdt
          _        dt
          _        dt
          _        t          j        fd}|t          _        t          j        j        rd }|t          j        _        d	t          j        d
<   t          j                     t#          j        t&                     t(          j        }d |_        |                    dd           t1          d          D ]f}|                    d|z  d            |                    d|z  d            |                    d|z  d            |                    d|z  d           g|                    dd           |                    dd           t          j        j        rf|                    dd            |                    dd           |                    dd           t(          j        }d |_        dt3                      fdt3                      fdt3                      fdt3                      fd t3                      fd!t3                      fd"t3          t7          d#          t7          d$          g          fd%t3          t7          d#          t7          d$          g          ffD ]} |j        |  t          j        j        r@t)          j                    D ].}|                    |t)          j        d&                     +d S d S d S )'Ng{Gzd?gMb@?g-C6?c                  *    t          j        d          )NzSkip test because of "--fast"rs   rt   r,   r(   r&   F2B_SkipIfFastz!initTests.<locals>.F2B_SkipIfFast  s    		:	;	;;r(   g?g{Gzt?c                 N    | dk    rt          d| z             |            d S )Ng      ?zT[BAD-CODE] To long sleep interval: %s, try to use conditional Utils.wait_for instead)
ValueError)r}   
_org_sleeps    r&   
_new_sleepzinitTests.<locals>._new_sleep  s2    $hh
knoo
p
pp:a=====r(   c                  *    t          j        d          )Nz#Skip test because of "--no-network"r   r,   r(   r&   F2B_SkipIfNoNetworkz&initTests.<locals>.F2B_SkipIfNoNetwork  s    		@	A	AAr(   zCET-01CEST-02,M3.5.0,M10.5.0TZc                  6    t                               d          S )Nz.clear CACHE_ipToName is disabled in test suiterI   warnr,   r(   r&   <lambda>zinitTests.<locals>.<lambda>/  s    6;;OPP r(   i'  i,  )maxCountmaxTime   z
192.0.2.%sz198.51.100.%sz203.0.113.%sz2001:db8::%sz	test-hostz2001:db8::ffffz
test-otherz87.142.124.10z192.0.2.888z8.8.4.4z
dns.googlec                  6    t                               d          S )Nz.clear CACHE_nameToIp is disabled in test suiter   r,   r(   r&   r   zinitTests.<locals>.<lambda>A  s    FKK PQQ r(   z999.999.999.999zabcdef.abcdefz
192.168.0.zfailed.dns.chz!doh1.2.3.4.buga.xxxxx.yyy.invalidz1.2.3.4.buga.xxxxx.yyy.invalidzexample.comz"2606:2800:220:1:248:1893:25c8:1946z93.184.216.34zwww.example.com	localhost)ra   r   rc   rs   r   r   DEFAULT_SLEEP_TIMEDEFAULT_SLEEP_INTERVALDEFAULT_SHORT_INTERVALrj   timesleepr!   rm   ru   environtzsetr   setAlternateNowTEST_NOWr   CACHE_ipToNameclear
setOptionsrangesetCACHE_nameToIpr   getSelfNamesdnsToIp)r^   r   r   r   cir   s         @r&   	initTestsr     sK    +	'))	*	*$D		L  $%!'%!'%< < <*(, #%!&%!'%z*     $*L 5B B B!4(, 3D!!! PPud+++
** ( (Q%%q$%%!T"""%%D!!!%%;''''&&&$$$L ,%%t%%	<   %%	<   !QQ!'suuSUU#%%SUU'/$cee,3CDDf_F]F]^__`sF#GHH&Q`JaJabccd	 
 
a 	15!999\ ,!## , ,qEE!Xk**++++-, ,(, ,, ,r(   c                      d S ri   r,   r,   r(   r&   
mtimesleepr   S  s	     r(   r   c                  8    t          j        t                     d S ri   )r   setTimer   r,   r(   r&   r   r   [  s     r(   c                      d t           _        d S ri   )r   myTimer,   r(   r&   r   r   a  s    r(   c           
      X    t                     ddlm} ddlm} ddlm} ddlm} ddlm} ddlm} ddlm} dd	lm	}	 dd
lm
}
 ddlm} ddlm} ddlm} ddlm} ddlm} ddlm} ddlm} ddlm}  st'          j                    }n& G  fddt&          j                               }|                    t'          j        |j                             |                    t'          j        |j                             |                    t'          j        |j                             |                    t'          j        |j                             |                    t'          j        |j                             |                    t'          j        |
j                             |                    t'          j        |j                             |                    t'          j        |j                             |                    t'          j        |j                             |                    t'          j        |j                              |                    t'          j        |j                             	 dd l!}|                    t'          j        |j"                             n# tF          $ r Y nw xY w|                    t'          j        |j$                             |                    t'          j        |j%                             |                    t'          j        |j&                             |                    t'          j        |j'                             |                    t'          j        |j(                             |                    t'          j        |j)                             |                    t'          j        |j*                             |                    t'          j        |j+                             |                    t'          j        |j,                             |                    t'          j        |j-                             |                    t'          j        |j.                             |                    t'          j        |j/                             |                    t'          j        |j0                             |                    t'          j        |j1                             |                    t'          j        |j2                             |                    t'          j        |j3                             |                    t'          j        |j4                             |                    t'          j        |j5                             |                    t'          j        |j6                             |                    t'          j        |j7                             |                    t'          j        |j8                             |                    t'          j        |j9                             |                    t'          j        |j:                             |                    t'          j        |j;                             |                    t'          j        |j<                             |                    t'          j        |j                             |                    t'          j        |	j=                             |                    t'          j        |	j>                             |                    t'          j        |j?                             |                    t'          j        |j@                             |                    t'          j        |jA                             |                    t'          j        |jB                             t'          jC                    }ddlmD} t          jF        t          jG        H                    t          jG        I                    |jJ                                      D ]}|K                    d          rj|L                    d          rU|                    |M                    |jN        dt          jG        O                    |          d                              ddlPmQ} |g}	 t&          jR        jS        st&          jR        jT        r3tG          dt&          jR        jS        dt&          jR        jT                  ddlUmV} |W                    |           n4# tF          $ r'}t          Y                    d|z             Y d }~nd }~ww xY w	 dd lZm[} |W                    |           n4# tF          $ r'}t          Y                    d!|z             Y d }~nd }~ww xY w|D ]<}|                    t'          j        |\                    |                               =	 dd"l]m^} |                    t'          j        |_                    |                               n4# tF          $ r'}t          Y                    d#|z             Y d }~nd }~ww xY w|                    t'          j        |j`                             |S )$NrD   )banmanagertestcase)clientbeautifiertestcase)clientreadertestcase)tickettestcase)failmanagertestcase)filtertestcase)servertestcase)datedetectortestcase)actiontestcase)actionstestcase)sockettestcase)misctestcase)databasetestcase)observertestcase)samplestestcase)fail2banclienttestcase)fail2banregextestcasec                   <     e Zd Zd D             Z fdZ xZS )&gatherTests.<locals>.FilteredTestSuitec                 6    g | ]}t          j        |          S r,   )recompile).0rs     r&   
<listcomp>z1gatherTests.<locals>.FilteredTestSuite.<listcomp>  s     ...rz!}}...r(   c                 h   g }|D ]}t          |t          j                  r|                     |           2t	          |          }| j        D ]:}|                    |          }	j        s|rn|s|                    |            n;|D ]%}t          |                               |           &d S ri   )
r   rs   	TestSuiteaddTestr\   _regexpssearchr"   appendsuper)
r%   suitematchedtestsr   mFilteredTestSuite	__class__r^   s
          r&   r   z.gatherTests.<locals>.FilteredTestSuite.addTest  s    G  4+,, 
ll4	TQm  
((1++a> !  1 ~~du 2 2
d##++D11112 2r(   )r)   r*   r+   r   r   __classcell__)r   r   r^   regexpss   @r&   r   r   ~  sV        ..g...82 2 2 2 2 2 2 2 2 2 2r(   r   r   )action_dtest_z.py.r   )
FilterPollzSkip, fast: z, no_gamin: )FilterGaminz2Skipping gamin backend testing. Got exception '%s')FilterPyinotifyz9I: Skipping pyinotify backend testing. Got exception '%s')FilterSystemdz7I: Skipping systemd backend testing. Got exception '%s')ar   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rs   r   r   	makeSuiteTransmitter	JailTests
RegexTestsLoggingTestsServerConfigReaderTestsCommandActionTestExecuteActionsTicketTests
AddFailureFailmanagerComplexdnsStatusExtendedCymruInfoImportErrorBeautifierTestConfigReaderTestJailReaderTestFilterReaderTestJailsReaderTestJailsReaderTestCacheSocket
ClientMiscHelpersTest	SetupTestTestsUtilsTest
MyTimeTestDatabaseTestObserverTestBanTimeIncrBanTimeIncrDBIgnoreIPBasicFilterLogFileLogFileMonitorLogFileFilterPollIgnoreIPDNSGetFailuresDNSUtilsTestsDNSUtilsNetworkTestsDateDetectorTestCustomDateFormatsTestFilterSamplesRegexFail2banClientTestFail2banServerTestFail2banRegexTest
TestLoaderr   ru   listdirrv   abspathdirname__file__
startswithendswithloadTestsFromNamer)   rw   server.filterpollr   rc   r   r    server.filtergaminr   r   rI   warningserver.filterpyinotifyr   get_monitor_failures_testcaseserver.filtersystemdr   %get_monitor_failures_journal_testcaseTransmitterLogging) r   r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   testsr  
testloaderr   file_r   filtersr   er   Filter_r   r   s    ``                             @r&   gatherTestsrC  e  s
   
4 "!!!!!''''''######""""""######%%%%%%$$$$$$ 



%%2 2 2 2 2 2 2 2 2(, 2 2 2( 


% x!."<==>>>x!.":;;<<<x!.";<<===x!."=>>???x!."HIIJJJx!."BCCDDDx!/"@AABBBx!."<==>>>x!"5"@AABBBx!"5"HIIJJJx!"4"?@@AAA***--"#5#MNNOOOO   $ x!":"IJJKKK x!"6"GHHIIIx!"6"EFFGGGx!"6"GHHIIIx!"6"FGGHHHx!"6"KLLMMMx!."788999x!.";<<===x!,":;;<<<x!,"899:::x!,"=>>???x!,"9::;;;x!"2"?@@AAAx!"2"?@@AAAx!"2">??@@@x!"2"@AABBB x!."9::;;;x!."<==>>>x!."899:::x!."?@@AAAx!."BCCDDDx!."<==>>>x!."<==>>>x!.">??@@@x!."EFFGGGx!.":;;<<< x!"6"GHHIIIx!"6"LMMNNNx!/"DEEFFF x!"8"KLLMMMx!"8"KLLMMMx!"7"IJJKKK
 !##j'//"'//("344557 7 @ @U
g @5>>%#8#8 @==--   "'"2"25"9"9!"<"<=? ? @ @ @ ,+++++<
K \ b(,/ b	x|7H7H7H(,J_J_`	a	aa......	.. K K K..EIJJJJJJJJKR666666	..!!!! R R R..LqPQQQQQQQQR  ; ;W--"//88: : ; ; ; ;P222222--">#W#WXe#f#fgghhhh P P P..JQNOOOOOOOOP
 x!."CDDEEEs\   0K 
KKA0g 
g5g00g59h 
iii	A k
 

k;k66k;assertDictEqualc           	         |                      t          |t                    d           |                      t          |t                    d           ||k    r|d|}dd                    t	          j        t          j        |                                          t          j        |                                                              z   }|p||z   }| 	                    |           d S d S )Nz"First argument is not a dictionaryz#Second argument is not a dictionary != rH   )

assertTruer   dictry   difflibndiffpprintpformat
splitlinesfail)r%   d1d2msgstandardMsgdiffs         r&   rD  rD    s    //*R&&(LMMM//*R&&(MNNN2XX!rr22&;$))GM
N2!!##
N2!!##% % & & &4 
	$t#399S>>>>> Xr(   rD   Fc           
        
 d |rt           n|ffd	
fd
	  
|||||           dS # t          $ r}t          |t                    r|j        d         nt          |          dz   }dd                    t          j        t          j
        |                                          t          j
        |                                                              z   }	|p||	z   }|                     |           Y d}~dS d}~ww xY w)zCompare complex elements (like dict, list or tuple) in sorted order until
	level 0 not reached (initial level = -1 meant all levels),
	or if nestedOnly set to True and some of the objects still contains nested lists or dicts.
	c                     t          | t                    r+t          d |                                 D                       S t          d | D                       S )Nc              3   Z   K   | ]&}t          |t          t          t          f          V  'd S ri   r   rH  listtupler   r}   s     r&   	<genexpr>z8assertSortedEqual.<locals>._is_nested.<locals>.<genexpr>)  s3      EEQjT4/00EEEEEEr(   c              3   Z   K   | ]&}t          |t          t          t          f          V  'd S ri   rW  rZ  s     r&   r[  z8assertSortedEqual.<locals>._is_nested.<locals>.<genexpr>*  s3      ;;AZD$.//;;;;;;r(   )r   rH  anyvalues)r}   s    r&   
_is_nestedz%assertSortedEqual.<locals>._is_nested'  sW    4 F
EE!((**EEE
E
EE	;;;;;	;	;;r(   c                     t          | t          t          t          f          r+t	          t          fd| D                                 S | S )Nc              3   0   K   | ]} |          V  d S ri   r,   )r   r}   _nest_sortedkeys     r&   r[  z:assertSortedEqual.<locals>._nest_sorted.<locals>.<genexpr>0  s/      77||As++777777r(   rc  )r   r   rX  rY  sorted)r}   rc  rb  s    `r&   rb  z'assertSortedEqual.<locals>._nest_sorted.  sV    S$&'' B$77777Q77777SAAAA
8r(   c                    t          |           t          |          k    rt          | d|          |s4|r2 	|           s' 	|          s| |k    rd S t          | d|          t          | t                    rt          |t                    r|                                 D ]\  }}||         }t          |t          t
          t          f          r=t          |t          t
          t          f          r |||dk    r|dz
  nd||           l||k    rt          | d|          d S  
| |          }  
||          }t          | |          D ]~\  }}t          |t          t
          t          f          r=t          |t          t
          t          f          r |||dk    r|dz
  nd||           d||k    rt          | d|          d S )NrF  r   rD   rd  )lenr   r   rH  itemsrX  rY  zip)abrM   
nestedOnlyrc  kv1v2_assertSortedEqualr_  rb  s           r&   rp  z-assertSortedEqual.<locals>._assertSortedEqual3  s/   VVs1vv	!!!QQ'	(	((	 )J )

1 )jjmm )1ff
F	!!!QQ'	(	((4 +Z400 +		 + +uq"	
1B"tT5)** +z"tT5>Q/R/R +B5A::a1j#NNNN	rAAAqq)*** 
	+ + |A31|A31Q + +vr2"tT5)** +z"tT5>Q/R/R +B5A::a1j#NNNN	rAAAqq)*** 
+ +r(   r   z
within:rH   N)re  	Exceptionr   r   r   r\   ry   rI  rJ  rK  rL  rM  rN  )r%   rj  rk  rM   rl  rc  rQ  rA  rR  rS  rp  r_  rb  s             @@@r&   assertSortedEqualrr  !  s[   < < <  ,,      
+ + + + + + +2Q5*c22222   ':66Rq		SVVk=Q+
7=	>!!!	>!!!# # $ $ $$ 	#d"#))C.........s   1 
D	CDD	assertRaisesRegexpc                    	  ||i | |                      dt          |d          z             d S # |$ rO}t          j        |t	          |                    "|                      d|d|d           Y d }~d S Y d }~d S d }~ww xY w)Nz%s not raisedr)   "z" does not match ")rN  getattrr   r   r\   )r%   excclsregexpfunr   r{   rA  s          r&   rs  rs  X  s    <3
 99_wvz:::;;;;;	 
 < < <iA'III:;;;;;;;;; ('''''<s   2 B>BBTc                     |}d}|>t          |d          r.t          |t                    st          j        |          \  }}d}||vr1|rt          |          }|p|d|}|                     |           d S d S )NF__iter__Tz was not found in hasattrr   r\   	itertoolsteerX  rN  r%   rj  rk  rQ  bbwraps         r&   assertInr  d  s    "	$[WQ
++[Jq#4F4F[=51b
4aZZ
bB		2AAArr2399S>>>>> Zr(   c                     |}d}|>t          |d          r.t          |t                    st          j        |          \  }}d}||v r1|rt          |          }|p|d|}|                     |           d S d S )NFr{  Tz unexpectedly found in r|  r  s         r&   assertNotInr  o  s    "	$[WQ
++[Jq#4F4F[=51b
4!VV
bB		7BB7399S>>>>> Vr(   c                 X   t           j        j        t          j        k    rLt
          j                            d           t          	                    d| 
                                           t          |            t           j        j        dk    rt          j                    | _        d S d S )NrH   z"========== %s ====================r   )rs   rc   r   rK   rO   r<   stderrwriterI   debugid
_org_setUpr   r   __startTimer$   s    r&   _customSetUpr  |  s     Lgm++*4,,'333DLQY[[$ r(   c                     t           j        j        dk    r>t          j                            dt          j                    | j        z
  fz             d S d S )Nr   z
 %.3fs -- )rs   rc   r   r<   r  r  r   r  r$   s    r&   _customTearDownr    sL    LQ*<49;;1A#A"CCDDDDD r(   c                        e Zd Z G d dej                  Z fdZ fdZd Zd Z	d Z
dd	Zd
 Zeej        fd            Z xZS )LogCaptureTestCasec                   :    e Zd ZdZd
dZddZd Zd Zd Zd	 Z	dS )LogCaptureTestCase._MemHandlerzLogging handler helper
		
		Affords not to delegate logging to StreamHandler at all,
		format lazily on demand in getvalue.
		Increases performance inside the LogCaptureTestCase tests, because there
		the log level set to DEBUG.
		Tc                 
   t          j                    | _        d| _        d| _        t                      | _        d| _        t                      | _	        t          j                            |            |r| j        | _        d S d S )Nr-   r   )	threadingLock_lock_val_dirtyrX  _recs
_nolckCntrr   _strmrK   Handlerr'   _handle_lazyhandle)r%   lazys     r&   r'   z'LogCaptureTestCase._MemHandler.__init__  sr      4:494;4:4?

4:
?D!!!
 $#DKKK$ $r(   Nc                     |rt          d|z            d| _        | j        5  d| _        t	                      | _        | j                            d           ddd           dS # 1 swxY w Y   dS )z)Truncate the internal buffer and records.z.invalid size argument: %r, should be None or 0r-   r   N)rq  r  r  r  rX  r  r  truncate)r%   sizes     r&   r  z'LogCaptureTestCase._MemHandler.truncate  s    
 M
DtK
L
LL49
  DKDJJ                 s   5A%%A),A)c                 T   	 |                                 dz   }	 | j                            |           d S # t          $ r2 | j                            |                    dd                     Y d S w xY w# t
          $ r(}| j                            d|z             Y d }~d S d }~ww xY w)NrH   zUTF-8r]   zError by logging handler: %r)
getMessager  r  UnicodeEncodeErrorencoderq  )r%   recordrQ  rA  s       r&   __writez&LogCaptureTestCase._MemHandler.__write  s    9





$C6	Zc 6 6 6	Zcjj)445555556
 9 9 9J3a78888888889s2   A5 6 8A2.A5 1A22A5 5
B'?B""B'c                    | j         s| j        S | j                            d          }| j         dz  r|sB| xj        dz  c_        | j        dk    r| j        S d| _        | j                                         	 | xj         dz  c_         | j        }t                      | _        | j                                         n# | j                                         w xY w|D ]}|                     |           n+|r)| xj         dz  c_         | j                                         | j	        
                                | _        | j        S )z&Return current buffer as whole string.Fr   rD      r   )r  r  r  acquirer  r  rX  release_MemHandler__writer  getvalue)r%   lckrecsr  s       r&   r  z'LogCaptureTestCase._MemHandler.getvalue  sK    + 9			E	"	"3
kAo  	____1YT_	Z	[[B[[JT&&TZ	ZTZ  	\\& KK2KKJz""$$49
)s   8*B< <Cc                     |                      |           | j        5  | xj        dz  c_        ddd           dS # 1 swxY w Y   dS )z-Handle the specified record direct (not lazy)rD   N)r  r  r  r%   r  s     r&   r  z%LogCaptureTestCase._MemHandler.handle  s    <<
  KK1KK                 s   ;??c                     | j         5  | j                            |           | xj        dz  c_        ddd           dS # 1 swxY w Y   dS )z*Lazy handle the specified record on demandr   N)r  r  r   r  r  s     r&   r  z+LogCaptureTestCase._MemHandler._handle_lazy  s    
  JfKK1KK                 s   +A  AAr   ri   )
r)   r*   r+   __doc__r'   r  r  r  r  r  r,   r(   r&   _MemHandlerr    s         	$ 	$ 	$ 	$   9 9 9     D      r(   r  c                    t           j        | _        t           j        | _        t
                              t          j        j	                  | _
        | j
        gt           _        | j        t          j        k    rt           xj        | j        z  c_        | j        t          j        dz
  k    r't                               t          j        dz
             t          t
          |                                            d S )NrD   )rI   rM   
_old_levelhandlers_old_handlersr  r  rs   rc   r   _logrK   rO   rJ   r   setUpr%   r   s    r&   r  zLogCaptureTestCase.setUp  s     L$/$ ,,X\-BCC$)YK&/	_%%	??d((??	_w}Q&&	??7=?###D!!'')))))r(   c                    |                                   | j                                         | j        t          _        t                              | j                   t          t          |           
                                 dS )zCall after every test case.N)pruneLogr  closer  rI   r  rJ   r  r   r  tearDownr  s    r&   r  zLogCaptureTestCase.tearDown  se     --///)//&&///$/"""D!!**,,,,,r(   c                     | j                                         }|                    dd          s|D ]	}||v r dS 
	 dS |D ]	}||vr dS 
dS )NallFT)r  r  rr   r%   r   r{   loggeds_s        r&   
_is_loggedzLogCaptureTestCase._is_logged  s    9&	E5	!	!   r	V||DD 5   r	EE 
$r(   c           	                               dd          }|r:t          j                            |          }t	          j         fd|          }n  j        i }                     dd          sE|sA j                                        } 	                    dd|rd|z  nd	d
|d           dS dS |sG j                                        }D ]-}||vr% 	                    |d|rd|z  nd	d
|d           ,dS dS )ak  Assert that one of the strings was logged

		Preferable to assertTrue(self._is_logged(..)))
		since provides message with the actual log.

		Parameters
		----------
		s : string or list/set/tuple of strings
		  Test should succeed if string (or any of the listed) is present in the log
		all : boolean (default False) if True should fail if any of s not logged
		waitNc                       j         i  S ri   )r  )r{   r   r%   s   r&   r   z1LogCaptureTestCase.assertLogged.<locals>.<lambda>!  s     =f = = r(   r  FzNone among z was found in the logz, waited %sr-   z: ===
===z was not found in the log)
rr   rs   rc   r   r   wait_forr  r  r  rN  )r%   r   r{   r  resr  r  s   ```    r&   assertLoggedzLogCaptureTestCase.assertLogged  s    
FD	!	!$	 '
,
"
"4
(
(4	======t	D	D33	!	&v	&	&3	E5	!	! :
 8Y!!FIIIAAA $,}t",,vvv7 8 8 8 8 88 8  :Y!!F : :
&
iirrr"&.		B..9 : : :	: :: :r(   c                 &   | j                                         }t          |          dk    r@|                    dd          s*|D ]	}||vr dS 
|                     d|d|d           dS |D ]!}||v r|                     |d|d           "dS )	a  Assert that strings were not logged

		Parameters
		----------
		s : string or list/set/tuple of strings
		  Test should succeed if the string (or at least one of the listed) is not
		  present in the log
		all : boolean (default False) if True should fail if any of s logged
		rD   r  FNzAll of the z$ were found present in the log: ===
r  z was found in the log: ===
)r  r  rg  rr   rN  r  s        r&   assertNotLoggedz"LogCaptureTestCase.assertNotLogged3  s     9&VVaZZ

5%00Z  r	VV 999!!!VVVTUUUUU E Er	V||	YYFFFCDDDE Er(   Nc                 x    | j                             d           |rt                              d|           d S d S )Nr   z===== %s =====)r  r  rI   r  )r%   logphases     r&   r  zLogCaptureTestCase.pruneLogH  sE    )Q 2	<<&111112 2r(   c                 4    | j                                         S ri   )r  r  r$   s    r&   getLogzLogCaptureTestCase.getLogM  s    					r(   c                    |t           j        k    s't                                           t          j        k    rU |d| z   dz              t          j        |           D ]"}|                    d          } ||           # |d           dS dS )z@Helper which outputs content of the file at HEAVYDEBUG loglevelsz---- z ----rH   z------------------------------N)rI   r  getEffectiveLevelrK   rO   	fileinputinputrstrip)fnr  lines      r&   dumpFilezLogCaptureTestCase.dumpFileP  s      8 8 : :gm K K	6'B,
 !!!r""  t;;tD
F4LLLL	6&>>>>> !L Kr(   ri   )r)   r*   r+   rK   r  r  r  r  r  r  r  r  r  staticmethodrI   r  r  r   )r   s   @r&   r  r    s        V V V V V7? V V Vp* * * * * - - - - -   : : :BE E E*2 2 2 2
       ,    r(   r  )r-   )NNri   )O
__author____copyright____license__r  r~  rK   r9   ru   r   r   r   r<   r   r  rs   ior   	functoolsr   rW   r   r	   r
   r   server.ipdnsr   r   server.mytimer   server.utilsr   serverr   r   rI   r   r   rr   rz   rv   rx   ry   rq   putenvr0  r/  r1  Valuesr   rB   ra   rc   r   r   r   r   old_TZr   r   rC  rI  rK  r}  TestCaserD  reprrr  rs  assertRaisesRegexr  r  r  r  r  r  _org_tearDownr  r  
pid_existsr,   r(   r&   <module>r     s  * "
7           				 				   



                   M M M M M M M M M M M M + + + + + + + + " " " " " "                               
:		Z^^1488
 GNN27<<99:: *** 	rw||J@@AA 
	,9 9 ) )            *
 *
 *
 *
X2 2 2j/ / / / /
 / / /d   	 	 	N, N, N,b  
 
d	#	#    g g g g\        wx "344 5	 	 	 	 &5"()e4 3 3 3 3h '8  #wx "677 	:< < < (:$-	 	 	 	 '	 	 	 	 "-$
! ! ! !*E E E '  ,  I I I I I* I I IX 


r(   