ogfu dZdZdZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZddlmZmZmZmZdd lmZmZdd lmZdd lmZdd lm Z dd l!m!Z!edZ"dZ#ejHjKddZ&e&s:ejNjQejNjSddrdZ&ndZ&ejNjQejNjSe&dZ*ejVdejNjYejNjYejNjYejNj[e.Gddej^Z0d0dZ1dZ2Gdde0Z3dZ4dZ5dZ6dZ7ejHjKddZ8d Z9d!Z:d1d"Z;ddlej~d#sd2d$Z@e@ej~_@d%d&eAdfd'ZBeBej~_Be>ej~d(sd)ZCeCej~_D d2d*ZEeEej~_Ed2d+ZFeFej~_Fej~jZHd,ZIej~jZKd-ZLeIej~_GeLej~_JGd.d/ej~ZMejZNy)3zYaroslav Halchenkoz%Copyright (c) 2013 Yaroslav HalchenkoGPLN)StringIOwraps) getLogger str2LogLevelgetVerbosityFormat uni_decode)IPAddrDNSUtils)MyTime)Utils) asyncserver)versionfail2bani BFAIL2BAN_CONFIG_DIRconfigz fail2ban.confz /etc/fail2ban PYTHONPATHceZdZdZy)DefaultTestOptionsc (ddddddddddd |_y)NTF) log_level verbositylog_lazy log_tracebackfull_tracebackfast memory_dbno_gamin no_network negate_re)__dict__selfs 6/usr/lib/python3/dist-packages/fail2ban/tests/utils.py__init__zDefaultTestOptions.__init__Hs#4TD u%U $-N)__name__ __module__ __qualname__r'r(r&rrGsr(rctj}tjdtjdz|zdt z}|j |ddddd |d d d dd |ddd tdd|ddddd|ddddd|dddd d!|d"d#dd$d%|d&d'dd(d)|d*d+dd,d-|d.d/dd01|d2dd31g |S)4Nz%s [OPTIONS] [regexps] rz%prog )usagerz-lz --log-levelrz4Log level for the logger to use during running tests)destdefaulthelpz-vcountrzIncrease verbosity)actionr/r0r1z --verbositystorez'Set numerical level of verbosity (0..4))r3r/typer0r1z --log-direct store_falserTz!Prevent lazy logging inside testsz-nz --no-network store_truer!z)Do not run tests that require the network)r3r/r1z-gz --no-gaminr z'Do not run tests that require the gaminz-mz --memory-dbrz/Run database tests using memory instead of filez-fz--fastrzQTry 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)r3r1z--full-tracebackzBEither to make the tracebacks full, not compressed (as by default))optparseOption OptionParsersysargvr add_optionsint)docr9ps r& getOptParserrASsD //  $sxx{ 2S 8 w  }  AC gK ! w[s 46   .0 ~l  68 |L  46 }\  <> x  ^` z,  NP   ;= L OQA""F r(c d}|j+t|j}tj|n#tjtj tj |_|j}||dn|tjkrdnp|tjkrdn[|ttjtjkrdn.|ttjtjkrdnd}||_t jt j"}d}|j$rddlm}|j*xrdxsd |z}ntj,}t/||}|j1||tj3||jdk7r=t5d t6d t9t j6j;d d d|S)Nrrz %(message)s)FormatterWithTraceBackz %(tb)sz %(tbc)sz Fail2ban z test suite. Python  z. Please wait...)rr logSyssetLevelloggingCRITICALlevelr HEAVYDEBUGDEBUGminINFONOTICEWARNINGERROR StreamHandlerr;stdoutrhelpersrFr Formatterr setFormatter addHandlerprintrstrreplace)optsllevrrVfmtrXs r& initProcessras| NN dnn %$//$  //'""#,,^^  1 """1  1 GLL'..111 GOOW]]331  $.    +;   * 8jC?#))S)Ys^$6 NNaCKK ((r2 46 r(c:eZdZdZdZdZdZdZdZdZ d dZ y ) F2B<cx|j|_|jrd|_d|_i|jd<y)NT share_config)r#rrr )r%r^s r&r'z F2B.__init__s0--$- YY4>4="$$--r(cyNr,r$s r& SkipIfFastzF2B.SkipIfFastr(cyrir,r$s r&SkipIfNoNetworkzF2B.SkipIfNoNetworkrkr(c ts|jdrtjddD]}|j|}|tj j |ddk(r|dz }tj jtj jt|dz|rtjd |d |yy) z4Helper to check action/filter config is available stockz/Skip test because of missing stock-config files)r3filterNrCrHz.confz.dzSkip test because of missing z -config for ) STOCKgetunittestSkipTestospathsplitextexistsjoin CONFIG_DIR)r%kwargstvs r&SkipIfCfgMissingzF2B.SkipIfCfgMissings  jj   M NN Wq 1 Ay( ww1#Q'\Q 77>>"'',,z1T61= >   PQSTU VV W r(c fd}|S)z>Helper decorator to check action/filter config is available c2tfd}|S)NcZtjjdi|g|i|S)Nr,)rsrcr~)r%argsr{decargsfs r&wrapperz?F2B.skip_if_cfg_missing.._deco_wrapper..wrappers- LL!!,G, T #D #F ##r(r)rrrs` r& _deco_wrapperz.F2B.skip_if_cfg_missing.._deco_wrappers  !H$ $ >r(r,)r%rrs ` r&skip_if_cfg_missingzF2B.skip_if_cfg_missings r(ct|tr|r |j}|jrt|trt |dz }|S)N ) isinstancebool MAX_WAITTIMErr>float)r%wtimes r& maxWaitTimezF2B.maxWaitTimes>t   5 YY:eS) <" 5 ,r(NT) r)r*r+r MID_WAITTIMEr'rjrmr~rrr,r(r&rcrcs+%  W r(rcc.tfd}|S)zHelper decorator to create a temporary directory Directory gets removed after function returns, regardless if exception was thrown of not ctjd} ||g|i|tj|S#tj|wxYw)Nzf2b-temp)prefix)tempfilemkdtempshutilrmtree)r%rr{tmprs r&rzwith_tmpdir..wrappersG +# D# ' ' ' ==6==s ;Arrrs` r& with_tmpdirrs" (  r(c.tfd}|S)z@Helper decorator to execute test in alternate (fixed) test time.cdt |g|i|tS#twxYwri) setUpMyTimetearDownMyTime)r%rr{rs r&rzwith_alt_time..wrappers, - D "4 "6 ">s # /rrs` r& with_alt_timers (  r(c|stt}t|t_tjjr:dt _dt _dt _d}|tj_ nAdt _dt _dt _tjfd}|t_ tjjrd}|tj_ d tjd <tj t#j$t&t(j*}d |_|j/d d t1dD]V}|j3d|zd|j3d|zd|j3d|zd|j3d|zdX|j3dd|j3ddtjjr@|j3dd|j3dd|j3ddt(j4}d|_dt3fdt3fdt3fdt3fd t3fd!t3fd"t3t7d#t7d$gfd%t3t7d#t7d$gffD]}|j2|tjjr?t)j8D]'}|j3|t)j:d&)yyy)'Ng{Gzd?gMb@?g-C6?c,tjd)NzSkip test because of "--fast"rsrtr,r(r&F2B_SkipIfFastz!initTests..F2B_SkipIfFasts   : ;;r(g?g{Gzt?c<|dkDrtd|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_sleepzinitTests.._new_sleeps#$h knoo pp a=r(c,tjd)Nz#Skip test because of "--no-network"rr,r(r&F2B_SkipIfNoNetworkz&initTests..F2B_SkipIfNoNetworks   @ AAr(zCET-01CEST-02,M3.5.0,M10.5.0TZc,tjdS)Nz.clear CACHE_ipToName is disabled in test suiterIwarnr,r(r&zinitTests../s6;;OPr(i'i,)maxCountmaxTimez 192.0.2.%sz 198.51.100.%sz 203.0.113.%sz 2001:db8::%sz test-hostz2001:db8::ffffz test-otherz 87.142.124.10z 192.0.2.888z8.8.4.4z dns.googlec,tjdS)Nz.clear CACHE_nameToIp is disabled in test suiterr,r(r&rzinitTests..AsFKK PQr(z999.999.999.999z abcdef.abcdefz 192.168.0.z failed.dns.chz!doh1.2.3.4.buga.xxxxx.yyy.invalidz1.2.3.4.buga.xxxxx.yyy.invalidz example.comz"2606:2800:220:1:248:1893:25c8:1946z 93.184.216.34zwww.example.com localhost)rarrcrsrrDEFAULT_SLEEP_TIMEDEFAULT_SLEEP_INTERVALDEFAULT_SHORT_INTERVALrjtimesleepr!rmruenvirontzsetrsetAlternateNowTEST_NOWr CACHE_ipToNameclear setOptionsrangesetCACHE_nameToIpr getSelfNamesdnsToIp)r^rrrcirs @r& initTestsrs ') *$D  LL$%!'%!'%<*(,,#%!&%!'%zz*$* LLB!4(,,3D! Pud+ *(Q%% q$%%!T"%%D!%%;' ( & $ LL%% t%% < %% < ! Q!'suSU#%SU'/$ce,3CDf_F]^_`sF#GH&Q`Jabcd   a 155!9  \\  ! ! #,qEE!X  k *+,)r(cyrir,r,r(r& mtimesleeprSsr(rc6tjtyri)rsetTimerr,r(r&rr[sr(cdt_yri)rmyTimer,r(r&rras r(c tddlm}ddlm}ddlm}ddlm}ddlm}ddlm}ddlm}dd lm } dd lm } dd lm } dd lm } dd lm } ddlm}ddlm}ddlm}ddlm}ddlm}st'j(}n$Gfddt&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> ddl!}|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,|jt'j}ddlmD}tjtjjtjj|jD]u}|jds|jds'|j+|j|jdtjj|dwddlPmQ}|g} t&jjst&jjrAtGdt&jjdt&jjddlUmV}|j| dd lZm[}|j||D]5}|j+t'j,|j|7 dd"l]m^}|j+t'j,|j||j+t'j,|j|S#tF$rY wxYw#tF$r"}tjd|zYd}~d}~wwxYw#tF$r#}tjd!|zYd}~ d}~wwxYw#tF$r"}tjd#|zYd}~d}~wwxYw)$NrC)banmanagertestcase)clientbeautifiertestcase)clientreadertestcase)tickettestcase)failmanagertestcase)filtertestcase)servertestcase)datedetectortestcase)actiontestcase)actionstestcase)sockettestcase) misctestcase)databasetestcase)observertestcase)samplestestcase)fail2banclienttestcase)fail2banregextestcaseceZdZWDcgc]}tj|c}}}ZfdZxZScc}}}w)&gatherTests..FilteredTestSuitec@g}|D]}t|tjr|j|/t |}|j D]8}|j |} js|s#n|r'|j||D]}t||yri) rrs TestSuiteaddTestr\_regexpssearchr"appendsuper) r%suitematchedtestsrmFilteredTestSuite __class__r^s r&rz.gatherTests..FilteredTestSuite.addTestsG  4++, ll4 TQmm  ((1+a>>!1~~d    2 d+D12r()r)r*r+recompilerr __classcell__).0rrrrr^regexpss000@r&rr~s-&-..rzz!}.822/s:rr)action_dtest_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')arrHrrrrrrrrrrrrrrrrrrsrr makeSuite Transmitter JailTests RegexTests LoggingTestsServerConfigReaderTestsCommandActionTestExecuteActions TicketTests AddFailureFailmanagerComplexdnsStatusExtendedCymruInfo ImportErrorBeautifierTestConfigReaderTestJailReaderTestFilterReaderTestJailsReaderTestJailsReaderTestCacheSocket ClientMisc HelpersTest SetupTestTestsUtilsTest MyTimeTest DatabaseTest ObserverTest BanTimeIncr BanTimeIncrDBIgnoreIP BasicFilterLogFileLogFileMonitorLogFileFilterPoll IgnoreIPDNS GetFailures DNSUtilsTestsDNSUtilsNetworkTestsDateDetectorTestCustomDateFormatsTestFilterSamplesRegexFail2banClientTestFail2banServerTestFail2banRegexTest TestLoaderrrulistdirrvabspathdirname__file__ startswithendswithloadTestsFromNamer)rwserver.filterpollrrcrr server.filtergaminrrrIwarningserver.filterpyinotifyrget_monitor_failures_testcaseserver.filtersystemdr%get_monitor_failures_journal_testcaseTransmitterLogging) rr^rrrrrrrrrrrrrrrrrtestsr  testloaderrfile_rfiltersrerFilter_rrs `` @r& gatherTestsrAes 4"'#"#%$    %22(,,2(  %x!!."<"<=>x!!.":":;<x!!.";";<=x!!."="=>?x!!."H"HIJx!!."B"BCDx!!/"@"@ABx!!."<"<=>x!!"5"@"@ABx!!"5"H"HIJx!!"4"?"?@A --""#5#M#MNO x!!":"I"IJKx!!"6"G"GHIx!!"6"E"EFGx!!"6"G"GHIx!!"6"F"FGHx!!"6"K"KLMx!!."7"789x!!.";";<=x!!,":":;<x!!,"8"89:x!!,"="=>?x!!,"9"9:;x!!"2"?"?@Ax!!"2"?"?@Ax!!"2">">?@x!!"2"@"@ABx!!."9"9:;x!!."<"<=>x!!."8"89:x!!."?"?@Ax!!."B"BCDx!!."<"<=>x!!."<"<=>x!!.">">?@x!!."E"EFGx!!.":":;<x!!"6"G"GHIx!!"6"L"LMNx!!/"D"DEFx!!"8"K"KLMx!!"8"K"KLMx!!"7"I"IJK !!#jj''//"''//("3"3457@U g5>>%#8==--  "''"2"25"9!"<=?@@, < K\\(,,// x||7H7H(,,J_J_` aa. ..R6 ..!;W--""//8:;;P2--"">#W#WXe#fgh x!!."C"CDE M ` K..EIJJK R..LqPQQR P..JQNOOPs[+2kB k*l19m k'&k'* l3ll m!l??m m2m--m2assertDictEqualc |jt|td|jt|td||k7r|d|}ddjt j t j|jt j|jz}|xs||z}|j|yy)Nz"First argument is not a dictionaryz#Second argument is not a dictionary != rG) assertTruerdictrydifflibndiffpprintpformat splitlinesfail)r%d1d2msg standardMsgdiffs r&rBrBs//*R&(LM//*R&(MN2X!2&; $))GMM NN2!!# NN2!!#%& &4 $t#399S> r(rCFc  d |rt n|f fd fd  |||||y#t$r}t|tr|jdn t |dz}ddj tjtj|jtj|jz} |xs|| z}|j|Yd}~yd}~wwxYw)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. ct|tr td|jDStd|DS)Nc3RK|]}t|tttf!ywrirrFlisttuplerr}s r& z8assertSortedEqual.._is_nested..)s EQjT4/0 E%'c3RK|]}t|tttf!ywrirUrXs r&rYz8assertSortedEqual.._is_nested..*s ;AZD$. / ;rZ)rrFanyvalues)r}s r& _is_nestedz%assertSortedEqual.._is_nested's44 E!((* E EE ; ; ;;r(ct|tttfr t tfd|DS|S)Nc30K|] }|ywrir,)rr} _nest_sortedkeys r&rYz:assertSortedEqual.._nest_sorted..0s7|As+7srb)rrrVrWsorted)r}rbras `r&raz'assertSortedEqual.._nest_sorted.s1S$&' $7Q77S AA 8r(ct|t|k7rt|d||s(|r& |s |s||k(ryt|d|t|trt|tr|j D]l\}}||}t|tt t fr2t|tt t fr|||dk7r|dz nd||X||k7s^t|d|y ||} ||}t||D]g\}}t|tt t fr2t|tt t fr|||dk7r|dz nd||S||k7sYt|d|y)NrDrrCrc)lenrrrFitemsrVrWzip) abrM nestedOnlyrbkv1v2_assertSortedEqualr^ras r&roz-assertSortedEqual.._assertSortedEqual3s^Vs1v !Q' (( J 1 jm1f !Q' ((4Z40 +uq" 1B"tT5)*z"tT5>Q/RB5A:a1j#N r Aq) ** +A31A31Q+vr2"tT5)*z"tT5>Q/RB5A:a1j#N r Aq) ** +r(rz within:rGN) rd Exceptionrrrr\ryrGrHrIrJrKrL) r%rirjrMrkrbrOr?rPrQror^ras @@@r&assertSortedEqualrq!s <, +2Q5*c2':6q SVk=Q+ 7== >>!! >>!!#$ $$ # d"#))C.. s , C0B1C++C0assertRaisesRegexpc ||i||jdt|dzy#|$rF}tj|t ||jd|d|dYd}~yYd}~yd}~wwxYw)Nz %s not raisedr)"z" does not match ")rLgetattrrrr\)r%excclsregexpfunrr{r?s r&rrrrXsn< 99_wvz: :; <iiA'II:;;(r(c|}d}|6t|dr*t|tstj|\}}d}||vr*|r t |}|xs|d|}|j |yy)NFrzTz unexpectedly found in r{rs r& assertNotInrosk" $[WQ +Jq#4F == 51b 4!V bB 7B7399S> r(cdtjjtjkrCt j jdtjd|jt|tjjdkDrtj|_yy)NrGz"========== %s ====================r)rsrcrrKrOr;stderrwriterIdebugid _org_setUprr __startTimer$s r& _customSetUpr|sn LLgmm+**4,,'3 D LLQYY[$r(ctjjdkDrCtjj dt j |jz fzyy)Nrz %.3fs -- )rsrcrr;rrrrr$s r&_customTearDownrsD LLQ**<499;1A1A#A"CCDr(ceZdZGddejZfdZfdZdZdZ dZ d dZ d Z e ejfd ZxZS) LogCaptureTestCasec8eZdZdZd dZd dZdZdZdZdZ 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. ctj|_d|_d|_t |_d|_t|_ tjj||r|j|_yy)NrHr) threadingLock_lock_val_dirtyrV_recs _nolckCntrr_strmrKHandlerr' _handle_lazyhandle)r%lazys r&r'z'LogCaptureTestCase._MemHandler.__init__s^ 4:494;4:4? 4: ??D! ##DK r(Nc|rtd|zd|_|j5d|_t |_|j jddddy#1swYyxYw)z)Truncate the internal buffer and records.z.invalid size argument: %r, should be None or 0rHrN)rprrrrVrrtruncate)r%sizes r&rz'LogCaptureTestCase._MemHandler.truncates[ DtK LL49 DKDJJJs 2AA(c@ |jdz} |jj|y#t$r.|jj|j ddYywxYw#t $r(}|jjd|zYd}~yd}~wwxYw)NrGzUTF-8r]zError by logging handler: %r) getMessagerrUnicodeEncodeErrorencoderp)r%recordrOr?s r&__writez&LogCaptureTestCase._MemHandler.__writes9     $C6 ZZc 6 ZZcjj)456 9JJ3a7889s2A,24A)&A,(A))A,, B5BBc|js |jS|jjd}|jdzr|sQ|xjdz c_|jdkr |jSd|_|jj |xjdzc_|j }t |_|jj|D]}|j|n1|r/|xjdzc_|jj|jj|_|jS#|jjwxYw)z&Return current buffer as whole string.FrrCr) rrracquirerrrVrelease_MemHandler__writergetvalue)r%lckrecsrs r&rz'LogCaptureTestCase._MemHandler.getvalues ++ 99   E "3 kkAo  ___ 1 YYT_ ZZ [[B[ JJT&TZ ZZ \\& KK2KJJzz""$49 )) ZZs 0EE2c|j||j5|xjdzc_dddy#1swYyxYw)z-Handle the specified record direct (not lazy)rCN)rrrr%rs r&rz%LogCaptureTestCase._MemHandler.handles8<< KK1Ks =Ac|j5|jj||xjdzc_dddy#1swYyxYw)z*Lazy handle the specified record on demandrN)rrrrrs r&rz+LogCaptureTestCase._MemHandler._handle_lazys> JJfKK1Ks 1AArri) r)r*r+__doc__r'rrrrrr,r(r& _MemHandlerrs& $9 Dr(rctj|_tj|_t j tjj|_ |jgt_|jtjkr#txj|jz c_|jtjdz kDr&tjtjdz tt |?y)NrC)rIrM _old_levelhandlers _old_handlersrrrsrcr_logrKrOrJrsetUpr%rs r&rzLogCaptureTestCase.setUpsLL$/$ ,,X\\-B-BC$)YYK&/ __ % ??d(((? __w}}Q& ??7==?#D')r(c|j|jj|jt_tj |jtt|+y)zCall after every test case.N) pruneLogrcloserrIrrJrrrtearDownrs r&rzLogCaptureTestCase.tearDownsG--/))//&&&///$//"D*,r(c|jj}|jdds|D]}||vsy y|D]}||vsyy)NallFT)rrrrr%rr{loggeds_s r& _is_loggedzLogCaptureTestCase._is_loggedsd 99   & E5 ! r V|  r   r(c jdd}|r;tjj|}t j fd|}nj i}jdds@|s=jj}jdd|rd|znd d |d yy|sHjj}D](}||vsj|d |rd|znd d |d *yy) akAssert 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(jiSri)r)r{rr%sr&rz1LogCaptureTestCase.assertLogged..!s =f =r(rFz None among z was found in the logz , waited %srHz: === ===z was not found in the log) rrrsrcrrwait_forrrrrL)r%rr{rresrrs``` r& assertLoggedzLogCaptureTestCase.assertLoggeds FD !$ ,, " "4 (4 =t D3 ! &v &3 E5 ! YY   !FIIA $}t",v78   YY   !F: & iir"& B.9:: r(c |jj}t|dkDr8|jdds&|D]}||vsy|j d|d|dy|D]}||vs|j |d|d y) aAssert 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 rCrFNz All of the z$ were found present in the log: === rz was found in the log: === )rrrfrrrLrs r&assertNotLoggedz"LogCaptureTestCase.assertNotLogged3s 99   &VaZ 5%0  r   99!V TU Er V| YYFCDEr(cl|jjd|rtjd|yy)Nrz===== %s =====)rrrIr)r%logphases r&rzLogCaptureTestCase.pruneLogHs+))Q  <<&1r(c6|jjSri)rrr$s r&getLogzLogCaptureTestCase.getLogMs    r(c|tjk7s%tjtjkrJ|d|zdzt j |D]}|jd}|||dyy)z@Helper which outputs content of the file at HEAVYDEBUG loglevelsz---- z ----rGz------------------------------N)rIrgetEffectiveLevelrKrO fileinputinputrstrip)fnrlines r&dumpFilezLogCaptureTestCase.dumpFilePsq   8 8 :gmm K 'B, !r"t ;;t D 4L &> !Lr(ri)r)r*r+rKrrrrrrrrr staticmethodrIrrr)rs@r&rrsVV7??Vp* - :BE*2 r(r)rH)NNri)O __author__ __copyright__ __license__rr}rKr8rurrrr;rrrsior functoolsrrWrr r r server.ipdnsr r server.mytimer server.utilsrserverrrrIrrrrrzrvrxryrqputenvr.r-r/ValuesrrArarcrrrrold_TZrrrArGrIr|TestCaserBreprrqrrassertRaisesRegexrrrrrr _org_tearDownrr pid_existsr,r(r&rs*" 7    MM+"  :   ZZ^^14 8 GGNN277<<9:** rww||J@A  ,9)* X2j/ /d N,b d # g\x  "34 &5"()e43h'8#x  "67<(:$ ' "-    $ $ !!!** E',I**IX   r(