ó
    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   € Ø'*„B‡J�JÐ#Ñ$Ø'*„B‡J�JÐ#Ñ$ÛÛ"Ø×Ñ�]Ô#Ø×$Ñ$Ó&Ð&ó    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Ó7€JÜ�z‰z�~‰~ÐAÓB€Hó Ø×%Ñ%Ñ1Ø×&Ñ&×/Ñ/Ô1Ø)-ˆÔ&ã	ð ÑØ-7Œ�
‰
Ð)Ò*ä
�
‰
�‰Ð-¨tÔ4àÑØ:BŒ�
‰
Ð6Ò7ä
�
‰
�‰Ð:¸DÔAð ×%Ñ%Ñ1Ø×&Ñ&×/Ñ/Ô1Ø)-ˆÕ&ð 2ùs   ‚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o»U
;  oÌ(       d¥  [        R0                  " SU4SXº4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 =p¼g )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ð *-„B‡J�JÐ%Ñ&Ø69„B‡J�JÐ2Ñ3ä" 3Ó3€Gô �OŠOÓ€Eõ!ð )„Hˆ[Ñð ‡O�O˜1¨kÀbÑIÔJô �1�dŽ^ˆØ�‰˜q°+È"ÑMÖNñ ð �=‰=Ð×ÑÐÐÓÐÕ×××××Ñˆ7×××Ñˆ7××Õˆ=××ÓÐ××ÓÐ×××××Ôð ‡O�O˜4°ÈÑLÔMð 
‡I�I„KØ×ÑÔô ! §¡Ó-€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,                  o»R.                  ofR0                  oÌ" 5       nSoíU:H  oÿ(       dù  [         R"                  " SU4SXÞ4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=pþT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à),„B‡J�JÐ%Ñ&Ø69„B‡J�JÐ2Ñ3ä�OŠOÓ€Eõ!ð )„Hˆ[Ñð  K¸BÑ?ð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Ö	Tús   Â
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 oºU:H  oÌ(       Gd"  [
        R                  " SU4SX«4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
=pËg )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ÐF€FÜ˜Ÿ™ VÔ,ä  §¡Ó-€FØ�%‰=˜Ñ"Ð/ iÐ/ iÑ/×/×/×/Ò/Ð"×/×/Ô/Ð"×/×/Ó/ i×/×/×/×/×/×/Ó/ð —‘Ð4Ñ4€JØ×Ñ˜.°7ÐÑ;Ø"Ÿ{™{Ð1Ô˜{Ó+Ð1¨rÐ1¨rÑ1×1×1×1Ó1Ð+×1×1×1×1×1Õ1Ô×1×1×1Ñ1Ô×1×1×1×1×1Ö1˜s×1×1×1Ñ1˜s×1×1Õ1˜{×1×1Ó1Ð+×1×1Ó1¨r×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 =p¼Mº     [        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
/ oºR"                  oÌ" 5       oîoþ(       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à),„B‡J�JÐ%Ñ&Ø69„B‡J�JÐ2Ñ3ä" 3Ó3€GØ×ÑÔà�‰Ð$Œ3ˆÓÐ$ 1Ð$ 1Ñ$×$×$×$Ó$Ð×$×$×$×$×$Õ$Œ3×$×$×$Ñ$Œ3×$×$×$×$×$Ö$ˆw×$×$×$Ñ$ˆw×$×$Õ$ˆ×$×$Ó$Ð×$×$Ó$ 1×$×$×$×$×$×$Õ$à�_Œ_ˆØ�z‰zÐˆz‹|Ð�|×××××Ñˆq×××Ñˆq××Õˆz××Óˆ|×××××Ôñ ô #,¸Ñ"?€G‡O�O�AÑÔð ×ÑÔð �‰Ð$Œ3ˆÓÐ$ 1Ð$ 1Ñ$×$×$×$Ó$Ð×$×$×$×$×$Õ$Œ3×$×$×$Ñ$Œ3×$×$×$×$×$Ö$ˆw×$×$×$Ñ$ˆw×$×$Õ$ˆ×$×$Ó$Ð×$×$Ó$ 1×$×$×$×$×$×$Õ$Ø�_�_ˆÙ:�z‰zÐ:ˆ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   ø€ Ü�JŠJ�sŒOØ�I‰I�Kr#   )Ú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à),„B‡J�JÐ%Ñ&Ø69„B‡J�JÐ2Ñ3ãÜ%9¸#Ó%J€NÔ"Ø×"Ñ"×0Ñ0Ô2ô �OŠOÓ€Eõ!ð -„Hˆ[Ñð ×"Ñ"×*Ñ*°#À{Ð_aÑ+bÔcÜ‡J‚Jˆs„Oð ÐB×2Ñ2ÐB×BÑBÐBÐBÑB×B×B×BÒBˆ5×B×BÔBˆ5×B×B×B×B×BÔB�N×B×B×BÑB�N×B×BÕBÐ2×B×BÓBÐB×B×B×B×B×B×BÕBô ØØØØGØñ€Dô 
Ð/Ô	0°IÜ	Ð*Õ	+õ	ô 	×Ò °TÑ:×@Ñ@ÔBô 	�C ¨%Ð0Ô1ð 	×$Ñ$Ô&ØÐJ×:Ñ:ÐJ×JÑJÐJÐJÑJ×J×J×JÒJˆu×J×JÔJˆu×J×J×J×J×JÔJ˜N×J×J×JÑJ˜N×J×JÕJÐ:×J×JÓJÐJ×J×J×J×J×J×JÕJ÷ 
,÷ 
1ð" ×"Ñ"×+Ñ+Ô-Ø%)€NÕ"÷# 
,Õ	+ú÷ 
1Õ	0ús%   Ç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¼   ðÝ "ç  „ ƒ	Û 
Û Û Û Û Û Ý ß *ã ð ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×7Ñ7¸Ñ:¸UÑBÓCÔ Dç *Ý ÷÷ ñ ÷ +ô'ôð ‡‚˜Ññ.ó ð.ò:% òN$òL2òó85*r#   