
    ii9                        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 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           7/home/jay/workspace/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(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}|j                  }d	}	||	k(  }|st	        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}}	y )N)r    ==zI%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.CLOSED
}cbr   py0py2py4py6assert %(py8)spy8r   z3%(py2)s
{%(py2)s = %(py0)s.error_count
} == %(py5)sr-   r.   py5assert %(py7)spy7)r#   stater   CLOSED
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationerror_count)selfr   r    r+   @py_assert1@py_assert5@py_assert3@py_format7@py_format9@py_assert4@py_format6@py_format8s               r"   test_initial_statez#TestInitialState.test_initial_state@   s   hK8xx.<...x.....x.......r...r...x......<...<...........~~""~""""~""""""r"""r"""~""""""""""r$   c                    t        |d|      }|j                  ddi       |j                  }d}||k(  }|st        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}}|j                  ddi       |j                  }d}||k(  }|st        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}}y )N   r   r    msgerr1   r(   r3   r+   r4   r6   r7   err2   )r#   record_errorrB   r:   r;   r<   r=   r>   r?   r@   rA   	rC   r   r    r+   rD   rI   rF   rJ   rK   s	            r"   "test_record_error_increments_countz3TestInitialState.test_record_error_increments_countE   s
   h!E
(~~""~""""~""""""r"""r"""~""""""""""
(~~""~""""~""""""r"""r"""~""""""""""r$   c                    t        |d|      }|j                  ddi       |j                  }d}||k(  }|st        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}}|j                          |j                  }d}||k(  }|st        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}}y )NrN   rO   rP   errrR   r(   r3   r+   r4   r6   r7   r   )r#   rU   rB   r:   r;   r<   r=   r>   r?   r@   rA   record_successrV   s	            r"    test_record_success_resets_countz1TestInitialState.test_record_success_resets_countL   s   h!E
'~~""~""""~""""""r"""r"""~""""""""""
~~""~""""~""""""r"""r"""~""""""""""r$   N)__name__
__module____qualname__rL   rW   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(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}}y )N   rO   rP   er(   zG%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.OPEN
}r+   r   r,   r1   r2   )r#   rangerU   r8   r   OPENr:   r;   r<   r=   r>   r?   r@   rA   
rC   r   r    r+   _rD   rE   rF   rG   rH   s
             r"    test_closed_to_open_at_thresholdz5TestStateTransitions.test_closed_to_open_at_thresholdY   s    h!Eq 	*AOOUCL)	*xx,<,,,x,,,,,x,,,,,,,r,,,r,,,x,,,,,,<,,,<,,,,,,,,,,,r$   c                    t        |d|      }t        d      D ]  }|j                  ddi        |j                  }t        j
                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}}|j                  ddi      }
t        j                  }|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |
      rt        j                  |
      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}y )Nrc   rO   rP   rd   r(   re   r+   r   r,   r1   r2   extraz0%(py0)s == %(py4)s
{%(py4)s = %(py2)s.ESCALATE
}actionr
   r-   r.   r/   assert %(py6)sr0   )r#   rf   rU   r8   r   rg   r:   r;   r<   r=   r>   r?   r@   rA   r
   ESCALATE)rC   r   r    r+   ri   rD   rE   rF   rG   rH   rn   @py_format5s               r"   test_open_always_escalatesz/TestStateTransitions.test_open_always_escalates_   s\   h!Eq 	*AOOUCL)	*xx,<,,,x,,,,,x,,,,,,,r,,,r,,,x,,,,,,<,,,<,,,,,,,,,,,%!12'000v00000v0000000v000v00000000000000000000r$   c                    t        |dd|      }t        d      D ]  }|j                  ddi        |j                         }d}||u }|st	        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                  }t        j                  }
||
k(  }|st	        j
                  d|fd||
f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |
      dz  }dd|iz  }t        t	        j                  |            d x}x}}
y )Nrc   ,  r   r   r    rP   rd   Fisz%(py0)s is %(py3)sresultr-   py3assert %(py5)sr5   r(   re   r+   r   r,   r1   r2   )r#   rf   rU   	try_resetr:   r;   r<   r=   r>   r?   r@   rA   r8   r   rg   rC   r   r    r+   ri   rz   @py_assert2rD   @py_format4rJ   rE   rF   rG   rH   s                 r"   test_try_reset_before_cooldownz3TestStateTransitions.test_try_reset_before_cooldowng   s-   h!c{[q 	*AOOUCL)	*vvvvxx,<,,,x,,,,,x,,,,,,,r,,,r,,,x,,,,,,<,,,<,,,,,,,,,,,r$   c                 :   t        |dd|      }t        d      D ]  }|j                  ddi        t        j                  d       |j                         }d}||u }|st        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                  }t        j                   }
||
k(  }|st        j                  d|fd||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
y )Nrc   rR   rv   rP   rd   皙?Trw   ry   rz   r{   r}   r5   r(   zL%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.HALF_OPEN
}r+   r   r,   r1   r2   )r#   rf   rU   timesleepr~   r:   r;   r<   r=   r>   r?   r@   rA   r8   r   	HALF_OPENr   s                 r"   test_try_reset_after_cooldownz2TestStateTransitions.test_try_reset_after_cooldowno   s8   h!a[Yq 	*AOOUCL)	*

3v~vvvxx1<111x11111x1111111r111r111x111111<111<11111111111r$   c                    t        |dd|      }t        d      D ]  }|j                  ddi        t        j                  d       |j                          |j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }	t        t        j                   |	            d x}x}}|j#                          |j                  }t        j$                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }	t        t        j                   |	            d x}x}}|j&                  }d}
||
k(  }|st        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}}
y )Nrc   rR   rv   rP   rd   r   r(   r   r+   r   r,   r1   r2   r*   r   r3   r4   r6   r7   )r#   rf   rU   r   r   r~   r8   r   r   r:   r;   r<   r=   r>   r?   r@   rA   rZ   r9   rB   )rC   r   r    r+   ri   rD   rE   rF   rG   rH   rI   rJ   rK   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1x11111x1111111r111r111x111111<111<11111111111
xx.<...x.....x.......r...r...x......<...<...........~~""~""""~""""""r"""r"""~""""""""""r$   c                 T   t        |dd|      }t        d      D ]  }|j                  ddi        t        j                  d       |j                          |j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }	t        t        j                   |	            d x}x}}|j                  ddi       |j                  }t        j"                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }	t        t        j                   |	            d x}x}}y )Nrc   rR   rv   rP   rd   r   r(   r   r+   r   r,   r1   r2   z
fail againre   )r#   rf   rU   r   r   r~   r8   r   r   r:   r;   r<   r=   r>   r?   r@   rA   rg   rh   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1x11111x1111111r111r111x111111<111<11111111111
-.xx,<,,,x,,,,,x,,,,,,,r,,,r,,,x,,,,,,<,,,<,,,,,,,,,,,r$   c                    t        |d|      }t        d      D ]  }|j                  ddi        |j                  }t        j
                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}}|j                          |j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}}y )Nrc   rO   rP   rd   r(   re   r+   r   r,   r1   r2   r*   )r#   rf   rU   r8   r   rg   r:   r;   r<   r=   r>   r?   r@   rA   force_resetr9   rh   s
             r"   test_force_resetz%TestStateTransitions.test_force_reset   sg   h!Eq 	*AOOUCL)	*xx,<,,,x,,,,,x,,,,,,,r,,,r,,,x,,,,,,<,,,<,,,,,,,,,,,
xx.<...x.....x.......r...r...x......<...<...........r$   N)
r\   r]   r^   rj   rs   r   r   r   r   r   r_   r$   r"   ra   ra   X   s%    -1-2	#-/r$   ra   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestStrategiesc                 B   t        d      }|j                  dddid      }t        j                  }||k(  }|st	        j
                  d|fd	||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}}y )Nrc   r   ctxrP   rd   rR   attemptr(   )z-%(py0)s == %(py4)s
{%(py4)s = %(py2)s.RETRY
}rn   r
   ro   rp   r0   )r   on_errorr
   RETRYr:   r;   r<   r=   r>   r?   r@   rA   rC   r   rn   rF   rD   rr   rG   s          r"   $test_autofix_retries_below_thresholdz3TestStrategies.test_autofix_retries_below_threshold   s    "Q/""55#,"B'---v-----v-------v---v--------------------r$   c                 B   t        d      }|j                  dddid      }t        j                  }||k(  }|st	        j
                  d|fd||f      d	t        j                         v st	        j                  |      rt	        j                  |      nd	d
t        j                         v st	        j                  t              rt	        j                  t              nd
t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}}y )Nrc   r   r   rP   rd   r   r(   rm   rn   r
   ro   rp   r0   )r   r   r
   rq   r:   r;   r<   r=   r>   r?   r@   rA   r   s          r"   #test_autofix_escalates_at_thresholdz2TestStrategies.test_autofix_escalates_at_threshold   s    "Q/""55#,"B'000v00000v0000000v000v00000000000000000000r$   c                 b   t               }t        d      D ]  }|j                  dddi|      }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndd	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}} y )NrN   r   rP   rd   r   r(   rm   rn   r
   ro   rp   r0   )r   rf   r   r
   rq   r:   r;   r<   r=   r>   r?   r@   rA   )rC   r   r   rn   rF   rD   rr   rG   s           r"    test_escalation_always_escalatesz/TestStrategies.test_escalation_always_escalates   s    %'Qx 	5G&&uuclG&LF+4446444446444444464446444444^444^444444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\  }|st        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}}y )N%utils.circuit_breaker.ESCALATIONS_DIRescalationsFr   rc   r   test-ctxrB   test-ctx_*_escalation.jsonrR   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenfilesr-   py1r|   r0   r1   r2   )r   r   on_circuit_openlistglobr   r:   r;   r<   r=   r>   r?   r@   rA   
rC   r   r    r   r   r   rE   rI   rG   rH   s
             r"   /test_autofix_on_circuit_open_creates_escalationz>TestStrategies.test_autofix_on_circuit_open_creates_escalation   s    3X5MW\ 	 	
 #Q/   ;h.445QRS5zQzQzQss55zQr$   c                    |j                  d|dz  d       t               }|j                  dd       t        |dz  j	                  d            }t        |      }d	}||k\  }|st        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}}y )Nr   r   Fr   r   rN   r   r   rR   r   r   r   r   r   r1   r2   )r   r   r   r   r   r   r:   r;   r<   r=   r>   r?   r@   rA   r   s
             r"   2test_escalation_on_circuit_open_creates_escalationzATestStrategies.test_escalation_on_circuit_open_creates_escalation   s    3X5MW\ 	 	
 &'   ;h.445QRS5zQzQzQss55zQr$   N)r\   r]   r^   r   r   r   r   r   r_   r$   r"   r   r      s    .
1
5r$   r   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 }|s7t        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                  |      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}x}}y )Ndata.txthelloin)zK%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} in %(py7)s
{%(py7)s = %(py5)s.files
}strtargetsnap)r-   r   r|   r5   r7   assert %(py9)spy9)
write_textr	   capturer   r   r:   r;   r<   r=   r>   r?   r@   rA   )	rC   r   r   r   r   @py_assert6rI   rK   @py_format10s	            r"   #test_snapshot_capture_existing_filez4TestFileSnapshot.test_snapshot_capture_existing_file   s    J&'"~S[!6{(djj({j(((({j((((((s(((s((((((6(((6((({((((((d(((d(((j(((((((r$   c                 H   t        |dz        }t               }|j                  |       |j                  }||v }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nd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 }||u }	|	slt	        j
                  d	|	fd
||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}	}y )Nznonexistent.txtr   )z-%(py0)s in %(py4)s
{%(py4)s = %(py2)s.files
}missingr   ro   rp   r0   rw   z%(py1)s is %(py4)sr   r/   )r   r	   r   r   r:   r;   r<   r=   r>   r?   r@   rA   
_snapshots)
rC   r   r   r   rF   rD   rr   rG   @py_assert0r   s
             r"   &test_snapshot_capture_nonexistent_filez7TestFileSnapshot.test_snapshot_capture_nonexistent_file   s    h!223~W**$w*$$$$w*$$$$$$w$$$w$$$$$$$$$$$$$$*$$$$$$$w'/4/'4////'4///'///4///////r$   c                    |dz  }|j                  d       t               }|j                  t        |             |j                  d       |j	                  t        |            }d}||u }|st        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(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}	x}}
y )Nr   originalmodifiedTrw   ry   rz   r{   r}   r5   r(   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}()
} == %(py7)sr   r-   r.   r/   r7   r   r   )r   r	   r   r   restore_filer:   r;   r<   r=   r>   r?   r@   rA   	read_text)rC   r   r   r   rz   r   rD   r   rJ   rF   r   rE   rK   r   s                 r"   test_snapshot_restore_filez+TestFileSnapshot.test_snapshot_restore_file   s2   J&*%~S[!*%""3v;/v~vvv/!/Z/!Z////!Z//////v///v//////!///Z///////r$   c                 &   |dz  }t               }|j                  t        |             |j                  t        |         }d }||u }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}|j                  d       |j                  t        |             |j                  }	 |	       }| }
|
sdd	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |	      t	        j                  |      d
z  }t        t	        j                  |            d x}	x}}
y )Nznew_file.txtrw   r   r   rp   r0   znew contentEassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   ro   )r	   r   r   r   r:   r;   r?   r@   rA   r   r   existsr<   r=   r>   )rC   r   r   r   r   rF   r   rr   rG   rD   rE   rJ   s               r"   &test_snapshot_restore_deletes_new_filez7TestFileSnapshot.test_snapshot_restore_deletes_new_file   s    N*~S[!s6{+3t3+t3333+t333+333t3333333-(#f+&=="=?"?""""""""6"""6"""="""?""""""r$   c                    |dz  }|dz  }|j                  d       |j                  d       t               }|j                  t        |      t        |      g       |j                  }t        |      }||v }|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                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }	t        t        j                  |	            d x}}t        |      }||v }|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                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }	t        t        j                  |	            d x}}t        |      }d}
||
k(  }|st        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}}
y )Nza.txtzb.txtabr   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} in %(py5)sr   f1r   r-   r   r|   r5   r6   r7   f2rT   r(   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r   r1   r2   )r   r	   capture_multipler   r   r:   r;   r<   r=   r>   r?   r@   rA   r   )rC   r   r   r   r   r   r   rI   rJ   rK   rE   rG   rH   s                r"   test_snapshot_files_propertyz-TestFileSnapshot.test_snapshot_files_property   s   
c
c~s2wB01

2ww%w%ss22w%%2ww%w%ss22w%%5zQzQzQss55zQr$   c                 ,   |dz  }|j                  d       t               }|j                  t        |             |j                  d       |j	                         }t        |      }||v }|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                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }t        t        j                  |            d x}}y )Nzc.txtr   changedr   r   r   r   restoredr   r6   r7   )r   r	   r   r   restorer:   r;   r<   r=   r>   r?   r@   rA   )	rC   r   r   r   r   r   rI   rJ   rK   s	            r"   +test_snapshot_restore_returns_restored_listz<TestFileSnapshot.test_snapshot_restore_returns_restored_list   s    
j!~SW
i <<>2w"w(""""w(""""""s"""s""""""2"""2"""w""""""("""("""""""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                    |dz  }|j                  d       t        dd      }|j                  t        |      g      }|j                  d       |j	                  |      }|d   }d}||u }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}t        |      }|d   }||v }|st        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   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|j                  } |       }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )Nz
target.txtv1ztask-1last_operationtask_idscopev2successTrw   r   r   rp   r0   r   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} in %(py6)sr   fr   r1   r2   failedr(   )z%(py1)s == %(py4)sr   r   r   r   )r   r   create_snapshotr   rollbackr:   r;   r?   r@   rA   r<   r=   r>   r   )rC   r   r   rmr   rz   r   rF   r   rr   rG   rE   rI   rH   rD   r   rK   r   s                     r"   test_rollback_successz)TestRollbackManager.test_rollback_success   s   |#	TX5EF!!3q6(+	TT"i (D( D(((( D((( (((D(((((((1v+
++v+++++v+++++++s+++s++++++1+++1+++v+++++++++++h%2%2%%%%2%%%%%%2%%%%%%%{{${}$$}$$$$}$$$$$$q$$$q$$${$$$}$$$$$$$$$$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\  }
|
st        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}||u }|slt        j                  d|fd||f      t        j                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}}y # 1 sw Y   xY w)Nr   r   Fr   z
locked.txtr   z	task-failr   r   r   )return_valuez*_escalation.jsonrR   r   r   r   	esc_filesr   r1   r2   r   rw   r   r   rp   r0   )r   r   r   r   r   r   objectrollback_with_escalationr   r   r   r:   r;   r<   r=   r>   r?   r@   rA   )rC   r   r    r   r   r   rz   r   r   rE   rI   rG   rH   r   rF   rr   s                   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~""~""""~""""""s"""s""""""9"""9"""~""""""""""i )E) E)))) E))) )))E)))))))	7 	7s   .H55H?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                    |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(  }	|	st        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}	}|j                  }t        j                   }||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}	}y )Nr   r   Tr   r   Fr   rN   r   zpersist-ctxr   r   r   r   rP   e1e2rT   r(   r3   cb2r4   r6   r7   r*   r   r,   r1   r2   )r   r   r   r   rU   rB   r:   r;   r<   r=   r>   r?   r@   rA   r8   r   r9   )rC   r   r    r!   r   cb1r  rD   rI   rF   rJ   rK   rE   rG   rH   s                  r"   test_persistent_state_save_loadz/TestPersistence.test_persistent_state_save_load!  s   f$'88td30(E 	 	
 #Q/!	
 	%'%'!$q1	
 #!#!####!######s###s######!#######yy/L///y/////y///////s///s///y//////L///L///////////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
                  } |       }| }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	t        t        j                  |	            d x}x}}y )Nr   r   Tr   r   Fr   zno-persist-ctxrc   r   r   rP   rd   zno-persist-ctx.jsonr   
state_filero   )r   r   r   r   rU   r   r<   r=   r:   r>   r?   r@   rA   )
rC   r   r    r!   r+   r  rD   rF   rE   rJ   s
             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d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t        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d }|j                  }t        |t              }|sd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                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }	t        t        j                  |	            d x}}|j                  }
t        j                   }|
|k(  }|st        j"                  d|fd|
|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }	dd|	iz  }t        t        j                  |            d x}
x}}y )Nr   r   Tr   r   Fr   zfactory-ctxautofixrN   strategy_typer   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer+   r   r-   r   r.   r/   Sassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.strategy
}, %(py4)s)
}r   r-   r   r|   r/   r0   r(   r*   r   r,   r1   r2   )r   r   r   r  r   r<   r=   r:   r>   r?   r@   rA   r   r   r8   r   r9   r;   )rC   r   r    r!   r+   rF   rr   r   rE   rG   rD   rH   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--------z---z------"---"------n---n----------++7z+77777777z777z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7xx.<...x.....x.......r...r...x......<...<...........r$   c                 B   |dz  dz  }|j                  dd       |j                  d|d       t        dd	d
      }t        |t              }|sd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t        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d }|j                  }t        |t              }|sd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                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }	t        t        j                  |	            d x}}y )Nr   r   Tr   r   Fr   zfactory-ctx2
escalationrc   r  r  r  r+   r   r  r  r   r  )r   r   r   r  r   r<   r=   r:   r>   r?   r@   rA   r   r   )
rC   r   r    r!   r+   rF   rr   r   rE   rG   s
             r"   &test_create_circuit_breaker_escalationz2TestFactory.test_create_circuit_breaker_escalation[  st   f$'88td30(E 	 	
 $N,Z[\"n--------z---z------"---"------n---n----------++:z+'9::::::::z:::z::::::":::":::+::::::'9:::'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(  }|st        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}}y )Nos
PYTHONPATHcircuit_breaker.pyzrecord-error	--contextzcli-ctxz	--messagez	cli errorTcapture_outputtextenvr   r(   z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)srz   r4   r6   r7   )r   r   __file__parent
__import__environ
subprocessrunsys
executable
returncoder:   r;   r<   r=   r>   r?   r@   rA   )
rC   workspace_rootr   module_pathrz   rD   rI   rF   rJ   rK   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% A%%%% A%%%%%%v%%%v%%% %%%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(  }|st        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}}|j&                  |j(                  z   }
g }d}|
j*                  } |       }||v }|}|sd}|
j*                  } |       }||v }|}|st        j                  d|fd||f      t        j                   |      dt        j                         v st        j                  |
      rt        j                   |
      ndt        j                   |      t        j                   |      dz  }dd|iz  }|j-                  |       |st        j                  dfdf      t        j                   |      dt        j                         v st        j                  |
      rt        j                   |
      ndt        j                         t        j                   |      dz  }dd|iz  }|j-                  |       t        j.                  |d      i z  }dd|iz  }t#        t        j$                  |            d x}x}x}x}x}x}x}x}x}}y )Nr  r  r  checkr  zcli-check-ctxTr  r   r(   r!  rz   r4   r6   r7   closedr8   r   )zD%(py3)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.lower
}()
}output)r|   r5   r7   r   z%(py11)spy11)zJ%(py14)s in %(py20)s
{%(py20)s = %(py18)s
{%(py18)s = %(py16)s.lower
}()
})py14py16py18py20z%(py22)spy22rR   zassert %(py25)spy25)r   r   r"  r#  r$  r%  r&  r'  r(  r)  r*  r:   r;   r<   r=   r>   r?   r@   rA   stdoutstderrlowerappend_format_boolop)rC   r+  r   r,  rz   rD   rI   rF   rJ   rK   r1  r   r   @py_assert8r   @py_assert13@py_assert17@py_assert19@py_assert15r   @py_format12@py_format21@py_format23@py_format24@py_format26s                            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% A%%%% A%%%%%%v%%%v%%% %%%A%%%%%%%.FxF6<<F<>Fx>)FWFFFW-FFFFFx>FFFxFFFFFF6FFF6FFF<FFF>FFFFFFFWFFFWFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFr$   N)r\   r]   r^   r-  rH  r_   r$   r"   r  r  j  s    &$Gr$   r  )r   Nrc   ru   TN)*__doc__builtinsr<   _pytest.assertion.rewrite	assertionrewriter:   r&  r(  r   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&   ra   r   r   r   r   r  r  r_   r$   r"   <module>rX     s   8     
     3tH~,,33::; <	 	 	 EF?@  	
   <# #2;/ ;/D! !P5# 5#x* *D(' ('^; ;6$G $Gr$   