
    j                        d Z ddlmZ ddlZddlmc mZ ddl	m	Z	m
Z
mZ ddlmZmZmZmZmZmZmZmZmZ  e e
d            ZddZd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(y)u   tests.regression.test_gate_snapshot_validator — task-2637.

11종 gate 측정 + STALE_SNAPSHOT TTL 단언.

Spec: memory/specs/system_real_merge_executor_wiring_spec_260523.md §4
    )annotationsN)datetime	timedeltatimezone)		GATE_FAILGATE_INVALID_SCHEMAGATE_OKGATE_SNAPSHOT_SCHEMAGATE_SNAPSHOT_TTL_SECONDS
GATE_STALEREQUIRED_GATE_NAMESis_snapshot_freshvalidate_gate_snapshot	   )hoursc                8    t        | ||||t              fdS )N)tzinfoc                      S )N )dts   D/home/jay/workspace/tests/regression/test_gate_snapshot_validator.py<lambda>z_clock.<locals>.<lambda>   s    2     )r   KST)yearmonthdayhourminuter   s        @r   _clockr       s    	$sD&	=Br   c                      y)N2026-05-23T11:59:00+09:00r   r   r   r   _gate_tsr#       s    &r   c                 F   ddddt               ddddt               dd	ddt               dd
dddt               dddddt               dddi dt               dddddt               ddddt               dddg dt               ddd d!t               dd"d#d$t               d%gS )&N	ci_checkssuccessz11/11gh)name
conclusioncountsourcetsgemini_review_gatePASS)r(   r)   r+   r,   phase3_merge_gateunresolved_threadsr      )r(   valuetotalr+   r,   mergeStateStatusCLEAN	MERGEABLE)r(   r2   	mergeabler+   r,   critical7_hits
classifier)r(   r2   	breakdownr+   r,   blocking_secretscan)r(   r2   net_new_identifier_exposurer+   r,   expected_files_exactTscope)r(   r2   r+   r,   forbidden_pathguard)r(   r2   checked_filesr+   r,   admin_override_requiredFz	non-admincallback_lifecycle_artifactnormal	DELIVERED)r(   r2   delivery_outcomer,   )r#   r   r   r   	_ok_gatesrH   $   s    ISW_g_ij%VtS[S]^$FdRZR\]%AU]U_`#gK[_gogqr!AB,^f^hi"Qq\bjrjtu'$'QYQ[\!Ag]e]gh*UkYaYcd.Wbjrjtu r   c                 h    t         t               t        t               dd}|j	                  |        |S )NT)schemats_kstsnapshot_ttl_secondsgatesall_pass)r
   r#   r   rH   update)	overridessnaps     r   	_snapshotrR   4   s/    &* 9D 	KK	Kr   c                    t        t               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}}|t        k(  }|st        j                  d	|fd
|t        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dz  }dd|iz  }t        t        j                  |            d }g }||k(  }|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}}y )NclockTisz%(py0)s is %(py3)sokpy0py3assert %(py5)spy5==z%(py0)s == %(py2)scoder	   r[   py2assert %(py4)spy4z%(py0)s == %(py3)sreasons)r   rR   r    
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr	   )	rY   rb   rh   @py_assert2@py_assert1@py_format4@py_format6@py_format3@py_format5s	            r   test_happy_path_returns_GATE_OKrw   @   s0   .y{&(KBg2:2227?4744777b=7b77br   c                 \   t               } d| d<   t        | 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}}|t        k(  }|st        j                  d|fd|t        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dz  }dd|iz  }	t        t        j                  |	            d }y )Nzwrong.schema.v1rJ   rT   FrV   rX   rY   rZ   r]   r^   r_   ra   rb   r   rc   re   rf   )rR   r   r    ri   rj   rk   rl   rm   rn   ro   rp   r   
rQ   rY   rb   _rq   rr   rs   rt   ru   rv   s
             r   -test_wrong_schema_returns_GATE_INVALID_SCHEMAr{   G   s    ;D&DN(VX>KBa2;222&&&&&4&&&&&&&4&&&4&&&&&&&&&&&&&&&&&&r   c                    t               } | d   D cg c]  }|d   dk7  s| c}| d<   t        | 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}}|t        k(  }|st        j                  d|fd|t        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dz  }	dd|	iz  }
t        t        j                  |
            d }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }
t        t        j                  |
            d x}}y c c}w )NrM   r(   r;   rT   FrV   rX   rY   rZ   r]   r^   r_   ra   rb   r   rc   re   rf   c              3  $   K   | ]  }d |v  
 ywr;   Nr   .0rs     r   	<genexpr>zItest_missing_required_gate_returns_GATE_INVALID_SCHEMA.<locals>.<genexpr>U        7! A%7   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr[   rd   rf   )rR   r   r    ri   rj   rk   rl   rm   rn   ro   rp   r   r   rQ   grY   rb   rh   rq   rr   rs   rt   ru   rv   @py_assert3s               r   6test_missing_required_gate_returns_GATE_INVALID_SCHEMAr   O   sk   ;D $WP16>O1OQPDM.t68DBg2;222&&&&&4&&&&&&&4&&&4&&&&&&&&&&&&&&&&&&7w7737777777773777377777777777777	 Qs
   I7I7c                    t               } | d   j                  ddd       t        | 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}}|t        k(  }|st	        j
                  d|fd|t        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dz  }dd|iz  }	t        t	        j                  |	            d }y )NrM   bogus_extra_gateT)r(   r2   rT   FrV   rX   rY   rZ   r]   r^   r_   ra   rb   r   rc   re   rf   )rR   appendr   r    ri   rj   rk   rl   rm   rn   ro   rp   r   ry   s
             r   6test_extra_unexpected_gate_returns_GATE_INVALID_SCHEMAr   X   s    ;DM"4tDE(VX>KBa2;222&&&&&4&&&&&&&4&&&4&&&&&&&&&&&&&&&&&&r   c                    t        d      } t        | 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}}|t        k(  }|st        j                  d|fd|t        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dz  }dd|iz  }	t        t        j                  |	            d }d |D        }t        |      }
|
sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |
      dz  }	t        t        j                  |	            d x}}
y )N2026-05-23T11:30:00+09:00rK   rT   FrV   rX   rY   rZ   r]   r^   r_   ra   rb   r   rc   re   rf   c              3  @   K   | ]  }d |j                         v   yw)ttlN)lowerr   s     r   r   zCtest_ttl_5_min_stale_snapshot_returns_GATE_STALE.<locals>.<genexpr>e   s     3au	!3s   r   r   r   )rR   r   r    ri   rj   rk   rl   rm   rn   ro   rp   r   r   )rQ   rY   rb   rh   rq   rr   rs   rt   ru   rv   r   s              r   0test_ttl_5_min_stale_snapshot_returns_GATE_STALEr   `   sA   78D.t68DBg2;222:4:44::373333333333333333333333333333333r   c                 V   t        d      } t        | 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}}|t        k(  }|st        j                  d|fd|t        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dz  }dd|iz  }	t        t        j                  |	            d }y )Nz2026-05-23T11:55:00+09:00r   rT   TrV   rX   rY   rZ   r]   r^   r_   ra   rb   r	   rc   re   rf   )rR   r   r    ri   rj   rk   rl   rm   rn   ro   rp   r	   ry   s
             r   $test_ttl_5_min_exact_boundary_passesr   h   s    78D(VX>KBa2:2227?474477r   c                    t               } | d   D ]  }|d   dk(  sd|d<    d| d<   t        | 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}}|t        k(  }|st        j                  d|fd|t        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dz  }	dd|	iz  }
t        t        j                  |
            d }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }
t        t        j                  |
            d x}}y )NrM   r(   rC   Tr2   FrN   rT   rV   rX   rY   rZ   r]   r^   r_   ra   rb   r   rc   re   rf   c              3  $   K   | ]  }d |v  
 yw)rC   Nr   r   s     r   r   zAtest_admin_override_required_returns_GATE_FAIL.<locals>.<genexpr>y   s     ?!(A-?r   r   r   r   rR   r   r    ri   rj   rk   rl   rm   rn   ro   rp   r   r   r   s               r   .test_admin_override_required_returns_GATE_FAILr   p   sr   ;D'] V911AgJ D.t68DBg2;2229494499?w??3?????????3???3??????????????r   c                    t               } | d   D ]  }|d   dk(  sd|d<   d|d<    d| d<   t        | 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}}|t        k(  }|st        j                  d|fd|t        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dz  }	dd|	iz  }
t        t        j                  |
            d }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }
t        t        j                  |
            d x}}y )NrM   r(   r;   r1   r2   r=   FrN   rT   rV   rX   rY   rZ   r]   r^   r_   ra   rb   r   rc   re   rf   c              3  $   K   | ]  }d |v  
 ywr~   r   r   s     r   r   zGtest_blocking_secret_value_nonzero_returns_GATE_FAIL.<locals>.<genexpr>   r   r   r   r   r   r   r   s               r   4test_blocking_secret_value_nonzero_returns_GATE_FAILr   |   s}   ;D'] 1V9))AgJ/0A+,1 D.t68DBg2;22294944997w7737777777773777377777777777777r   c                    t               } | d   D ]  }|d   dk(  sd|d<    t        | 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}}|t        k(  }|st        j                  d|fd|t        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dz  }	dd|	iz  }
t        t        j                  |
            d }y )NrM   r(   r0      r2   rT   FrV   rX   rY   rZ   r]   r^   r_   ra   rb   r   rc   re   rf   rR   r   r    ri   rj   rk   rl   rm   rn   ro   rp   r   rQ   r   rY   rb   rz   rq   rr   rs   rt   ru   rv   s              r   1test_unresolved_threads_nonzero_returns_GATE_FAILr      s   ;D'] V9,,AgJ )VX>KBa2;2229494499r   c                    t               } | d   D ]  }|d   dk(  sd|d<    t        | 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}}|t        k(  }|st        j                  d|fd|t        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dz  }	dd|	iz  }
t        t        j                  |
            d }y )NrM   r(   r4   DIRTYr2   rT   FrV   rX   rY   rZ   r]   r^   r_   ra   rb   r   rc   re   rf   r   r   s              r   (test_merge_state_dirty_returns_GATE_FAILr      s   ;D'] !V9** AgJ! )VX>KBa2;2229494499r   c                    t               } | d   D ]  }|d   dk(  sd|d<    t        | 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}}|t        k(  }|st        j                  d|fd|t        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dz  }	dd|	iz  }
t        t        j                  |
            d }y )NrM   r(   rD   incidentr2   rT   FrV   rX   rY   rZ   r]   r^   r_   ra   rb   r   rc   re   rf   r   r   s              r   2test_callback_lifecycle_incident_returns_GATE_FAILr      s   ;D'] $V955#AgJ$ )VX>KBa2;2229494499r   c            	         t        d      } t        d      }t               }t        | |      }d}||u }|sSt        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	d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}t               }t        ||      }d}||u }|sSt        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d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )Nr"   r   r   rT   TrV   )zV%(py6)s
{%(py6)s = %(py0)s(%(py1)s, clock=%(py4)s
{%(py4)s = %(py2)s()
})
} is %(py9)sr   freshr    )r[   py1rd   rf   py6py9zassert %(py11)spy11Fstale)rR   r    r   ri   rj   rk   rl   rm   rn   ro   rp   )r   r   r   @py_assert5@py_assert8@py_assert7@py_format10@py_format12s           r    test_is_snapshot_fresh_predicater      s   89E89E*0(;U(3;t;3t;;;;3t;;;;;;;;;;;;;;;U;;;U;;;;;;&;;;&;;;(;;;3;;;t;;;;;;;*0(<U(3<u<3u<<<<3u<<<<<<<<<<<<<<<U<<<U<<<<<<&<<<&<<<(<<<3<<<u<<<<<<<r   c                 L   t        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                  t              rt        j                  t              ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}}t        d	   }d
}||k(  } | slt        j                  d| fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x} }t        d   }d}||k(  } | slt        j                  d| fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x} }y )N   r_   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr   )r[   r   r\   r   zassert %(py8)spy8r   r%   )z%(py1)s == %(py4)s)r   rf   zassert %(py6)sr   rD   )
r   r   ri   rj   rk   rl   rm   rn   ro   rp   )rq   r   @py_assert4@py_format7@py_format9@py_assert0r   rv   s           r   test_eleven_gate_names_completer      s=   "#)r)#r))))#r))))))3)))3))))))")))")))#)))r)))))))q!0[0![0000![000!000[0000000r"C&CC"&CCCCC"&CCCC"CCC&CCCCCCCCr   c                 p   d} t         | k(  }|st        j                  d|fdt         | f      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 )Ni,  r_   rg   r   rZ   r]   r^   )	r   ri   rj   rk   rl   rm   rn   ro   rp   )rq   rr   rs   rt   s       r   $test_chair_5_min_ttl_constant_is_300r      s_    (++$++++$++++++$+++$++++++++++r   )i           r   ))__doc__
__future__r   builtinsrk   _pytest.assertion.rewrite	assertionrewriteri   r   r   r   utils.gate_snapshot_validatorr   r   r	   r
   r   r   r   r   r   r   r    r#   rH   rR   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s    #    2 2
 
 
 yq!"
' 	'8'4	@
8=D,r   