
    ogfu                        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jH                  jK                  dd      Z&e&s:ejN                  jQ                  ejN                  jS                  dd            rdZ&ndZ&ejN                  jQ                  ejN                  jS                  e&d            Z* ejV                  dejN                  jY                  ejN                  jY                  ejN                  jY                  ejN                  j[                  e.                                G d dej^                        Z0d0dZ1d Z2 G d de0      Z3d Z4d Z5d Z6d Z7ejH                  jK                  dd      Z8d  Z9d! Z:d1d"Z;ddl<Z<ddl=Z= e>ej~                  d#      sd2d$Z@e@ej~                  _@        d%d&eAdfd'ZBeBej~                  _B         e>ej~                  d(      sd) ZCeCej~                  _D        	 d2d*ZEeEej~                  _E        d2d+ZFeFej~                  _F        ej~                  j                  ZHd, ZIej~                  j                  ZKd- ZLeIej~                  _G        eLej~                  _J         G d. d/ej~                        ZMej                  ZNy)3z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y)DefaultTestOptionsc                 (    d d dd d dddddd
| _         y )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         }|j                   |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)actionr/   r0   r1   z--verbositystorez'Set numerical level of verbosity (0..4))r3   r/   typer0   r1   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)r3   r/   r1   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)r3   r1   z--full-tracebackzBEither to make the tracebacks full, not compressed (as by default))optparseOptionOptionParsersysargvr   add_optionsint)docr9   ps      r&   getOptParserrA   S   sD   
//
$sxx{
2S
8w  }AC 	gK! 	w[s46 	.0 	~l68 	|L46 	}\<> 	x^` 	z,NP 	 ;=	LOQA" "F 	
r(   c           	         d }| j                   +t        | j                         }t        j                  |       n#t        j                  t        j
                         t        j                  | _         | j                  }||dn|t        j                  k  rdnp|t        j                  k  rdn[|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*                  xr dxs d	|z   }nt        j,                  }t/        ||      }|j1                   ||             t        j3                  |       | j                  dk7  r=t5        d
t6        dt9        t         j6                        j;                  dd      d       | S )N         r   r   z %(message)s)FormatterWithTraceBackz %(tb)sz %(tbc)sz	Fail2ban z test suite. Python 
 z. Please wait...)r   r	   logSyssetLevelloggingCRITICALlevelr   
HEAVYDEBUGDEBUGminINFONOTICEWARNINGERRORStreamHandlerr;   stdoutr   helpersrF   r   	Formatterr
   setFormatter
addHandlerprintr   strreplace)optsllevr   rV   fmtrX   s         r&   initProcessra      s|   NN	dnn	%$//$
 	//'""#,, ^^1"""11GLL'..111GOOW]]331  $. 




+;				*	8jC?#) )S) Ys^$6 	NNaCKK ((r2
4 6 	r(   c                   :    e Zd ZdZdZd Zd Zd Zd Zd Z	d
dZ
y	)F2B<      c                 x    |j                   | _         | j                  rd| _        d| _        i | j                   d<   y )NTshare_config)r#   r   r   r    )r%   r^   s     r&   r'   zF2B.__init__   s0    --$-	YY4>4="$$--r(   c                      y Nr,   r$   s    r&   
SkipIfFastzF2B.SkipIfFast       r(   c                      y ri   r,   r$   s    r&   SkipIfNoNetworkzF2B.SkipIfNoNetwork   rk   r(   c                    t         s|j                  d      rt        j                  d      dD ]  }|j                  |      }|t        j
                  j                  |      d   dk(  r|dz  }t        j
                  j                  t        j
                  j                  t        |dz   |            rt        j                  d	|d
|       yy)z4Helper to check action/filter config is available
		stockz/Skip test because of missing stock-config files)r3   filterNrC   rH   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     
jj


M
NN  Wq

1Ay(	ww1#Q'\Q77>>"'',,z1T61=>PQSTUVVW 
r(   c                     fd}|S )z>Helper decorator to check action/filter config is available
		c                 2     t                fd       }|S )Nc                 Z    t        j                  j                  di   | g|i |S )Nr,   )rs   rc   r~   )r%   argsr{   decargsfs      r&   wrapperz?F2B.skip_if_cfg_missing.<locals>._deco_wrapper.<locals>.wrapper   s-    LL!!,G,T#D#F##r(   r   )r   r   r   s   ` r&   _deco_wrapperz.F2B.skip_if_cfg_missing.<locals>._deco_wrapper   s     	!H$ $ >r(   r,   )r%   r   r   s    ` r&   skip_if_cfg_missingzF2B.skip_if_cfg_missing   s     
r(   c                     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   s>    t5 
YY:eS)<"5	,r(   NT)r)   r*   r+   r   MID_WAITTIMEr'   rj   rm   r~   r   r   r,   r(   r&   rc   rc      s+    %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|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   sG    
+#
D#
'
'
' 
==6==s	   ; Ar   r   r   s   ` r&   with_tmpdirr      s"     (  	r(   c                 .     t                fd       }|S )z@Helper decorator to execute test in alternate (fixed) test time.c                 d    t                	  | g|i |t                S # t                w xY wri   )setUpMyTimetearDownMyTime)r%   r   r{   r   s      r&   r   zwith_alt_time.<locals>.wrapper   s,    -
D
"4
"6
">s   # /r   r   s   ` r&   with_alt_timer      s     (  	r(   c                    | st        t                     } t        |       t        _        t        j                  j                  r:d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 |_        |j/                  dd       t1        d      D ]V  }|j3                  d|z  d        |j3                  d|z  d        |j3                  d|z  d        |j3                  d|z  d       X |j3                  dd       |j3                  dd       t        j                  j                  r@|j3                  dd        |j3                  dd       |j3                  dd       t(        j4                  }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 ]  } |j2                  |   t        j                  j                  r?t)        j8                         D ]'  }|j3                  |t)        j:                  d&             ) y y y )'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                 <    | dkD  rt        d| z         |        y )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  s#    $h
knoo
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Ar(   zCET-01CEST-02,M3.5.0,M10.5.0TZc                  ,    t         j                  d      S )Nz.clear CACHE_ipToName is disabled in test suiterI   warnr,   r(   r&   <lambda>zinitTests.<locals>.<lambda>/  s    6;;O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                  ,    t         j                  d      S )Nz.clear CACHE_nameToIp is disabled in test suiter   r,   r(   r&   r   zinitTests.<locals>.<lambda>A  s    FKK P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     s   	')	*$D	LL $%!'%!'%<*(,, #%!&%!'%zz* $*LLB!4(,, 3D! Pud+
* (Q%%q$%%!T"%%D!%%;'	( &$LL%%t%%	< %%	< !Q!'suSU#%SU'/$ce,3CDf_F]^_`sF#GH&Q`Jabcd	 
a 	155!9
 \\!!# ,qEE!Xk*+, ) r(   c                       y ri   r,   r,   r(   r&   
mtimesleepr   S  s     r(   r   c                  6    t        j                  t               y ri   )r   setTimer   r,   r(   r&   r   r   [  s     r(   c                      d t         _        y ri   )r   myTimer,   r(   r&   r   r   a  s	    r(   c           
          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(                                }|j+                  t'        j,                  |j.                               |j+                  t'        j,                  |j0                               |j+                  t'        j,                  |j2                               |j+                  t'        j,                  |j4                               |j+                  t'        j,                  |j6                               |j+                  t'        j,                  |
j8                               |j+                  t'        j,                  |j:                               |j+                  t'        j,                  |j<                               |j+                  t'        j,                  |j>                               |j+                  t'        j,                  |j@                               |j+                  t'        j,                  |j>                               	 dd l!}|j+                  t'        j,                  |jD                               |j+                  t'        j,                  |jH                               |j+                  t'        j,                  |jJ                               |j+                  t'        j,                  |jL                               |j+                  t'        j,                  |jN                               |j+                  t'        j,                  |jP                               |j+                  t'        j,                  |jR                               |j+                  t'        j,                  |jT                               |j+                  t'        j,                  |jV                               |j+                  t'        j,                  |jX                               |j+                  t'        j,                  |jZ                               |j+                  t'        j,                  |j\                               |j+                  t'        j,                  |j^                               |j+                  t'        j,                  |j`                               |j+                  t'        j,                  |jb                               |j+                  t'        j,                  |jd                               |j+                  t'        j,                  |jf                               |j+                  t'        j,                  |jh                               |j+                  t'        j,                  |jj                               |j+                  t'        j,                  |jl                               |j+                  t'        j,                  |jn                               |j+                  t'        j,                  |jp                               |j+                  t'        j,                  |jr                               |j+                  t'        j,                  |jt                               |j+                  t'        j,                  |jv                               |j+                  t'        j,                  |jx                               |j+                  t'        j,                  |j0                               |j+                  t'        j,                  |	jz                               |j+                  t'        j,                  |	j|                               |j+                  t'        j,                  |j~                               |j+                  t'        j,                  |j                               |j+                  t'        j,                  |j                               |j+                  t'        j,                  |j                               t'        j                         }ddlmD} t        j                  t        j                  j                  t        j                  j                  |j                                    D ]u  }|j                  d      s|j                  d      s'|j+                  |j                  |j                  dt        j                  j                  |      d                w ddlPmQ} |g}	 t&        j                  j                  st&        j                  j                  rAtG        dt&        j                  j                  dt&        j                  j                        ddlUmV} |j                  |       	 dd lZm[} |j                  |       |D ]5  }|j+                  t'        j,                  |j                  |                   7 	 dd"l]m^} |j+                  t'        j,                  |j                  |                   |j+                  t'        j,                  |j                               |S # tF        $ r Y 	w xY w# tF        $ r"}t        j                  d|z         Y d }~d }~ww xY w# tF        $ r#}t        j                  d!|z         Y d }~	d }~ww xY w# tF        $ r"}t        j                  d#|z         Y d }~d }~ww xY w)$NrC   )banmanagertestcase)clientbeautifiertestcase)clientreadertestcase)tickettestcase)failmanagertestcase)filtertestcase)servertestcase)datedetectortestcase)actiontestcase)actionstestcase)sockettestcase)misctestcase)databasetestcase)observertestcase)samplestestcase)fail2banclienttestcase)fail2banregextestcasec                       e Zd ZW D  cg c]  }t        j                  |       c}}} ZfdZxZS c c}}} w )&gatherTests.<locals>.FilteredTestSuitec                 @   g }|D ]  }t        |t        j                        r| j                  |       /t	        |      }| j
                  D ]8  }|j                  |      }	j                  s|s#n|r'|j                  |          |D ]  }t        |   |        y ri   )
r   rs   	TestSuiteaddTestr\   _regexpssearchr"   appendsuper)
r%   suitematchedtestsrmFilteredTestSuite	__class__r^   s
          r&   r   z.gatherTests.<locals>.FilteredTestSuite.addTest  s    G 4++,
ll4	TQmm 
((1+a>>!1~~d	  2
d+D12r(   )r)   r*   r+   recompiler   r   __classcell__).0r   r   r   r   r^   regexpss   000@r&   r   r   ~  s-    &-..rzz!}.82 2 /s   :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   rH   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&   gatherTestsrA  e  s   
4 "'#"#%$



%2 2(,, 2( 
% x!!."<"<=>x!!.":":;<x!!.";";<=x!!."="=>?x!!."H"HIJx!!."B"BCDx!!/"@"@ABx!!."<"<=>x!!"5"@"@ABx!!"5"H"HIJx!!"4"?"?@A--""#5#M#MNO
 x!!":"I"IJK x!!"6"G"GHIx!!"6"E"EFGx!!"6"G"GHIx!!"6"F"FGHx!!"6"K"KLMx!!."7"789x!!.";";<=x!!,":":;<x!!,"8"89:x!!,"="=>?x!!,"9"9:;x!!"2"?"?@Ax!!"2"?"?@Ax!!"2">">?@x!!"2"@"@AB x!!."9"9:;x!!."<"<=>x!!."8"89:x!!."?"?@Ax!!."B"BCDx!!."<"<=>x!!."<"<=>x!!.">">?@x!!."E"EFGx!!.":":;< x!!"6"G"GHIx!!"6"L"LMNx!!/"D"DEF x!!"8"K"KLMx!!"8"K"KLMx!!"7"I"IJK
 !!#jj''//"''//("3"3457 @U
g5>>%#8==--  "''"2"25"9!"<=? @@ ,<
K \\(,,//	x||7H7H(,,J_J_`	aa.	..R6	..!  ;W--""//8: ;;P2--"">#W#WXe#fgh x!!."C"CDEM 	 ` 	 K..EIJJK 	 R..LqPQQR 	 P..JQNOOPs[   +2k Bk* l 19m 	k'&k'*	l3ll	m!l??m	m2m--m2assertDictEqualc           	         | j                  t        |t              d       | j                  t        |t              d       ||k7  r|d|}ddj                  t	        j
                  t        j                  |      j                         t        j                  |      j                                     z   }|xs ||z   }| j                  |       y y )Nz"First argument is not a dictionaryz#Second argument is not a dictionary != rG   )

assertTruer   dictry   difflibndiffpprintpformat
splitlinesfail)r%   d1d2msgstandardMsgdiffs         r&   rB  rB    s    //*R&(LM//*R&(MN2X!2&;$))GMM
NN2!!#
NN2!!#% & &4 
	$t#399S> r(   rC   Fc           
        
 d |rt         n|ffd	
fd
	  
|||||       y# t        $ r}t        |t              r|j                  d   nt        |      dz   }ddj                  t        j                  t        j                  |      j                         t        j                  |      j                                     z   }	|xs ||	z   }| j                  |       Y d}~y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 | j                         D              S t        d | D              S )Nc              3   R   K   | ]  }t        |t        t        t        f       ! y wri   r   rF  listtupler   r}   s     r&   	<genexpr>z8assertSortedEqual.<locals>._is_nested.<locals>.<genexpr>)  s     EQjT4/0E   %'c              3   R   K   | ]  }t        |t        t        t        f       ! y wri   rU  rX  s     r&   rY  z8assertSortedEqual.<locals>._is_nested.<locals>.<genexpr>*  s     ;AZD$./;rZ  )r   rF  anyvalues)r}   s    r&   
_is_nestedz%assertSortedEqual.<locals>._is_nested'  s4    4
E!((*E
EE	;;	;;r(   c                     t        | t        t        t        f      r t	        t        fd| D                    S | S )Nc              3   0   K   | ]  } |        y wri   r,   )r   r}   _nest_sortedkeys     r&   rY  z:assertSortedEqual.<locals>._nest_sorted.<locals>.<genexpr>0  s     7|As+7s   rb  )r   r   rV  rW  sorted)r}   rb  ra  s    `r&   ra  z'assertSortedEqual.<locals>._nest_sorted.  s1    S$&'$7Q77SAA
8r(   c                    t        |       t        |      k7  rt        | d|      |s(|r& 	|       s 	|      s| |k(  ry t        | d|      t        | t              rt        |t              r| j	                         D ]l  \  }}||   }t        |t        t
        t        f      r2t        |t        t
        t        f      r |||dk7  r|dz
  nd||       X||k7  s^t        | d|       y  
| |      }  
||      }t        | |      D ]g  \  }}t        |t        t
        t        f      r2t        |t        t
        t        f      r |||dk7  r|dz
  nd||       S||k7  sYt        | d|       y )NrD  r   rC   rc  )lenr   r   rF  itemsrV  rW  zip)abrM   
nestedOnlyrb  kv1v2_assertSortedEqualr^  ra  s           r&   ro  z-assertSortedEqual.<locals>._assertSortedEqual3  s^   Vs1v	!Q'	((	J
1jm1f
	!Q'	((4Z40	 +uq"	
1B"tT5)*z"tT5>Q/RB5A:a1j#N	rAq)**+ A31A31Q +vr2"tT5)*z"tT5>Q/RB5A:a1j#N	rAq)**	+r(   r   z
within:rG   N)rd  	Exceptionr   r   r   r\   ry   rG  rH  rI  rJ  rK  rL  )r%   ri  rj  rM   rk  rb  rO  r?  rP  rQ  ro  r^  ra  s             @@@r&   assertSortedEqualrq  !  s    < , 
+2Q5*c2 ':6q	SVk=Q+
7==	>>!!	>>!!# $ $$ 	#d"#))C..s   , 	C0B1C++C0assertRaisesRegexpc                     	  ||i | | j                  dt        |d      z         y # |$ rF}t        j                  |t	        |            | j                  d|d|d       Y d }~y Y d }~y d }~ww xY w)Nz%s not raisedr)   "z" does not match ")rL  getattrr   r   r\   )r%   excclsregexpfunr   r{   r?  s          r&   rr  rr  X  sn    <
 99_wvz::;	 
 <iiA'II:;; (<s   ) A47A//A4c                     |}d}|6t        |d      r*t        |t              st        j                  |      \  }}d}||vr*|rt        |      }|xs |d|}| j                  |       y y )NF__iter__Tz was not found in hasattrr   r\   	itertoolsteerV  rL  r%   ri  rj  rO  bbwraps         r&   assertInr  d  sk    "	$[WQ
+Jq#4F==51b
4aZ
bB		2Ar2399S> r(   c                     |}d}|6t        |d      r*t        |t              st        j                  |      \  }}d}||v r*|rt        |      }|xs |d|}| j                  |       y y )NFrz  Tz unexpectedly found in r{  r  s         r&   assertNotInr  o  sk    "	$[WQ
+Jq#4F==51b
4!V
bB		7B7399S> r(   c                 d   t         j                  j                  t        j                  k  rCt
        j                  j                  d       t        j                  d| j                                t        |        t         j                  j                  dkD  rt        j                         | _        y y )NrG   z"========== %s ====================r   )rs   rc   r   rK   rO   r;   stderrwriterI   debugid
_org_setUpr   r   __startTimer$   s    r&   _customSetUpr  |  sn     LLgmm+**4,,'3DLLQYY[$ r(   c                     t         j                  j                  dkD  rCt        j                  j                  dt        j                         | j                  z
  fz         y y )Nr   z
 %.3fs -- )rs   rc   r   r;   r  r  r   r  r$   s    r&   _customTearDownr    sD    LLQ**<499;1A1A#A"CC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                   8    e Zd ZdZd	dZd
dZd Zd Zd Zd Z	y)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.
		c                    t        j                         | _        d| _        d| _        t               | _        d| _        t               | _	        t        j                  j                  |        |r| j                  | _        y y )NrH   r   )	threadingLock_lock_val_dirtyrV  _recs
_nolckCntrr   _strmrK   Handlerr'   _handle_lazyhandle)r%   lazys     r&   r'   z'LogCaptureTestCase._MemHandler.__init__  s^     4:494;4:4?
4:
??D!
##DK r(   Nc                     |rt        d|z        d| _        | j                  5  d| _        t	               | _        | j                  j                  d       ddd       y# 1 sw Y   yxY w)z)Truncate the internal buffer and records.z.invalid size argument: %r, should be None or 0rH   r   N)rp  r  r  r  rV  r  r  truncate)r%   sizes     r&   r  z'LogCaptureTestCase._MemHandler.truncate  s[    

DtK
LL49

 DKDJJJ  s   2AA(c                 @   	 |j                         dz   }	 | j                  j                  |       y # t        $ r. | j                  j                  |j	                  dd             Y y w xY w# t
        $ r(}| j                  j                  d|z         Y d }~y d }~ww xY w)NrG   zUTF-8r]   zError by logging handler: %r)
getMessager  r  UnicodeEncodeErrorencoderp  )r%   recordrO  r?  s       r&   __writez&LogCaptureTestCase._MemHandler.__write  s    9




$C6	ZZc 6	ZZcjj)456
 9JJ3a7889s2   A, 2 4A)&A, (A))A, ,	B5BBc                    | j                   s| j                  S | j                  j                  d      }| j                   dz  r|sQ| xj                  dz  c_        | j                  dk  r| j                  S d| _        | j                  j                          	 | xj                   dz  c_         | j
                  }t               | _        | j                  j                          |D ]  }| j                  |        n1|r/| xj                   dz  c_         | j                  j                          | j                  j                         | _        | j                  S # | j                  j                          w xY w)z&Return current buffer as whole string.Fr   rC      r   )r  r  r  acquirer  r  rV  release_MemHandler__writer  getvalue)r%   lckrecsr  s       r&   r  z'LogCaptureTestCase._MemHandler.getvalue  s    ++99			E	"3
kkAo	___1YYT_	ZZ	[[B[JJT&TZ	ZZ 	\\&KK2KJJzz""$49
)) 
ZZs   0E E2c                     | j                  |       | j                  5  | xj                  dz  c_        ddd       y# 1 sw Y   yxY w)z-Handle the specified record direct (not lazy)rC   N)r  r  r  r%   r  s     r&   r  z%LogCaptureTestCase._MemHandler.handle  s8    <<

 KK1K  s	   =Ac                     | j                   5  | j                  j                  |       | xj                  dz  c_        ddd       y# 1 sw Y   yxY w)z*Lazy handle the specified record on demandr   N)r  r  r   r  r  s     r&   r  z+LogCaptureTestCase._MemHandler._handle_lazy  s>    

 JJfKK1K  s   1AAr   ri   )
r)   r*   r+   __doc__r'   r  r  r  r  r  r,   r(   r&   _MemHandlerr    s&    	$9 Dr(   r  c                    t         j                  | _        t         j                  | _        t
        j                  t        j                  j                        | _
        | j                  gt         _        | j                  t        j                  k  r#t         xj                  | j                  z  c_        | j                  t        j                  dz
  kD  r&t         j                  t        j                  dz
         t        t
        | ?          y )NrC   )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     LL$/$ ,,X\\-B-BC$)YYK&/	__%	??d(((?	__w}}Q&	??7==?#D')r(   c                     | j                          | j                  j                          | j                  t        _        t        j                  | j                         t        t        | +          y)zCall after every test case.N)pruneLogr  closer  rI   r  rJ   r  r   r  tearDownr  s    r&   r  zLogCaptureTestCase.tearDown  sG     --/))//&&&///$//"D*,r(   c                     | j                   j                         }|j                  dd      s|D ]  }||v s y 	 y|D ]  }||vs y y)NallFT)r  r  rr   r%   r   r{   loggeds_s        r&   
_is_loggedzLogCaptureTestCase._is_logged  sd    99&	E5	! r	V|   r	 r(   c           	          j                  dd      }|r;t        j                  j                  |      }t	        j
                   fd|      }n  j                  i }j                  dd      s@|s= j                  j                         } j                  dd|rd|z  nd	d
|d       yy|sH j                  j                         }D ](  }||vs j                  |d|rd|z  nd	d
|d       * yy)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 %srH   z: ===
===z was not found in the log)
rr   rs   rc   r   r   wait_forr  r  r  rL  )r%   r   r{   r  resr  r  s   ```    r&   assertLoggedzLogCaptureTestCase.assertLogged  s     
FD	!$	
,,
"
"4
(4	=t	D3	!	&v	&3	E5	!
YY!FIIA $}t",v7 8  YY!F :
&
iir"&	B.9 :: r(   c                 
   | j                   j                         }t        |      dkD  r8|j                  dd      s&|D ]  }||vs y | j	                  d|d|d       y|D ]  }||v s| j	                  |d|d         y)	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
		rC   r  FNzAll of the z$ were found present in the log: ===
r  z was found in the log: ===
)r  r  rf  rr   rL  r  s        r&   assertNotLoggedz"LogCaptureTestCase.assertNotLogged3  s     99&VaZ

5%0 r	 99!VTU Er	V|	YYFCDEr(   c                 l    | j                   j                  d       |rt        j                  d|       y y )Nr   z===== %s =====)r  r  rI   r  )r%   logphases     r&   r  zLogCaptureTestCase.pruneLogH  s+    ))Q	<<&1 r(   c                 6    | j                   j                         S ri   )r  r  r$   s    r&   getLogzLogCaptureTestCase.getLogM  s    				r(   c                    |t         j                  k7  s%t         j                         t        j                  k  rJ |d| z   dz          t        j                  |       D ]  }|j                  d      } ||         |d       yy)z@Helper which outputs content of the file at HEAVYDEBUG loglevelsz---- z ----rG   z------------------------------N)rI   r  getEffectiveLevelrK   rO   	fileinputinputrstrip)fnr  lines      r&   dumpFilezLogCaptureTestCase.dumpFileP  sq      8 8 :gmm K	'B,
 !r" t;;tD
4L 
&> !Lr(   ri   )r)   r*   r+   rK   r  r  r  r  r  r  r  r  r  staticmethodrI   r  r  r   )r   s   @r&   r  r    sV    V7?? Vp* - :BE*2
   r(   r  )rH   )NNri   )O
__author____copyright____license__r  r}  rK   r8   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   putenvr.  r-  r/  Valuesr   rA   ra   rc   r   r   r   r   old_TZr   r   rA  rG  rI  r|  TestCaserB  reprrq  rr  assertRaisesRegexr  r  r  r  r  r  _org_tearDownr  r  
pid_existsr,   r(   r&   <module>r     s  * "
7     	 	   
      M M + "      
:	ZZ^^148
GGNN277<<9:** 	rww||J@A 
		,9 )   *
X2j/
 /d 	N,b
 
d	#g\ x  "34	 &5"()e4 3h '8   #x  "67< (:$ 	 '	 "-$$
! !!**E '   ,   I** IX 
r(   