
     j                        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y)u  tests/regression/test_checksum_repair.py — Group 5 (3건).

task-2472 regression: checksum repair 경로 검증.

16. test_checksum_repair_without_chairman_evidence_rejected
17. test_checksum_repair_audit_missing_rejected
18. test_repair_without_verify_consistency_blocks_done
    )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/regression/test_checksum_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_g5zutils/state_repair.pysilent_corruption_guard_g5z 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 )u.   올바른 checksum 포함 state 파일 생성..tasksstateT)parentsexist_oktaskctl)task_idr?   actorF)	sort_keysensure_asciiutf-8	_checksumz.jsonr   rF   indentencoding)mkdirhashlibsha256jsondumpsencode	hexdigest
write_text)tmp_pathrC   r?   	state_dir
state_datachecksum
state_paths          r8   _make_valid_state_filerZ   "   s    8#g-IOOD4O0$uyIJ~~

:EBII'Rik  'J{y..J$**ZeANY`ar:   c                   d}t        | |       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}}|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)%uC   repair_state() 시 evidence_path 부재 → ok=False (fail-closed).ztask-repair-no-ev-16zchairman_approval_MISSING.jsonchairman
test-actorrecompute_checksumapproved_by_chairmanevidence_pathrD   repair_action	workspaceokFisz%(py1)s is %(py4)spy1py4u*   evidence 없으면 repair 거부해야 함
>assert %(py6)spy6Nra   reasonu   없음in)z%(py3)s in %(py6)s)py3rl   z%(py8)spy8)z%(py11)s in %(py14)s)r   r   r   r      zassert %(py19)sr   backup_path )==)z%(py1)s == %(py4)szassert %(py6)s
audit_path)rZ   r   srrepair_stater   r   r   r    r!   r"   r   r   )rU   rC   nonexistent_evresultr-   r,   @py_assert2@py_format5@py_format7r*   @py_assert5r+   r.   r/   r0   @py_format9r3   r4   r5   r6   s                       r8   7test_checksum_repair_without_chairman_evidence_rejectedr   6   s   $G8W-$DDEN__'$*  F $<N5N<5 NNN<5NNN<NNN5NNN"NNNNNNNN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&&&&&&&,%2%2%%%%2%%%%%%2%%%%%%%r:   c                   d}t        | |       | dz  }|j                  t        j                  ddd      d       t        j
                  j                  }d }|j                  t        j
                  d	|       t        j                  |dt        |      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   }|j                   } |       }|	|v }|}|s d}|d   }|j                   } |       }||v }|}|sNt        j                  d|fd|	|f      t        j                  |	      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }|j#                  |       |st        j                  dfdf      t        j                  |      t        j                        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}x}x}}|j                  t        j
                  d	|       y)%u1   audit jsonl 쓰기 차단 → repair fail-closed.ztask-audit-blocked-17chairman_evidence.jsonr\   2026-05-07T00:00:00Zapproved_bytsrG   rK   c                     ~ ~t        d      )Nu'   디렉토리 read-only — audit 차단)OSError)argskwargss     r8   _blocked_writezCtest_checksum_repair_audit_missing_rejected.<locals>._blocked_write_   s    &?@@r:   writer]   r^   r_   rd   Fre   rg   rh   u.   audit 기록 실패 → repair ok=False 필수rk   rl   Nauditrm   zfail-closedrn   )zF%(py3)s in %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.lower
}()
})rp   rl   rq   py10z%(py12)spy12)zJ%(py15)s in %(py22)s
{%(py22)s = %(py20)s
{%(py20)s = %(py18)s.lower
}()
})py15py18py20py22z%(py24)spy24rr   zassert %(py27)spy27)rZ   rT   rP   rQ   rw   osr   setattrrx   r   r   r   r   r    r!   r"   lowerr   r   )rU   monkeypatchrC   evidence_fileoriginal_os_writer   rz   r-   r,   r{   r|   r}   r*   r~   @py_assert7@py_assert9r+   @py_assert14@py_assert17@py_assert19@py_assert21@py_assert16@py_format11@py_format13@py_format23@py_format25@py_format26@py_format28s                               r8   +test_checksum_repair_audit_missing_rejectedr   P   s'   %G8W- 77M

:5KLM   A w7__'-(*  F $<R5R<5 RRR<5RRR<RRR5RRR"RRRRRRRR[7[fX&[&,,[,.[7..[-[6(CS[CSCYCY[CYC[[-C[2[[[[[7.[[[7[[[&[[[,[[[.[[[[[[[-C[[[[-[[[CS[[[CY[[[C[[[[[[[[[[[[[[[[ w(9:r:   c                   d}t        | |      }t        j                  |j                  d            }d|d<   |j	                  t        j
                  |dd      d       | d	z  }|j	                  t        j
                  d
dd      d       t        j                  |d
t        |      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}}| dz  dz  d| z  }|j                  } |       }|st        j                  d      dz   dt!        j"                         v st        j$                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	t        t        j                  |	            dx}}|j                  } |       }|st        j                  d      dz   dt!        j"                         v st        j$                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	t        t        j                  |	            dx}}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}}|j                  } |       }| }|st        j                  d"      d#z   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)$ua   repair 성공 후 verify_consistency 미호출 → .verify-pending 마커 잔존 → done 차단.ztask-verify-pending-18rG   rK   HUMAN_APPROVEDr?   Fr   rI   r   r\   r   r   r]   r^   r_   rd   Tre   rg   rh   u   repair 자체가 실패함: rk   rl   Nr>   z.verify-pending-u0   .verify-pending 마커가 생성되지 않았음zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}marker_path)py0r	   rj   ue   verify_consistency 미호출 시 .verify-pending 마커가 남아있어야 함 → done 차단 조건)rc   u   verify_consistency 실패: u8   verify_consistency 통과 후 마커 제거되어야 함zG
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
})rZ   rP   loads	read_textrT   rQ   rw   rx   r   r   r   r   r    r!   r"   existsr   r   r   verify_consistency)rU   rC   rY   rW   r   repair_resultr-   r,   r{   r|   r}   r   r*   	vc_resultr~   r1   s                   r8   2test_repair_without_verify_consistency_blocks_doner   z   s;   &G'':J J00'0BCJ*Jw$**ZeANY`a 77M

:5KLM   OO'-(* $ M V$V$&VVV$VVVVVV$VVV*F}o(VVVVVVVV X%/4DWI2NNKSSSS!SSSSSSS;SSS;SSSSSSSSSSSS      	p                       
 %%g%BIT?MdM?d"MMM?dMMM?MMMdMMM&A)$MMMMMMMM!!_!#_##_#__%_______{___{___!___#______r:   )r'   r   r(   r   )FAILED)rU   r   rC   r   r?   r   returnr   )__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rN   importlib.utilr   rP   r$   pathlibr   __file__resolver@   r   r9   rw   scgrZ   r   r   r    r:   r8   <module>r      sx    #      
 >!!#++A. 56(*LM(&4#;T,`r:   