
    ogfd                         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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mZmZ  G d de      Zy)zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    N   )CommandAction
CallingMapsubstituteRecursiveTags)OrderedDictActions)Utils   )	DummyJail)
pid_existswith_tmpdirLogCaptureTestCasec                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	        Zd
 Zed        Zed        Zed        Zed        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)CommandActionTestc                      t        j                          t        dd       _        d _         j                  j
                   fd}| j                  _        y)zCall before every test case.NTestFc                       d_                  S )NT)"_CommandActionTest__action_started)orgstartselfs   ?/usr/lib/python3/dist-packages/fail2ban/tests/actiontestcase.py_action_startz.CommandActionTest.setUp.<locals>._action_start1   s    4
*    )r   setUpr   _CommandActionTest__actionr   start)r   r   r   s   ` @r   r   zCommandActionTest.setUp*   sI    4 f-$-$]]  ( &$--r   c                 z    | j                   r| j                  j                          t        j                  |        y)zCall after every test case.N)r   r   stopr   tearDownr   s    r   r    zCommandActionTest.tearDown6   s)    	==d#r   c           
         dddd}| j                  t        d        | j                  t        d        | j                  t        d        | j                  t        d        | j                  t        d	        | j                  t        t	        d
            ddddd       | j                  t        t	        d            ddddddd       | j                  t        t	        d            t	        d             | j                  t        d        | j                  t        d        | j                  t        ddi      ddi       | j                  t        ddd      ddd       | j                  t        d d!d"      d#d!d"       | j                  t        d$d!d"      d%d!d"       | j                  t        d&d'd(d)      d*d'd(d)       | j                  t        |      dd+d,d       | j                  t        d-d.d/      d0d.d/       | j                  t        d-d.d1d2      d1d.d1d2       | j                  t        d3d4d1d2      d5d4d1d2       y )6N	192.0.2.0z
123 <HOST>z	890 <ABC>HOSTABCxyzc                      t        ddi      S )NA<A>r    r   r   <lambda>z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>D   s    "C<0 r   c                      t        ddd      S )N<B>r*   r)   Br+   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>F   s    "U#;< r   c                       t        dddd      S )Nr/   <C>r*   )r)   r1   Cr+   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>H   s    "U#GH r   c                  "    t        ddddd      S )Nzto=<B> fromip=<IP>r/   r3    )r)   r4   r1   Dr+   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>K   s    ")=EPU\^#_` r   c                  "    t        ddddd      S )Nzto=<honeypot> fromip=<IP>z
<honeypot>z<sweet>r6   )	failregexsweethoneypotignoreregexr+   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>M   s#    "1LWcqz  LN  $O  P r   ))Xzx=x<T>T1)Zz<X> <T> <Y>Yzy=y<T>zx=x1r@   zy=y1zx=x1 1 y=y1)r=   r?   rC   rA   ))r=   zx=x<T> <Z> <<R1>> <<R2>>)R1rA   )R2rC   r>   )rA   z<T> <Y>rB   zx=x1 1 y=y1 1 y=y1 y=y1rA   rC   z1 y=y1)r=   rD   rE   r?   rA   rC   ))actionstartzgipset create <ipmset> hash:ip timeout <bantime> family <ipsetfamily>
<iptables> -I <chain> <actiontype>)ipmsetz
f2b-<name>nameanybantime600ipsetfamilyinet)iptablesziptables <lockingopt>
lockingoptz-wchainINPUT)
actiontypez<multiport>)	multiportzY-p <protocol> -m multiport --dports <port> -m set --match-set <ipmset> src -j <blocktype>protocoltcpportssh	blocktypeREJECT))rF   zipset create f2b-any hash:ip timeout 600 family inet
iptables -w -I INPUT -p tcp -m multiport --dports ssh -m set --match-set f2b-any src -j REJECT)rG   zf2b-anyrH   rK   rN   )rQ   ziptables -wrR   rT   )rW   I-p tcp -m multiport --dports ssh -m set --match-set f2b-any src -j REJECT)rX   rb   rY   r\   r_   c                  *    t        t        d            S )N)r)   z<<B><C>>r1   r7   r4   EDEz	cycle <A>r   r   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>y       (? N B ) r   c                  *    t        t        d            S )N)rh   rd   re   rf   rj   r,   r   r   r-   z?CommandActionTest.testSubstituteRecursiveTags.<locals>.<lambda>~   rk   r   r)   r3   z<C> <D> <X>fun)r)   r=   z<C> <D> funz<C> <B>coolr0   z<C> coolz<matches> <B>z<matches> coolz/to=<honeypot> fromip=<IP> evilperson=<honeypot>pokier6   )r9   r;   r<   z%to=pokie fromip=<IP> evilperson=pokiez123 192.0.2.0z890 123 192.0.2.0z<<PREF>HOST>IPV4)r)   PREFz
<IPV4HOST>z1.2.3.4)r)   rq   IPV4HOSTzA <IP<PREF>HOST> B IP<PREF> CV4zA 1.2.3.4 B IPV4 C)assertRaises
ValueErrorassertEqualr   r   r   aInfos     r   testSubstituteRecursiveTagsz-CommandActionTest.testSubstituteRecursiveTags<   s   

% J02J<>JHJ J`bJ PQ *KH-J 6>
 *Kq-s %S#H[ab
 *K 9 -    @ J ! 
 J !  *C<83,G*5+IJR_ejLkl*+HIQ[bhKij*v+NOWgntQuv*9jx  QS  ,T  U>	
 *51#	
 *+PQ6*,*]f+ghI>@ *1PZ^lu+vw!4YGIr   c                     t        dd ddd      t               ddd<    j                  t        fd       t               dd	<    j                  t        fd
        j	                   j
                  j                  d      d        j	                   j
                  j                  d      d        j                  t         fd        j	                   j
                  j                  d      d       y )Nr   c                      y)Nz<A><A>r,   r!   s    r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>       r   r6   )r)   r1   r4   r7   c                 $    dt        | d         z  S )N   r)   int)r   is     r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    Q#d3i.0 r   r4   c                       d   S )Nr4   r,   cms   r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    r#w r   test=<C>r7   c                      t               S Nr+   r   s   r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    /Fr/J r   ztest=<A>ztest=0ztest=<A>--<B>--<A>ztest=0--<A><A>--0c                  <    j                   j                  d       S )Nr   )r   
replaceTag)r   r   s   r   r-   zHCommandActionTest.testSubstRec_DontTouchUnusedCallable.<locals>.<lambda>   s    t}}/G/G
TV/W r   z<D>)r   )r   r   rt   ZeroDivisionErrorrv   r   r   )r   r   s   `@r   $testSubstRec_DontTouchUnusedCallablez6CommandActionTest.testSubstRec_DontTouchUnusedCallable   s    			 " "0"S'%7""S'%'JK 4==++J;XF 4==++,@"EGZ[%'WX4==++E26
Cr   c                    dddd}| j                  | j                  j                  d|      d       | j                  | j                  j                  d|      d       | j                  | j                  j                  d	|      d
       | j                  | j                  j                  dddi      d       | j                  | j                  j                  dddi      d       | j                  | j                  j                  dddi      d       d|d<   | j                  | j                  j                  d	|      d       | j                  | j                  j                  dt        d             d       y )Nr#   123890r$   zText<br>textz	Text
textzText <HOST> textzText 192.0.2.0 textzText <xyz> text <ABC> ABCzText 890 text 123 ABCz	<matches>matchesz$some >char< should \< be[ escap}ed&
z,some \>char\< should \\\< be\[ escap\}ed\&\nz<ipmatches>	ipmatchesz<ipjailmatches>ipjailmatchesz%some >char< should \< be[ escap}ed&
z.some \>char\< should \\\< be\[ escap\}ed\&\r\nz<xyz>r&   zText 890 text 890 ABCz09 <matches> 11c                     t        d      S N
   strr!   s    r   r-   z2CommandActionTest.testReplaceTag.<locals>.<lambda>   s
    CG r   r   z09 10 11rv   r   r   r   rw   s     r   testReplaceTagz CommandActionTest.testReplaceTag   s}   

%
 ==NE2 ==.6 ==7? ==K89;:< ==M:;=:< ==-@AC=? %,==7?
 ==-+,.r   c                 r    | j                  | j                  j                  dt        d             d       y )Nabcc                     t        d      S Nar   r!   s    r   r-   z4CommandActionTest.testReplaceNoTag.<locals>.<lambda>   s
    CH r   r   r   r!   s    r   testReplaceNoTagz"CommandActionTest.testReplaceNoTag   s2     ==E,-/057r   c                     t         j                  dd       t         j                  dd       t         j                  dd       t         j                  dd       t         j                  d	d
       t         j                  dd        j                  t        d fd       t	         j                  d        j                  t        d fd       y )Nr   z<abzc>zb?family=inet6zb>ac<a><b>abz<ac>zx?family=inet6r6   z/properties contain self referencing definitionsc                  h     j                   j                  d j                   j                  d      S )Nr   family=inet4conditionalr   r   _propertiesr!   s   r   r-   z?CommandActionTest.testReplaceTagSelfRecursion.<locals>.<lambda>   s,    4==##HMM> $ ; r   z.possible self referencing definitions in queryc                  h     j                   j                  d j                   j                  d      S )NzZ<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>family=inet6r   r   r!   s   r   r-   z?CommandActionTest.testReplaceTagSelfRecursion.<locals>.<lambda>   s,    4==##NMM> $ ; r   )setattrr   assertRaisesRegexru   delattrr!   s   `r   testReplaceTagSelfRecursionz-CommandActionTest.testReplaceTagSelfRecursion   s    	$--d#	$--d#	$--)40	$--x(	$--v&	$--)2.%W;
 
$--%V;r   c           	      R   t        | j                  dd       t        | j                  dd       t        | j                  dd       t        | j                  dd       t        | j                  d	d
       | j                  j                  }t        d      D ]  }| j	                  | j                  j                  d| j                  j                  d|      d       | j	                  | j                  j                  d| j                  j                  d|      d       | j	                  | j                  j                  d| j                  j                  d|      d        | j                  t        |      dk\         t        | j                  dd       | j	                  t        |      d       t        d      D ]  }| j	                  | j                  j                  d| j                  j                  d|      d       | j	                  | j                  j                  d| j                  j                  d|      d       | j	                  | j                  j                  d| j                  j                  d|      d        | j                  t        |      dk\         y )Nr   r   zabc?family=inet4345zabc?family=inet6567r'   z	890-<abc>	banactionzText <xyz> text <abc>r   z<banaction> '<abc>'r6   )r   cachezText 890-123 text 123 '123'r   zText 890-345 text 345 '345'r   zText 890-567 text 567 '567'   z	000-<abc>r   zText 000-123 text 123 '123'zText 000-345 text 345 '345'zText 000-567 text 567 '567')	r   r   _substCacherangerv   r   r   
assertTruelen)r   r   r   s      r   testReplaceTagConditionalCachedz1CommandActionTest.testReplaceTagConditionalCached  sJ   	$--&	$--+U3	$--+U3	$--,	$--&=>
--
#
#%8 #aMM2DMM4M4M5  "!# MM2DMM4M4Mu  .!# MM2DMM4M4Mu  .!## //#e*/"	$--,3u:q!8 #aMM2DMM4M4M5  "!# MM2DMM4M4Mu  .!# MM2DMM4M4Mu  .!## //#e*/"r   c                    |dz  }d|z  | j                   _        | j                   j                  | j                   _        | j                  | j                   j                  d|z         d|z  | j                   _        | j                  | j                   j                  d|z         d| j                   _        | j                  | j                   j
                  d       d|z  | j                   _        | j                  | j                   j                  d|z         d| j                   _        | j                  | j                   j                  d       | j                          | j                  d       | j                   j                  dd i       | j                  d	       | j                  d
       | j                   j                          | j                  | j                   j                         y )N/fail2ban.test
touch '%s'
rm -f '%s'z<actioncheck> && echo -n[ -e '%s' ]truereturnedipInvariant check failedzreturned successfully)r   rF   actionrepairrv   
actionstop	actionbanactioncheckactionunbanpruneLogassertNotLoggedbanassertLoggedr   r   tmps     r   testExecuteActionBanz&CommandActionTest.testExecuteActionBan*  su   	#*S0$--#}}88$--4==,,lS.@A)C/$--4==++\C-?@6$--4==**,FG+c1$--4==,,mc.AB$$--4==,,f5--/z" --T4L!,-+,--DMM,,-r   c                    d| j                   _        d| j                   _        d| j                   _        d| j                   _        | j                   j                          | j                   j                  i        | j                          | j                   j                  i        | j                  dd       | j                   j                  i        | j                  d       | j                   j                          | j                   j                  i        | j                   j                          | j                  dd       | j                  d       y )	Nr6   zecho -n 'flush'zecho -n 'stop'Nothing to doTwait	[phase 2]r   )r   r   r   actionflushr   r   r   r   unbanr   flushr   r   r!   s    r   testExecuteActionEmptyUnbanz-CommandActionTest.testExecuteActionEmptyUnbanD  s    $-- $--/$---$------B--/--bO$/--B------b--F&'r   c                    |dz  }d| j                   _        d|z  | j                   _        d|z  | j                   _        d|z  | j                   _        | j                   j                          | j                   j                          y )Nr   r#   ztouch '%s.<HOST>'zrm -f '%s.<HOST>'z[ -e '%s.192.0.2.0' ])r   r%   rF   r   r   r   consistencyCheckr   s     r   testExecuteActionStartCtagsz-CommandActionTest.testExecuteActionStartCtagsX  sl    	#"$--1C7$--036$--5;$------  "r   c                 j   |dz  }d| j                   _        d|z  | j                   _        d|z  | j                   _        d|z  | j                   _        | j                  t        | j                   j                  dd i       | j                  ddd	
       | j                  d       d|z  | j                   _        d|z  | j                   _        d|z  | j                   _        d|z  | j                   _        | j                   j                  dd i       | j                  d       | j                  d       y )Nr   r6   r   rm '%s'r   r   r   Unable to restore environmentTallr   r   z-<actioncheck> && printf "%%%%b
" <ip> >> '%s')r   rF   r   r   r   rt   RuntimeErrorr   r   r   r   r   s     r   (testExecuteActionCheckRestoreEnvironmentz:CommandActionTest.testExecuteActionCheckRestoreEnvironmentb  s   	# $--)C/$--%O$--+c1$--L$--"3"3dD\B,.MSWX--*S0$--&_$--PSVV$--+c1$----T4L!,-67r   c           	         |dz  }d|z  | j                   _        d|z  | j                   _        d|z  | j                   _        d|z  | j                   _        d|z  | j                   _        d| j                   _        | j                   j                          dD ]P  }| j                  d	|z         | j                   j                  d
di       | j                  ddz  d       | j                  dddz  d| j                   j
                  rdndz  ddz  d       t        j                  |       | j                          | j                   j                  d
di       | j                  dddz  d| j                   j
                  rdndz  ddz  ddz  d       | j                   j
                  rd| j                   _        (| j                   j                  r@d| j                   _        S y )Nr   ztouch '%s'; echo 'started ...'r   z![ -e '%s' ] && echo 'banned '<ip>zB[ -e '%s' ] && echo 'check ok' || { echo 'check failed'; exit 1; }echo 'repair ...'; touch '%s'F)r   r   r   z
[phase %s]r   	192.0.2.1z
stdout: %rzbanned 192.0.2.1Tr   Invariant check failed. Tryingzcheck failedz
repair ...zstarted ...zcheck okz	192.0.2.2zbanned 192.0.2.2r6   )r   rF   r   r   r   r   actionstart_on_demandr   r   r   r   r   osremove)r   r   r   s      r   "testExecuteActionCheckOnBanFailurez4CommandActionTest.testExecuteActionCheckOnBanFailureu  s   	#>D$--)C/$--?#E$--behh$-->D$--(-$--%--  /a==!"==dK()%%4  18>!DMM$>$>LMR:4  )
 99S>==?==dK()5>!DMM$>$>LMR:%%4	  1 mm  !#DMMMM//*.DMM'1/r   c                    |dz  }d| j                   _        d| j                   _        d|z  | j                   _        d|z  | j                   _        d|z  | j                   _        | j                   j                  dd i       | j                  ddd	
       | j                          d| j                   _        | j                  t        | j                   j                  dd i       | j                  dddd	
       y )Nr   r6   r   r   r   r   r   zecho 'repair ...'Tr   r   )r   rF   r   r   r   r   r   r   r   rt   r   r   s     r   'testExecuteActionCheckRepairEnvironmentz9CommandActionTest.testExecuteActionCheckRepairEnvironment  s    	# $--$--%O$--+c1$-->D$----T4L!46ItT--/2$--L$--"3"3dD\B#"  .r   c                     | j                  t        t        | j                  d       d| j                  _        | j                  | j                  j                  d       y )NROSTr#   )rt   AttributeErrorgetattrr   r   rv   r!   s    r   testExecuteActionChangeCtagsz.CommandActionTest.testExecuteActionChangeCtags  s@    NGT]]FC"$--4==%%k2r   c                     t        ddd d      }d| j                  _        d| j                  _        | j                  j	                  |       | j                  j                  |       | j                  ddd	
       y )Nr   r   c                     ddddS )No      tester)fidfportuserr,   r!   s    r   r-   z?CommandActionTest.testExecuteActionUnbanAinfo.<locals>.<lambda>  s     r   )r&   r   zF-*zFecho '<ABC>, failure <F-ID> of <F-USER> -<F-TEST>- from <ip>:<F-PORT>'z$echo '<ABC>, user <F-USER> unbanned'z> -- stdout: '123, failure 111 of tester -- from 192.0.2.1:222'z' -- stdout: '123, user tester unbanned'Tr   )r   r   r   r   r   r   r   rw   s     r   testExecuteActionUnbanAinfoz-CommandActionTest.testExecuteActionUnbanAinfo  sw    

	 % e$--D$----E--eC,  r   c                    d| j                   _        | j                   j                          | j                  | j                   j	                  d             | j                  d       | j                          | j                  | j                   j                  d             | j                  d       | j                          y )Nr6   r   )r   rF   r   r   
executeCmdr   r   _processCmdr!   s    r   testExecuteActionStartEmptyz-CommandActionTest.testExecuteActionStartEmpty  s     $----//$--**2./O$--///$--++B/0O$--/r   c           	          | j                  | j                  j                  ddddd             | j                  ddd	d
d       y )NzUprintf %b "foreign input:\n -- $f2bV_A --\n -- $f2bV_B --\n -- $(echo -n $f2bV_C) --"z I'm a hacker; && $(echo $f2bV_B)zI"m very bad hackerz#`Very | very
$(bad & worst hacker)`)f2bV_Af2bV_Bf2bV_C)varsDictzforeign input:z' -- I'm a hacker; && $(echo $f2bV_B) --z -- I"m very bad hacker --z* -- `Very | very $(bad & worst hacker)` --Tr   )r   r   r   r   r!   s    r   testExecuteWithVarsz%CommandActionTest.testExecuteWithVars  s\    //$--** 1"3 + 
 
 )-/T  ;r   c                 $   d| j                   _        d| j                   _        d| j                   _        g d}dddj	                  |      d}| j                          | j                   j                  |        | j                  d	|d
   z  |d   g|ddi | j                  d|d
   z  dd       | j                          | j                   j                  |       | j                   j                          | j                  d|d
   z  dd       y )Nz3echo "** ban <ip>, reason: <reason> ...\n<matches>"zecho "** unban <ip>"zecho "** stop monitoring")z<actionunban>z" Hooray! #z`I'm cool script kiddyz7`I`m very cool > /here-is-the-path/to/bin/.x-attempt.shz<actionstop>r   zAhacking attempt ( he thought he knows how f2b internally works ;)
)r   reasonr   z	** ban %sr   r  r   Tz** unban %sz** stop monitoringr   )r   r   r   r   joinr   r   r   r   r   r   )r   r   rx   s      r    testExecuteReplaceEscapeWithVarsz2CommandActionTest.testExecuteReplaceEscapeWithVars  s   R$--4$--8$--' 
Pii %
 --/--E$teHoC07C=AC5; 4$  @--/--e--5; 4$  @r   c                 P    t        j                  d       | j                  d       y )Nz+/bin/ls >/dev/null
bogusXXX now 2>/dev/nullz HINT on 127: "Command not found"r   r   r   r!   s    r   testExecuteIncorrectCmdz)CommandActionTest.testExecuteIncorrectCmd   s     IJ67r   c                    t        j                          }t        j                  j                  sdnd}| j	                  t        j                  d|             | j                  t        j                          ||z   k\  xr t        j                          ||z   dz   k         | j                  ddd       | j                  dd	       y )
Nr   g{Gz?zsleep 30timeoutz -- timed out afterTr    -- killed with SIGTERM -- killed with SIGKILL)	timeunittestF2BfastassertFalser   r   r   r   )r   stimer  s      r   testExecuteTimeoutz$CommandActionTest.testExecuteTimeout  s    
))+%\\&&AD'=++JHI//$))+0WTYY[EGOVWDW5WXJ 54@--/r   c                    t        j                  dd      t        d      5 }|j                  dz         d d d        dfd}fdt	        j                         | j                  t        j                  dz  |	                     | j                  t        j                  fd
d             | j                  dd       | j                  d       | j                  dd       t        j                  dz          t	        j                         | j                  t        j                  dz  |	                     | j                  t        j                  fdd             | j                  dd       | j                  d       | j                  dd       t        j                         t        j                  dz          y # 1 sw Y   xY w)Nz.sh	fail2ban_wzo#!/bin/bash
		trap : HUP EXIT TERM

		echo "$$" > %s.pid
		echo "my pid $$ . sleeping lo-o-o-ong"
		sleep 30
		r   c                  N             d uxs t        j                          z
  dkD  S Nr~   )r  )getnastypidr  s   r   getnasty_toutzLCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.getnasty_tout  s*    M yy{UQr   c                      d } t         j                  j                  dz         r3t        dz         5 }	 t	        |j                               } d d d        | S | S # t        $ r Y w xY w# 1 sw Y   | S xY w)N.pid)r   pathisfileopenr   readru   )cpidftmpFilenames     r   r  zJCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.getnastypid$  sv    
4ggnn[6)*	kF"	# q]d
 ;$;  

 ;s(   A*A	A'$A*&A''A**A4zbash %sr  c                      t                S r   r   r'  s   r   r-   zGCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.<lambda>5      Z-=)= r   r   zmy pid z Resource temporarily unavailablez	timed outzkilled with SIGTERMzkilled with SIGKILLr"  zout=`bash %s`; echo ALRIGHTc                      t                S r   r+  r,  s   r   r-   zGCommandActionTest.testExecuteTimeoutWithNastyChildren.<locals>.<lambda>C  r-  r   z -- timed outr  r  )tempfilemktempr%  writer  r  r   r   r   r
   wait_forr   r   unlink)r   r(  r   r'  r  r  r)  s      @@@@r   #testExecuteTimeoutWithNastyChildrenz5CommandActionTest.testExecuteTimeoutWithNastyChildren  s   {3+K 77  	  % ))+%=++{M3 4 
$//%..!=qABIABK ))+))K& ! ))+%=++ ;.G H 
$//%..!=qABIABO$--/))K))K& !m s   GG#c                     t        j                  d       | j                  d       t        j                  d       | j                  d       y )Nzecho "How now brown cow"zstdout: 'How now brown cow'
z7echo "The rain in Spain stays mainly in the plain" 1>&2z6stderr: 'The rain in Spain stays mainly in the plain'
r  r!   s    r   testCaptureStdOutErrz&CommandActionTest.testCaptureStdOutErrL  sB    5634<><>r   c                     t        d d dd      }| j                  d|z  d       | j                  t        d |       y )	Nc                     t        d      S r   r   r!   s    r   r-   z2CommandActionTest.testCallingMap.<locals>.<lambda>U  s
    R r   c                     t        d      S r   r   r!   s    r   r-   z2CommandActionTest.testCallingMap.<locals>.<lambda>U  s
    SX r   string   )callmeerror
dontcallmenumberz)%(callme)s okay %(dontcallme)s %(number)iz10 okay string 17c                     d| z  S )Nz	%(error)ir,   )xs    r   r-   z2CommandActionTest.testCallingMap.<locals>.<lambda>]  s
    +/ r   )r   rv   rt   ru   )r   mymaps     r   testCallingMapz CommandActionTest.testCallingMapT  sG    
08M$% .6 J 95Ar   c                    t        d d dd      }|j                          d|d<   |d= | j                  t        |      d       | j	                  d|       | j                  |d   |d	   fd
       |j                          t        |      }| j                  t        |      d       | j                  d|       | j                  |d   |d	   |d   fd       d|d<   |j                         }d |d<   d|d<   |d	= |d= | j                  d	|v        | j                  d|v        | j                  d	|v        | j                  d|v        | j                  |d   |d	   |d   |d   fd       | j                  |d   |d   fd       y )Nc                      yr  r,   r!   s    r   r-   z8CommandActionTest.testCallingMapModify.<locals>.<lambda>a  r|   r   c                     | d   dz   S Nr      r,   r!   s    r   r-   z8CommandActionTest.testCallingMapModify.<locals>.<lambda>b      T#Y] r   testr   r   c   r   rL  r   r   )rM  r   r   )r~      rJ  dddddc                     | d   dz   S )Nr      r,   r!   s    r   r-   z8CommandActionTest.testCallingMapModify.<locals>.<lambda>w  s    cQ r   r   )r~   rN  rJ  rO  )r      )
r   resetrv   r   assertNotInreprassertIncopyr   r  )r   msm2s       r   testCallingMapModifyz&CommandActionTest.testCallingMapModify_  s   " ! '')!C&f3q613AcFAcF#W-'')
1g!3q61--QAcFAcFAcF+_=!C&vvx"&"S'"S'gg//#(//#(3"93"9AcFAcFAcFAcF35LMBsGRW%v.r   c                    t        d d dd      }t        |      }| j                  d|       | j                  d|       | j                  d|       |j	                  d      }| j                  d	|       | j                  d
|       | j                  d|       d |d<   |j	                  d      }| j                  d	|       | j                  d
|       | j                  d|       | j                  d|       y )Nc                      yr  r,   r!   s    r   r-   z5CommandActionTest.testCallingMapRep.<locals>.<lambda>  r|   r   c                     | d   dz   S rG  r,   r!   s    r   r-   z5CommandActionTest.testCallingMapRep.<locals>.<lambda>  rI  r   r6   rK  z'a': z'b': z'c': ''Tz'a': 5z'b': 11c                     | d   dz   S )NxxxrR  r,   r!   s    r   r-   z5CommandActionTest.testCallingMapRep.<locals>.<lambda>  s    Ua r   rL  z'c': )r   rV  rU  rW  _asrepr)r   rY  rZ  s      r   testCallingMapRepz#CommandActionTest.testCallingMapRep  s    "
 !
 1g!7A7A--	1iio!--!--	1--	1'!C&iio!--!--	1--9a r   c                     t        t                     }d|_        d|_        |j	                          | j                  dd       d|_        | j                  dd       d|_        |j                          y )Ng-C6?TzActions: enter idle moder   r   FzActions: leave idle mode)r	   r   	sleeptimeidler   r   activer	  )r   r   s     r   testActionsIdleModez%CommandActionTest.testActionsIdleMode  sd    ik!!+!&'').R8!&.R8!(&&(r   N)__name__
__module____qualname__r   r    ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r4  r6  rC  r\  rc  rh  r,   r   r   r   r   (   s    
&$aIFD>&P7('#R . .2(( # # 8 8$ $/ $/L . .&3
(;"@88	/:"z>	B!/F!.r   r   )
__author____copyright____license__r   r/  r  r  server.actionr   r   r   server.actionsr   r	   server.utilsr
   	dummyjailr   utilsr   r   r   r   r,   r   r   <module>rt     sF   . 
2 	    N N 1     > >	* 	r   