§
    Tq¬j$  ã                   ó  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlmZmZ ddlZddlmZmZmZmZmZ ddlmZmZmZmZ ej        d„ ¦   «         Z G d„ d¦  «        Z G d	„ d
¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )u>  AutoPOE2 - Unit Tests cho Live Run Sentinel (Mock Harness & Invariant Gate)
Domain: QA & Governance Sentinel (SÆ° Ä‘oÃ n 4)
TuÃ¢n thá»§:
- Rule 4: Tá»± Ä‘á»™ng khÃ³a cháº·n há»“i quy.
- Rule 5: Cáº¥m mock áº£o, 100% dá»¯ liá»‡u cáº¥u trÃºc thá»±c nghiá»‡m.
- Rule 8: Kiá»ƒm toÃ¡n toÃ n diá»‡n Master Invariant Matrix.
é    N)Ú	MagicMockÚpatch)ÚERR_CLIENT_LOG_PORTAL_DISABLEDÚERR_FOCUS_LOST_WHILE_AUTONOMOUSÚERR_WATCHDOG_HEARTBEAT_LAGÚLiveRunSentinelÚLiveSentinelStatus)ÚERR_BOGUS_VITAL_STRUCT_778ÚERR_CORE_LOG_FATAL_EXCEPTIONÚERR_WATCHDOG_HEARTBEAT_TIMEOUTÚERR_XYZ_OUT_OF_BOUNDSc               #   ón  K  — t          j        d¬¦  «        } t          j                             | d¦  «        }t          j                             | d¦  «        }t          |dd¬¦  «        5 }|                     d¦  «         d	d	d	¦  «         n# 1 swxY w Y   | ||d
œV — t          j        | d¬¦  «         d	S )uA   Táº¡o thÆ° má»¥c táº¡m thá»�i phá»¥c vá»¥ kiá»ƒm thá»­ cÃ´ láº­p.Úsentinel_test_)Úprefixz
Client.txtÚ	incidentsÚwúutf-8©ÚencodingzF2026/09/18 01:00:00 12345678 [INFO Client 22632] Connected to server.
N)Útemp_dirÚlog_fileÚincidents_dirT)Úignore_errors)	ÚtempfileÚmkdtempÚosÚpathÚjoinÚopenÚwriteÚshutilÚrmtree)r   r   r   Úfs       ú0C:\Projects\AutoPOE2\tests\test_live_sentinel.pyÚtemp_envr%       s  è è € õ ÔÐ'7Ð8Ñ8Ô8€HÝŒw�|Š|˜H lÑ3Ô3€HÝ”G—L’L ¨;Ñ7Ô7€Må	ˆh˜ gÐ	.Ñ	.Ô	.ð [°!Ø	�ŠÐYÑZÔZÐZð[ð [ð [ñ [ô [ð [ð [ð [ð [ð [ð [øøøð [ð [ð [ð [ð ØØ&ðð ð ð ð õ „M�(¨$Ð/Ñ/Ô/Ð/Ð/Ð/s   Á*BÂBÂBc                   ó   — e Zd ZdZd„ ZdS )ÚTestLiveRunSentinelZeroInputuN   XÃ¡c nháº­n nguyÃªn táº¯c thá»¥ Ä‘á»™ng tuyá»‡t Ä‘á»‘i (Zero Input Guarantee).c           
      ó~  — t          d¦  «        5 }t          d¦  «        5 }t          d¦  «        5 }t          d|d         |d         ¬¦  «        }t          d¦  «        D ]}|                     ¦   «          Œ|j        }d	}||k    }	|	s¿t          j        d
|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }
t          j        d¦  «        dz   d|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}|j        }d	}||k    }	|	s¿t          j        d
|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }
t          j        d¦  «        dz   d|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}|j        }d	}||k    }	|	s¿t          j        d
|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }
t          j        d¦  «        dz   d|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )ui   Kháº³ng Ä‘á»‹nh LiveRunSentinel khÃ´ng phÃ¡t báº¥t ká»³ phÃ­m báº¥m hay click chuá»™t nÃ o ra mÃ n hÃ¬nh.z ctypes.windll.user32.keybd_eventz ctypes.windll.user32.mouse_eventz!ctypes.windll.user32.PostMessageWéhX  r   r   ©Ú
target_pidÚlog_pathr   é
   r   ©ú==)z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py5)sÚ
mock_keybd©Úpy0Úpy2Úpy5u>   VI PHáº M NGUYÃŠN Táº®C THá»¤ Ä�á»˜NG: keybd_event bá»‹ gá»�i!z
>assert %(py7)sÚpy7NÚ
mock_mouseu>   VI PHáº M NGUYÃŠN Táº®C THá»¤ Ä�á»˜NG: mouse_event bá»‹ gá»�i!Ú	mock_postu?   VI PHáº M NGUYÃŠN Táº®C THá»¤ Ä�á»˜NG: PostMessageW bá»‹ gá»�i!)r   r   ÚrangeÚprocess_tickÚ
call_countÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚAssertionErrorÚ_format_explanation)Úselfr%   r0   r6   r7   ÚsentinelÚ_Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8s               r$   Ú*test_sentinel_never_calls_win32_input_apiszGTestLiveRunSentinelZeroInput.test_sentinel_never_calls_win32_input_apis6   s•  € åÐ5Ñ6Ô6ð 	x¸*ÝÐ9Ñ:Ô:ð x¸jÝÐ>Ñ?Ô?ð xÀ9Ý.Ø#(Ø!)¨*Ô!5Ø&.¨Ô&?ð ñ  ô  �Hõ # 2™YœYð 0ð 0˜Ø ×-Ò-Ñ/Ô/Ð/Ð/ð &Ô0Ðw°AÐwÐ0°AÒ5ÐwÐwÐwÕwÔwÐwÐwÐwÐwÐ0°AÐwÑwÔwÐwÕwÔwÑwÔwÐwÐwÕwÔw˜:ÑwÔwÐwÕwÔw˜:ÑwÔwÐwÐwÕwÔwÐ0ÑwÔwÕwÔw°AÑwÔwÐwÐwÑwÐwÕwÔwÐ7wÑwÔwÐwÑwÐwÐwÐwÑwÐwÕwÕwÔwÐwÑwÔwÑwÔwÐwÐwÐwÐwÐwÐwÐwØ%Ô0Ðw°AÐwÐ0°AÒ5ÐwÐwÐwÕwÔwÐwÐwÐwÐwÐ0°AÐwÑwÔwÐwÕwÔwÑwÔwÐwÐwÕwÔw˜:ÑwÔwÐwÕwÔw˜:ÑwÔwÐwÐwÕwÔwÐ0ÑwÔwÕwÔw°AÑwÔwÐwÐwÑwÐwÕwÔwÐ7wÑwÔwÐwÑwÐwÐwÐwÑwÐwÕwÕwÔwÐwÑwÔwÑwÔwÐwÐwÐwÐwÐwÐwÐwØ$Ô/Ðw°1ÐwÐ/°1Ò4ÐwÐwÐwÕwÔwÐwÐwÐwÐwÐ/°1ÐwÑwÔwÐwÕwÔwÑwÔwÐwÐwÕwÔw˜9ÑwÔwÐwÕwÔw˜9ÑwÔwÐwÐwÕwÔwÐ/ÑwÔwÕwÔw°1ÑwÔwÐwÐwÑwÐwÕwÔwÐ6wÑwÔwÐwÑwÐwÐwÐwÑwÐwÕwÕwÔwÐwÑwÔwÑwÔwÐwÐwÐwÐwÐwÐwÐwð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ð	xð 	xð 	xñ 	xô 	xð 	xð 	xð 	xð 	xð 	xð 	xð 	xøøøð 	xð 	xð 	xð 	xð 	xð 	xsX   �L2 L°KLË7LÌLÌLÌ
LÌLÌL2ÌL	ÌL2Ì!L	Ì"L2Ì2L6Ì9L6N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rL   © ó    r$   r'   r'   3   s.   € € € € € ØXÐXðxð xð xð xð xrR   r'   c                   ó   — e Zd ZdZd„ ZdS )ÚTestFocusLossAndAutonomousGuarduM   Kiá»ƒm tra báº¯t lá»—i máº¥t focus khi Ä‘ang báº­t cháº¿ Ä‘á»™ tá»± hÃ nh F8.c                 óP  — t          d|d         |d         ¬¦  «        }|                     d¦  «         t          j        |dd¬¦  «        5  |                     ¦   «         }t
          |v}|sÑt          j        d|fd	t
          |f¦  «        d
t          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        nd
dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}ddd¦  «         n# 1 swxY w Y   t          j        |dd¬¦  «        5  |                     ¦   «         }t
          |v }|sÑt          j        d|fdt
          |f¦  «        d
t          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        nd
dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}t          j        |d         ¦  «        }t#          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        t"          ¦  «        rt          j        t"          ¦  «        nddt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d!}|d         }||v }|slt          j        d|fd"||f¦  «        t          j        |¦  «        t          j        |¦  «        d#œz  }d$d%|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}ddd¦  «         dS # 1 swxY w Y   dS )&uf   Khi Ä‘ang tá»± hÃ nh (F8 ON) mÃ  game máº¥t focus, Sentinel pháº£i bÃ¡o lá»—i vÃ  Ä‘Ã³ng gÃ³i dossier.r)   r   r   r*   TÚis_game_window_focused)Úreturn_value)únot in)z%(py0)s not in %(py2)sr   Ú	anomalies©r2   r3   úassert %(py4)sÚpy4Nr   r.   ©z:%(py2)s
{%(py2)s = %(py0)s.incidents_recorded
} == %(py5)srE   r1   úassert %(py7)sr5   F©Úin©z%(py0)s in %(py2)sé   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚincident_folders)r2   Úpy1Úpy3Úpy6zassert %(py8)sÚpy8Ú	INV_F8_01)z%(py1)s in %(py4)s)re   r\   zassert %(py6)srg   )r   Úset_autonomous_moder   Úobjectr9   r   r;   r<   r=   r>   r?   r@   rB   rC   Úincidents_recordedr   Úlistdirrc   )rD   r%   rE   rY   rG   Ú@py_format3Ú@py_format5rH   rI   rJ   rK   rd   Ú@py_assert2Ú@py_assert5Ú@py_format7Ú@py_format9Ú@py_assert0s                    r$   Ú2test_focus_loss_while_autonomous_triggers_incidentzRTestFocusLossAndAutonomousGuard.test_focus_loss_while_autonomous_triggers_incidentM   sÀ  € å"ØØ˜jÔ)Ø" ?Ô3ð
ñ 
ô 
ˆð
 	×$Ò$ TÑ*Ô*Ð*õ Œ\˜(Ð$<È4ÐPÑPÔPð 	4ð 	4Ø ×-Ò-Ñ/Ô/ˆIÝ2¸)ÐCÐCÐCÐCÕCÔCÐCÐCÐCÐCÕ2¸)ÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔCÕ2ÑCÔCÐCÕCÔCÕ2ÑCÔCÐCÐCÐCÕCÔCÑCÔCÐCÐCÕCÔC¸)ÑCÔCÐCÕCÔC¸)ÑCÔCÐCÐCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCØÔ.Ð3°!Ð3Ð.°!Ò3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð.°!Ð3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3�8Ñ3Ô3Ð3Õ3Ô3�8Ñ3Ô3Ð3Ð3Õ3Ô3Ð.Ñ3Ô3Õ3Ô3°!Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ð	4ð 	4ð 	4ñ 	4ô 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4øøøð 	4ð 	4ð 	4ð 	4õ Œ\˜(Ð$<È5ÐQÑQÔQð 	6ð 	6Ø ×-Ò-Ñ/Ô/ˆIÝ2°iÐ?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Õ2°iÐ?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?Õ2Ñ?Ô?Ð?Õ?Ô?Õ2Ñ?Ô?Ð?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?°iÑ?Ô?Ð?Õ?Ô?°iÑ?Ô?Ð?Ð?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?ØÔ.Ð3°!Ð3Ð.°!Ò3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð.°!Ð3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3�8Ñ3Ô3Ð3Õ3Ô3�8Ñ3Ô3Ð3Ð3Õ3Ô3Ð.Ñ3Ô3Õ3Ô3°!Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3õ  "œz¨(°?Ô*CÑDÔDÐÝÐ'Ñ(Ô(Ð-¨AÐ-Ð(¨AÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð(¨AÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-•3Ñ-Ô-Ð-Õ-Ô-•3Ñ-Ô-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-Ð'Ñ-Ô-Ð-Õ-Ô-Ð'Ñ-Ô-Ð-Ð-Õ-Ô-Ð(Ñ-Ô-Õ-Ô-¨AÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÐ5Ð"2°1Ô"5Ð5�;Ð"5Ð5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5�;Ð"5Ð5Ñ5Ô5Õ5Ô5�;Ñ5Ô5Õ5Ô5Ð"5Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5ð	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6ð 	6ð 	6s&   ÁF4HÈHÈHÈ-M!VÖVÖ"VN)rM   rN   rO   rP   ru   rQ   rR   r$   rT   rT   J   s)   € € € € € ØWÐWð6ð 6ð 6ð 6ð 6rR   rT   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestClientLogWatcherChannelu2   Kiá»ƒm tra giÃ¡m sÃ¡t tá»‡p nháº­t kÃ½ Client.txt.c                 óv  — t          d|d         |d         ¬¦  «        }t          |d         dd¬¦  «        5 }|                     d¦  «         d	d	d	¦  «         n# 1 swxY w Y   |                     ¦   «          |j        }d
}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}d	S )uK   Kiá»ƒm tra nháº­n diá»‡n chuyá»ƒn cáº£nh khu vá»±c tá»« [SCENE] Set Source.r)   r   r   r*   Úar   r   zD2026/09/18 01:10:05 12345678 [SCENE] Set Source [Shoreline Hideout]
NzShoreline Hideoutr.   )z4%(py2)s
{%(py2)s = %(py0)s.current_area
} == %(py5)srE   r1   r^   r5   )r   r   r    r9   Úcurrent_arear;   r<   r=   r>   r?   r@   rB   rC   )	rD   r%   rE   r#   rG   rH   rI   rJ   rK   s	            r$   Útest_detect_zone_transitionz7TestClientLogWatcherChannel.test_detect_zone_transitionk   s¹  € å"ØØ˜jÔ)Ø" ?Ô3ð
ñ 
ô 
ˆõ �(˜:Ô&¨°gÐ>Ñ>Ô>ð 	]À!Ø�GŠGÐ[Ñ\Ô\Ð\ð	]ð 	]ð 	]ñ 	]ô 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]øøøð 	]ð 	]ð 	]ð 	]ð 	×ÒÑÔÐØÔ$Ð;Ð(;Ð;Ð$Ð(;Ò;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð$Ð(;Ð;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆxÑ;Ô;Ð;Õ;Ô;ˆxÑ;Ô;Ð;Ð;Õ;Ô;Ð$Ñ;Ô;Õ;Ô;Ð(;Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ó   ·AÁAÁ Ac                 ó2  — t          d|d         |d         ¬¦  «        }t          |d         dd¬¦  «        5 }|                     d¦  «         d	d	d	¦  «         n# 1 swxY w Y   |                     ¦   «         }t          |v }|sÑt          j        d
|fdt          |f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}	}d	S )u]   Kiá»ƒm tra phÃ¡t hiá»‡n lá»—i 'Portals are disabled here' (phÃ¡ báº¥t biáº¿n INV-KEY-PORTAL).r)   r   r   r*   ry   r   r   zN2026/09/18 01:12:30 12345678 [INFO Client 22632] : Portals are disabled here.
Nr_   ra   r   rY   rZ   r[   r\   rb   r.   r]   rE   r1   r^   r5   )r   r   r    r9   r   r;   r<   r=   r>   r?   r@   rB   rC   rl   )rD   r%   rE   r#   rY   rG   rn   ro   rH   rI   rJ   rK   s               r$   Ú&test_detect_portal_disabled_in_hideoutzBTestClientLogWatcherChannel.test_detect_portal_disabled_in_hideouty   sš  € å"ØØ˜jÔ)Ø" ?Ô3ð
ñ 
ô 
ˆõ �(˜:Ô&¨°gÐ>Ñ>Ô>ð 	gÀ!Ø�GŠGÐeÑfÔfÐfð	gð 	gð 	gñ 	gô 	gð 	gð 	gð 	gð 	gð 	gð 	gøøøð 	gð 	gð 	gð 	gð ×)Ò)Ñ+Ô+ˆ	Ý-°Ð:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Õ-°Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:Õ-Ñ:Ô:Ð:Õ:Ô:Õ-Ñ:Ô:Ð:Ð:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:°Ñ:Ô:Ð:Õ:Ô:°Ñ:Ô:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:ØÔ*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/r|   c                 óâ  — t          d|d         |d         ¬¦  «        }t          |d         dd¬¦  «        5 }|                     d¦  «         d	d	d	¦  «         n# 1 swxY w Y   |                     ¦   «         }d
„ |D ¦   «         }t	          |¦  «        }|s•ddt          j        ¦   «         v st          j        t          ¦  «        rt          j	        t          ¦  «        ndt          j	        |¦  «        t          j	        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d	x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        ndt          j	        |¦  «        t          j	        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d	x}x}}d	S )uZ   Kiá»ƒm tra báº¯t lá»—i [FATAL] hoáº·c Access Violation vÃ  Ä‘Ã³ng gÃ³i há»“ sÆ¡ sá»± cá»‘.r)   r   r   r*   ry   r   r   zQ2026/09/18 01:15:00 12345678 [FATAL] Access Violation (0xC0000005) at 0x7FFF1234
Nc              3   ó(   K  — | ]}t           |v V — Œd S )N)r   )Ú.0ry   s     r$   ú	<genexpr>zMTestClientLogWatcherChannel.test_detect_fatal_crash_in_log.<locals>.<genexpr>”   s(   è è € ÐHÐH¸Õ/°1Ð4ÐHÐHÐHÐHÐHÐHrR   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany)r2   r3   r\   rb   r.   r]   rE   r1   r^   r5   )r   r   r    r9   rƒ   r=   r>   r;   r?   r@   rB   rC   rl   r<   )rD   r%   rE   r#   rY   rG   rI   ro   rH   rJ   rK   s              r$   Útest_detect_fatal_crash_in_logz:TestClientLogWatcherChannel.test_detect_fatal_crash_in_logˆ   sj  € å"ØØ˜jÔ)Ø" ?Ô3ð
ñ 
ô 
ˆõ �(˜:Ô&¨°gÐ>Ñ>Ô>ð 	jÀ!Ø�GŠGÐhÑiÔiÐið	jð 	jð 	jñ 	jô 	jð 	jð 	jð 	jð 	jð 	jð 	jøøøð 	jð 	jð 	jð 	jð ×)Ò)Ñ+Ô+ˆ	ØHÐH¸iÐHÑHÔHÐH�sÐHÑHÔHÐHÐHÐHÐHÐHÕHÔHÑHÔHÐHÐHÕHÔH�sÑHÔHÐHÕHÔH�sÑHÔHÐHÐHÕHÔHÐHÑHÔHÕHÔHÐHÑHÔHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHÐHÐHØÔ*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/r|   N)rM   rN   rO   rP   r{   r~   r„   rQ   rR   r$   rw   rw   h   sG   € € € € € Ø<Ð<ð<ð <ð <ð0ð 0ð 0ð0ð 0ð 0ð 0ð 0rR   rw   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestLiveInvariantsChannelu<   Kiá»ƒm tra giÃ¡m sÃ¡t Telemetry sá»‘ng (HP/ES/XYZ/Watchdog).c                 ó*  — t          d|d         |d         ¬¦  «        }ddddddd	t          t          j        ¦   «         d
z  ¦  «        dœ}|                     |¦  «         |                     ¦   «         }t
          |v }|sÑt          j        d|fdt
          |f¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        nddt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}dS )uS   Struct 778/778 pháº£i bá»‹ báº¯t vÃ  Ä‘Ã³ng gÃ³i incident dossier ngay láº­p tá»©c.r)   r   r   r*   i
  r   g      Y@ç      i@ç        éè  ©Ú
current_hpÚmax_hpÚ
current_esÚmax_esÚpos_xÚpos_yÚpos_zÚtimestamp_msr_   ra   r
   rY   rZ   r[   r\   Nrb   r.   r]   rE   r1   r^   r5   )r   ÚintÚtimeÚupdate_telemetryr9   r
   r;   r<   r=   r>   r?   r@   rB   rC   rl   ©rD   r%   rE   Ú	telemetryrY   rG   rn   ro   rH   rI   rJ   rK   s               r$   Ú%test_vitals_bogus_marker_778_packagedz?TestLiveInvariantsChannel.test_vitals_bogus_marker_778_packaged›   sV  € å"ØØ˜jÔ)Ø" ?Ô3ð
ñ 
ô 
ˆð ØØØØØØÝ¥¤	¡¤¨dÑ 2Ñ3Ô3ð	
ð 	
ˆ	ð 	×!Ò! )Ñ,Ô,Ð,Ø×)Ò)Ñ+Ô+ˆ	å)¨YÐ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Õ)¨YÐ6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6Õ)Ñ6Ô6Ð6Õ6Ô6Õ)Ñ6Ô6Ð6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6¨YÑ6Ô6Ð6Õ6Ô6¨YÑ6Ô6Ð6Ð6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6ØÔ*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/rR   c                 ó*  — t          d|d         |d         ¬¦  «        }ddddddd	t          t          j        ¦   «         d
z  ¦  «        dœ}|                     |¦  «         |                     ¦   «         }t
          |v }|sÑt          j        d|fdt
          |f¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        nddt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}dS )uL   Tá»�a Ä‘á»™ bay vÆ°á»£t ngÆ°á»¡ng biÃªn báº£n Ä‘á»“ pháº£i bá»‹ báº¯t lá»—i.r)   r   r   r*   rb   éÜ  g    ~„.Arˆ   r‰   rŠ   r‹   r_   ra   r   rY   rZ   r[   r\   Nr.   r]   rE   r1   r^   r5   )r   r”   r•   r–   r9   r   r;   r<   r=   r>   r?   r@   rB   rC   rl   r—   s               r$   Útest_xyz_out_of_bounds_packagedz9TestLiveInvariantsChannel.test_xyz_out_of_bounds_packaged³   sV  € å"ØØ˜jÔ)Ø" ?Ô3ð
ñ 
ô 
ˆð ØØØØØØÝ¥¤	¡¤¨dÑ 2Ñ3Ô3ð	
ð 	
ˆ	ð 	×!Ò! )Ñ,Ô,Ð,Ø×)Ò)Ñ+Ô+ˆ	å$¨	Ð1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Õ$¨	Ð1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1Õ$Ñ1Ô1Ð1Õ1Ô1Õ$Ñ1Ô1Ð1Ð1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1¨	Ñ1Ô1Ð1Õ1Ô1¨	Ñ1Ô1Ð1Ð1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1ØÔ*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/rR   c                 ó†
  — t          d|d         |d         dd¬¦  «        }t          t          j        ¦   «         dz  ¦  «        }||_        d|_        |                     |d	z   ¬
¦  «        }g }||k    }|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j        }d}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	|                     |dz   ¬
¦  «        }t          |v }|sÑt          j        d|fdt          |f¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        nddt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}|j        }d}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	|                     |d z   ¬
¦  «        }t           |v }|sÑt          j        d|fdt           |f¦  «        d!t          j	        ¦   «         v st          j
        t           ¦  «        rt          j        t           ¦  «        nd!d"t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd"dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}|j        }d#}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	dS )$um   Ä�o lÆ°á»�ng nhá»‹p tim: Lag > 1500ms bÃ¡o warning (khÃ´ng Ä‘Ã³ng gÃ³i), > 3000ms bÃ¡o timeout (Ä‘Ã³ng gÃ³i).r)   r   r   r›   i¸  )r+   r,   r   Úheartbeat_warning_msÚheartbeat_timeout_msrŠ   Tiô  )Únow_msr.   )z%(py0)s == %(py3)sÚ
anomalies1)r2   rf   zassert %(py5)sr4   Nr   r]   rE   r1   r^   r5   i  r_   ra   r   Ú
anomalies2rZ   r[   r\   i€  r   Ú
anomalies3rb   )r   r”   r•   Úlast_heartbeat_msÚhas_received_heartbeatr9   r;   r<   r=   r>   r?   r@   rB   rC   rl   r   r   )rD   r%   rE   Úbase_nowr¡   rp   rG   Ú@py_format4rJ   rH   rI   rK   r¢   rn   ro   r£   s                   r$   Ú%test_watchdog_lag_warning_and_timeoutz?TestLiveInvariantsChannel.test_watchdog_lag_warning_and_timeoutË   sä  € å"ØØ˜jÔ)Ø" ?Ô3Ø!%Ø!%ð
ñ 
ô 
ˆõ •t”y‘{”{ TÑ)Ñ*Ô*ˆØ%-ˆÔ"Ø*.ˆÔ'ð ×*Ò*°(¸S±.Ð*ÑAÔAˆ
ØÐˆz˜RÒÐÐÐÕÔÐÐÐÐˆz˜RÐÑÔÐÕÔÑÔÐÐÕÔˆzÑÔÐÕÔˆzÑÔÐÐÕÔ˜RÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ð ×*Ò*°(¸T±/Ð*ÑBÔBˆ
Ý)¨ZÐ7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Õ)¨ZÐ7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7Õ)Ñ7Ô7Ð7Õ7Ô7Õ)Ñ7Ô7Ð7Ð7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7¨ZÑ7Ô7Ð7Õ7Ô7¨ZÑ7Ô7Ð7Ð7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7ØÔ*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ð ×*Ò*°(¸T±/Ð*ÑBÔBˆ
Ý-°Ð;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Õ-°Ð;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;Õ-Ñ;Ô;Ð;Õ;Ô;Õ-Ñ;Ô;Ð;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;°Ñ;Ô;Ð;Õ;Ô;°Ñ;Ô;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;ØÔ*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Õ/Ô/ˆxÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/rR   N)rM   rN   rO   rP   r™   rœ   r¨   rQ   rR   r$   r†   r†   ˜   sG   € € € € € ØFÐFð0ð 0ð 0ð00ð 0ð 0ð00ð 0ð 0ð 0ð 0rR   r†   ) rP   Úbuiltinsr=   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter;   r   r!   r   r•   Úunittest.mockr   r   ÚpytestÚ src.assistant_tool.live_sentinelr   r   r   r   r	   Ú%src.agentic_engine.invariant_sentinelr
   r   r   r   Úfixturer%   r'   rT   rw   r†   rQ   rR   r$   ú<module>r²      sÌ  ððð ð € € € € € € € € € € € € €	€	€	€	Ø €€€Ø €€€Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *à €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð „ð0ð 0ñ „ð0ð$xð xð xð xð xñ xô xð xð.6ð 6ð 6ð 6ð 6ñ 6ô 6ð 6ð<-0ð -0ð -0ð -0ð -0ñ -0ô -0ð -0ð`N0ð N0ð N0ð N0ð N0ñ N0ô N0ð N0ð N0ð N0rR   