+
    ¡Š·j*3  ã                   óÐ  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	]P                  ! ]4      P                  4       P                  t]P                  P!                  ^ ]! ]4      4       ^ RIt^ RIt ! R R4      tRR ltR t ! R R]	P.                  4      t ! R R	]	P.                  4      t ! R
 R]	P.                  4      t]R8X  d   ]	P8                  ! 4        R# R# )zeTests for the restricted shell mode of the MCP bridge:
python3 -m unittest scripts/test_mcp_shell.py
Nc                   ó4   a € ] tR t^t o RtRR ltR tRtV tR# )ÚFakeConfirmzCAnswers every prompt with `answer` and remembers what it was shown.c                ó$   € V. uV n         V n        R # ©N©ÚanswerÚprompts)Úselfr   s   &&Ú./work/data/stt/webtt/scripts/test_mcp_shell.pyÚ__init__ÚFakeConfirm.__init__   s   € Ø$*¨BÐ!ˆŒ�T–\ó    c                ó~   € V P                   P                  V4       V P                  V P                  '       d   R 3# R3# )Nu   ç»ˆç«¯é‡Œæ‹’ç»�äº†è¿™æ�¡å‘½ä»¤)r   Úappendr   )r	   Útexts   &&r
   Ú__call__ÚFakeConfirm.__call__   s4   € Ø�‰×Ñ˜DÔ!Ø—‘ T§[§[ [˜TÐWÐWÐ6VÐWÐWr   r   N)T)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r
   r   r      s   ø‡ € ÙMô/÷Xð Xr   r   c                 ó”   € R V/Ve   RV/M/ Cp\         P                  ! V P                  RRRVRRRRR	R
V//R4      4      pVR,          # )ÚcommandÚstdinÚjsonrpcú2.0ÚidÚmethodz
tools/callÚparamsÚnameÚrunÚ	argumentsÚ Úresult)ÚjsonÚloadsÚrpc)Úsessionr   r   ÚmidÚargsÚreplys   &&&&  r
   Úcallr0      su   € Ø�wÐR°uÒ7H G¨UÑ#3ÈbÐR€DÜ�JŠJ�w—{‘{ I¨u°d¸CÀÈ<ÐYaÐdjÐlqÐs~ð  AEð  dFð  $Gð  IKó  Ló  M€EØ��?Ðr   c                 ó@   € R P                  R V R,           4       4      # )Ú
c              3   ó2   "  € T F  qR ,          x € K  	  R# 5i)r   N© )Ú.0Úcs   & r
   Ú	<genexpr>Útext.<locals>.<genexpr>&   s   é € Ð:Ñ(9 1�v—Y’YÓ(9ùs   ‚Úcontent)Újoin)r(   s   &r
   r   r   %   s   € Ø�9‰9Ñ:¨¨yÖ(9Ó:Ó:Ð:r   c                   ó’   a € ] tR t^)t o R tR tR tR tR tR t	R t
R tR	 tR
 tR tR tR tR tR tR tR tR tR tRtV tR# )ÚShellSessionTestc                óJ  € \         P                  ! 4       V n        V P                  V P                  P                  4       \
        P                  ! V P                  P                  4      V n        V P                  R ,          P                  RRR7       \        R4      V n        R# )ú	hello.txtzhello
world
úutf-8)ÚencodingTN)ÚtempfileÚTemporaryDirectoryÚtmpÚ
addCleanupÚcleanupÚpathlibÚPathr$   ÚbaseÚ
write_textr   Úconfirm©r	   s   &r
   ÚsetUpÚShellSessionTest.setUp*   si   € Ü×.Ò.Ó0ˆŒØ�‰˜Ÿ™×(Ñ(Ô)Ü—L’L §¡§¡Ó/ˆŒ	Ø	�‰�[Õ	 ×,Ñ,Ð-=ÈÐ,ÔPÜ" 4Ó(ˆŽr   c           
     ó¢   € R RRRRRRR. RO/VC/p\         P                  ! W P                  \        P                  ! 4       V P
                  R7      # )	r!   Úshr$   u   å�—é™� shellÚkindÚshellÚallow©rJ   )ÚcatÚwcÚechoÚprintf)Ú	mcp_shellÚShellSessionrH   Ú
mcp_bridgeÚEventsrJ   )r	   rQ   Úcfgs   &, r
   r,   ÚShellSessionTest.session1   sX   € Ø�T˜6 >°6¸7ÀGÈgÒWvð  NAÐzð  NAð  BˆÜ×%Ò% c¯9©9´j×6GÒ6GÓ6IÐSW×S_ÑS_Ô`Ð`r   c                ó&  € V P                  4       p\        P                  ! VP                  R RR^RRRRR//R4      4      pV P	                  VR	,          R,          R4       \        P                  ! VP                  R RR^RR
/R4      4      R	,          R,          pT P	                  V Uu. uF  qDR,          NK  	  upR.4       V P                  RV^ ,          R,          4       V P	                  V^ ,          R,          R,          R.4       R# u upi )r   r    r!   r"   Ú
initializer#   ÚprotocolVersionz
2025-03-26r'   r(   z
tools/listÚtoolsr$   r%   rT   ÚdescriptionÚinputSchemaÚrequiredr   N)r,   r)   r*   r+   ÚassertEqualÚassertIn)r	   ÚsÚinitra   Úts   &    r
   Ú3test_lists_one_run_tool_naming_the_allowed_programsÚDShellSessionTest.test_lists_one_run_tool_naming_the_allowed_programs5   sû   € Ø�L‰L‹NˆÜ�zŠz˜!Ÿ%™% ¨E°4¸¸HÀlÐT\Ð_pÐr~Ð^ð  !Að  CEó  Fó  GˆØ×Ñ˜˜h�Ð(9Õ:¸LÔIÜ—
’
˜1Ÿ5™5 )¨U°D¸!¸XÀ|Ð!TÐVXÓYÓZÐ[cÕdÐelÕmˆØ×Ñ©UÓ3©U¨˜FŸ)˜)©UÑ3°e°WÔ=Ø�‰�e˜U 1�X mÕ4Ô5Ø×Ñ˜˜q� -Õ0°Õ<¸y¸kÖJùò 4s   Â*Dc                ól  € \        V P                  4       R 4      pV P                  VR,          \        V4      4       V P	                  R\        V4      4       V P                  \        V P                  P                  4      ^4       V P	                  R V P                  P                  ^ ,          4       R# )zwc -l hello.txtÚisErrorz2 hello.txtN)	r0   r,   ÚassertFalser   rf   re   ÚlenrJ   r   ©r	   r(   s   & r
   Ú,test_allowed_command_runs_after_confirmationÚ=ShellSessionTest.test_allowed_command_runs_after_confirmation>   s}   € Ü�d—l‘l“nÐ&7Ó8ˆØ×Ñ˜ 	Õ*¬D°«LÔ9Ø�‰�m¤T¨&£\Ô2Ø×Ñœ˜TŸ\™\×1Ñ1Ó2°AÔ6Ø�‰Ð'¨¯©×)=Ñ)=¸aÕ)@ÖAr   c                óp   € V P                  R \        \        V P                  4       RRR7      4      4       R# )Ú3zwc -lza
b
c
©r   N)rf   r   r0   r,   rK   s   &r
   Ú#test_stdin_is_passed_to_the_programÚ4ShellSessionTest.test_stdin_is_passed_to_the_programE   s$   € Ø�‰�cœ4¤ T§\¡\£^°WÀKÔ PÓQÖRr   c                ó2  € R V P                   n        V P                  R,          p\        V P	                  R.R7      RV 24      pV P                  VR,          4       V P                  R\        V4      4       V P                  VP                  4       4       R# )FÚranÚtouch©rR   ztouch rm   õ   æ‹’ç»�N)
rJ   r   rH   r0   r,   Ú
assertTruerf   r   rn   Úexists)r	   Úmarkerr(   s   &  r
   Ú&test_refused_confirmation_does_not_runÚ7ShellSessionTest.test_refused_confirmation_does_not_runH   ss   € Ø#ˆ�‰ÔØ—‘˜UÕ"ˆÜ�d—l‘l¨'¨�lÓ3°v¸f¸XÐ5FÓGˆØ�‰˜˜yÕ)Ô*Ø�‰�h¤ V£Ô-Ø×Ñ˜Ÿ™›Ö)r   c                ó˜  € R R\         P                  ! R4       R2R3 FR  p\        V P                  4       V4      pV P	                  VR,          V4       V P                  R\        V4      V4       KT  	  V P                  V P                  P                  . 4       V P	                  V P                  R,          P                  4       4       R# )	zrm hello.txtzsh -c "cat hello.txt"Úrmú
 hello.txtzenv cat hello.txtrm   õ   ä¸�åœ¨ç™½å��å�•r>   N)ÚshutilÚwhichr0   r,   r}   rf   r   re   rJ   r   rH   r~   )r	   r   r(   s   &  r
   Ú=test_programs_outside_the_allowlist_are_refused_before_askingÚNShellSessionTest.test_programs_outside_the_allowlist_are_refused_before_askingP   sŸ   € Ø&Ð(?ÄFÇLÂLÐQUÓDVÐCWÐWaÐAbÐdwÓxˆGÜ˜$Ÿ,™,›.¨'Ó2ˆFØ�O‰O˜F 9Õ-¨wÔ7Ø�M‰MÐ+¬T°&«\¸7ÖCñ yð 	×Ñ˜Ÿ™×-Ñ-¨rÔ2Ø�‰˜Ÿ™ [Õ0×8Ñ8Ó:Ö;r   c           
     óô   € V P                   R ,          pVP                  R4       VP                  R4       RV R23 F7  pV P                  R\	        \        V P                  4       V4      4      V4       K9  	  R# )rT   z#!/bin/sh
echo pwned
éí  z./cat hello.txtr„   r…   N)rH   rI   Úchmodrf   r   r0   r,   )r	   Úfaker   s   &  r
   Ú:test_a_same_named_program_elsewhere_is_not_the_allowed_oneÚKShellSessionTest.test_a_same_named_program_elsewhere_is_not_the_allowed_oneX   sd   € Ø�y‰y˜5Õ ˆØ�‰Ð1Ô2Ø�
‰
�5ÔØ)¨d¨V°:Ð+>Ó?ˆGØ�M‰MÐ+¬T´$°t·|±|³~ÀwÓ2OÓ-PÐRYÖZó @r   c                ó¬   € \        V P                  4       \        P                  ! R 4       R24      pV P	                  VR,          \        V4      4       R# )rT   r„   rm   N)r0   r,   r†   r‡   rn   r   rp   s   & r
   Ú0test_the_full_path_of_an_allowed_program_is_fineÚAShellSessionTest.test_the_full_path_of_an_allowed_program_is_fine_   s>   € Ü�d—l‘l“n¬¯ª°eÓ)<Ð(=¸ZÐ&HÓIˆØ×Ñ˜ 	Õ*¬D°«LÖ9r   c                óú   € \        V P                  4       R 4      pV P                  \        V4      P	                  4       ^ ,          R4       V P                  V P                  R,          P                  4       4       R# )z,echo $(id) `id` ; rm -rf x | cat > out *.txtz'$(id) `id` ; rm -rf x | cat > out *.txtÚoutN)r0   r,   re   r   Ú
splitlinesrn   rH   r~   rp   s   & r
   Útest_shell_syntax_is_just_textÚ/ShellSessionTest.test_shell_syntax_is_just_textc   sX   € ä�d—l‘l“nÐ&TÓUˆØ×Ñœ˜f›×0Ñ0Ó2°1Õ5Ð7`ÔaØ×Ñ˜$Ÿ)™) eÕ+×3Ñ3Ó5Ö6r   c           	     ó  € V P                  R \        \        V P                  4       R4      4      4       V P                  R\        \        V P                  4       R4      4      4       V P	                  V P
                  P                  . 4       R# )u   å¼•å�·zecho "unclosedu   ç©ºz   N)rf   r   r0   r,   re   rJ   r   rK   s   &r
   Ú.test_bad_quoting_and_empty_commands_are_errorsÚ?ShellSessionTest.test_bad_quoting_and_empty_commands_are_errorsi   s]   € Ø�‰�h¤¤T¨$¯,©,«.Ð:JÓ%KÓ LÔMØ�‰�eœT¤$ t§|¡|£~°uÓ"=Ó>Ô?Ø×Ñ˜Ÿ™×-Ñ-¨rÖ2r   c                óê   € \        V P                  R R7      R4      pV P                  \        V4      P	                  4       ^ ,          R4       V P                  V P
                  P                  . 4       R# )FrS   úecho hiÚhiN)r0   r,   re   r   r•   rJ   r   rp   s   & r
   Ú#test_confirm_false_skips_the_promptÚ4ShellSessionTest.test_confirm_false_skips_the_promptn   sU   € Ü�d—l‘l¨5�lÓ1°9Ó=ˆØ×Ñœ˜f›×0Ñ0Ó2°1Õ5°tÔ<Ø×Ñ˜Ÿ™×-Ñ-¨rÖ2r   c                óà   € \        V P                  4       R 4       V P                  P                  ^ ,          pV P	                  RV4       V P	                  RV4       V P                  RV4       R# )zprintf '[2K[1Gls'ÚÚz\x1bN)r0   r,   rJ   r   ÚassertNotInrf   )r	   Úprompts   & r
   Ú&test_prompt_escapes_control_charactersÚ7ShellSessionTest.test_prompt_escapes_control_characterss   sU   € äˆT�\‰\‹^Ð:Ô;Ø—‘×%Ñ% aÕ(ˆØ×Ñ˜ Ô(Ø×Ñ˜˜vÔ&Ø�‰�g˜vÖ&r   c                óÚ  € \        V P                  4       R 4       V P                  P                  ^ ,          pVP	                  4        Uu. uF  q"P                  R4      '       g   K  VNK  	  ppV P                  \        V4      ^4       V P                  RV^ ,          4       V P                  RV^ ,          4       V P                  \        VP	                  4       4      ^V4       R# u upi )u@   echo 'safe



[MCP å�—é™� shell] å‘½ä»¤ï¼šls	å…�è®¸è¿�è¡Œå�—ï¼Ÿ'u     å‘½ä»¤ï¼šz\x0az\x09N)	r0   r,   rJ   r   r•   Ú
startswithre   ro   rf   )r	   r¤   ÚlÚcommand_lines   &   r
   Ú+test_newlines_and_tabs_cannot_fake_a_promptÚ<ShellSessionTest.test_newlines_and_tabs_cannot_fake_a_prompt{   s²   € ô 	ˆT�\‰\‹^ÐdÔeØ—‘×%Ñ% aÕ(ˆØ#)×#4Ñ#4Ô#6ÓVÑ#6˜a¿,¹,À}×:UŸ˜Ñ#6ˆÐVØ×Ñœ˜\Ó*¨AÔ.Ø�‰�g˜|¨A�Ô/Ø�‰�g˜|¨A�Ô/Ø×Ñœ˜V×.Ñ.Ó0Ó1°1°fÖ=ùò	 Ws   Á
C(Á'C(c                óô   € \        V P                  4       R R\        P                  ,          ,           4      pV P	                  R\        V4      4       V P                  V P                  P                  . 4       R# )zecho Úxu   å¤ªé•¿N)	r0   r,   rX   ÚMAX_COMMANDrf   r   re   rJ   r   rp   s   & r
   Ú1test_over_long_commands_are_refused_before_askingÚBShellSessionTest.test_over_long_commands_are_refused_before_asking†   sP   € Ü�d—l‘l“n g°´i×6KÑ6KÕ0KÕ&KÓLˆØ�‰�h¤ V£Ô-Ø×Ñ˜Ÿ™×-Ñ-¨rÖ2r   c                ó˜   € \        V P                  4       R RR7       V P                  RV P                  P                  ^ ,          4       R# )zwc -cru   u   æ²¡æœ‰æ˜¾ç¤ºNÁè  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)r0   r,   rf   rJ   r   rK   s   &r
   Ú"test_truncated_stdin_is_called_outÚ3ShellSessionTest.test_truncated_stdin_is_called_out‹   s1   € ÜˆT�\‰\‹^˜W¨JÕ7Ø�‰�n d§l¡l×&:Ñ&:¸1Õ&=Ö>r   c                ó0  a a€ S P                   R ,          oSP                  R4       SP                  R4       V V3R lpVS n        \	        S P                  R.R7      R4      pS P                  VR,          4       S P                  R\        V4      4       R# )	ztool.shz#!/bin/sh
echo original
r‹   c                 ó    <€ SP                   R ,          pVP                  R4       VP                  R4       \        P                  ! VS4       R# )z
swapped.shz#!/bin/sh
echo swapped
r‹   )TN)rH   rI   rŒ   ÚosÚreplace)r   Úswappedr	   Útools   & €€r
   Úswap_during_confirmationÚaShellSessionTest.test_program_replaced_while_waiting_is_not_run.<locals>.swap_during_confirmation”   s@   ø€ Ø—i‘i ,Õ.ˆGØ×ÑÐ:Ô;Ø�M‰M˜%Ô Ü�JŠJ�w Ô%ØÐr   z	./tool.shr{   rm   u	   è¢«æ›¿æ�¢N)	rH   rI   rŒ   rJ   r0   r,   r}   rf   r   )r	   r¼   r(   r»   s   f  @r
   Ú.test_program_replaced_while_waiting_is_not_runÚ?ShellSessionTest.test_program_replaced_while_waiting_is_not_run�   st   ù€ Ø�y‰y˜9Õ$ˆØ�‰Ð4Ô5Ø�
‰
�5Ôö	ð 0ˆŒÜ�d—l‘l¨+¨�lÓ7¸ÓEˆØ�‰˜˜yÕ)Ô*Ø�‰�k¤4¨£<Ö0r   c                óî   € \        V P                  4       R 4       V P                  RV P                  P                  ^ ,          4       V P                  RV P                  P                  ^ ,          4       R# )u   echo "â€®etadpu"u   â€®z\u202eN)r0   r,   r£   rJ   r   rf   rK   s   &r
   Ú'test_prompt_escapes_direction_overridesÚ8ShellSessionTest.test_prompt_escapes_direction_overridesŸ   sO   € ÜˆT�\‰\‹^Ð2Ô3Ø×Ñ˜ 4§<¡<×#7Ñ#7¸Õ#:Ô;Ø�‰�i §¡×!5Ñ!5°aÕ!8Ö9r   c                óx   € \        V P                  R .RR7      R4      pV P                  R\        V4      4       R# )Úsleepç333333Ó?)rR   Ú	timeout_szsleep 5u   è¶…è¿‡N)r0   r,   rf   r   rp   s   & r
   Ú$test_timeout_and_output_limits_applyÚ5ShellSessionTest.test_timeout_and_output_limits_apply¤   s/   € Ü�d—l‘l¨'¨¸c�lÓBÀIÓNˆØ�‰�h¤ V£Ö-r   )rH   rJ   rC   N)r   r   r   r   rL   r,   rj   rq   rv   r€   rˆ   rŽ   r‘   r–   r™   rž   r¥   r«   r°   r´   r¾   rÁ   rÇ   r   r   r   s   @r
   r<   r<   )   sn   ø‡ € ò)òaòKòBòSò*ò<ò[ò:ò7ò3ò
3ò
'ò	>ò3ò
?ò1ò :÷
.ð .r   r<   c                   óD   a € ] tR t^©t o R tR tR tR tR tR t	Rt
V tR# )	Ú
ConfigTestc                óÀ  € \         P                  ! R RRR7      ;_uu_ 4       p\        P                  ! RV/V4       RRR4        \        P
                  ! XP                  4      ^ ,          \        P                  ! VP                  4      P                  4        #   + '       g   i     Lf; i  \        P                  ! XP                  4      P                  4        i ; i)Úwú.jsonF©ÚsuffixÚdeleteÚserversN)
rA   ÚNamedTemporaryFiler)   ÚdumprZ   Úload_configr$   rF   rG   Úunlink)r	   rÑ   Úfs   && r
   ÚloadÚConfigTest.loadª   s�   € Ü×(Ò(¨°WÀU×KÕKÈqÜ�IŠI�y 'Ð*¨AÔ.÷ Lð	*Ü×)Ò)¨!¯&©&Ó1°!Õ4ä�LŠL˜Ÿ™Ó ×'Ñ'Õ)÷ L×Kûô
 �LŠL˜Ÿ™Ó ×'Ñ'Õ)ús   ¢BÁ&B- ÂB*	Â-0Cc           	     ó~   € V P                  R RRRRR.R^//.4      pV P                  VR,          R,          R4       R# )	r!   rO   rQ   rR   ÚlsÚgitrÆ   rP   N)r×   re   )r	   rÑ   s   & r
   Útest_shell_servers_loadÚ"ConfigTest.test_shell_servers_load²   sC   € Ø—)‘)˜d D¨'°G¸dÀE¸]ÈKÐYZÐ3[Ð\Ð]Ó^ˆØ×Ñ˜ � vÕ.°Ö8r   c                óÂ  € \         P                  ! R RRR7      ;_uu_ 4       p\        P                  ! RRRRRR	.R
R//RRRRR.//RRRRRRR./././V4       RRR4       V P	                  \
        P                  ! XP                  4      P                  4       \        P                  ! VP                  ^ 4      P                  4        Uu/ uF  q"R,          VbK  	  ppV P                  VR,          R,          VR,          R
,          3R4       V P                  VR,          R
,          4       V P                  R
VR,          4       R#   + '       g   i     Lø; iu upi )rÌ   rÍ   FrÎ   rÑ   r!   ÚrorQ   rR   rÚ   rJ   rÛ   ra   Úclir$   rU   r   NrP   )rQ   F)rA   rÒ   r)   rÓ   rD   rF   rG   r$   rÕ   rZ   ÚBridgeÚserver_listre   r}   r£   )r	   rÖ   rg   Úlisteds   &   r
   Ú0test_server_list_says_whether_a_shell_asks_firstÚ;ConfigTest.test_server_list_says_whether_a_shell_asks_first¶   s:  € ä×(Ò(¨°WÀU×KÕKÈqÜ�IŠI�y D¨$°¸'ÀDÀ6È9ÐV[Ð9\Ð#]Ø$(¨%°¸7ÀUÀGÐ:LÐ#MØ$(¨'°5¸FÀDÈ)ÐVZÐU[Ð;\Ð:]Ð#^ð#`ð aàbcôe÷ Lð 	�‰œŸš Q§V¡VÓ,×3Ñ3Ô4Ü&0×&7Ò&7¸¿¹ÀÓ&B×&NÑ&NÔ&PÓQÑ&P �D•'˜1’*Ñ&PˆÐQØ×Ñ˜& �, vÕ.°°tµ¸YÕ0GÐHÐJZÔ[Ø�‰˜˜u� iÕ0Ô1Ø×Ñ˜ F¨7¥OÖ4÷ L×Küò
 Rs   ¢7E	ÃEÅ	E	c                óŒ  € \         P                  ! R RRR7      ;_uu_ 4       p\        P                  ! RRRRRR	.R
R//RRRRR.//./V4       RRR4       V P	                  \
        P                  ! XP                  4      P                  4       \        P                  ! VP                  ^ 4      P                  4       pV P                  \        \
        P                  ! VP                  4      P                  4       4      V^ ,          4       T P                  \         ;QJ d#    R VR,           4       F  '       g   K   RM	  RM! R VR,           4       4      V4       T P                  \         ;QJ d#    R VR,           4       F  '       g   K   RM	  RM! R VR,           4       4      V4       R#   + '       g   i     ELm; i)rÌ   rÍ   FrÎ   rÑ   r!   rß   rQ   rR   rÚ   rJ   rÛ   Nc              3   óF   "  € T F  pR V9   ;'       d    RV9   x € K  	  R# 5i)rß   u	   å…�ç¡®è®¤Nr4   ©r5   r©   s   & r
   r7   Ú`ConfigTest.test_startup_lines_name_the_config_and_each_shells_confirm_setting.<locals>.<genexpr>É   s$   é € ÐNÁI¸q˜D A™I×:Ð:¨+¸Ñ*:Ô:ÃIùó   ‚!“!:é   NNTc              3   óF   "  € T F  pR V9   ;'       d    RV9   x € K  	  R# 5i)rÛ   u   ç»ˆç«¯ç¡®è®¤Nr4   rè   s   & r
   r7   ré   Ê   s$   é € ÐRÉ	À1˜E Q™J×>Ð>¨>¸QÑ+>Ô>Ë	ùrê   )rA   rÒ   r)   rÓ   rD   rF   rG   r$   rÕ   rZ   rá   Ústartup_linesrf   ÚstrÚresolver}   Úany)r	   rÖ   Úliness   &  r
   ÚBtest_startup_lines_name_the_config_and_each_shells_confirm_settingÚMConfigTest.test_startup_lines_name_the_config_and_each_shells_confirm_settingÂ   sE  € Ü×(Ò(¨°WÀU×KÕKÈqÜ�IŠI�y D¨$°¸'ÀDÀ6È9ÐV[Ð9\Ð#]Ø$(¨%°¸7ÀUÀGÐ:LÐ#Mð#Oð PØQRôT÷ Lð 	�‰œŸš Q§V¡VÓ,×3Ñ3Ô4Ü×!Ò! !§&¡&¨!Ó,×:Ñ:Ó<ˆØ�‰”cœ'Ÿ,š, q§v¡vÓ.×6Ñ6Ó8Ó9¸5À½8ÔDØ�‰Ÿ›ÑNÀEÈ"ÆIÓNŸŸšÑNÀEÈ"ÆIÓNÓNÐPUÔVØ�‰Ÿ›ÑRÈÈbÎ	ÓRŸŸšÑRÈÈbÎ	ÓRÓRÐTYÖZ÷ L×KÐKús   ¢,F2Æ2G	c           
     ó†  € \         P                  ! R RRR7      ;_uu_ 4       p\        P                  ! RRRRRR	.//./V4       R
R
R
4       V P	                  \
        P                  ! XP                  4      P                  4       \        P                  ! VP                  ^ \        R4      R7      p\        VP                  R4      R4       V P                  \        \
        P                  ! VP                  4      P!                  4       4      VP"                  P$                  ^ ,          4       R
#   + '       g   i     Lô; i)rÌ   rÍ   FrÎ   rÑ   r!   rÛ   rQ   rR   rV   NrS   rœ   )rA   rÒ   r)   rÓ   rD   rF   rG   r$   rÕ   rZ   rá   r   r0   r,   rf   rî   rï   rJ   r   )r	   rÖ   Úbridges   &  r
   Ú!test_prompt_names_the_config_fileÚ,ConfigTest.test_prompt_names_the_config_fileÌ   sØ   € Ü×(Ò(¨°WÀU×KÕKÈqÜ�IŠI�y D¨%°¸7ÀVÀHÐ:MÐ#NÐ"OÐPÐRSÔT÷ Là�‰œŸš Q§V¡VÓ,×3Ñ3Ô4Ü×"Ò" 1§6¡6¨1´kÀ%Ó6HÔIˆÜˆV�^‰^˜EÓ" IÔ.Ø�‰”cœ'Ÿ,š, q§v¡vÓ.×6Ñ6Ó8Ó9¸6¿>¹>×;QÑ;QÐRSÕ;TÖU÷ L×Kús   ¢"D0Ä0E 	c           
     óž  € R . /R R/R R./R R./R R.RR// R R.R^/3 FA  pV P                  \        VR7      ;_uu_ 4        V P                  RR	R
V/.4       RRR4       KC  	  V P                  \        4      ;_uu_ 4        V P                  RR	R
R R./RR./.4       RRR4       R#   + '       g   i     Kš  ; i  + '       g   i     R# ; i)rR   rÚ   zls -lar'   rJ   ÚnoÚextra)Úmsgr!   rO   rQ   Nr   r®   )ÚassertRaisesÚ
ValueErrorr×   )r	   Úbads   & r
   Ú'test_invalid_shell_configs_are_rejectedÚ2ConfigTest.test_invalid_shell_configs_are_rejectedÔ   sÚ   € Ø˜b�M G¨T ?°W¸x¸jÐ4IÈGÐVXÐUYÈ?Ø˜t˜f i°Ð6¸¸WÀtÀfÈgÐWXÐ<Yó[ˆCà×"Ñ"¤:°3Ð"×7Õ7Ø—	‘	˜D $¨°Ð5Ð6Ô7÷ 8Ñ7ñ[ð ×Ñœz×*Õ*Ø�I‰I˜˜d G¨g¸°vÐ->À	ÈCÈ5ÐQÐRÔS÷ +Ñ*÷ 8×7Ð7úç*×*Ð*ús   Á B'Â B;Â'B8Â;C	r4   N)r   r   r   r   r×   rÜ   rä   rò   rö   rÿ   r   r   r   s   @r
   rÊ   rÊ   ©   s,   ø‡ € ò*ò9ò
5ò[òV÷Tð Tr   rÊ   c                   ó^   a € ] tR t^Ýt o RtR tRR ltR tR tR t	R t
R tR	 tR
 tRtV tR# )ÚTerminalConfirmTestzJThe real prompt, on a pseudo-terminal standing in for the user's terminal.c                óö   € \         P                  ! 4       w  V n        p\         P                  ! V4      V n        \         P
                  ! V4       V P                  \         P
                  V P                  4       R # r   )r¸   ÚopenptyÚmasterÚttynameÚttyÚcloserD   )r	   Úslaves   & r
   rL   ÚTerminalConfirmTest.setUpà   sE   € ÜŸZšZ›\ÑˆŒ�UÜ—:’:˜eÓ$ˆŒÜ
�Š�ŒØ�‰œŸ™ $§+¡+Ö.r   c                óh   a aa€ VVV 3R  lp\         P                  ! VRR7      P                  4        R# )c                  óv   <€ \         P                  ! S 4       \        P                  ! SP                  S4       R # r   )ÚtimerÄ   r¸   Úwriter  )ÚdelayÚkeysr	   s   €€€r
   Ú	type_keysÚ3TerminalConfirmTest.answer_later.<locals>.type_keysç   s!   ø€ Ü�JŠJ�uÔÜ�HŠH�T—[‘[ $Ö'r   T)ÚtargetÚdaemonN)Ú	threadingÚThreadÚstart)r	   r  r  r  s   fff r
   Úanswer_laterÚ TerminalConfirmTest.answer_lateræ   s#   ú€ ÷	(ô 	×Ò 	°$Ô7×=Ñ=Ö?r   c                ó(  € R p  ^ RI pVP                  V P                  .. . R4      ^ ,          '       g   VP                  RR4      # V\        P                  ! V P                  R4      ,          pKn    \
         d    TP                  RR4      u # i ; i)r   Nçš™™™™™¹?r?   r¹   i   )Úselectr  Údecoder¸   ÚreadÚOSError)r	   r”   r  s   &  r
   Úread_screenÚTerminalConfirmTest.read_screenì   s|   € ØˆØð6ÛØ—}‘} d§k¡k ]°B¸¸CÓ@À×CÔCØŸ:™: g¨yÓ9Ð9Ø”r—w’w˜tŸ{™{¨DÓ1Õ1’øÜô 6Ø—z‘z '¨9Ó5Ò5ð6ús   …/A1 µA1 Á(A1 Á1BÂBc                óÞ   € V P                  R 4       \        P                  ! V P                  ^R7      ! R4      w  rV P	                  W4       V P                  RV P                  4       4       R# )ó   y
©Útimeoutu   è¿�è¡Œ wc -lï¼ŸN)r  rX   ÚTerminalConfirmr  r}   rf   r   ©r	   ÚokÚwhys   &  r
   Ú+test_yes_approves_and_the_question_is_shownÚ?TerminalConfirmTest.test_yes_approves_and_the_question_is_shown÷   sR   € Ø×Ñ˜&Ô!Ü×+Ò+¨D¯H©H¸aÕ@ÐARÓS‰ˆØ�‰˜Ô Ø�‰Ð'¨×)9Ñ)9Ó);Ö<r   c                óÖ   € R Fb  pV P                  VR4       \        P                  ! V P                  ^R7      ! R4      w  r#V P	                  W!4       V P                  RV4       Kd  	  R# )ó   n
r  r$  Ú?r|   N)r-  ó   
s   yes please
s   Y E S
)r  rX   r&  r  rn   rf   )r	   r  r(  r)  s   &   r
   Útest_anything_else_refusesÚ.TerminalConfirmTest.test_anything_else_refusesý   sV   € Û@ˆDØ×Ñ˜d CÔ(Ü×/Ò/°·±À!ÕDÀSÓI‰GˆBØ×Ñ˜RÔ&Ø�M‰M˜( CÖ(ó	 Ar   c                óê   € \         P                  ! V P                  R 4       \        P                  ! R4       \
        P                  ! V P                  RR7      ! R4      w  rV P                  V4       R# )r#  r  ç      à?r$  r.  N)	r¸   r  r  r  rÄ   rX   r&  r  rn   )r	   r(  Ú_s   &  r
   Ú/test_keys_typed_before_the_question_are_ignoredÚCTerminalConfirmTest.test_keys_typed_before_the_question_are_ignored  sJ   € Ü
�Š�—‘˜fÔ%Ü�
Š
�3ŒÜ×)Ò)¨$¯(©(¸CÕ@ÀÓE‰ˆØ×Ñ˜Ör   c                ó    € \         P                  ! V P                  R R7      ! R4      w  rV P                  V4       V P	                  RV4       R# )rÅ   r$  r.  u   ç§’N)rX   r&  r  rn   rf   r'  s   &  r
   Ú#test_no_answer_times_out_as_refusalÚ7TerminalConfirmTest.test_no_answer_times_out_as_refusal
  s;   € Ü×+Ò+¨D¯H©H¸cÕBÀ3ÓG‰ˆØ×Ñ˜ÔØ�‰�e˜SÖ!r   c                óÂ  € \         P                  ! V P                  R R7      p\        P                  ! VRR7      pVP                  4        \        P                  ! R4       \        P                  ! 4       pV! R4      w  rEV P                  V4       V P                  RV4       V P                  \        P                  ! 4       V,
          R4       VP                  4        R# )	g      ø?r$  )r  r.   çš™™™™™É?zsecond?u   æ­£åœ¨ç­‰å¾…r3  N)zfirst?)rX   r&  r  r  r  r  r  rÄ   Ú	monotonicrn   rf   Ú
assertLessr:   )r	   rJ   ÚfirstÚt0r(  r)  s   &     r
   Ú8test_a_second_request_while_one_waits_is_refused_at_onceÚLTerminalConfirmTest.test_a_second_request_while_one_waits_is_refused_at_once  s•   € Ü×+Ò+¨D¯H©H¸cÔBˆÜ× Ò ¨°kÔBˆØ�‰ŒÜ�
Š
�3ŒÜ�^Š^ÓˆÙ˜)Ó$‰ˆØ×Ñ˜ÔØ�‰�n cÔ*Ø�‰œŸšÓ(¨2Õ-¨sÔ3Ø�
‰
Žr   c                óŒ   € \         P                  ! R ^R7      ! R4      w  rV P                  V4       V P                  RV4       R# )z/nonexistent/ttyr$  r.  u   ç»ˆç«¯N)rX   r&  rn   rf   r'  s   &  r
   Útest_no_terminal_refusesÚ,TerminalConfirmTest.test_no_terminal_refuses  s8   € Ü×+Ò+Ð,>ÈÕJÈ3ÓO‰ˆØ×Ñ˜ÔØ�‰�h Ö$r   )r  r  N)r;  )r   r   r   r   r   rL   r  r   r*  r0  r5  r8  r@  rC  r   r   r   s   @r
   r  r  Ý   s;   ø‡ € ÙTò/ô@ò	6ò=ò)òò"ò

÷%ð %r   r  Ú__main__)Nrë   )r   r)   r¸   rF   r†   ÚsysrA   r  r  ÚunittestrG   Ú__file__rï   ÚparentÚHEREÚpathÚinsertrî   rZ   rX   r   r0   r   ÚTestCaser<   rÊ   r  r   Úmainr4   r   r
   Ú<module>rO     sÍ   ðñó Û 	Û Û Û 
Û Û Û Û à‡|‚|�HÓ×%Ñ%Ó'×.Ñ.€Ø ‡�‡��‘3�t“9Ô Û Û ÷Xñ Xôò;ô}.�x×(Ñ(ô }.ô@1T�×"Ñ"ô 1TôhA%˜(×+Ñ+ô A%ðH ˆzÔØ‡M‚M†Oñ r   