
    xIjg                        S SK Jr  S SKrS SKJs  J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Jr  S SKr\	R*                  R-                  S \" \" \5      R3                  5       R4                  S   S-  5      5        S SKJrJr  S SKJr  S S	K J!r!J"r"J#r#J$r$J%r%J&r&J'r'  S S
K(J)r)J*r*  SS jr+SS jr,\RZ                  " SS9S 5       r.S r/S r0S r1S r2S r3g)    )annotationsN)Path)	MagicMockpatch   src)	ApiClientApiError)Config)process_commandsload_command_statesupdate_command_statesave_command_statesrecover_interrupted_commandsCommandWorkerManagerHANDLERS)self_update
UpdateInfoc                    U [         R                  S'   S[         R                  S'   SS KnSS KnUR	                  U5        UR                  5       $ )NWOLFPANEL_DEV_HOME1WOLFPANEL_API_MOCKr   )osenviron	importlibconfigreloadload_config)tmpr   config_modules      <D:\Programs\laragon\www\wolf\agent\tests\test_reliability.py_fresh_configr"      sC    '*BJJ#$'*BJJ#$"]#$$&&    c                b    [        U 5      nSSKJnJn  U" U5        U" USS5        [        U 5      $ )Nr   )ensure_dirsstore_credentials
server_123wp_agent_dev_token)r"   identityr%   r&   )r   cfgr%   r&   s       r!   _registered_configr+   '   s/    

C7c<)=>r#   T)autousec               #  .  #    [         R                  R                  S5      n [         R                  R                  S5      nSS KnUR                  b!  UR                  R                  5         S Ul        S v   U b  U [         R                  S'   O [         R                  R                  SS 5        Ub  U[         R                  S'   O [         R                  R                  SS 5        UR                  b"  UR                  R                  5         S Ul        g g 7f)NWOLFPANEL_TEST_ASYNC!WOLFPANEL_MAX_CONCURRENT_COMMANDSr   )r   r   getcommand_runner_worker_managershutdownpop)
orig_asyncorig_maxr1   s      r!   	clean_envr7   .   s       67Jzz~~ABH %%1&&//1)-&	 -7

)*


-t4:B

67


:DA %%1&&//1)-& 2s   DDc                  ^ [        [        U 5      5      n[        5       nS[        R                  S'   S[        R                  S'   [        X5      n[        R                  " 5       mU4S jnU[        S'   UR                  SS0 S.5        [        SS	5       H  nUR                  US0 S.5        M     UR                  ofR                  ow" 5       o(       d  S
S[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OS[        R"                  " U5      [        R"                  " U5      [        R"                  " U5      S.-  n	[%        [        R&                  " U	5      5      eS =n=pxUR                  S	S0 S.5        TR)                  5         UR+                  5         [-        UR.                  5      n
SoU
;  o(       d  [        R0                  " SU4SX45      [        R"                  " U5      S[        R                  " 5       ;   d  [        R                   " U
5      (       a  [        R"                  " U
5      OSS.-  nSSU0-  n[%        [        R&                  " U5      5      eS =pg )Nr   r.   r/   c                *   > TR                  SS9  SS0$ Ng      @timeoutsuccessTwaitpayloadevents    r!   slow_handler/test_queue_capacity_limit.<locals>.slow_handlerX       

3
4  r#   	test.slowr   idcommand_typerA      i  zZassert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.queue
}.full
}()
}manager)py0py2py4py61002not in)z%(py1)s not in %(py3)sstates)py1py3zassert %(py5)spy5)r+   strr   r   r   r   	threadingEventr   enqueuerangequeuefull@py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationsetr3   r   var_dir_call_reprcompare)tmp_pathr*   
api_clientrK   rC   i@py_assert1@py_assert3@py_assert5@py_format7rS   @py_assert0@py_assert2@py_format4@py_format6rB   s                  @r!   test_queue_capacity_limitrs   L   s   
S]
+CJ *-BJJ%&69BJJ23"33G OOE! )H[ OO1kbIJ 1d^q+"MN  ==77= OO4LM 
IIK !-F66r#   c           
       ^ [        [        U 5      5      n[        5       nS[        R                  S'   S[        R                  S'   [
        R                  " 5       mU4S jnU[        S'   SS0 S./UR                  l	        [        SS	S
9   [        X5        [        R                  " S5        [        X5        [        UR                  5      nUS   S   nSoeU:H  ow(       do  [         R"                  " SU4SXV45      [         R$                  " U5      [         R$                  " U5      S.-  nSSU0-  n	['        [         R(                  " U	5      5      eS =n=pvSS Kn
U
R,                  oR.                  ofR0                  o" 5       nSoU:H  o(       d  [         R"                  " SU4SX45      S[2        R4                  " 5       ;   d  [         R6                  " U
5      (       a  [         R$                  " U
5      OS[         R$                  " U5      [         R$                  " U5      [         R$                  " U5      [         R$                  " U5      [         R$                  " U5      S.-  nSSU0-  n['        [         R(                  " U5      5      eS =n=n=n=n=pTR9                  5         [        R                  " S5        S S S 5        g ! , (       d  f       g = f)Nr   r.   r/   c                *   > TR                  SS9  SS0$ r:   r>   r@   s    r!   rC   >test_race_condition_duplicate_prevention.<locals>.slow_handler{   rE   r#   rF   i  rG   zcommand_runner.load_agent_tokenr(   return_value皙?501statusrunning==z%(py1)s == %(py4)srT   rN   assert %(py6)srO   r   )z%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._worker_manager
}.queue
}.qsize
}()
} == %(py11)sr1   )rL   rM   rN   rO   py8py11zassert %(py13)spy13      ?)r+   rW   r   r   r   rX   rY   r   get_pending_commandsrx   r   r   timesleepr   rf   r`   rg   rb   rc   rd   r1   r2   r\   qsizer^   r_   ra   re   )rh   r*   ri   rC   rS   ro   rl   rp   @py_format5rn   r1   rk   rm   @py_assert7@py_assert10@py_assert9@py_format12@py_format14rB   s                     @r!   (test_race_condition_duplicate_preventionr   s   s   
S]
+CJ),BJJ%&69BJJ23OOE! )H[ KB?4J##0 
0?S	T)

3 	) %S[[1e}X&3)3)33333&333&333)3333333 	--@33@99@9;@q@q@@@@@;@@@@@@~@@@@~@@@-@@@3@@@9@@@;@@@q@@@@@@@@		

3% 
U	T	Ts   
H,J??
Kc                x   [        [        U 5      5      nSSSS.0n[        UR                  U5        [	        UR                  5      nUS   S   nSoTU:H  of(       do  [
        R                  " SU4SXE45      [
        R                  " U5      [
        R                  " U5      S.-  nS	S
U0-  n[        [
        R                  " U5      5      eS =n=peUR                  S-  n	U	R                  SSS9  UR                  n[	        U5      n
0 oU:H  o(       Gd"  [
        R                  " SU4SX45      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OSS[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U
5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n
=pg )N999r=   z	test-time)r{   
updated_atr{   r}   r   r   r   rO   zcommand_states.jsonz{bad json...zutf-8)encoding)zM%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.var_dir
})
} == %(py8)sr   r*   rL   rT   rU   rV   r   assert %(py10)spy10)r+   rW   r   rf   r   r`   rg   rb   rc   rd   
write_textr^   r_   ra   )rh   r*   rS   loadedro   rl   rp   r   rn   
state_file@py_assert4r   @py_assert6@py_format9@py_format11s                  r!   test_power_loss_durabilityr      s`   
S]
+C 	EFFV, -F%="/i/i/////"///"///i/////// 44J.7;"{{1{+1r1r11111+1111111111111111s1111s111{111+111r1111111r#   c                   [        [        U 5      5      n[        5       nS[        R                  S'   S[        R                  S'   [        X5      nUR                  5         UR                  n[        U5      nSoeU:H  ow(       Gd"  [        R                  " SU4SXV45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        R                  " U5      [        R                  " U5      [        R                  " U5      S
.-  nSSU0-  n	[        [        R                   " U	5      5      eS =n=n=pvUR                   H  n
U
R"                  o" 5       o(       d  SS[        R                  " 5       ;   d  [        R                  " U
5      (       a  [        R                  " U
5      OS[        R                  " U5      [        R                  " U5      S.-  n[        [        R                   " U5      5      eS =pM     [        SS9UR                  S   l        UR                  5         UR                  n[        U5      nSoeU:H  ow(       Gd"  [        R                  " SU4SXV45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        R                  " U5      [        R                  " U5      [        R                  " U5      S
.-  nSSU0-  n	[        [        R                   " U	5      5      eS =n=n=pvUR                   GH  n
/ oR"                  o" 5       oo(       d  UR                  S   nU
ULnUnU(       Gdk  SS[        R                  " 5       ;   d  [        R                  " U
5      (       a  [        R                  " U
5      OS[        R                  " U5      [        R                  " U5      S.-  nUR%                  U5        U(       d  [        R                  " SW4SU
W45      S[        R                  " 5       ;   d  [        R                  " U
5      (       a  [        R                  " U
5      OS[        R                  " U5      S.-  nSSU0-  nUR%                  U5        [        R&                  " US5      0 -  nSSU0-  n[        [        R                   " U5      5      eS =n=n=n=n=nnGM     UR)                  5         g )Nr   r.   2r/   rJ   r}   )zM%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.workers
})
} == %(py8)slenrK   r   r   r   zCassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_alive
}()
}t)rL   rM   rN   Frw   r   z<%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.is_alive
}()
})rM   rN   rO   )is not)z%(py8)s is not %(py11)s)r   r   z%(py13)sr   r   zassert %(py16)spy16)r+   rW   r   r   r   r   start_workersworkersr   r`   rg   r^   r_   ra   rb   rc   rd   is_aliveappend_format_boolopr3   )rh   r*   ri   rK   rp   r   r   r   r   r   r   rk   rl   r   rm   ro   r   r   rn   r   r   @py_format15@py_format17s                          r!   test_worker_death_resurrectionr      s"   
S]
+CJ),BJJ%&69BJJ23"33G$3$1$1$$$$$$$$$$$3$$$$3$$$$$$w$$$$w$$$$$$$$$1$$$$$$$__zzz||qqz|  #,"?GOOA  $3$1$1$$$$$$$$$$$3$$$$3$$$$$$w$$$$w$$$$$$$$$1$$$$$$$__:zz:z|:|(::q(:::::::::q::::q:::z:::|::::|:::q(:::::::q::::q:::(:::::::::::::::  r#   c           	       ^ [        [        U 5      5      n[        5       nS[        R                  S'   S[        R                  S'   SS Kn[        X5      Ul        UR                  R                  5         [        R                  " 5       mU4S jnU[        S'   UR                  R                  SS0 S	.5        [        R                  " S
5        SoSR                  ofR                  ouU;   o(       d  [         R"                  " SU4SXW45      [         R$                  " U5      S[&        R(                  " 5       ;   d  [         R*                  " U5      (       a  [         R$                  " U5      OS[         R$                  " U5      [         R$                  " U5      S.-  n	SSU	0-  n
[-        [         R.                  " U
5      5      eS =n=n=pg[1        SSSSSS9n[3        S5       n[3        S5         U4S jn[        R4                  " USS9R7                  5         [9        XSS05        UR;                  5         SoSR                  ofR                  ouU;  o(       d  [         R"                  " SU4SXW45      [         R$                  " U5      S[&        R(                  " 5       ;   d  [         R*                  " U5      (       a  [         R$                  " U5      OS[         R$                  " U5      [         R$                  " U5      S.-  n	SSU	0-  n
[-        [         R.                  " U
5      5      eS =n=n=pgS S S 5        S S S 5        UR                  R=                  5         S Ul        g ! , (       d  f       N8= f! , (       d  f       NA= f) Nr   r.   r   r/   r   c                *   > TR                  SS9  SS0$ )Ng       @r;   r=   Tr>   r@   s    r!   slow_cmd_handler@test_update_waits_for_running_commands.<locals>.slow_cmd_handler   rE   r#   rF   i  rG   ry   701)in)z\%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s._worker_manager
}.active_commands
}r1   )rT   rU   rV   py7zassert %(py9)spy9z0.1.1z0.1.2Tz9https://downloads.wolfpanel.net/agent/v0.1.2/agent.tar.gzzmock-sha)currentlatestupdate_availableurlsha256zupdate.swap_directories_atomiczupdate.clean_old_versionsc                 R   > [         R                  " S5        T R                  5         g )Nr   )r   r   re   )rB   s   r!   unblock_soon<test_update_waits_for_running_commands.<locals>.unblock_soon   s    JJsOIIKr#   )targetdaemonjob_id702rQ   )z`%(py1)s not in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s._worker_manager
}.active_commands
})r+   rW   r   r   r   r1   r   r2   r   rX   rY   r   rZ   r   r   active_commandsr`   rg   rb   r^   r_   ra   rc   rd   r   r   Threadstartr   assert_called_oncer3   )rh   r*   ri   r1   r   ro   r   r   rp   @py_format8@py_format10info	mock_swapr   rB   s                 @r!   &test_update_waits_for_running_commandsr      sV   
S]
+CJ),BJJ%&69BJJ23%9#%JN"""002 OOE! -H[ ""**#{_a+bcJJsO B22BBBBBBBBBB5BBB5BBBBBBNBBBBNBBB2BBBBBBBBBBB GD 
/	0I	*	+	 	T:@@B 	C%01 	$$&J::JJJJJJJJJJuJJJuJJJJJJNJJJJNJJJ:JJJJJJJJJJJ 
, 
1" ""++-%)N"# 
,	+ 
1	0s%   M,)E M)M,
M)	%M,,
M:)r   rW   returnr   )4
__future__r   builtinsr^   _pytest.assertion.rewrite	assertionrewriter`   r   sysr   loggingrX   shutiljsonpathlibr   unittest.mockr   r   pytestpathinsertrW   __file__resolveparentsri   r	   r
   r   r   r1   r   r   r   r   r   r   r   updater   r   r"   r+   fixturer7   rs   r   r   r   r    r#   r!   <module>r      s    "   	 
       *  3tH~--/77:UBC D *    +' . .:% N$L285*r#   