
     jo                        d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
ZddlZddlZddlmZ  ee      j#                         j$                  d   ZddZ edd      Z ed	d
      ZdddZd Zd Zd Zd Zy)u_  tests/state_machine/test_state_repair.py — Group 2 (4건).

task-2472 regression: 수동 state 수정 차단 + checksum mismatch 검증.

5. test_state_json_direct_modification_checksum_mismatch
6. test_failed_to_human_approved_manual_transition_rejected
7. test_checksum_mismatch_blocks_done_or_merge
8. test_state_repair_without_evidence_rejected
    )annotationsN)Path   c                p   t         |z  }t        j                  j                  | t	        |            }g }d }||u}|}|r|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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }t        j                  d|       dz   d|iz  }t        t        j                   |            d x}x}x}x}x}x}
}	t        j                  j#                  |      }|t$        j&                  | <   |j
                  j)                  |       |S )N)is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14%(py16)spy16r   u   spec load 실패: z
>assert %(py19)spy19)WORKTREE	importlibutilspec_from_file_locationstrloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolop_format_assertmsgAssertionError_format_explanationmodule_from_specsysmodulesexec_module)mod_namerelpathr   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                     </home/jay/workspace/tests/state_machine/test_state_repair.py_loadr9      sM   c>D>>11(CIFDTtT4tTT4T4 7TTTT4tTTTTTT4TTT4TTTtTTTTTTT4TTTTTTTTTTTTTTT4TTTTTTTTTT;MdV9TTTTTTTTT
..
)
)$
/CCKKKKC J    state_repair_modzutils/state_repair.pysilent_corruption_guard_g2z utils/silent_corruption_guard.pyc                D   | dz  dz  }|j                  dd       ||dd}t        j                  t        j                  |dd      j                  d	            j                         }||d
<   || dz  }|j                  t        j                  |dd      d	       |S )u4   올바른 checksum이 포함된 state 파일 생성.z.tasksstateT)parentsexist_oktaskctl)task_idr>   actorF)	sort_keysensure_asciiutf-8	_checksumz.jsonr   rE   indentencoding)mkdirhashlibsha256jsondumpsencode	hexdigest
write_text)tmp_pathrB   r>   	state_dir
state_datachecksum
state_paths          r8   _make_valid_state_filerY   #   s    8#g-IOOD4O0J
 ~~

:EBII'Rik  'J{y..J$**ZeANY`ar:   c                   d}t        | |d      }t        j                  ||       }|d   }d}||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }t        j                  d
      dz   d|iz  }t        t        j                  |            dx}x}}t        j                  |j                  d            }	d|	d<   |j                  t        j                  |	dd      d       t        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}}|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}}|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}}|d   }d}||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}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)u>   state JSON 직접 수정 후 inspect → checksum_match=False.ztask-chksum-testRUNNINGr>   	workspacechecksum_matchTisz%(py1)s is %(py4)spy1py4u*   초기 상태는 checksum 일치해야 함
>assert %(py6)spy6NrF   rJ   HUMAN_APPROVEDr>   Fr   rH   existsassert %(py6)s
json_validchecksum_presentu4   수동 편집 후 checksum mismatch 감지해야 함c              3  $   K   | ]  }d |v  
 yw)zchecksum mismatchN ).0issues     r8   	<genexpr>zHtest_state_json_direct_modification_checksum_mismatch.<locals>.<genexpr>N   s     J"e+Js   issuesz,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)py0r	   re   )rY   srinspect_stater   r   r   r    r!   r"   rO   loads	read_textrS   rP   rs   r   r   r   )rT   rB   rX   resultr-   r,   @py_assert2@py_format5@py_format7rV   r*   s              r8   5test_state_json_direct_modification_checksum_mismatchr}   :   s    G''KJ g:F"#YtY#t+YYY#tYYY#YYYtYYY-YYYYYYYY J00'0BCJ*Jw$**ZeANY`a g:F(#t#t####t######t#######,'4'4''''4''''''4'''''''$%--%----%---%----------"#dud#u,ddd#uddd#ddduddd.ddddddddJ9IJJ3JJJJJJJJJ3JJJ3JJJJJJJJJJJJJJr:   c                   d}t        | |d      }t        j                  |j                  d            }d|d<   |j	                  t        j
                  |dd	
      d       t        j                  ||       }|d   }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}}g }
d}|d   }||v }|}|sd}|d   }||v }|}|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }|
j                  |       |s_t        j                  dfdf      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}}|d#   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)&uH   taskctl에서 FAILED → HUMAN_APPROVED 직접 전이 시도 → 차단.ztask-transition-testFAILEDr\   rF   rJ   rh   r>   Fr   rH   r]   okr`   rb   rc   u<   checksum mismatch 상태에서 state 검증 차단해야 함rf   rg   Nmismatchreasonu   수동 편집inz%(py3)s in %(py6)spy3rg   %(py8)spy8z%(py11)s in %(py14)sr   r   r   r      assert %(py19)sr   detailr_   rj   )rY   rO   rw   rx   rS   rP   scgcheck_state_file_presentr   r   r   r    r!   r"   r   r   )rT   rB   rX   rV   ry   r-   r,   rz   r{   r|   r*   @py_assert5r+   r.   r/   r0   @py_format9r3   r4   r5   r6   s                        r8   8test_failed_to_human_approved_manual_transition_rejectedr   U   s   
 %G''JJ J00'0BCJ*Jw$**ZeANY`a ))'X)FF$<`5`<5 ```<5```<```5```"````````P:P)P:))P_Px@PP_@P-PPPP:)PPP:PPP)PPPPPPP_@PPPP_PPP@PPPPPPPPPPPPPPP(,-66-6666-666-6666666666r:   c                ~   d}t        | |d      }t        j                  |j                  d            }d|d<   |j	                  t        j
                  |dd	
      d       t        j                  ||       }|d   }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}}g }
d}|d   }||v }|}|sd}|d   }||v }|}|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }|
j                  |       |s_t        j                  dfdf      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}}t         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}}|d%   }
t%        |
      }d&}||kD  }|st        j                  d'|fd(||f      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)-uU   checksum mismatch 상태에서 check_state_file_present → ok=False → done 차단.ztask-mismatch-blockVERIFIEDr\   rF   rJ   injected_by_attackerextra_fieldFr   rH   r]   r   r`   rb   rc   u.   checksum mismatch → done/merge 차단 필수rf   rg   Nr   r   zfail-closedr   r   r   r   r   r   r   r   r   r   r   r   r_   rj   rr   r   )>)z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)slen)rt   r	   re   r   zassert %(py9)sr   )rY   rO   rw   rx   rS   rP   r   r   r   r   r   r    r!   r"   r   r   ru   rv   r   r   r   r   )rT   rB   rX   rV   guard_resultr-   r,   rz   r{   r|   r*   r   r+   r.   r/   r0   r   r3   r4   r5   r6   inspect@py_assert6r2   @py_format10s                            r8   +test_checksum_mismatch_blocks_done_or_merger   n   sz   #G''LJ J00'0BCJ 6J}$**ZeANY`a //8/LLXX&XXXXXXXXXXXX(XXXXXXXXZ:Zh/Z://Z=ZLQYDZZ=DZ3ZZZZ:/ZZZ:ZZZ/ZZZZZZZ=DZZZZ=ZZZDZZZZZZZZZZZZZZZ w(;G#$--$----$---$----------x %3 !%A%!A%%%%!A%%%%%%3%%%3%%% %%%!%%%A%%%%%%%r:   c                   d}t        | |d       t        | dz        }t        j                  |d|dd|       }|d	   }d
}||u }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d      dz   d|iz  }t        t	        j                  |            dx}x}}g }	d}|d   }
||
v }|}|sd}|d   }||v }|}|st	        j
                  d|fd||
f      t	        j                  |      t	        j                  |
      dz  }dd|iz  }|	j                  |       |s_t	        j
                  dfdf      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}}|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)&uF   repair_state() 호출 시 evidence_path 파일 없음 → fail-closed.ztask-repair-no-evr   r\   zno_such_evidence.jsonchairmanz
test-actorrecompute_checksum)approved_by_chairmanevidence_pathrC   repair_actionr^   r   Fr`   rb   rc   u-   evidence 없이 repair → fail-closed 필수rf   rg   Nr   r   u   없음r   r   r   r   r   r   r   r   r   r   r   r   backup_path )==)z%(py1)s == %(py4)srj   )rY   r   ru   repair_stater   r   r   r    r!   r"   r   r   )rT   rB   nonexistent_evidencery   r-   r,   rz   r{   r|   r*   r   r+   r.   r/   r0   r   r3   r4   r5   r6   s                       r8   +test_state_repair_without_evidence_rejectedr      s   !G8WH= x*AAB__'**  F $<Q5Q<5 QQQ<5QQQ<QQQ5QQQ"QQQQQQQQN?NfX.N?..N(NfX>NN(>N2NNNN?.NNN?NNN.NNNNNNN(>NNNN(NNN>NNNNNNNNNNNNNNN- &B& B&&&& B&&& &&&B&&&&&&&r:   )r'   r   r(   r   )r[   )rT   r   rB   r   r>   r   returnr   )__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rM   importlib.utilr   rO   r$   pathlibr   __file__resolver?   r   r9   ru   r   rY   r}   r   r   r   rn   r:   r8   <module>r      s|    #      
 >!!#++A. 67(*LM.K672&2'r:   