Ë
    •ÝjÕ  ã                   óÎ   — d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZmZ  G d„ d	ej                   «      Z G d
„ de«      Zedk(  r ej(                  «        yy)ud   VerfÃ¼gbarkeit: Circuit-Breaker, Claude-Ausfall, Codex-Ausfall, Timeout, kein ungeprÃ¼fter Fallback.é    N)ÚPath)ÚHandling)ÚHealthRegistry)Ú
MockRunnerÚ	RunResult)Ú	FakeClockÚGatewayTestCaseÚRecordingSinkc                   ó6   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚCircuitBreakerTestsc                 óò   — t        j                  «       | _        t        | j                  j                  «      dz  | _        t        «       | _        t        | j
                  dd| j                  ¬«      | _	        y )Nzhealth.jsoné   é,  ©Úclock)
ÚtempfileÚTemporaryDirectoryÚ_tmpr   ÚnameÚpathr   r   r   Úregistry©Úselfs    ú2/home/aria/aria-v3-dev/python/tests/test_health.pyÚsetUpzCircuitBreakerTests.setUp   sN   € Ü×/Ñ/Ó1ˆŒ	Ü˜Ÿ™Ÿ™Ó(¨=Ñ8ˆŒ	Ü“[ˆŒ
Ü& t§y¡y°!°SÀÇ
Á
ÔKˆ�ó    c                 ó8   — | j                   j                  «        y )N)r   Úcleanupr   s    r   ÚtearDownzCircuitBreakerTests.tearDown   s   € Ø�	‰	×ÑÕr   c                 ó¦  — t        d«      D ]  }| j                  j                  dd«       Œ  | j                  | j                  j	                  d«      «       | j                  j                  dd«       | j                  | j                  j                  d«      j                  d«       | j                  | j                  j	                  d«      «       y )Né   ÚcodexÚTIMEOUTÚopen)	Úranger   Úrecord_failureÚ
assertTrueÚis_availableÚassertEqualÚstateÚstatusÚassertFalse©r   Ú_s     r   Útest_opens_after_thresholdz.CircuitBreakerTests.test_opens_after_threshold   sš   € Ü�q“ò 	=ˆAØ�M‰M×(Ñ(¨°)Õ<ð	=à�‰˜Ÿ™×2Ñ2°7Ó;Ô<Ø�‰×$Ñ$ W¨iÔ8Ø×Ñ˜Ÿ™×,Ñ,¨WÓ5×<Ñ<¸fÔEØ×Ñ˜Ÿ™×3Ñ3°GÓ<Õ=r   c                 óÈ  — t        d«      D ]  }| j                  j                  dd«       Œ  | j                  j	                  d«       | j                  | j                  j                  d«      j                  d«       | j                  | j                  j                  d«      «       | j                  j                  dd«       | j                  | j                  j                  d«      j                  d«       | j                  j	                  d«       | j                  j                  d«       | j                  | j                  j                  d«      j                  d«       y )Nr   r"   ÚCRASHEDé-  Ú	half_openr$   Úclosed)r%   r   r&   r   Úadvancer)   r*   r+   r'   r(   Úrecord_successr-   s     r   Ú!test_half_open_after_open_secondsz5CircuitBreakerTests.test_half_open_after_open_seconds   sý   € Ü�q“ò 	=ˆAØ�M‰M×(Ñ(¨°)Õ<ð	=à�
‰
×Ñ˜3ÔØ×Ñ˜Ÿ™×,Ñ,¨WÓ5×<Ñ<¸kÔJØ�‰˜Ÿ™×2Ñ2°7Ó;Ô<Ø�‰×$Ñ$ W¨iÔ8Ø×Ñ˜Ÿ™×,Ñ,¨WÓ5×<Ñ<¸fÔEØ�
‰
×Ñ˜3ÔØ�‰×$Ñ$ WÔ-Ø×Ñ˜Ÿ™×,Ñ,¨WÓ5×<Ñ<¸hÕGr   c                 óT  — t        d«      D ]  }| j                  j                  dd«       Œ  | j                  j                  d«       t        d«      D ]  }| j                  j                  dd«       Œ  | j	                  | j                  j                  d«      j                  d«       y )Nr!   r"   r#   r4   )r%   r   r&   r6   r)   r*   r+   r-   s     r   Útest_success_resets_counterz/CircuitBreakerTests.test_success_resets_counter+   s‡   € Ü�q“ò 	=ˆAØ�M‰M×(Ñ(¨°)Õ<ð	=à�‰×$Ñ$ WÔ-Ü�q“ò 	=ˆAØ�M‰M×(Ñ(¨°)Õ<ð	=à×Ñ˜Ÿ™×,Ñ,¨WÓ5×<Ñ<¸hÕGr   c                 óÒ   — dD ]-  }| j                  | j                  j                  d|«      «       Œ/ | j                  | j                  j	                  d«      j
                  d«       y )N)ÚREPLAYÚINVALID_SIGNATUREÚPRIVACY_NOT_PERMITTEDr"   r   )r,   r   r&   r)   r*   Úfailures)r   Úcodes     r   Útest_non_health_codes_ignoredz1CircuitBreakerTests.test_non_health_codes_ignored3   sW   € ØLò 	JˆDØ×Ñ˜TŸ]™]×9Ñ9¸'À4ÓHÕIð	Jà×Ñ˜Ÿ™×,Ñ,¨WÓ5×>Ñ>ÀÕBr   c                 óÞ   — t        d«      D ]  }| j                  j                  dd«       Œ  | j                  t	        | j
                  dd| j                  ¬«      j                  d«      «       y )Nr   ÚclaudeÚDELIVERY_FAILEDr   r   )r%   r   r&   r,   r   r   r   r(   r-   s     r   Útest_state_persistedz(CircuitBreakerTests.test_state_persisted8   sY   € Ü�q“ò 	FˆAØ�M‰M×(Ñ(¨Ð3DÕEð	Fà×Ñœ¨¯	©	°1°cÀÇÁÔL×YÑYÐZbÓcÕdr   N)
Ú__name__Ú
__module__Ú__qualname__r   r   r/   r7   r9   r@   rD   © r   r   r   r      s*   „ òLòò>ò
HòHòCó
er   r   c                   ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚAvailabilityTestsc                 ó  — t        d„ «      }| j                  |¬«      }dD ]…  }|j                  | j                  |d«      «      }| j	                  |j
                  |j                  ft        j                  df«       | j                  d|j                  j                  «       «       Œ‡ | j	                  |j                  «       d   d   d	   d
«       |j                  | j                  dd«      «      }| j	                  |j                  d«       |j                  | j                  dd«      «      }| j	                  |j                  d«       | j                  d|j                  «       | j	                  t        |j                  «      d«       y )Nc                 ó   — t        dd«      S )NFÚSTART_FAILED©r   ©Úspecs    r   ú<lambda>zPAvailabilityTests.test_codex_outage_opens_circuit_and_reroutes.<locals>.<lambda>@   s   € ¬°5¸.Ó)I€ r   ©Úcodex_runner)é   r!   r   ú#public fragerM   ÚkeinÚbackendsr"   Úhealthr$   é   rB   é   z/codex #public frageÚMANUAL_CHOICE_NOT_PERMITTEDu   nicht verfÃ¼gbarr   )r   ÚgatewayÚhandleÚrequestr)   Úhandlingr?   r   ÚFAILEDÚassertInÚ
reply_textÚlowerr+   ÚbackendÚlenÚcalls)r   Úrunnerr\   Ú
message_idÚresultÚreroutedÚmanuals          r   Ú,test_codex_outage_opens_circuit_and_reroutesz>AvailabilityTests.test_codex_outage_opens_circuit_and_reroutes?   s<  € ÜÑIÓJˆØ—,‘,¨F�,Ó3ˆØ#ò 	=ˆJØ—^‘^ D§L¡L°¸_Ó$MÓNˆFØ×Ñ˜fŸo™o¨v¯{©{Ð;¼h¿o¹oÈ~Ð=^Ô_Ø�M‰M˜& &×"3Ñ"3×"9Ñ"9Ó";Õ<ð	=ð 	×Ñ˜Ÿ™Ó)¨*Ñ5°gÑ>¸xÑHÈ&ÔQØ—>‘> $§,¡,¨q°/Ó"BÓCˆØ×Ñ˜×)Ñ)¨8Ô4Ø—‘ §¡¨QÐ0FÓ GÓHˆØ×Ñ˜Ÿ™Ð&CÔDØ�‰Ð(¨&×*;Ñ*;Ô<Ø×Ñœ˜VŸ\™\Ó*¨AÕ.r   c                 ój  — t        d¬«      }| j                  |¬«      }dD ][  }|j                  | j                  |d«      «      }| j	                  |j
                  |j                  ft        j                  df«       Œ] | j	                  |j                  «       d   d   d	   d
«       |j                  | j                  dd«      «      }| j	                  |j
                  |j                  ft        j                  df«       | j	                  |j                  d   j                  j                  g «       y )NT)Úfail©Úforward_sink)é   é   é   ÚhallorC   rW   rB   rX   r$   é	   ÚNO_ELIGIBLE_BACKENDr"   )r
   r\   r]   r^   r)   r_   r?   r   r`   r+   ÚBLOCKEDÚadaptersrg   rf   )r   Úsinkr\   rh   ri   Úblockeds         r   Ú-test_claude_outage_without_unchecked_fallbackz?AvailabilityTests.test_claude_outage_without_unchecked_fallbackN   s   € Ü $Ô'ˆØ—,‘,¨D�,Ó1ˆØ#ò 	cˆJØ—^‘^ D§L¡L°¸WÓ$EÓFˆFØ×Ñ˜fŸo™o¨v¯{©{Ð;¼h¿o¹oÐO`Ð=aÕbð	cð 	×Ñ˜Ÿ™Ó)¨*Ñ5°hÑ?ÀÑIÈ6ÔRØ—.‘. §¡¨a°Ó!9Ó:ˆà×Ñ˜'×*Ñ*¨G¯L©LÐ9¼H×<LÑ<LÐNcÐ;dÔeØ×Ñ˜×)Ñ)¨'Ñ2×9Ñ9×?Ñ?ÀÕDr   c                 óœ  — | j                  d ¬«      }dD ]Œ  }|j                  | j                  |d«      «      }| j                  |j                  t
        j                  «       |j                  d   d   }| j                  |j                  |j                  |d¬«      «       ŒŽ | j                  |j                  «       d   d	   d
   d«       y )Nro   )é
   é   é   rt   Ú	clearanceÚnonceF©Újob_idr�   ÚokrW   rB   rX   r$   )r\   r]   r^   r)   r_   r   ÚFORWARD_TO_CLAUDE_CHANNELÚforwardr'   Úreport_deliveryrƒ   r+   )r   r\   rh   ri   r�   s        r   Ú"test_claude_delivery_report_countsz4AvailabilityTests.test_claude_delivery_report_countsZ   sµ   € Ø—,‘,¨D�,Ó1ˆØ&ò 	bˆJØ—^‘^ D§L¡L°¸WÓ$EÓFˆFØ×Ñ˜VŸ_™_¬h×.PÑ.PÔQØ—N‘N ;Ñ/°Ñ8ˆEØ�O‰O˜G×3Ñ3¸6¿=¹=ÐPUÐZ_Ð3Ó`Õað		bð
 	×Ñ˜Ÿ™Ó)¨*Ñ5°hÑ?ÀÑIÈ6ÕRr   c                 óÀ   — | j                  d ¬«      }| j                  |j                  ddd¬«      «       | j                  |j	                  «       d   d   d   d	«       y )
Nro   ztg-xÚ 00000000000000000000000000000000Fr‚   rW   rB   Úconsecutive_failuresr   )r\   r,   r‡   r)   r+   )r   r\   s     r   Ú(test_delivery_report_requires_real_noncez:AvailabilityTests.test_delivery_report_requires_real_noncec   s[   € Ø—,‘,¨D�,Ó1ˆØ×Ñ˜×0Ñ0¸ÀhÐSXÐ0ÓYÔZØ×Ñ˜Ÿ™Ó)¨*Ñ5°hÑ?Ð@VÑWÐYZÕ[r   c                 ó   — | j                  t        d„ «      ¬«      }|j                  | j                  dd«      «      }| j	                  |j
                  |j                  fd«       | j	                  |j                  «       d   d   d   d	«       y )
Nc                 ó   — t        dd«      S )NFr#   rN   rO   s    r   rQ   zJAvailabilityTests.test_timeout_counts_and_sets_timed_out.<locals>.<lambda>i   s   € ÄIÈeÐU^ÓD_€ r   rR   é   rU   )Ú	timed_outr#   rW   r"   r‹   rT   )r\   r   r]   r^   r)   r+   r?   )r   r\   ri   s      r   Ú&test_timeout_counts_and_sets_timed_outz8AvailabilityTests.test_timeout_counts_and_sets_timed_outh   sw   € Ø—,‘,¬JÑ7_Ó,`�,ÓaˆØ—‘ §¡¨R°Ó AÓBˆØ×Ñ˜&Ÿ-™-¨¯©Ð5Ð7OÔPØ×Ñ˜Ÿ™Ó)¨*Ñ5°gÑ>Ð?UÑVÐXYÕZr   c                 óh  ‡‡— t        t        dd«      gdz  «      ŠddlmŠ t	        ˆˆfd„«      }| j                  |¬«      }dD ]#  }|j                  | j                  |d	«      «       Œ% | j                  |j                  | j                  d
d	«      «      j                  d«       | j                  j                  d«       |j                  | j                  dd	«      «      }| j                  |j                  |j                  fd«       | j                  |j                  «       d   d   d   d«       y )NFr1   r   r   )Úmock_codex_eventsc           
      ó@   •— t        ‰t        dd ‰d«      ¬«      «      S )NTr   Ú	WIEDER_DA)Ú	exit_codeÚstdout)Únextr   )rP   r“   Úoutcomess    €€r   rQ   z9AvailabilityTests.test_circuit_recovers.<locals>.<lambda>q   s%   ø€ ¬¨h¼	À$ÐRSÙJ[Ð\gÓJhô9jó *k€ r   rR   )é   é   é   rU   é   rB   r2   é   )r"   r•   rW   r"   rX   r4   )Úiterr   Úaria_router.runnerr“   r   r\   r]   r^   r)   rd   r   r5   rb   r+   )r   rg   r\   rh   Ú	recoveredr“   r™   s        @@r   Útest_circuit_recoversz'AvailabilityTests.test_circuit_recoversn   s  ù€ Üœ 5¨)Ó4Ð5¸Ñ9Ó:ˆÝ8Üô kó lˆà—,‘,¨F�,Ó3ˆØ&ò 	FˆJØ�N‰N˜4Ÿ<™<¨
°OÓDÕEð	Fà×Ñ˜Ÿ™¨¯©°R¸Ó(IÓJ×RÑRÐT\Ô]Ø�
‰
×Ñ˜3ÔØ—N‘N 4§<¡<°°OÓ#DÓEˆ	Ø×Ñ˜)×+Ñ+¨Y×-AÑ-AÐBÐDZÔ[Ø×Ñ˜Ÿ™Ó)¨*Ñ5°gÑ>¸xÑHÈ(ÕSr   N)	rE   rF   rG   rl   r{   rˆ   rŒ   r‘   r¢   rH   r   r   rJ   rJ   >   s%   „ ò/ò
EòSò\ò
[óTr   rJ   Ú__main__)Ú__doc__r   ÚunittestÚpathlibr   Úaria_router.gatewayr   Úaria_router.healthr   r    r   r   Útests.helpersr   r	   r
   ÚTestCaser   rJ   rE   ÚmainrH   r   r   ú<module>r¬      s^   ðÙ jÛ Û Ý å (Ý -ß 4ç CÑ Cô.e˜(×+Ñ+ô .eôb<T˜ô <Tð~ ˆzÒØ€H‡M�M…Oð r   