§
    ö­»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
mZ ddlmZmZmZ ddlmZ ddlmZ ddlmZmZ  G d„ d	¦  «        ZdS )
aÊ  
Unit Test Suite for FreeExile Anti-Fog Memory Tampering & Anti-Exploit Verifier.
Validates:
1. Fog Hash Challenge-Response (HMAC-SHA256 integrity verification).
2. Detection of Client RAM tampering (hacker forcing fog_matrix to VISIBLE).
3. Server-Authoritative Action Line-of-Sight (LoS) Sanity Validation.
4. Detection of out-of-vision targeting and wall-penetrating clicks.
5. Integration with Independent Security Division (Audit telemetry & flagging).
é    N)ÚTuple)ÚFogStateÚMapGridDataÚPlayerVisibilityState)ÚWarFogEngine)ÚProceduralMapEngine)ÚFogIntegrityVerifierÚFogTamperViolationExceptionc                   óL   — e Zd Zej        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ Z	d„ Z
dS )Ú(TestFogIntegrityAndMemoryTamperDetectionc                 ó  — t          dd¬¦  «        }|                     dd¬¦  «        }t          ¦   «         }|                     ddd¬¦  «        }|j        \  }}|                     ||||d¬	¦  «         t          ¦   «         }||||fS )
Né    )ÚwidthÚheighti90  ÚBLEACHED_BONE_CANYON)ÚseedÚbiome_idÚplayer_honest)Ú	player_idr   r   é   )Úplayer_xÚplayer_yÚview_radius)r   Úgenerate_mapr   Úcreate_player_visibilityÚspawn_pointÚupdate_visibilityr	   )ÚselfÚengineÚmap_dataÚ
fog_engineÚvisÚsxÚsyÚverifiers           úGC:\Projects\FreeExile\tests\unit\test_fog_integrity_and_anti_exploit.pyÚsetup_systemz5TestFogIntegrityAndMemoryTamperDetection.setup_system   s˜   € å$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨EÐ<RÐ&ÑSÔSˆÝ!‘^”^ˆ
Ø×1Ò1¸OÐSUÐ^`Ð1ÑaÔaˆØÔ%‰ˆˆBØ×$Ò$ S¨(¸RÈ"ÐZ[Ð$Ñ\Ô\Ð\Ý'Ñ)Ô)ˆØ˜ S¨(Ð2Ð2ó    c                 óZ  — |\  }}}}|                      |j        ¦  «        }|                     ||¦  «        }|                     |||¦  «        }d}	||	u }
|
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}
}	|                     ||¦  «        }d	}	||	u }
|
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}
}	dS )zXHonest client computing hash matching server fog_matrix succeeds and consumes challenge.T©Úis©z%(py0)s is %(py3)sÚis_valid©Úpy0Úpy3úassert %(py5)sÚpy5NFÚis_replay_valid)Úgenerate_fog_challenger   Úcompute_expected_fog_hashÚverify_client_fog_hashÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)r   r'   r    r!   r"   r%   ÚnonceÚexpected_hashr-   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6r3   s                 r&   Ú"test_honest_client_fog_hash_passeszKTestFogIntegrityAndMemoryTamperDetection.test_honest_client_fog_hash_passes)   sô  € à.:Ñ+ˆ�*˜c 8Ø×/Ò/°´Ñ>Ô>ˆð !×:Ò:¸3ÀÑFÔFˆØ×2Ò2°3¸ÀuÑMÔMˆØÐˆx˜4ÐÐÐÐÕÔÐÐÐÐˆx˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐð #×9Ò9¸#¸}ÑMÔMˆØ"'Ð'ˆ %Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆÑ'Ô'Ð'Õ'Ô'ˆÑ'Ô'Ð'Ð'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'r(   c                 óª  — |\  }}}}|                      |j        ¦  «        }d„ t          d¦  «        D ¦   «         }t          d„ |D ¦   «         ¦  «        }t	          j        |                     d¦  «        |t          j        ¦  «         	                    ¦   «         }	| 
                    ||	|¦  «        }
d}|
|u }|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}}dS )zPHacker modifying RAM to remove fog of war produces hash mismatch and is flagged.c                 ó@   — g | ]}d „ t          d¦  «        D ¦   «         ‘ŒS )c                 ó0   — g | ]}t           j        j        ‘ŒS © )r   ÚVISIBLEÚvalue©Ú.0Ú_s     r&   ú
<listcomp>zoTestFogIntegrityAndMemoryTamperDetection.test_ram_tampered_client_fog_hash_fails.<locals>.<listcomp>.<listcomp>=   s   € ÐFÐFÐF°q�HÔ,Ô2ÐFÐFÐFr(   r   )ÚrangerL   s     r&   rO   zdTestFogIntegrityAndMemoryTamperDetection.test_ram_tampered_client_fog_hash_fails.<locals>.<listcomp>=   s-   € ÐZÐZÐZÈ1ÐFÐF½EÀ"¹I¼IÐFÑFÔFÐZÐZÐZr(   r   c                 ó   — g | ]	}|D ]}|‘ŒŒ
S rI   rI   )rM   ÚrowÚcells      r&   rO   zdTestFogIntegrityAndMemoryTamperDetection.test_ram_tampered_client_fog_hash_fails.<locals>.<listcomp>>   s%   € ÐPÐPÐP¨ÈCÐPÐPÀD ÐPÐPÐPÐPr(   zutf-8Fr*   r,   r-   r.   r1   r2   N)r4   r   rP   ÚbytesÚhmacÚnewÚencodeÚhashlibÚsha256Ú	hexdigestr6   r7   r8   r9   r:   r;   r<   r=   r>   )r   r'   r    r!   r"   r%   r?   Útampered_matrixÚtampered_bytesÚhacker_hashr-   rA   rB   rC   rD   s                  r&   Ú'test_ram_tampered_client_fog_hash_failszPTestFogIntegrityAndMemoryTamperDetection.test_ram_tampered_client_fog_hash_fails7   so  € à.:Ñ+ˆ�*˜c 8Ø×/Ò/°´Ñ>Ô>ˆð [ÐZÕPUÐVXÑPYÔPYÐZÑZÔZˆÝÐPÐP°ÐPÑPÔPÑQÔQˆÝ”h˜uŸ|š|¨GÑ4Ô4°nÅgÄnÑUÔU×_Ò_ÑaÔaˆð ×2Ò2°3¸ÀUÑKÔKˆØ Ð ˆx˜5Ð Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆx˜5Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆxÑ Ô Ð Õ Ô ˆxÑ Ô Ð Ð Õ Ô ˜5Ñ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð r(   c                 óF  — |\  }}}}|j         \  }}|dz   |f}t          j        j        |j        |         |dz   <   |                     ||||f|¬¦  «        \  }	}
d}|	|u }|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}}d}|
|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}}d
S )zGActions targeting entities inside VISIBLE Line-of-Sight are legitimate.é   ©Ú
player_posÚ
target_posTr*   r,   Ú
is_allowedr.   r1   r2   NÚIN_LINE_OF_SIGHT)ú==)z%(py0)s == %(py3)sÚreason)r   r   rJ   rK   Ú
fog_matrixÚvalidate_player_action_losr7   r8   r9   r:   r;   r<   r=   r>   )r   r'   r    r!   r"   r%   r#   r$   rc   rd   rg   rA   rB   rC   rD   s                  r&   Ú%test_action_target_inside_los_allowedzNTestFogIntegrityAndMemoryTamperDetection.test_action_target_inside_los_allowedE   s  € à.:Ñ+ˆ�*˜c 8ØÔ%‰ˆˆBð ˜1‘f˜b�\ˆ
Ý%-Ô%5Ô%;ˆŒ�rÔ˜2 ™6Ñ"à%×@Ò@Ø� r¨2 h¸:ð Añ 
ô 
Ñˆ
�Fð "Ð!ˆz˜TÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆz˜TÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆzÑ!Ô!Ð!Õ!Ô!ˆzÑ!Ô!Ð!Ð!Õ!Ô!˜TÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ø+Ð+ˆvÐ+Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+ˆvÐ+Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆvÑ+Ô+Ð+Õ+Ô+ˆvÑ+Ô+Ð+Ð+Õ+Ô+Ð+Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r(   c                 ó  — |\  }}}}|j         \  }}|j        \  }}	|j        |	         |         }
t          j        }|j        }|
|k    }|sÇt          j        d|fd|
|f¦  «        t          j        |
¦  «        dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}x}}|                     ||||f||	f¬¦  «        \  }}d	}||u }|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}}d}
|
|v }|s—t          j        d|fd|
|f¦  «        t          j        |
¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
}dS )zRActions targeting monsters hidden in fog/unexplored are blocked with exploit flag.)ú!=)zJ%(py1)s != %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.VISIBLE
}.value
}r   )Úpy1r0   r2   Úpy7zassert %(py9)sÚpy9Nra   Fr*   r,   rd   r.   r1   r2   ÚTARGET_NOT_VISIBLE_IN_FOG)Úin)z%(py1)s in %(py3)srg   )rm   r0   )r   Ú
boss_pointrh   r   rJ   rK   r7   r8   r<   r9   r:   r;   r=   r>   ri   )r   r'   r    r!   r"   r%   r#   r$   ÚbxÚbyÚ@py_assert0Ú@py_assert4Ú@py_assert6rA   Ú@py_format8Ú@py_format10rd   rg   rB   rC   rD   s                        r&   Ú/test_action_target_in_fog_or_unexplored_blockedzXTestFogIntegrityAndMemoryTamperDetection.test_action_target_in_fog_or_unexplored_blockedT   sø  € à.:Ñ+ˆ�*˜c 8ØÔ%‰ˆˆBØÔ$‰ˆˆBð Œ~˜bÔ! "Ô%Ð?­Ô)9Ð?Ð)9Ô)?Ð?Ð%Ð)?Ò?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð%Ð)?Ð?Ñ?Ô?Õ?Ô?Ð%Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?­Ñ?Ô?Ð?Õ?Ô?­Ñ?Ô?Ð?Ð?Õ?Ô?Ð)9Ñ?Ô?Õ?Ô?Ð)?Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?à%×@Ò@Ø� r¨2 h¸BÀ¸8ð Añ 
ô 
Ñˆ
�Fð #Ð"ˆz˜UÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆz˜UÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Ð"Õ"Ô"˜UÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ø*Ð4Ð*¨fÐ4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð*¨fÐ4Ñ4Ô4Õ4Ô4Ð*Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4¨fÑ4Ô4Ð4Õ4Ô4¨fÑ4Ô4Ð4Ð4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4r(   c                 ó|  — |\  }}}}|j         \  }}d}t          d¦  «        D ]4}	t          d¦  «        D ]}
|                     |
|	¦  «        r|
|	f} nŒ|r nŒ5d}||u}|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}}|                     ||||f|¬	¦  «        \  }}d
}||u }|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}}dS )zGActions targeting through solid walls are blocked as wall-hack exploit.Nr   )úis not)z%(py0)s is not %(py3)sÚwall_posr.   r1   r2   ra   Fr*   r,   rd   )r   rP   Úblocks_visionr7   r8   r9   r:   r;   r<   r=   r>   ri   )r   r'   r    r!   r"   r%   r#   r$   r}   ÚyÚxrA   rB   rC   rD   rd   rg   s                    r&   Ú,test_action_target_behind_solid_wall_blockedzUTestFogIntegrityAndMemoryTamperDetection.test_action_target_behind_solid_wall_blockedc   sG  € à.:Ñ+ˆ�*˜c 8ØÔ%‰ˆˆBð ˆÝ�r‘”ð 	ð 	ˆAÝ˜2‘Y”Yð ð �Ø×)Ò)¨!¨QÑ/Ô/ð Ø ! 1˜v�HØ�Eðð ð Ø�ðð  $Ð#ˆx˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆx˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆxÑ#Ô#Ð#Õ#Ô#ˆxÑ#Ô#Ð#Ð#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#à%×@Ò@Ø� r¨2 h¸8ð Añ 
ô 
Ñˆ
�Fð #Ð"ˆz˜UÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆz˜UÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Ð"Õ"Ô"˜UÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"r(   N)Ú__name__Ú
__module__Ú__qualname__ÚpytestÚfixturer'   rE   r^   rj   rz   r�   rI   r(   r&   r   r      sz   € € € € € Ø„^ð3ð 3ñ „^ð3ð(ð (ð (ð!ð !ð !ð,ð ,ð ,ð5ð 5ð 5ð#ð #ð #ð #ð #r(   r   )Ú__doc__Úbuiltinsr9   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter7   r…   rU   rX   Útypingr   Úserver.world.map_data_typesr   r   r   Úserver.world.war_fog_enginer   Ú"server.world.procedural_map_enginer   Ú&server.security.fog_integrity_verifierr	   r
   r   rI   r(   r&   ú<module>r‘      s  ððð ð € € € € € € € € € € € € €€€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð
 5Ð 4Ð 4Ð 4Ð 4Ð 4Ø BÐ BÐ BÐ BÐ BÐ Bðð ð ð ð ð ð ð ðZ#ð Z#ð Z#ð Z#ð Z#ñ Z#ô Z#ð Z#ð Z#ð Z#r(   