
    4jJ                        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ZddlmZ  ee      j                         j                   d   dz  dz  Zej$                  j'                  de      Zej$                  j+                  e      Zee
j.                  d<   ej0                  j3                  e       ej5                  e      Zddd	ed
ee   dz  defdZ G d dej>                        Z e!dk(  r ejD                  d       yy)u8  
Regression — task-2553+27 coordinator V0 closeout finalizer (§3.3 / 9-R.4 / 9-R.5).

Cases:
  1. normal closeout            -> marker produced, 9-packet PASS, ACCEPT/CONVERGED
  2. batch-state file unchanged -> sha pre == post (read-only preserve)
  3. coordinator code unchanged -> sha pre == post (byte-0 anchor)
  4. idempotent                 -> 2nd run = NO_OP, marker/decision byte-stable, no double-closeout
  5. evidence absent            -> HOLD_FOR_CHAIR, no marker written
  + write whitelist enforcement (9-R.5): non-whitelisted / tracked path refused
    N)Path   scriptszrun_coordinator_v0_closeout.pyrcv0cdroptmpr   returnc                
   |xs
 t               }| dz  }|dz  dz  j                  d       |dz  dz  j                  d       |dz  j                  d       |dz  j                  d       t        t        j                  j                               t        j                  gz   D ]Y  }||v rt        |z  }|j                         s"||z  }|j                  j                  dd	       t        j                  ||       [ |S )
zBCopy the real read-only evidence inputs into an isolated tmp repo.repomemoryeventsT)parentsreportsanu_v3r   )r   exist_ok)setmkdirlistcloEVIDENCEvaluesCOORDINATOR_CODE	REAL_ROOTis_fileparentshutilcopy2)r	   r   rootrelsrcdsts         O/home/jay/workspace/tests/regression/test_coordinator_v0_closeout_2553plus27.py_make_fixture_repor$      s    =35D<D	H_x&&t&4	H_y '''5	H_D)	IT*CLL'')*c.B.B-CC #$;#o;;=*CJJTD9LLc"# K    c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
CloseoutRegressionc                     t        t        d      j                  d            | _        | j	                  t
        j                  | j                  d       y )Ntempfilep27clo_)prefixT)ignore_errors)r   
__import__mkdtemp_tmp
addCleanupr   rmtree)selfs    r#   setUpzCloseoutRegression.setUp0   s;    J/77y7IJ	tyyEr%   c                    t        | j                        }t        j                  |      }| j	                  |d   d       | j                  |d          | j	                  |d   d       | j	                  |d   d       |t        j                  z  }| j                  |j                                dd l}|j                  |j                  d	            }| j	                  |d
   d   d       | j	                  t        |d
   d         d       | j                  |d          | j                  |d          | j                  |t        j                  z  j                                y )NverdictCLOSEOUT_FINALIZEDokfinal_statuszACCEPT / CONVERGEDmarker_branchFRESH_WRITEr   utf-8nine_packet_checkresultPASSkeys	   high4_resolvedaccept_converged)r$   r/   r   run_closeoutassertEqual
assertTrue
MARKER_RELr   jsonloads	read_textlenDECISION_REL)r2   r   resmarkerrG   ms         r#   test_1_normal_closeoutz)CloseoutRegression.test_1_normal_closeout5   s,   !$)),t$Y)=>D	"^,.BC_-}=&()JJv''01./96BQ23F;<a@*+,,-. 0 0099;<r%   c                 T   t        | j                        }|t        j                  d   z  }t        j	                  |      }t        j                  |      }t        j	                  |      }| j                  ||       | j                  |d          | j                  |d   |d          y )Nbatch_statestate_sha_equalstate_sha_prestate_sha_post)r$   r/   r   r   _sha256_filerC   rD   rE   )r2   r   stateprerL   posts         r#   test_2_state_file_untouchedz.CloseoutRegression.test_2_state_file_untouchedG   s    !$)),s||M22u%t$&d#-./_-s3C/DEr%   c                    t        | j                        }|t        j                  z  }t        j	                  |      }t        j                  |      }t        j	                  |      }| j                  ||       | j                  |d          y )Ncoord_sha_equal)r$   r/   r   r   rU   rC   rD   rE   )r2   r   coordrW   rL   rX   s         r#   !test_3_coordinator_code_untouchedz4CloseoutRegression.test_3_coordinator_code_untouchedR   sr    !$)),s+++u%t$&d#-./r%   c                 d   t        | j                        }t        j                  |      }| j	                  |d   d       |t        j
                  z  j                         }|t        j                  z  j                         }t        j                  |t        j                  d   z        }t        j                  |      }| j	                  |d   d       | j	                  |d   d       | j                  |d          | j	                  |t        j
                  z  j                         |       | j	                  |t        j                  z  j                         |       | j	                  t        j                  |t        j                  d   z        |       | j	                  |d   |d          y )	Nr9   r:   rQ   r5   r6   NO_OP_BYTE_STABLEno_op_already_closeoutcloseout_id)r$   r/   r   rC   rD   rF   
read_bytesrK   rU   r   rE   )r2   r   r1	marker_b1decision_b1state_after1r2s          r#   test_4_idempotent_no_opz*CloseoutRegression.test_4_idempotent_no_op\   sY   !$)),d#O,m<CNN*668	c...::<''s||M/J(JKd#I(<=O,.AB345$/;;=yI$!1!11==?M))$m1L*LM|\M*B},=>r%   c                    t        | j                        }t        j                  |       |t        j                  z  j                  dd       t        j                  |      }| j                  |d   d       | j                  d|d          y )Nz{"tampered": true}
r;   r5   HOLD_FOR_CHAIR0MARKER_INCONSISTENT_WITH_DETERMINISTIC_RECOMPUTEreasons)r$   r/   r   rC   rF   
write_textrD   assertIn)r2   r   rL   s      r#   !test_4b_inconsistent_marker_holdsz4CloseoutRegression.test_4b_inconsistent_marker_holdsm   sp    !$)),		**+A7Kt$Y)9:H#i.Yr%   c                 j   dD ]  }t        | j                  |j                  dd      z  |h      }t        j	                  |      }| j                  |d   d|       | j                  |t        j                  z  j                         |       | j                  t        d |d   D              |        y )	N)z&memory/events/task-2553+17.result.jsonz7memory/events/task-2553+19.adjudication-resolution.json/_r   r5   rj   c              3   $   K   | ]  }d |v  
 yw)MISSINGN ).0rs     r#   	<genexpr>zBCloseoutRegression.test_5_evidence_absent_holds.<locals>.<genexpr>~   s     G1	QGs   rl   )r$   r/   replacer   rC   rD   assertFalserF   existsrE   any)r2   missingr   rL   s       r#   test_5_evidence_absent_holdsz/CloseoutRegression.test_5_evidence_absent_holdsv   s    S 	RG%dii'//#s2K&K,396D""4(CS^-=wGdS^^3;;=wGOOCGIGGQ	Rr%   c                 `   t        | j                        }| j                  t              5  t        j                  |d       d d d        | j                  t              5  t        j                  |d       d d d        | j                  t              5  t        j                  |d       d d d        | j                  t        t        j                  |t        j                              j                  t        j                               y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   {xY w)Nz$anu_v3/parallel_batch_coordinator.pyz1memory/events/task-2553.parallel-batch-state.jsonz(memory/events/task-2553+26.anything.json)
r$   r/   assertRaisesPermissionErrorr   _assert_writablerE   strrF   endswith)r2   r   s     r#   test_6_write_whitelist_enforcedz2CloseoutRegression.test_6_write_whitelist_enforced   s    !$)),/ 	O  'MN	O/ 	\  'Z[	\/ 	S  'QR	S 	C00s~~FGPPQTQ_Q_`a	O 	O	\ 	\	S 	Ss#   DDD$DD!$D-N)__name__
__module____qualname__r3   rO   rY   r]   rh   ro   r~   r   ru   r%   r#   r'   r'   /   s/    F
=$F0?"ZR	br%   r'   __main__)	verbosity)#__doc__builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arimportlib.util	importlibr   sysunittestpathlibr   __file__resolver   _SCRIPTutilspec_from_file_location_specmodule_from_specr   modulesloaderexec_modulefind_repo_rootr   r   r   r$   TestCaser'   r   mainru   r%   r#   <module>r      s   
     
  
x.
 
 
"
*
*1
-	
9<\
\..w@nn%%e,G     w'	 >B D 3s8d? d &[b** [b| zHMMA r%   