
    Sii9                        d Z ddlZddlZddlZddlmZ ddlmZ ddlZej                  j                  d e ee      j                  j                  j                               ddlmZmZmZmZmZmZmZmZ  ed      Z ed      Z	 	 	 	 	 	 dded	ed
edededefdZ G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z  G d d      Z! G d d      Z" G d d      Z#y) u2   utils/circuit_breaker.py 테스트 스위트 (TDD)    N)Path)patch)AutoFixStrategyCircuitBreakerCircuitStateEscalationStrategyFileSnapshotRecoveryActionRollbackManagercreate_circuit_breakerz//home/jay/workspace/memory/logs/circuit-breakerz&/home/jay/workspace/memory/escalationstmp_pathcontext	thresholdcooldown_seconds
persistentreturnc                     |t        |      }|/| dz  dz  }|j                  dd       |j                  d|d       t        |||||	      S )
Nr   logscircuit-breakerTparentsexist_ok"utils.circuit_breaker.CB_STATE_DIRFraising)r   strategyr   r   r   )r   mkdirsetattrr   )r   r   r   r   r   r   monkeypatchfake_logs           Q/home/jay/workspace/.worktrees/task-2117-dev1/utils/tests/test_circuit_breaker.py_make_cbr#   !   sr     "Y7f$'88td30(E 	 	
 )     c                       e Zd Zd Zd Zd Zy)TestInitialStatec                 ~    t        ||      }|j                  t        j                  k(  sJ |j                  dk(  sJ y )N)r    r   )r#   stater   CLOSEDerror_countselfr   r    cbs       r"   test_initial_statez#TestInitialState.test_initial_state@   s8    hK8xx<.....~~"""r$   c                     t        |d|      }|j                  ddi       |j                  dk(  sJ |j                  ddi       |j                  dk(  sJ y )N   r   r    msgerr1   err2   )r#   record_errorr*   r+   s       r"   "test_record_error_increments_countz3TestInitialState.test_record_error_increments_countE   sT    h!E
(~~"""
(~~"""r$   c                     t        |d|      }|j                  ddi       |j                  dk(  sJ |j                          |j                  dk(  sJ y )Nr0   r1   r2   errr4   r   )r#   r7   r*   record_successr+   s       r"    test_record_success_resets_countz1TestInitialState.test_record_success_resets_countL   sP    h!E
'~~"""
~~"""r$   N)__name__
__module____qualname__r.   r8   r<    r$   r"   r&   r&   ?   s    #
##r$   r&   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestStateTransitionsc                     t        |d|      }t        d      D ]  }|j                  ddi        |j                  t        j
                  k(  sJ y N   r1   r2   e)r#   ranger7   r(   r   OPENr,   r   r    r-   _s        r"    test_closed_to_open_at_thresholdz5TestStateTransitions.test_closed_to_open_at_thresholdY   sK    h!Eq 	*AOOUCL)	*xx<,,,,,r$   c                     t        |d|      }t        d      D ]  }|j                  ddi        |j                  t        j
                  k(  sJ |j                  ddi      }|t        j                  k(  sJ y )NrE   r1   r2   rF   extra)r#   rG   r7   r(   r   rH   r
   ESCALATE)r,   r   r    r-   rJ   actions         r"   test_open_always_escalatesz/TestStateTransitions.test_open_always_escalates_   sr    h!Eq 	*AOOUCL)	*xx<,,,,,%!1200000r$   c                     t        |dd|      }t        d      D ]  }|j                  ddi        |j                         }|du sJ |j                  t
        j                  k(  sJ y )NrE   ,  r   r   r    r2   rF   F)r#   rG   r7   	try_resetr(   r   rH   r,   r   r    r-   rJ   results         r"   test_try_reset_before_cooldownz3TestStateTransitions.test_try_reset_before_cooldowng   sd    h!c{[q 	*AOOUCL)	*xx<,,,,,r$   c                     t        |dd|      }t        d      D ]  }|j                  ddi        t        j                  d       |j                         }|du sJ |j                  t        j                  k(  sJ y )NrE   r4   rS   r2   rF   皙?T)	r#   rG   r7   timesleeprT   r(   r   	HALF_OPENrU   s         r"   test_try_reset_after_cooldownz2TestStateTransitions.test_try_reset_after_cooldowno   so    h!a[Yq 	*AOOUCL)	*

3~~xx<11111r$   c                 p   t        |dd|      }t        d      D ]  }|j                  ddi        t        j                  d       |j                          |j                  t        j                  k(  sJ |j                          |j                  t        j                  k(  sJ |j                  dk(  sJ y )NrE   r4   rS   r2   rF   rY   r   )r#   rG   r7   rZ   r[   rT   r(   r   r\   r;   r)   r*   rI   s        r"   #test_half_open_to_closed_on_successz8TestStateTransitions.test_half_open_to_closed_on_successx   s    h!a[Yq 	*AOOUCL)	*

3
xx<11111
xx<.....~~"""r$   c                 T   t        |dd|      }t        d      D ]  }|j                  ddi        t        j                  d       |j                          |j                  t        j                  k(  sJ |j                  ddi       |j                  t        j                  k(  sJ y )NrE   r4   rS   r2   rF   rY   z
fail again)
r#   rG   r7   rZ   r[   rT   r(   r   r\   rH   rI   s        r"   test_half_open_to_open_on_errorz4TestStateTransitions.test_half_open_to_open_on_error   s    h!a[Yq 	*AOOUCL)	*

3
xx<11111
-.xx<,,,,,r$   c                    t        |d|      }t        d      D ]  }|j                  ddi        |j                  t        j
                  k(  sJ |j                          |j                  t        j                  k(  sJ y rD   )r#   rG   r7   r(   r   rH   force_resetr)   rI   s        r"   test_force_resetz%TestStateTransitions.test_force_reset   sm    h!Eq 	*AOOUCL)	*xx<,,,,,
xx<.....r$   N)
r=   r>   r?   rK   rP   rW   r]   r_   ra   rd   r@   r$   r"   rB   rB   X   s%    -1-2	#-/r$   rB   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestStrategiesc                 r    t        d      }|j                  dddid      }|t        j                  k(  sJ y )NrE   r   ctxr2   rF   r4   attempt)r   on_errorr
   RETRYr,   r   rO   s      r"   $test_autofix_retries_below_thresholdz3TestStrategies.test_autofix_retries_below_threshold   s;    "Q/""55#,"B-----r$   c                 r    t        d      }|j                  dddid      }|t        j                  k(  sJ y )NrE   r   rh   r2   rF   ri   )r   rk   r
   rN   rm   s      r"   #test_autofix_escalates_at_thresholdz2TestStrategies.test_autofix_escalates_at_threshold   s;    "Q/""55#,"B00000r$   c                     t               }t        d      D ]-  }|j                  dddi|      }|t        j                  k(  r-J  y )Nr0   rh   r2   rF   ri   )r   rG   rk   r
   rN   )r,   r   rj   rO   s       r"    test_escalation_always_escalatesz/TestStrategies.test_escalation_always_escalates   sL    %'Qx 	5G&&uuclG&LF^44444	5r$   c                     |j                  d|dz  d       t        d      }|j                  dd       t        |dz  j	                  d	            }t        |      d
k\  sJ y )N%utils.circuit_breaker.ESCALATIONS_DIRescalationsFr   rE   r   test-ctxr*   test-ctx_*_escalation.jsonr4   )r   r   on_circuit_openlistgloblenr,   r   r    r   filess        r"   /test_autofix_on_circuit_open_creates_escalationz>TestStrategies.test_autofix_on_circuit_open_creates_escalation   sl    3X5MW\ 	 	
 #Q/   ;h.445QRS5zQr$   c                     |j                  d|dz  d       t               }|j                  dd       t        |dz  j	                  d            }t        |      d	k\  sJ y )
Nrt   ru   Fr   rv   r0   rw   rx   r4   )r   r   ry   rz   r{   r|   r}   s        r"   2test_escalation_on_circuit_open_creates_escalationzATestStrategies.test_escalation_on_circuit_open_creates_escalation   sj    3X5MW\ 	 	
 &'   ;h.445QRS5zQr$   N)r=   r>   r?   rn   rp   rr   r   r   r@   r$   r"   rf   rf      s    .
1
5r$   rf   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestFileSnapshotc                     |dz  }|j                  d       t               }|j                  t        |             t        |      |j                  v sJ y )Ndata.txthello)
write_textr	   capturestrr~   r,   r   targetsnaps       r"   #test_snapshot_capture_existing_filez4TestFileSnapshot.test_snapshot_capture_existing_file   sG    J&'"~S[!6{djj(((r$   c                     t        |dz        }t               }|j                  |       ||j                  v sJ |j                  |   J y )Nznonexistent.txt)r   r	   r   r~   
_snapshots)r,   r   missingr   s       r"   &test_snapshot_capture_nonexistent_filez7TestFileSnapshot.test_snapshot_capture_nonexistent_file   sL    h!223~W$**$$$w'///r$   c                    |dz  }|j                  d       t               }|j                  t        |             |j                  d       |j	                  t        |            }|du sJ |j                         dk(  sJ y )Nr   originalmodifiedT)r   r	   r   r   restore_file	read_text)r,   r   r   r   rV   s        r"   test_snapshot_restore_filez+TestFileSnapshot.test_snapshot_restore_file   sv    J&*%~S[!*%""3v;/~~!Z///r$   c                    |dz  }t               }|j                  t        |             |j                  t        |         J |j	                  d       |j                  t        |             |j                         rJ y )Nznew_file.txtznew content)r	   r   r   r   r   r   existsr   s       r"   &test_snapshot_restore_deletes_new_filez7TestFileSnapshot.test_snapshot_restore_deletes_new_file   sm    N*~S[!s6{+333-(#f+&==?""?r$   c                 .   |dz  }|dz  }|j                  d       |j                  d       t               }|j                  t        |      t        |      g       |j                  }t        |      |v sJ t        |      |v sJ t        |      dk(  sJ y )Nza.txtzb.txtabr6   )r   r	   capture_multipler   r~   r|   )r,   r   f1f2r   r~   s         r"   test_snapshot_files_propertyz-TestFileSnapshot.test_snapshot_files_property   s    
c
c~s2wB01

2w%2w%5zQr$   c                     |dz  }|j                  d       t               }|j                  t        |             |j                  d       |j	                         }t        |      |v sJ y )Nzc.txtr   changed)r   r	   r   r   restore)r,   r   r   r   restoreds        r"   +test_snapshot_restore_returns_restored_listz<TestFileSnapshot.test_snapshot_restore_returns_restored_list   sX    
j!~SW
i <<>2w("""r$   N)	r=   r>   r?   r   r   r   r   r   r   r@   r$   r"   r   r      s     )00#
#r$   r   c                       e Zd Zd Zd Zy)TestRollbackManagerc                 8   |dz  }|j                  d       t        dd      }|j                  t        |      g      }|j                  d       |j	                  |      }|d   du sJ t        |      |d	   v sJ |d
   g k(  sJ |j                         dk(  sJ y )Nz
target.txtv1ztask-1last_operationtask_idscopev2successTr   failed)r   r   create_snapshotr   rollbackr   )r,   r   frmr   rV   s         r"   test_rollback_successz)TestRollbackManager.test_rollback_success   s    |#	TX5EF!!3q6(+	TT"i D(((1v
++++h2%%%{{}$$$r$   c                    |j                  d|dz  d       |dz  }|j                  d       t        dd	      }|j                  t	        |      g      }t        j                  |d
d      5  |j                  |      }d d d        t        |dz  j                  d            }t        |      dk\  sJ d   du sJ y # 1 sw Y   @xY w)Nrt   ru   Fr   z
locked.txtr   z	task-failr   r   r   )return_valuez*_escalation.jsonr4   r   )r   r   r   r   r   r   objectrollback_with_escalationrz   r{   r|   )r,   r   r    r   r   r   rV   	esc_filess           r"   (test_rollback_with_escalation_on_failurez<TestRollbackManager.test_rollback_with_escalation_on_failure  s    3X5MW\ 	 	
 |#	Z [8HI!!3q6(+\\$UC 	7006F	7 (]2889LMN	9~"""i E)))	7 	7s   .B??CN)r=   r>   r?   r   r   r@   r$   r"   r   r      s    
%*r$   r   c                       e Zd Zd Zd Zy)TestPersistencec                 v   |dz  dz  }|j                  dd       |j                  d|d       t        d	      }t        d
|dd      }|j	                  ddi       |j	                  ddi       t        d
t        d	      dd      }|j
                  dk(  sJ |j                  t        j                  k(  sJ y )Nr   r   Tr   r   Fr   r0   r   zpersist-ctxr   r   r   r   r2   e1e2r6   )	r   r   r   r   r7   r*   r(   r   r)   )r,   r   r    r!   r   cb1cb2s          r"   test_persistent_state_save_loadz/TestPersistence.test_persistent_state_save_load!  s    f$'88td30(E 	 	
 #Q/!	
 	%'%'!$q1	
 !###yyL/////r$   c                     |dz  dz  }|j                  dd       |j                  d|d       t        dt        d	
      d	d      }|j	                  ddi       |dz  }|j                         rJ y )Nr   r   Tr   r   Fr   zno-persist-ctxrE   r   r   r2   rF   zno-persist-ctx.json)r   r   r   r   r7   r   )r,   r   r    r!   r-   
state_files         r"   test_non_persistent_no_filez+TestPersistence.test_non_persistent_no_file:  s    f$'88td30(E 	 	
 $$q1	
 	% 55
$$&&&&r$   N)r=   r>   r?   r   r   r@   r$   r"   r   r      s    02'r$   r   c                       e Zd Zd Zd Zy)TestFactoryc                    |dz  dz  }|j                  dd       |j                  d|d       t        dd	d
      }t        |t              sJ t        |j
                  t              sJ |j                  t        j                  k(  sJ y )Nr   r   Tr   r   Fr   zfactory-ctxautofixr0   strategy_typer   )
r   r   r   
isinstancer   r   r   r(   r   r)   r,   r   r    r!   r-   s        r"   #test_create_circuit_breaker_autofixz/TestFactory.test_create_circuit_breaker_autofixP  s    f$'88td30(E 	 	
 $MVWX"n---"++777xx<.....r$   c                     |dz  dz  }|j                  dd       |j                  d|d       t        dd	d
      }t        |t              sJ t        |j
                  t              sJ y )Nr   r   Tr   r   Fr   zfactory-ctx2
escalationrE   r   )r   r   r   r   r   r   r   r   s        r"   &test_create_circuit_breaker_escalationz2TestFactory.test_create_circuit_breaker_escalation[  sr    f$'88td30(E 	 	
 $N,Z[\"n---"++'9:::r$   N)r=   r>   r?   r   r   r@   r$   r"   r   r   O  s    	/;r$   r   c                       e Zd Zd Zd Zy)TestCLIc           	         t        t        t              j                  j                  j                        }i t	        d      j
                  d|i}t        t              j                  j                  dz  }t        j                  t        j                  t        |      dddddgd	d	|
      }|j                  dk(  sJ y )Nos
PYTHONPATHcircuit_breaker.pyzrecord-error	--contextzcli-ctxz	--messagez	cli errorTcapture_outputtextenvr   )r   r   __file__parent
__import__environ
subprocessrunsys
executable
returncode)r,   workspace_rootr   module_pathrV   s        r"   test_cli_record_errorzTestCLI.test_cli_record_errork  s    T(^2299@@AHD!))H<H8n++225IIK Y[  
   A%%%r$   c                    t        t        t              j                  j                  j                        }i t	        d      j
                  d|i}t        t              j                  j                  dz  }t        j                  t        j                  t        |      dddgdd|      }|j                  d	k(  sJ |j                  |j                  z   }d
|j                         v sd|j                         v sJ y y )Nr   r   r   checkr   zcli-check-ctxTr   r   closedr(   )r   r   r   r   r   r   r   r   r   r   r   stdoutstderrlower)r,   r   r   r   rV   outputs         r"   test_cli_check_statezTestCLI.test_cli_check_state}  s    T(^2299@@AHD!))H<H8n++225IIK _	  

   A%%%.6<<>)W-FFF-F)r$   N)r=   r>   r?   r   r   r@   r$   r"   r   r   j  s    &$Gr$   r   )rv   NrE   rR   TN)$__doc__r   r   rZ   pathlibr   unittest.mockr   pytestpathinsertr   r   r   utils.circuit_breakerr   r   r   r   r	   r
   r   r   CB_STATE_DIRESCALATIONS_DIRintboolr#   r&   rB   rf   r   r   r   r   r   r@   r$   r"   <module>r      s   8  
     3tH~,,33::; <	 	 	 EF?@  	
   <# #2;/ ;/D! !P5# 5#x* *D(' ('^; ;6$G $Gr$   