
    =*fp                        S r SrSrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSKJrJrJrJr  SS	KJrJr  SS
KJr  SSKJr  SSKJ r   SSK!J!r!  \" S5      r"Sr#\RH                  RK                  SS5      r&\&(       d?  \RN                  RQ                  \RN                  RS                  SS5      5      (       a  Sr&OSr&\RN                  RQ                  \RN                  RS                  \&S5      5      r*\RV                  " S\RN                  RY                  \RN                  RY                  \RN                  RY                  \RN                  R[                  \.5      5      5      5      5         " S S\R^                  5      r0S.S jr1S r2 " S S\05      r3S r4S r5S r6S r7\RH                  RK                  SS5      r8S  r9S! r:S/S" jr;SSK<r<SSK=r=\>" \R~                  S#5      (       d  S0S$ jr@\@\R~                  l@        S%S&\AS4S' jrB\B\R~                  lB         S0S( jrC\C\R~                  lC        S0S) jrD\D\R~                  lD        \R~                  R                  rFS* rG\R~                  R                  rIS+ rJ\G\R~                  lE        \J\R~                  lH         " S, S-\R~                  5      rK\R                  rLg)1z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                       \ rS rSrS rSrg)DefaultTestOptionsG   c           
      &    S S SS S SSSSS.	U l         g )NTF)		log_level	verbositylog_lazylog_tracebackfull_tracebackfast	memory_db
no_network	negate_re__dict__selfs    6/usr/lib/python3/dist-packages/fail2ban/tests/utils.py__init__DefaultTestOptions.__init__H   s!    4TDuU	$-    r#   N)__name__
__module____qualname____firstlineno__r(   __static_attributes__ r*   r'   r   r   G   s    r*   r   c                 f   [         R                  n[         R                  " S[        R                  S   -  U -   S[
        -   S9nUR                  U" SSSS SS	9U" S
SSS SS9U" SSS[        S SS9U" SSSSSS9U" SSSSSS9U" SSSS S!S9U" S"S#SS$S%S9U" S&S'SS(S)S9U" S*S+SS,S-9U" S.SS/S-9/
5        U$ )0Nz%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)actionr3   r4   r5   z--verbositystorez'Set numerical level of verbosity (0..4))r7   r3   typer4   r5   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)r7   r3   r5   z-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)r7   r5   z--full-tracebackzBEither to make the tracebacks full, not compressed (as by default))optparseOptionOptionParsersysargvr   add_optionsint)docr=   ps      r'   getOptParserrE   S   s-   
//
$sxx{
2S
8w  }AC 	gK! 	w[s46 	.0 	~l68 	}\<> 	x^` 	z,NP 	 ;=	LOQ; @ 	
r*   c           	         S nU R                   b+  [        U R                   5      n[        R                  U5        O#[        R                  [        R
                  5        [        R                  U l         U R                  nUc  Uc  SOU[        R                  ::  a  SOsU[        R                  ::  a  SO]U[        [        R                  [        R                  5      ::  a  SO/U[        [        R                  [        R                  5      ::  a  SOSnX l        [        R                  " [         R"                  5      nSnU R$                  (       a(  SSKJn  U R*                  =(       a    S=(       d    S	U-   nO[        R,                  n[/        X$5      nUR1                  U" U5      5        [        R3                  U5        U R                  S:w  a?  [5        S
[6        < S[9        [         R6                  5      R;                  SS5      < S35        U $ )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   helpersrJ   r   	Formatterr
   setFormatter
addHandlerprintr   strreplace)optsllevr   rZ   fmtr\   s         r'   initProcessre   |   sx   NN	dnn	%$//$
 	//'""#,, ^^1"""11GLL'..111GOOW]]331  . 




+;				*	8jC?#) )) Ys^$6 	NNaCKK ((r2
4 6 	r*   c                   D    \ rS rSrSrSrS rS rS rS r	S r
SS	 jrS
rg)F2B   <      c                 t    UR                   U l         U R                  (       a  SU l        0 U R                   S'   g )NTshare_config)r$   r   r    )r&   rb   s     r'   r(   F2B.__init__   s)    --$-	YY4>"$$--r*   c                     g Nr0   r%   s    r'   
SkipIfFastF2B.SkipIfFast       r*   c                     g ro   r0   r%   s    r'   SkipIfNoNetworkF2B.SkipIfNoNetwork   rr   r*   c                    [         (       d  UR                  S5      (       a  [        R                  " S5      eS H  nUR                  U5      nUc  M  [        R
                  R                  U5      S   S:X  a  US-  n[        R
                  R                  [        R
                  R                  [        US-   U5      5      (       a  M  [        R                  " S	U< S
U< 35      e   gg)zBHelper to check action/filter config is available
                stockz/Skip test because of missing stock-config files)r7   filterNrG   rL   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'   SkipIfCfgMissingF2B.SkipIfCfgMissing   s     
jj


M
NN q

1Ay(	ww1#Q'\Q77>>"'',,z1T61=>>PQSTUVV ! 
r*   c                    ^ U4S jnU$ )zLHelper decorator to check action/filter config is available
                c                 4   >^  [        T 5      UU 4S j5       nU$ )Nc                 \   > [         R                  R                  " S0 TD6  T" U /UQ70 UD6$ )Nr0   )r{   rg   r   )r&   argsr   decargsfs      r'   wrapper?F2B.skip_if_cfg_missing.<locals>._deco_wrapper.<locals>.wrapper   s-    LL!!,G,T#D#F##r*   r   )r   r   r   s   ` r'   _deco_wrapper.F2B.skip_if_cfg_missing.<locals>._deco_wrapper   s     	!H$ $ >r*   r0   )r&   r   r   s    ` r'   skip_if_cfg_missingF2B.skip_if_cfg_missing   s     
r*   c                     [        U[        5      (       a  U(       a  U R                  nU R                  (       a#  [        U[        5      (       a  [        U5      S-  nU$ )N
   )
isinstanceboolMAX_WAITTIMEr   rB   float)r&   wtimes     r'   maxWaitTimeF2B.maxWaitTime   sD    t5 
YY:eS))<"5	,r*   )r$   r    NT)r+   r,   r-   r.   r   MID_WAITTIMEr(   rp   rt   r   r   r   r/   r0   r*   r'   rg   rg      s+    %
W	r*   rg   c                 0   ^  [        T 5      U 4S j5       nU$ )zHelper decorator to create a temporary directory

Directory gets removed after function returns, regardless
if exception was thrown of not
c                    > [         R                  " SS9n T" X/UQ70 UD6[        R                  " U5        $ ! [        R                  " U5        f = f)Nzf2b-temp)prefix)tempfilemkdtempshutilrmtree)r&   r   r   tmpr   s       r'   r   with_tmpdir.<locals>.wrapper   sE    
+#
D
'
'
' 
==6==s	   9 Ar   r   r   s   ` r'   with_tmpdirr      s"     (  	r*   c                 0   ^  [        T 5      U 4S j5       nU$ )z@Helper decorator to execute test in alternate (fixed) test time.c                 d   > [        5          T" U /UQ70 UD6[        5         $ ! [        5         f = fro   )setUpMyTimetearDownMyTime)r&   r   r   r   s      r'   r   with_alt_time.<locals>.wrapper   s,    -
D
"4
"6
">s   # /r   r   s   ` r'   with_alt_timer      s     (  	r*   c                 p  ^ U (       d  [        [        5       5      n [        U 5      [        l        [        R                  R                  (       a:  S[
        l        S[
        l        S[
        l        S nU[        R                  l	        OBS[
        l        S[
        l        S[
        l        [        R                  mU4S jnU[        l        [        R                  R                  (       a  S nU[        R                  l        S	[        R                  S
'   [        R                   " 5         ["        R$                  " [&        5        [(        R*                  nS Ul        UR/                  SSS9  [1        S5       HW  nUR3                  SU-  S 5        UR3                  SU-  S 5        UR3                  SU-  S 5        UR3                  SU-  S5        MY     UR3                  SS5        UR3                  SS5        [        R                  R                  (       Ga  [        R                  R                  (       a  S H  nUR3                  US5        M     UR3                  SS 5        UR3                  SS5        UR3                  SS5        UR3                  SS5        [(        R4                  nS  Ul        S![3        5       4S"[3        5       4S#[3        5       4S$[3        5       4S%[3        5       4S&[3        5       4S'[3        [7        S(5      [7        S)5      /5      4S*[3        [7        S(5      [7        S)5      /5      44 H  nUR2                  " U6   M     [        R                  R                  (       aM  [3        [7        S+5      [7        S,5      /5      n[(        R8                  " 5        H  nUR3                  XV5        M     g g g )-Ng{Gzd?gMb@?g-C6?c                  .    [         R                  " S5      e)NzSkip test because of "--fast"r{   r|   r0   r*   r'   F2B_SkipIfFast!initTests.<locals>.F2B_SkipIfFast
  s    			:	;;r*   g?g{Gzt?c                 >   > U S:  a  [        SU -  5      eT" U 5        g )Ng      ?zT[BAD-CODE] To long sleep interval: %s, try to use conditional Utils.wait_for instead)
ValueError)r   
_org_sleeps    r'   
_new_sleepinitTests.<locals>._new_sleep  s#    $h
knoo
ppa=r*   c                  .    [         R                  " S5      e)Nz#Skip test because of "--no-network"r   r0   r*   r'   F2B_SkipIfNoNetwork&initTests.<locals>.F2B_SkipIfNoNetwork  s    			@	AAr*   zCET-01CEST-02,M3.5.0,M10.5.0TZc                  ,    [         R                  S5      $ )Nz.clear CACHE_ipToName is disabled in test suiterM   warningr0   r*   r'   <lambda>initTests.<locals>.<lambda>+  s    6>>"RSr*   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.10)	127.0.0.1::1	localhostz192.0.2.888z8.8.4.4z
dns.googlez8.8.8.8z199.9.14.201zb-2017.b.root-servers.orgc                  ,    [         R                  S5      $ )Nz.clear CACHE_nameToIp is disabled in test suiter   r0   r*   r'   r   r   A  s    FNN#STr*   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:21f:cb07:6820:80da:af6b:8b2cz93.184.215.14zwww.example.comr   r   )re   r   rg   r{   r   r   DEFAULT_SLEEP_TIMEDEFAULT_SLEEP_INTERVALDEFAULT_SHORT_INTERVALrp   timesleepr!   rt   r}   environtzsetr   setAlternateNowTEST_NOWr   CACHE_ipToNameclear
setOptionsrangesetCACHE_nameToIpr   getSelfNames)rb   r   r   r   ciipsr   s          @r'   	initTestsr      s   	')	*$D	LL $%!'%!'%<*(,, #%!&%!'%zz* $*LLB!4(,, 3D! Sud+
*Q%%q$%%!T"%%D!%%;'	  &$LL\\ qEE![ ! %%t%%	< %%	< %%34!T!'suSU#%SU'/$ce,3GH&Q`JabcdsF#KLfUdNefgh	a 55!9	 \\	f[!6%=1	23!!#qEE!M $ 1 r*   c                      g ro   r0   r0   r*   r'   
mtimesleepr   T  s     r*   r   c                  8    [         R                  " [        5        g ro   )r   setTimer   r0   r*   r'   r   r   \  s     r*   c                      S [         l        g ro   )r   myTimer0   r*   r'   r   r   b  s	    r*   c           
        ^ ^^ [        T5        SSKJn  SSKJn  SSKJn  SSKJn  SSKJn  SSKJn  SSKJn  SS	KJ	n	  SS
KJ
n
  SSKJn  SSKJn  SSKJn  SSKJn  SSKJn  SSKJn  SSKJn  SSKJn  T (       d  [&        R(                  " 5       nO% " UUU 4S jS[&        R(                  5      mT" 5       n[&        R*                  R,                  nUR/                  U" UR0                  5      5        UR/                  U" UR2                  5      5        UR/                  U" UR4                  5      5        UR/                  U" UR6                  5      5        UR/                  U" UR8                  5      5        UR/                  U" U
R:                  5      5        UR/                  U" UR<                  5      5        UR/                  U" UR>                  5      5        UR/                  U" UR@                  5      5        UR/                  U" URB                  5      5        UR/                  U" UR@                  5      5         SS K"nUR/                  U" URF                  5      5        UR/                  U" URJ                  5      5        UR/                  U" URL                  5      5        UR/                  U" URN                  5      5        UR/                  U" URP                  5      5        UR/                  U" URR                  5      5        UR/                  U" URT                  5      5        UR/                  U" URV                  5      5        UR/                  U" URX                  5      5        UR/                  U" URZ                  5      5        UR/                  U" UR\                  5      5        UR/                  U" UR^                  5      5        UR/                  U" UR`                  5      5        UR/                  U" URb                  5      5        UR/                  U" URd                  5      5        UR/                  U" URf                  5      5        UR/                  U" URh                  5      5        UR/                  U" URj                  5      5        UR/                  U" URl                  5      5        UR/                  U" URn                  5      5        UR/                  U" URp                  5      5        UR/                  U" URr                  5      5        UR/                  U" URt                  5      5        UR/                  U" URv                  5      5        UR/                  U" URx                  5      5        UR/                  U" URz                  5      5        UR/                  U" UR2                  5      5        UR/                  U" U	R|                  5      5        UR/                  U" U	R~                  5      5        UR/                  U" UR                  5      5        UR/                  U" UR                  5      5        UR/                  U" UR                  5      5        UR/                  U" UR                  5      5        [&        R                  " 5       nSSKJEn  [        R                  " [        R                  R                  [        R                  R                  UR                  5      5      5       H  nUR                  S5      (       d  M  UR                  S5      (       d  M3  UR/                  UR                  UR                  < S[        R                  R                  U5      S   < 35      5        M     SSKQJRn  U/n SSKSJTn  UR                  U5        U H)  nUR/                  U" UR                  U5      5      5        M+      SSKYJZn  UR/                  U" UR                  U5      5      5        UR/                  U" UR                  5      5        U$ ! [H         a     GNf = f! [H         a"  n[        R                  SU-  5         S nANS nAff = f! [H         a"  n[        R                  SU-  5         S nANS nAff = f) NrG   )banmanagertestcase)clientbeautifiertestcase)clientreadertestcase)tickettestcase)failmanagertestcase)filtertestcase)servertestcase)datedetectortestcase)actiontestcase)actionstestcase)sockettestcase)misctestcase)databasetestcase)observertestcase)samplestestcase)fail2banclienttestcase)fail2banregextestcasec                      >^ \ rS rSr Y V VVs/ s H  n[        R
                  " U5      PM     snnn rUUU4S jrSrU=r	$ s  snnn f )&gatherTests.<locals>.FilteredTestSuitei  c                 z  > / nU H  n[        U[        R                  5      (       a  U R                  U5        M5  [	        U5      nU R
                   HJ  nUR                  U5      nT	R                  (       d
  U(       d  M.  O	U(       a  M8  UR                  U5          M     M     U H  n[        TU ]  U5        M     g ro   )
r   r{   	TestSuiteaddTestr`   _regexpssearchr"   appendsuper)
r&   suitematchedtestsrmFilteredTestSuite	__class__rb   s
          r'   r   .gatherTests.<locals>.FilteredTestSuite.addTest  s    G4++,,
ll4	TQmm
((1+a>>!!11~~d	   
d+D1 r*   r0   )
r+   r,   r-   r.   recompiler   r   r/   __classcell__).0r  r  r  r  rb   regexpss   000@r'   r  r     s.    &-.grzz!}g.82 2 /s    Ar  r   )action_dtest_z.py.r   )
FilterPoll)FilterPyinotifyz9I: Skipping pyinotify backend testing. Got exception '%s')FilterSystemdz7I: Skipping systemd backend testing. Got exception '%s')]r   rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   r   defaultTestLoaderloadTestsFromTestCaser   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  r}   listdirr~   abspathdirname__file__
startswithendswithloadTestsFromNamer+   r   server.filterpollr  server.filterpyinotifyr  r   rM   r   get_monitor_failures_testcaseserver.filtersystemdr  %get_monitor_failures_journal_testcaseTransmitterLogging) r  rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   tests	loadTestsr  
testloaderr  file_r  filtersr  eFilter_r  r  s    ``                             @r'   gatherTestsrV  f  s8   
4 "'#"#%$



%2 2(,, 2( 
%''== y3345y1123y2234y4456y??@Ay99:;y7789y3345y,7789y,??@Ay+6678--	,DDEF
 y1@@AB y->>?@y-<<=>y->>?@y-==>?y-BBCDy../0y2234y1123y//01y4456y0012y)6678y)6678y)5567y)7789 y0012y3345y//01y6678y99:;y3345y3345y5567y<<=>y1123 y->>?@y-CCDEy;;<= y/BBCDy/BBCDy.@@AB
 !!#jj''//"''//("3"3457U
g5>>%#8#8==--  "''"2"25"9!"<=? @7 ,<
R6	..! W--	//8: ; P2--	.NN}]^_ y::;<y 	 X 	 R..LqPQQR 	 P..JQNOOPsB   =%` 	`0 ,a 
`-,`-0
a:aa
b)bbassertDictEqualc           	         U R                  [        U[        5      S5        U R                  [        U[        5      S5        X:w  a  U< SU< 3nSSR                  [        R
                  " [        R                  " U5      R                  5       [        R                  " U5      R                  5       5      5      -   nU=(       d    XE-   nU R                  U5        g g )Nz"First argument is not a dictionaryz#Second argument is not a dictionary != rK   )

assertTruer   dictr   difflibndiffpprintpformat
splitlinesfail)r&   d1d2msgstandardMsgdiffs         r'   rW  rW    s    //*R&(LM//*R&(MNX!2&;$))GMM
NN2!!#
NN2!!#% & &4 
	$#399S> r*   rG   Fc           
        ^
^^ S mU(       a  [         mO	U4U4S jjmU
UU4S jm
 T
" XX4U5        g! [         a  n[        U[        5      (       a  UR                  S   O[        U5      S-   nSSR                  [        R                  " [        R                  " U5      R                  5       [        R                  " U5      R                  5       5      5      -   n	U=(       d    X-   nU R                  U5         SnAgSnAff = f)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                     [        U [        5      (       a   [        S U R                  5        5       5      $ [        S U  5       5      $ )Nc              3   X   #    U  H   n[        U[        [        [        45      v   M"     g 7fro   r   r[  listtupler  r   s     r'   	<genexpr>8assertSortedEqual.<locals>._is_nested.<locals>.<genexpr>"  s!     E*QjT4/00*   (*c              3   X   #    U  H   n[        U[        [        [        45      v   M"     g 7fro   rj  rm  s     r'   rn  ro  #  s!     ;AZD$.//rp  )r   r[  anyvalues)r   s    r'   
_is_nested%assertSortedEqual.<locals>._is_nested   s7    4
E!((*E
EE	;;	;;r*   c                    >^ [        U [        [        [        45      (       a  [	        [        UU4S jU  5       5      TS9$ U $ )Nc              3   6   >#    U  H  nT" UT5      v   M     g 7fro   r0   )r  r   _nest_sortedkeys     r'   rn  :assertSortedEqual.<locals>._nest_sorted.<locals>.<genexpr>)  s     7Q|As++Qs   ry  )r   r   rk  rl  sorted)r   ry  rx  s    `r'   rx  'assertSortedEqual.<locals>._nest_sorted'  s4    S$&''$7Q77SAA
8r*   c                 b  > [        U 5      [        U5      :w  a  [        U < SU< 35      eU(       d9  U(       a2  T	" U 5      (       d%  T	" U5      (       d  X:X  a  g [        U < SU< 35      e[        U [        5      (       a  [        U[        5      (       a  U R	                  5        Hw  u  pVX   n[        U[        [
        [        45      (       a7  [        U[        [
        [        45      (       a  T" XgUS:w  a  US-
  OSX45        M`  Xg:w  d  Mg  [        U < SU< 35      e   g T
" XS9n T
" XS9n[        X5       Hs  u  pg[        U[        [
        [        45      (       a7  [        U[        [
        [        45      (       a  T" XgUS:w  a  US-
  OSX45        M\  Xg:w  d  Mc  [        U < SU< 35      e   g )NrY  r   rG   r{  )lenr   r   r[  itemsrk  rl  zip)abrQ   
nestedOnlyry  kv1v2_assertSortedEqualrt  rx  s           r'   r  -assertSortedEqual.<locals>._assertSortedEqual,  sP   Vs1v	!Q'	((	J
1jmmf
	!Q'	((4Z400	uq	
B"tT5)**z"tT5>Q/R/R5A:a1jN	Aq)**  A1A1Qvr"tT5)**z"tT5>Q/R/R5A:a1jN	Aq)**	 r*   r   z
within:rK   N)r|  	Exceptionr   r   r   r`   r   r\  r]  r^  r_  r`  ra  )r&   r  r  rQ   r  ry  rd  rT  re  rf  r  rt  rx  s             @@@r'   assertSortedEqualr    s    < , 
+2Q5c2 ':66q	SVk=Q+
7==	>>!!	>>!!# $ $$ 	#"#))C..s   
2 
DB=C>>Dc                    UnSnUc@  [        US5      (       a/  [        U[        5      (       d  [        R                  " U5      u  p$SnX;  a6  U(       a  [        U5      nU=(       d	    U< SU< 3nU R                  U5        g g )NF__iter__Tz was not found in hasattrr   r`   	itertoolsteerk  ra  r&   r  r  rd  bbwraps         r'   assertInr  R  sm    "	$[WQ
++Jq#4F4F==51
4Z
bB		2Ar2399S> r*   c                    UnSnUc@  [        US5      (       a/  [        U[        5      (       d  [        R                  " U5      u  p$SnX;   a6  U(       a  [        U5      nU=(       d	    U< SU< 3nU R                  U5        g g )NFr  Tz unexpectedly found in r  r  s         r'   assertNotInr  ]  sm    "	$[WQ
++Jq#4F4F==51
4V
bB		7B7399S> r*   c                 j   [         R                  R                  [        R                  ::  aC  [
        R                  R                  S5        [        R                  SU R                  5       5        [        U 5        [         R                  R                  S:  a  [        R                  " 5       U l        g g )NrK   z"========== %s ====================r   )r{   rg   r   rO   rS   r?   stderrwriterM   debugid
_org_setUpr   r   __startTimer%   s    r'   _customSetUpr  j  sn     LLgmm+**4,,'3DLLQYY[$ r*   c                     [         R                  R                  S:  aD  [        R                  R                  S[        R                  " 5       U R                  -
  4-  5        g g )Nr   z
 %.3fs -- )r{   rg   r   r?   r  r  r   r  r%   s    r'   _customTearDownr  u  sD    LLQ**<499;1A1A#A"CCD r*   c                      ^  \ rS rSr " S S\R
                  5      rU 4S jrU 4S jrS r	S r
S rSS	 jrS
 r\\R                   4S j5       rSrU =r$ )LogCaptureTestCasei}  c                   D    \ rS rSrSrSS jrSS jrS rS rS r	S	 r
S
rg)LogCaptureTestCase._MemHandleri  zLogging 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                    [         R                  " 5       U l        SU l        SU l        [        5       U l        SU l        [        5       U l	        [        R                  R                  U 5        U(       a  U R                  U l        g g )NrL   r   )	threadingLock_lock_val_dirtyrk  _recs
_nolckCntrr   _strmrO   Handlerr(   _handle_lazyhandle)r&   lazys     r'   r(   'LogCaptureTestCase._MemHandler.__init__  s^     4:494;4:4?
4:
??D!
##DK r*   Nc                     U(       a  [        SU-  5      eSU l        U R                     SU l        [	        5       U l        U R                  R                  S5        SSS5        g! , (       d  f       g= f)z)Truncate the internal buffer and records.z.invalid size argument: %r, should be None or 0rL   r   N)r  r  r  r  rk  r  r  truncate)r&   sizes     r'   r  'LogCaptureTestCase._MemHandler.truncate  sP    

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

DKDJJJ 	

s   2A$$
A2c                 D    UR                  5       S-   n U R                  R                  U5        g ! [         a.    U R                  R                  UR	                  SS5      5         g f = f! [
         a(  nU R                  R                  SU-  5         S nAg S nAff = f)NrK   zUTF-8ra   zError by logging handler: %r)
getMessager  r  UnicodeEncodeErrorencoder  )r&   recordrd  rT  s       r'   __write&LogCaptureTestCase._MemHandler.__write  s    9




$C6	ZZc 6	ZZcjj)456
 9JJ3a7889s2   A- 2 5A*'A- )A**A- -
B7BBc                    U R                   (       d  U R                  $ U R                  R                  S5      nU R                   S-  (       a  U(       dR  U =R                  S-  sl        U R                  S::  a  U R                  $ SU l        U R                  R                  5          U =R                   S-  sl         U R
                  n[        5       U l        U R                  R                  5         U H  nU R                  U5        M     O6U(       a/  U =R                   S-  sl         U R                  R                  5         U R                  R                  5       U l        U R                  $ ! U R                  R                  5         f = f)z&Return current buffer as whole string.Fr   rG      r   )r  r  r  acquirer  r  rk  release_MemHandler__writer  getvalue)r&   lckrecsr  s       r'   r  'LogCaptureTestCase._MemHandler.getvalue  s    ++99			E	"3
kkAo	___1YYT_	ZZ	[[B[JJT&TZ	ZZ	\\& KK2KJJzz""$49
)) 
ZZs   '0E- -F	c                     U R                  U5        U R                     U =R                  S-  sl        SSS5        g! , (       d  f       g= f)z-Handle the specified record direct (not lazy)rG   N)r  r  r  r&   r  s     r'   r  %LogCaptureTestCase._MemHandler.handle  s-    <<

KK1K 	

s	   =
Ac                     U R                      U R                  R                  U5        U =R                  S-  sl        SSS5        g! , (       d  f       g= f)z*Lazy handle the specified record on demandr   N)r  r  r   r  r  s     r'   r  +LogCaptureTestCase._MemHandler._handle_lazy  s3    

JJfKK1K 	

s   1A
A)r  r  r  r  r  r  r  r   ro   )r+   r,   r-   r.   __doc__r(   r  r  r  r  r  r/   r0   r*   r'   _MemHandlerr    s&    	$9 Dr*   r  c                   > [         R                  U l        [         R                  U l        [
        R                  [        R                  R                  5      U l
        U R                  /[         l        U R                  [        R                  ::  a#  [         =R                  U R                  -  sl        U R                  [        R                  S-
  :  a&  [         R                  [        R                  S-
  5        [        [
        U ]?  5         g )NrG   )rM   rQ   
_old_levelhandlers_old_handlersr  r  r{   rg   r   _logrO   rS   rN   r   setUpr&   r  s    r'   r  LogCaptureTestCase.setUp  s     LL$/$ ,,X\\-B-BC$)YYK&/	__%	??d(((?	__w}}Q&	??7==?#D')r*   c                    > U R                  5         U R                  R                  5         U R                  [        l        [        R                  U R                  5        [        [        U ]+  5         g)zCall after every test case.N)pruneLogr  closer  rM   r  rN   r  r   r  tearDownr  s    r'   r  LogCaptureTestCase.tearDown  sG     --/))//&&&///$//"D*,r*   c                     U R                   R                  5       nUR                  SS5      (       d  U H
  nXC;   d  M
    g    gU H
  nXC;  d  M
    g   g)NallFT)r  r  rz   r&   r  r   loggeds_s        r'   
_is_loggedLogCaptureTestCase._is_logged  sY    99&	E5	!	!r	|   r	  r*   c           	      X  ^ ^^ TR                  SS5      nU(       a=  [        R                  R                  U5      n[        R
                  " UUU 4S jU5      nOT R                  " T0 TD6nTR                  SS5      (       dM  U(       dE  T R                  R                  5       nT R                  ST< SU(       a  SU-  OS	< S
U< S35        ggU(       dT  T R                  R                  5       nT H3  nXe;  d  M
  T R                  U< SU(       a  SU-  OS	< S
U< S35        M5     gg)a[  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                  (   > TR                   " T0 T D6$ ro   )r  )r   r  r&   s   r'   r   1LogCaptureTestCase.assertLogged.<locals>.<lambda>  s     =f =r*   r  FzNone among z was found in the logz, waited %srL   z: ===
===z was not found in the log)
rz   r{   rg   r   r   wait_forr  r  r  ra  )r&   r  r   r  resr  r  s   ```    r'   assertLogged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                 ,   U R                   R                  5       n[        U5      S:  aB  UR                  SS5      (       d+  U H
  nXC;  d  M
    g   U R	                  SU< SU< S35        gU H#  nXC;   d  M
  U R	                  U< SU< S35        M%     g)	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
rG   r  FNzAll of the z$ were found present in the log: ===
r  z was found in the log: ===
)r  r  r  rz   ra  r  s        r'   assertNotLogged"LogCaptureTestCase.assertNotLogged!  sw     99&VaZ

5%00r	  99!VTUr	|	YYFCD r*   c                 v    U R                   R                  S5        U(       a  [        R                  SU5        g g )Nr   z===== %s =====)r  r  rM   r  )r&   logphases     r'   r  LogCaptureTestCase.pruneLog6  s+    ))Q	<<&1 r*   c                 6    U R                   R                  5       $ ro   )r  r  r%   s    r'   getLogLogCaptureTestCase.getLog;  s    				r*   c                    U[         R                  :w  d&  [         R                  5       [        R                  ::  aM  U" SU -   S-   5        [
        R                  " U 5       H  nUR                  S5      nU" U5        M     U" S5        gg)z@Helper which outputs content of the file at HEAVYDEBUG loglevelsz---- z ----rK   z------------------------------N)rM   r  getEffectiveLevelrO   rS   	fileinputinputrstrip)fnr  lines      r'   dumpFileLogCaptureTestCase.dumpFile>  sl      8 8 :gmm K	'B,
 !r"t;;tD
4L # 
&> !Lr*   )r  r  r  ro   )r+   r,   r-   r.   rO   r  r  r  r  r  r  r  r  r  staticmethodrM   r  r  r/   r
  )r  s   @r'   r  r  }  sV    V7?? Vp* - :BE*2
   r*   r  )rL   )NNro   )M
__author____copyright____license__r  r  rO   r<   r}   r  r   r   r?   r   r  r{   ior   	functoolsr   r[   r   r	   r
   r   server.ipdnsr   r   server.mytimer   server.utilsr   serverr   r   rM   r   r   rz   r   r~   r   r   ry   putenvrD  rC  rE  Valuesr   rE   re   rg   r   r   r   r   old_TZr   r   rV  r\  r^  r  TestCaserW  reprr  r  r  r  r  r  r  _org_tearDownr  r  
pid_existsr0   r*   r'   <module>r     sl  * "
7     	 	   
      M M + "      
:	ZZ^^148
GGNN277<<9::** 	rww||J@A 		,9 )   '
R2j.
 .b 	Sl
 
d	#_L x  "344	 &5"()e4 3h '8   # 	 '	 "-$$
! !!**E '   ,   I** IX 
r*   