§
    hÐ½jä/  ã            
      óÀ  — d Z ddlm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ZddlZddlZddlmZmZmZmZ ej                             dej                             ej                             ej                             e¦  «        d¦  «        ¦  «        ¦  «         ddlmZ ddlmZmZm Z m!Z!  G d„ d	ej"        ¦  «        Z#e$d
k    r ej%        ¦   «          dS dS )aH  
Adversarial Stress Test Suite for FreeExile 1,000,000 CCU Chat Microservice.
Empirically challenges:
1. Extreme concurrency (50 to 100 concurrent tasks).
2. High listener load (10,000+ active listeners across 64 shards).
3. Burst flooding on World channel with zero dropped deliveries.
4. Multi-round memory leak tracking (5 consecutive rounds, residual growth <= 0.05MB).
5. Dynamic player arrival unevicted dict leak detection in ChannelManager.
6. Concurrent HMAC item queries (< 2.0ms) and cryptographic spoof rejection.
7. O(N^2) subscription cache rebuilding characterization.
é    )ÚannotationsN)ÚCallableÚListÚSequenceÚTuplez../..)ÚChatService)ÚChatChannelTypeÚChatMessageDTOÚItemAffixDTOÚSendChatRequestDTOc                  óZ   — e Zd ZdZdd„Zdd	„Zdd
„Zdd„Zdd„Zdd„Z	dd„Z
dd„Zdd„ZdS )ÚTestChatAdversarialStresszGAdversarial stress testing harness challenging worker benchmark claims.ÚreturnÚNonec                ó0   — t          d¬¦  «        | _        d S )Né@   )Úcluster_shards)r   Úchat_service)Úselfs    úKC:\Projects\FreeExile\tests\load_simulation\test_chat_adversarial_stress.pyÚsetUpzTestChatAdversarialStress.setUp&   s   € Ý'°rÐ:Ñ:Ô:ˆÔÐÐó    ÚcountÚintÚsinkú Callable[[ChatMessageDTO], None]c                óF  — d}| j         j        }|D ]x}|j                             |¦  «        }|j        j        |                              |i ¦  «        }t          d|dz   ¦  «        D ]}|||<   Œ|j                             ||¦  «         Œy|j                             ¦   «         S )zNEfficiently registers count listeners across 5 channels rebuilding cache once.)ÚworldÚsystemÚrecruitzzone:zone_mainzguild:guild_mainé   )	r   Úcluster_routerÚregistryÚ_get_shard_indexÚshardsÚ
setdefaultÚrangeÚ_rebuild_cacheÚtotal_subscribers_count)	r   r   r   ÚchannelsÚrouterÚchÚs_idxÚ
shard_dictÚcids	            r   Ú_register_subscribers_bulkz4TestChatAdversarialStress._register_subscribers_bulk)   s¬   € àWˆØÔ"Ô1ˆØð 	6ð 	6ˆBØ”O×4Ò4°RÑ8Ô8ˆEØœÔ/°Ô6×AÒAÀ"ÀbÑIÔIˆJÝ˜Q ¨¡	Ñ*Ô*ð 'ð '�Ø"&�
˜3‘�ØŒO×*Ò*¨5°"Ñ5Ô5Ð5Ð5ØŒ×6Ò6Ñ8Ô8Ð8r   c              ƒ  ó  ‡ ‡K  — ‰                       dd„ ¦  «         dˆ fd„Šˆfd	„t          d
¦  «        D ¦   «         }t          j        |Ž ƒ d{V —†}‰                      t          |¦  «        d¦  «         ˆfd„t          d¦  «        D ¦   «         }t          j        |Ž ƒ d{V —†}‰                      t          |¦  «        d¦  «         ‰ j        j                             ¦   «         }‰  	                    |d         dd|d         › d�¦  «         dS )z>Challenges cluster with 50 and 100 concurrent publisher tasks.éè  c                ó   — d S ©N© ©Ú_s    r   ú<lambda>zWTestChatAdversarialStress.test_01_extreme_concurrency_publisher_flood.<locals>.<lambda>7   s   € ¸€ r   Útask_idr   Úbase_senderÚ	msg_countr   c              “  óò   •K  — d}t          |¦  «        D ]a}t          || dz  z   |z   d| › d|› �dt          j        d| › d|› �¬¦  «        }‰j                             |¦  «        ƒ d {V —†}|j        r|d	z  }Œb|S )
Nr   éd   ÚExile_r7   é#   zConcurrency stress msg ú-©Ú	sender_idÚsender_nameÚsender_levelÚchannelÚcontentr!   ©r'   r   r	   ÚWORLDr   Úhandle_send_chatÚsuccess)r9   r:   r;   ÚacceptedÚiÚreqÚresr   s          €r   Ú_publish_batchz]TestChatAdversarialStress.test_01_extreme_concurrency_publisher_flood.<locals>._publish_batch9   sº   øè è € ØˆHÝ˜9Ñ%Ô%ð 
"ð 
"�Ý(Ø)¨G°c©MÑ9¸AÑ=Ø 6¨Ð 6Ð 6°1Ð 6Ð 6Ø!#Ý+Ô1ØC°gÐCÐCÀÐCÐCðñ ô �ð !Ô-×>Ò>¸sÑCÔCÐCÐCÐCÐCÐCÐC�Ø”;ð "Ø ‘M�HøØˆOr   c                ó*   •— g | ]} ‰|d d¦  «        ‘ŒS )i@ é
   r5   ©Ú.0ÚtrO   s     €r   ú
<listcomp>zYTestChatAdversarialStress.test_01_extreme_concurrency_publisher_flood.<locals>.<listcomp>I   s'   ø€ ÐFÐFÐF°q�N�N 1 g¨rÑ2Ô2ÐFÐFÐFr   é2   Néô  c                ó*   •— g | ]} ‰|d d¦  «        ‘ŒS )ià“ é   r5   rR   s     €r   rU   zYTestChatAdversarialStress.test_01_extreme_concurrency_publisher_flood.<locals>.<listcomp>N   s'   ø€ ÐGÐGÐG°q�^�^ A w°Ñ2Ô2ÐGÐGÐGr   r=   Úp99ç      .@zp99 latency exceeded 15ms SLA: Úms)r9   r   r:   r   r;   r   r   r   )
r0   r'   ÚasyncioÚgatherÚassertEqualÚsumr   r"   Úget_latency_statsÚ
assertLess)r   Útasks_50Ú
results_50Ú	tasks_100Úresults_100ÚstatsrO   s   `     @r   Ú+test_01_extreme_concurrency_publisher_floodzETestChatAdversarialStress.test_01_extreme_concurrency_publisher_flood5   s@  øøè è € à×'Ò'¨¨n¨nÑ=Ô=Ð=ð	ð 	ð 	ð 	ð 	ð 	ð  GÐFÐFÐF½EÀ"¹I¼IÐFÑFÔFˆÝ"œ>¨8Ð4Ð4Ð4Ð4Ð4Ð4Ð4ˆ
Ø×Ò�˜Z™œ¨#Ñ.Ô.Ð.ð HÐGÐGÐG½EÀ#¹J¼JÐGÑGÔGˆ	Ý#œN¨IÐ6Ð6Ð6Ð6Ð6Ð6Ð6ˆØ×Ò�˜[Ñ)Ô)¨3Ñ/Ô/Ð/àÔ!Ô0×BÒBÑDÔDˆØ�Š˜˜eœ dÐ,^ÈeÐTYÌlÐ,^Ð,^Ð,^Ñ_Ô_Ð_Ð_Ð_r   c              ƒ  óâ  ‡K  — dŠdˆfd„}|                       d|¦  «        }|                      |d¦  «         t          d	d
dt          j        d¬¦  «        }t          j        ¦   «         }| j                             |¦  «        ƒ d{V —†}t          j        ¦   «         |z
  dz  }|  	                    |j
        ¦  «         |                      ‰dd¦  «         |                      |dd|d›d�¦  «         dS )zNRegisters 10,000 active listeners (50,000 handles) and verifies 0 drop fanout.r   r7   r
   r   r   c                ó   •— ‰dz  Šd S )Nr!   r5   )r7   Údelivery_counters    €r   Ú_counting_sinkz_TestChatAdversarialStress.test_02_high_listener_load_10k_sharded_fanout.<locals>._counting_sinkY   s   ø€ à Ñ!ÐÐÐr   é'  iPÃ  i¡† ÚWorldBroadcasterrV   u1   ToÃ n cÃµi hoang vá»±c láº¯ng nghe hiá»‡u lá»‡nh!rA   Nç     @�@z3World broadcast must reach exactly 10,000 listenersr[   z 10k fanout exceeded 15.0ms SLA: ú.3fr\   )r7   r
   r   r   )r0   ÚassertGreaterEqualr   r	   rH   ÚtimeÚperf_counterr   rI   Ú
assertTruerJ   r_   rb   )r   rl   Útotal_handlesrM   Út0rN   Ú	fanout_msrk   s          @r   Ú-test_02_high_listener_load_10k_sharded_fanoutzGTestChatAdversarialStress.test_02_high_listener_load_10k_sharded_fanoutU   s'  øè è € àÐð	"ð 	"ð 	"ð 	"ð 	"ð 	"ð ×7Ò7¸ÀÑOÔOˆØ×Ò ¨vÑ6Ô6Ð6å ØØ*ØÝ#Ô)ØGð
ñ 
ô 
ˆõ ÔÑ Ô ˆØÔ%×6Ò6°sÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;ˆÝÔ&Ñ(Ô(¨2Ñ-°Ñ7ˆ	à�Š˜œÑ$Ô$Ð$Ø×ÒÐ)¨6Ð3hÑiÔiÐiØ�Š˜	 4Ð)]ÈIÐ)]Ð)]Ð)]Ð)]Ñ^Ô^Ð^Ð^Ð^r   c              ƒ  ó  ‡ ‡K  — ‰                       dd„ ¦  «         dˆ fd„Št          j        ¦   «         }ˆfd„t          d	¦  «        D ¦   «         }t	          j        |Ž ƒ d
{V —†}t          j        ¦   «         |z
  }t          |¦  «        }‰                      |d¦  «         |dk    r||z  nd}‰ j        j	         
                    ¦   «         }‰                      |d         dd|d         › d�¦  «         ‰                      |dd¦  «         d
S )zHFloods World channel with 500 messages across 50 tasks to 10k listeners.rm   c                ó   — d S r4   r5   r6   s    r   r8   zPTestChatAdversarialStress.test_03_world_channel_burst_flooding.<locals>.<lambda>q   ó   € ¸$€ r   r9   r   r   r   c              “  óò   •K  — d}t          |¦  «        D ]a}t          d| dz  z   |z   d| › d|› �dt          j        d| › d|› �¬	¦  «        }‰j                             |¦  «        ƒ d {V —†}|j        r|d
z  }Œb|S )Nr   i€ rV   ÚBurstExile_r7   é(   zBurst flood event packet ú:rA   r!   rG   )r9   r   Úlocal_acceptedrL   rM   rN   r   s         €r   Ú_burst_senderzUTestChatAdversarialStress.test_03_world_channel_burst_flooding.<locals>._burst_senders   sº   øè è € ØˆNÝ˜5‘\”\ð 
(ð 
(�Ý(Ø%¨°"©Ñ4°qÑ8Ø ;¨gÐ ;Ð ;¸Ð ;Ð ;Ø!#Ý+Ô1ØE¸ÐEÐEÀ!ÐEÐEðñ ô �ð !Ô-×>Ò>¸sÑCÔCÐCÐCÐCÐCÐCÐC�Ø”;ð (Ø" aÑ'�NøØ!Ð!r   c                ó(   •— g | ]} ‰|d ¦  «        ‘ŒS )rQ   r5   )rS   rT   r�   s     €r   rU   zRTestChatAdversarialStress.test_03_world_channel_burst_flooding.<locals>.<listcomp>ƒ   s%   ø€ Ð9Ð9Ð9¨!��˜q "Ñ%Ô%Ð9Ð9Ð9r   rV   NrW   r   ç        rZ   r[   zBurst flood p99 exceeded 15ms: r\   g      $@z2Throughput under 10k listeners is unacceptably low)r9   r   r   r   r   r   )r0   rr   rs   r'   r]   r^   r`   r_   r   r"   ra   rb   ÚassertGreater)	r   Út_startÚtasksÚresultsÚ	total_durÚtotal_acceptedÚ
throughputrg   r�   s	   `       @r   Ú$test_03_world_channel_burst_floodingz>TestChatAdversarialStress.test_03_world_channel_burst_floodingo   s7  øøè è € à×'Ò'¨°°Ñ?Ô?Ð?ð	"ð 	"ð 	"ð 	"ð 	"ð 	"õ Ô#Ñ%Ô%ˆØ9Ð9Ð9Ð9­u°R©y¬yÐ9Ñ9Ô9ˆÝœ¨Ð.Ð.Ð.Ð.Ð.Ð.Ð.ˆÝÔ%Ñ'Ô'¨'Ñ1ˆ	å˜W™œˆØ×Ò˜¨Ñ-Ô-Ð-Ø3<¸q²=°=�^ iÑ/Ð/Àcˆ
àÔ!Ô0×BÒBÑDÔDˆØ�Š˜˜eœ dÐ,^ÈeÐTYÌlÐ,^Ð,^Ð,^Ñ_Ô_Ð_Ø×Ò˜: tÐ-aÑbÔbÐbÐbÐbr   c              ƒ  ó  K  — t          j        ¦   «          t          j        ¦   «          |                      dd„ ¦  «         g }t          dd¦  «        D ]ø}t          j        ¦   «          t          d¦  «        D ]‘}d|z   }d| j        j        j        |t          j
        f<   d| j        j        j        |t          j
        f<   t          |d	|› �d
t          j
        d|› d|dz  › �¬¦  «        }| j                             |¦  «        ƒ d{V —† Œ’t          j        ¦   «          |                     t          j        ¦   «         d         dz  ¦  «         Œùt          j        ¦   «          |d         |d         z
  }|                      |dd|d›d�¦  «         dS )zOExecutes 5 stress rounds with steady active senders verifying growth <= 0.05MB.rm   c                ó   — d S r4   r5   r6   s    r   r8   zXTestChatAdversarialStress.test_04_multi_round_memory_leak_steady_state.<locals>.<lambda>“   r{   r   r!   é   éÈ   i ¡ rƒ   )Ú rƒ   ÚSteady_é   zRound z payload buffer é   rA   Nr   é   éÿÿÿÿçš™™™™™©?z;Steady state leak detected over 5 rounds! Residual growth: z.4fÚMB)ÚtracemallocÚstartÚgcÚcollectr0   r'   r   Úchannel_managerÚ_last_send_timer	   rH   Ú_last_message_infor   rI   ÚappendÚget_traced_memoryÚstopÚassertLessEqual)r   Úround_memoriesÚrrL   ÚsidrM   Úresidual_growths          r   Ú,test_04_multi_round_memory_leak_steady_statezFTestChatAdversarialStress.test_04_multi_round_memory_leak_steady_state�   s´  è è € åÔÑÔÐÝ
Œ
‰ŒˆØ×'Ò'¨°°Ñ?Ô?Ð?à&(ˆÝ�q˜!‘”ð 	Vð 	VˆAÝŒJ‰LŒLˆLÝ˜3‘Z”Zð >ð >�Ø ‘k�Øbe�Ô!Ô1ÔAÀ3ÍÔH]ÐB^Ñ_Øen�Ô!Ô1ÔDÀcÍ?ÔK`ÐEaÑbÝ(Ø!¨¸¨¨ÈRÝ+Ô1Ð;_ÀAÐ;_Ð;_ÐWXÐ[]ÑW]Ð;_Ð;_ðñ ô �ð Ô'×8Ò8¸Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=åŒJ‰LŒLˆLØ×!Ò!¥+Ô"?Ñ"AÔ"AÀ!Ô"DÈÑ"TÑUÔUÐUÐUåÔÑÔÐØ(¨Ô,¨~¸aÔ/@Ñ@ˆØ×ÒØ˜TØaÈ/ÐaÐaÐaÐañ	
ô 	
ð 	
ð 	
ð 	
r   c              ƒ  ój  K  — t          j        ¦   «          t          j        ¦   «          g }t	          dd¦  «        D ]¼}t          j        ¦   «          t	          d¦  «        D ]U}t          d|dz  z   |z   d|› d|› �dt          j        d	|› d
|› �¬¦  «        }| j         	                    |¦  «        ƒ d{V —† ŒVt          j        ¦   «          | 
                    t          j        ¦   «         d         dz  ¦  «         Œ½t          j        ¦   «          |d         |d         z
  }|                      |dd¦  «         dS )zREmpirically demonstrates ChannelManager unevicted dict leak under dynamic senders.r!   rŽ   r�   iÀ'	 r2   Ú	NewExile_r7   r’   zDynamic new arrival msg r@   rA   Nr   r”   r•   r–   zTExpected ChannelManager dict inflation to exceed 0.05MB under continuous new senders)r˜   r™   rš   r›   r'   r   r	   rH   r   rI   rŸ   r    r¡   r„   )r   r£   r¤   rL   rM   r¦   s         r   Ú6test_05_dynamic_sender_unbounded_dict_growth_detectionzPTestChatAdversarialStress.test_05_dynamic_sender_unbounded_dict_growth_detection¬   sb  è è € åÔÑÔÐÝ
Œ
‰Œˆà&(ˆÝ�q˜!‘”ð 	Vð 	VˆAÝŒJ‰LŒLˆLÝ˜3‘Z”Zð >ð >�Ý(Ø%¨¨D©Ñ0°1Ñ4Ø 3¨AÐ 3Ð 3°Ð 3Ð 3Ø!#Ý+Ô1Ø>°qÐ>Ð>¸1Ð>Ð>ðñ ô �ð Ô'×8Ò8¸Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=åŒJ‰LŒLˆLØ×!Ò!¥+Ô"?Ñ"AÔ"AÀ!Ô"DÈÑ"TÑUÔUÐUÐUåÔÑÔÐØ(¨Ô,¨~¸aÔ/@Ñ@ˆà×ÒØ˜TØbñ	
ô 	
ð 	
ð 	
ð 	
r   c              ƒ  ó  ‡ ‡‡K  — g Št          d¦  «        D ]]}d|› �}‰ j        j                             |d|› �dddddt	          dd	d
¦  «        f¬¦  «        }‰                     ||j        f¦  «         Œ^d!ˆ fd„Šˆfd„t          d¦  «        D ¦   «         }t          j        ˆfd„|D ¦   «         Ž ƒ d{V —†}d„ |D ¦   «         }t          |¦  «        }|t          t          |¦  «        dz  ¦  «                 }‰                      |dd|d›d�¦  «         d}	d}
‰ j                             |	|
¦  «        }‰                      |j        d¦  «         ‰ j                             dd¦  «        }‰                      |j        d ¦  «         dS )"zRStresses HMAC item query SLA (< 2.0ms) and checks cryptographic forgery rejection.r“   Úadv_item_blade_u   Huyáº¿t Ma Kiáº¿m +rY   r!   r=   u   Cá»• Tháº§nÚstatu   SÃ¡t ThÆ°Æ¡ngro   )Ú	item_uuidÚitem_name_keyÚrarityÚelementÚqualityÚ
item_levelÚcrafter_nameÚaffixesÚqueriesúSequence[Tuple[str, str]]r   úList[float]c              “  óV  •K  — g }| D �]\  }}t          j        ¦   «         }‰j                             ||¦  «        }|                     t          j        ¦   «         |z
  d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        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d x}x}}�Œ!|S )	Nro   T)Úis)z0%(py2)s
{%(py2)s = %(py0)s.is_valid
} is %(py5)srN   )Úpy0Úpy2Úpy5zassert %(py7)sÚpy7)rr   rs   r   Úquery_item_snapshotrŸ   Úis_validÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)r¶   ÚlatsÚuid_strÚsigrv   rN   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8r   s              €r   Ú_query_workerzbTestChatAdversarialStress.test_06_concurrent_hmac_query_and_spoof_rejection.<locals>._query_workerÕ   sO  øè è € ØˆDØ 'ð ,ñ ,‘�˜ÝÔ&Ñ(Ô(�ØÔ'×;Ò;¸GÀSÑIÔI�Ø—’�TÔ.Ñ0Ô0°2Ñ5¸Ñ?Ñ@Ô@Ð@Ø”|Ð+ tÐ+�| tÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+�| tÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�sÑ+Ô+Ð+Õ+Ô+�sÑ+Ô+Ð+Ð+Õ+Ô+�|Ñ+Ô+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ñ+ØˆKr   c                óF   •— g | ]}ˆfd „t          d¦  «        D ¦   «         ‘ŒS )c                ó@   •— g | ]}‰|t          ‰¦  «        z           ‘ŒS r5   )Úlen)rS   ÚjÚlegit_itemss     €r   rU   zjTestChatAdversarialStress.test_06_concurrent_hmac_query_and_spoof_rejection.<locals>.<listcomp>.<listcomp>ß   s+   ø€ ÐBÐBÐB°1ˆ[˜�S Ñ-Ô-Ñ-Ô.ÐBÐBÐBr   rQ   )r'   )rS   r7   rÖ   s     €r   rU   z_TestChatAdversarialStress.test_06_concurrent_hmac_query_and_spoof_rejection.<locals>.<listcomp>Þ   sD   ø€ ð 
ð 
ð 
àð CÐBÐBÐB½¸b¹	¼	ÐBÑBÔBð
ð 
ð 
r   rV   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r5   r5   )rS   ÚbrÑ   s     €r   rU   z_TestChatAdversarialStress.test_06_concurrent_hmac_query_and_spoof_rejection.<locals>.<listcomp>â   s#   ø€ Ð(MÐ(MÐ(M¸a¨¨°qÑ)9Ô)9Ð(MÐ(MÐ(Mr   Nc                ó   — g | ]	}|D ]}|‘ŒŒ
S r5   r5   )rS   r¤   Úlats      r   rU   z_TestChatAdversarialStress.test_06_concurrent_hmac_query_and_spoof_rejection.<locals>.<listcomp>ã   s%   € Ð6Ð6Ð6˜A°AÐ6Ð6¨S�CÐ6Ð6Ð6Ð6r   g®Gáz®ï?g       @z!HMAC p99 latency exceeded 2.0ms: rp   r\   Úadv_item_blade_0Ú@0000000000000000000000000000000000000000000000000000000000000000z#Tampered signature must be rejectedÚnon_existent_itemÚ@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz"Non-existent item must be rejected)r¶   r·   r   r¸   )r'   r   Úitem_link_serviceÚcreate_item_snapshotr   rŸ   Úhmac_signaturer]   r^   Úsortedr   rÔ   rb   r¿   ÚassertFalserÀ   )r   rL   ÚuidÚsnapÚ	q_batchesr‡   Úall_latsÚsorted_latsÚp99_hmacÚ	fake_uuidÚfake_sigÚres_fakeÚres_missingrÑ   rÖ   s   `            @@r   Ú1test_06_concurrent_hmac_query_and_spoof_rejectionzKTestChatAdversarialStress.test_06_concurrent_hmac_query_and_spoof_rejectionÉ   sú  øøøè è € à-/ˆÝ�r‘”ð 	;ð 	;ˆAØ' AÐ'Ð'ˆCØÔ$Ô6×KÒKØÐ-FÀ1Ð-FÐ-FÈqØ 2°#ÀMÝ% f¨o¸vÑFÔFÐHð Lñ ô ˆDð
 ×Ò  TÔ%8Ð9Ñ:Ô:Ð:Ð:ð	ð 	ð 	ð 	ð 	ð 	ð
ð 
ð 
ð 
å˜2‘Y”Yð
ñ 
ô 
ˆ	õ  œÐ(MÐ(MÐ(MÐ(MÀ9Ð(MÑ(MÔ(MÐNÐNÐNÐNÐNÐNÐNˆØ6Ð6 Ð6Ñ6Ô6ˆå˜XÑ&Ô&ˆØ�s¥3 {Ñ#3Ô#3°dÑ#:Ñ;Ô;Ô<ˆØ�Š˜ #Ð'[È8Ð'[Ð'[Ð'[Ð'[Ñ\Ô\Ð\ð 'ˆ	ØˆØÔ$×8Ò8¸ÀHÑMÔMˆØ×Ò˜Ô*Ð,QÑRÔRÐRàÔ'×;Ò;Ð<OÐQYÑZÔZˆØ×Ò˜Ô-Ð/SÑTÔTÐTÐTÐTr   c              ƒ  ó  K  — d}t          |ddt          j        d¬¦  «        }| j                             |¦  «        ƒ d{V —†}|                      |j        ¦  «         t          |ddt          j        d¬¦  «        }| j                             |¦  «        ƒ d{V —†}|                      |j        d¦  «         t          dd	dt          j        d
¬¦  «        }| j                             |¦  «        ƒ d{V —†}|                      |j        ¦  «         |                      |j	        d¦  «         t          dd	dt          j        d¬¦  «        }| j                             |¦  «        ƒ d{V —†}	|                      |	j        d¦  «         dS )zGVerifies duplicate spam rejection and auto-mute containment under load.iY> ÚSpammerr’   u   BÃ¡n vÃ ng SLL uy tÃ­nrA   Nz,Immediate duplicate message must be rejectediZ> ÚRmtBotu2   BÃ¡n vÃ ng sll liÃªn há»‡ zalo 0912345678 ib ngay!é<   u   Xin chÃ o má»�i ngÆ°á»�iz)Muted account must not be allowed to post)
r   r	   rH   r   rI   rt   rJ   rã   rq   Ú
risk_score)
r   rB   Úreq1Úres1Úreq2Úres2Úrmt_reqÚrmt_resÚsub_reqÚsub_ress
             r   Ú.test_07_duplicate_spam_and_anti_rmt_resiliencezHTestChatAdversarialStress.test_07_duplicate_spam_and_anti_rmt_resilienceò   s¾  è è € àˆ	å!Ø¨YÀRÝ#Ô)Ð3Kð
ñ 
ô 
ˆð Ô&×7Ò7¸Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØ�Š˜œÑ%Ô%Ð%å!Ø¨YÀRÝ#Ô)Ð3Kð
ñ 
ô 
ˆð Ô&×7Ò7¸Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØ×Ò˜œÐ'UÑVÔVÐVå$Ø¨8À"Ý#Ô)Ð3gð
ñ 
ô 
ˆð Ô)×:Ò:¸7ÑCÔCÐCÐCÐCÐCÐCÐCˆØ×Ò˜œÑ)Ô)Ð)Ø×Ò Ô 2°BÑ7Ô7Ð7å$Ø¨8À"Ý#Ô)Ð3Mð
ñ 
ô 
ˆð Ô)×:Ò:¸7ÑCÔCÐCÐCÐCÐCÐCÐCˆØ×Ò˜œÐ*UÑVÔVÐVÐVÐVr   N)r   r   )r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r0   rh   rx   r‹   r§   rª   rî   rü   r5   r   r   r   r   #   sç   € € € € € ØQÐQð;ð ;ð ;ð ;ð
9ð 
9ð 
9ð 
9ð`ð `ð `ð `ð@_ð _ð _ð _ð4cð cð cð cð@
ð 
ð 
ð 
ð:
ð 
ð 
ð 
ð:'Uð 'Uð 'Uð 'UðRWð Wð Wð Wð Wð Wr   r   Ú__main__)&r   Ú
__future__r   ÚbuiltinsrÃ   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterÁ   r]   rš   ÚosÚsysrr   r˜   ÚunittestÚtypingr   r   r   r   ÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úserver.chat.chat_servicer   Úserver.chat.chat_typesr	   r
   r   r   ÚIsolatedAsyncioTestCaser   rý   Úmainr5   r   r   ú<module>r     s—  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø €€€Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ7Ñ#SÔ#SÑTÔTÑ UÔ UÐ Uà 0Ð 0Ð 0Ð 0Ð 0Ð 0ðð ð ð ð ð ð ð ð ð ð ð ðnWð nWð nWð nWð nW Ô @ñ nWô nWð nWðb ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   