
    4j*                        d Z ddlZddlmc mZ ddlZddlZddl	m
Z
  e
e      j                         j                  d   Z ee      ej                   vr"ej                   j#                  d ee             ddlmZmZ ddlmZmZ ddlmZ edz  d	z  d
z  Zedz  dz  dz  ZdefdZ G d dej:                        Zedk(  r ej@                  d       yy)u  Regression — task-2553+29 ANU parallel batch coordinator runtime registry.

Covers §5 1~15 verbatim. NO-CRON variant (9-R.1): zero cron register/remove;
self-completion via result.json + .done existence (dogfooding).

  1  dispatch ok + result + no normal callback -> RESULT_READY_NO_NORMAL_CALLBACK
  2  result ready + fallback pending -> does NOT block batch final state
  3  result ready + fallback later fires -> DUPLICATE_CALLBACK_IGNORED /
     RESULT_READY_ALREADY_COLLECTED
  4  normal callback completed -> NORMAL_COLLECTOR_COMPLETED
  5  dispatch ok + no result + fallback pending -> WAIT_FOR_FALLBACK
  6  fallback fires + no result -> RESULT_MISSING_BOT_STALE
  7  task_id mismatch -> TRACK_MISMATCH
  8  dispatch_cron_id mismatch -> TRACK_MISMATCH
  9  normal collector belongs to different task -> TRACK_MISMATCH
  10 fallback belongs to different task -> TRACK_MISMATCH
  11 one track HOLD does not block independent DONE track
  12 cross-task artifact contamination -> BATCH_HOLD
  13 batch_state represents +26 MERGED, +27 PASS, +28 DONE simultaneously
  14 closeout eligibility derived from batch_state, not chat memory
  15 consolidated summary contains only final decision fields
    N)Path   )ParallelRuntimeRegistryTaskRuntimeRecord)Callback4TupleIndexTuple4)	reconcilememoryfixturesz(task-2553.runtime-reconcile.fixture.jsoneventsz#task-2553.parallel-batch-state.jsonreturnc                  \    t        dddddd      }|j                  |        t        di |S )	Ntask-XdevXD1F1okPENDING)task_idexecutordispatch_cron_idfallback_callback_cron_iddispatch_statusfallback_state )dictupdater   )kwbases     K/home/jay/workspace/tests/regression/test_parallel_runtime_registry_2553.py_recr!   .   s9    "& D 	KKO$t$$    c                   r    e 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d Zy)RuntimeRegistryRegressionc                     t               }|j                  t        d             |j                  d      }| j	                  |j
                  d       | j                  |j                  d       y )NTresult_presentr   RESULT_READY_NO_NORMAL_CALLBACKz$must be recovery target, not failure)r   register_dispatchr!   reconcile_trackassertEqualclassification
assertTruerecovery_eligibleselfregrs      r    'test_01_result_ready_no_normal_callbackzARuntimeRegistryRegression.test_01_result_ready_no_normal_callback=   sY    %'d$78)))+LM++-STr"   c                     t        t        t              }| j                  |d   d       | j                  t	        |d   d         g d       y )Nbatch_next_actionBATCH_ACCEPTjoin_policyindependent_done_tracks)task-2553+26task-2553+27task-2553+28)r	   FIXTUREFROZENr+   sortedr0   bss     r    %test_02_fallback_pending_non_blockingz?RuntimeRegistryRegression.test_02_fallback_pending_non_blockingE   sH    w'/0.A2m$%>?@<	
r"   c                 n   t               }|j                  t        d             |j                  d       |j	                  dd      }| j                  |d       t               }|j                  t        dd             |j                  d       | j                  |j	                  dd      d       y )	NTr&   r   r   claimed_task_idfallback_cron_idDUPLICATE_CALLBACK_IGNOREDr'   normal_collector_executedRESULT_READY_ALREADY_COLLECTED)r   r)   r!   r*   classify_fallbackr+   )r0   r1   clsreg2s       r    )test_03_result_ready_fallback_later_fireszCRuntimeRegistryRegression.test_03_result_ready_fallback_later_firesO   s    %'d$78H%##$t $ 
 	:;&(E	
 	X&""8d"S,	
r"   c                     t               }|j                  t        dd             |j                  d      }| j	                  |j
                  d       y )NTrG   r   NORMAL_COLLECTOR_COMPLETEDr   r)   r!   r*   r+   r,   r/   s      r    "test_04_normal_collector_completedz<RuntimeRegistryRegression.test_04_normal_collector_completedc   sK    %'E	
 )))+GHr"   c                     t               }|j                  t        dd             |j                  d      }| j	                  |j
                  d       y )NFr   r'   r   r   WAIT_FOR_FALLBACKrP   r/   s      r    'test_05_no_result_fallback_pending_waitzARuntimeRegistryRegression.test_05_no_result_fallback_pending_waitl   sF    %'d%	RS)))+>?r"   c                     t               }|j                  t        dd             |j                  d      }| j	                  |j
                  d       | j	                  |j                  dd      d       y )NFFIREDrS   r   RESULT_MISSING_BOT_STALEr   rC   )r   r)   r!   r*   r+   r,   rJ   r/   s      r    &test_06_fallback_fires_no_result_stalez@RuntimeRegistryRegression.test_06_fallback_fires_no_result_stales   sj    %'d%PQ)))+EF!!(T!R&	
r"   c                     t               }|j                  t        dddd             |j                  dddd      }| j	                  t        d |D                     y )	Ntask-Ar   N1r   fallbacktask-B)rD   
event_kindevent_task_idevent_cron_idc              3   $   K   | ]  }d |v  
 yw)ztask_id mismatchNr   .0xs     r    	<genexpr>zERuntimeRegistryRegression.test_07_task_id_mismatch.<locals>.<genexpr>   s     E.!3E   r   registerr   classify_eventr-   anyr0   idxreasonss      r    test_07_task_id_mismatchz2RuntimeRegistryRegression.test_07_task_id_mismatch~   s[    !#VHdD$78$$$!"	 % 
 	EWEEFr"   c                     t               }|j                  t        dddd             |j                  t        dddd             |j                  dd	d
      }| j	                  t        d |D                     y )Nr[   r   r\   r   r^   D2N2F2dispatchrD   r_   ra   c              3   $   K   | ]  }d |v  
 ywzbelongs to task-BNr   rc   s     r    rf   zNRuntimeRegistryRegression.test_08_dispatch_cron_id_mismatch.<locals>.<genexpr>        F/14Frg   rh   rl   s      r    !test_08_dispatch_cron_id_mismatchz;RuntimeRegistryRegression.test_08_dispatch_cron_id_mismatch   so    !#VHdD$78VHdD$78$$$! % 

 	FgFFGr"   c                     t               }|j                  t        dddd             |j                  t        dddd             |j                  dd	d
      }| j	                  t        d |D                     y )Nr[   r   r\   r   r^   rq   rr   rs   normal_collectorru   c              3   $   K   | ]  }d |v  
 ywrw   r   rc   s     r    rf   zPRuntimeRegistryRegression.test_09_normal_collector_other_task.<locals>.<genexpr>   rx   rg   rh   rl   s      r    #test_09_normal_collector_other_taskz=RuntimeRegistryRegression.test_09_normal_collector_other_task   so    !#VHdD$78VHdD$78$$$) % 

 	FgFFGr"   c                    t               }|j                  t        dddd             |j                  t        dddd             |j                  dd	d
      }| j	                  t        d |D                     t               }|j                  t        ddd             |j                  t        ddd             | j                  |j                  dd      d       y )Nr[   r   r\   r   r^   rq   rr   rs   r]   ru   c              3   $   K   | ]  }d |v  
 ywrw   r   rc   s     r    rf   zHRuntimeRegistryRegression.test_10_fallback_other_task.<locals>.<genexpr>   rx   rg   )r   r   r   rC   TRACK_MISMATCH)r   ri   r   rj   r-   rk   r   r)   r!   r+   rJ   )r0   rm   rn   r1   s       r    test_10_fallback_other_taskz5RuntimeRegistryRegression.test_10_fallback_other_task   s    !#VHdD$78VHdD$78$$$! % 

 	FgFFG%'DTXY	
 	DTXY	
 	!! (4 "  		
r"   c           	         t               }|j                  t        ddddd             |j                  t        ddd	dd
             |j                          ddlm}m}  |dddddd       |dd
dddd      g} ||      }| j                  d|j                         | j                  d|j                         | j                  |j                  d       | j                  |j                  d       y )Nz	task-DONEr   r   TDONE)r   r   r   r'   terminal_outcomez	task-HOLDrq   rs   HOLD)r   r   r   hold_for_chairr   r   )TrackJoinViewjoinr(   Fr   
BATCH_HOLDz,DONE track must remain independently settled)r   r)   r!   reconcile_all anu_v3.batch_runtime_join_policyr   r   assertInr8   held_tracksr+   r5   r-   )r0   r1   r   r   viewsjrs         r    &test_11_hold_track_does_not_block_donez@RuntimeRegistryRegression.test_11_hold_track_does_not_block_done   s    %'t+/"(*	

 	t+/"(*	

 	H+v/PD2+v/P	52
 %[k2#=#=>k2>>2--|<22F	Hr"   c                     t        t        t        dddg      }| j                  |d   d       | j	                  |d   d          y )	Nr9   r:   )writervictim)contaminationr5   r   closeout_proposaleligible)r	   r<   r=   r+   assertFalser?   s     r     test_12_contamination_batch_holdz:RuntimeRegistryRegression.test_12_contamination_batch_hold   sM    V&4OP
 	/0,?/0<=r"   c                     t        t        t              }|d   }| j                  |d   d   d       | j                  |d   d   d       | j                  |d   d   d       y )	Ntracksr9   r   MERGEDr:   PASSr;   r   )r	   r<   r=   r+   )r0   r@   trs      r    /test_13_batch_state_three_outcomes_simultaneouszIRuntimeRegistryRegression.test_13_batch_state_three_outcomes_simultaneous   sh    w'\N+,>?JN+,>?HN+,>?Hr"   c                     t        t        t              }|d   }| j                  |d   d       | j	                  |d   d       | j                  |d          ddlm} | j                   ||      d   |d          y )	Nr   derived_frombatch_state	confirmedu&   registry never confirms closeout (§7)r   r   )derive_closeout_proposal)r	   r<   r=   r+   r   r-   r   r   )r0   r@   propr   s       r    )test_14_closeout_derived_from_batch_statezCRuntimeRegistryRegression.test_14_closeout_derived_from_batch_state   sx    w'%&n-}=k*,TUZ()M1"5jA4
CSTr"   c                    t        t        t              }|d   }| j                  t	        |j                               h d       |d   j                         D ]-  }| j                  t	        |j                               h d       / y )Nconsolidated_summary>   r   r5   closeout_eligibler   >   r,   r   r   )r	   r<   r=   r+   setkeysvalues)r0   r@   csrecs       r    .test_15_consolidated_summary_final_fields_onlyzHRuntimeRegistryRegression.test_15_consolidated_summary_final_fields_only   sq    w'&'RWWYM	Oh<&&( 	CCHHJH	r"   c                 n   dd l }|j                         5 }t        |      dz  }t        |      dz  }| j                  t	        j
                  ||             |j                  dd       |j                  dd       | j                  t	        j
                  ||             d d d        y # 1 sw Y   y xY w)Nr   zr.jsonzx.donez{}zutf-8)encoding )tempfileTemporaryDirectoryr   r   r   self_completion_recognized
write_textr-   )r0   r   dresdones        r    +test_16_self_completion_via_result_and_donezERuntimeRegistryRegression.test_16_self_completion_via_result_and_done   s    ((* 
	aq'H$C7X%D'BB3M NN4'N2OOBO1OO'BB3M
	 
	 
	s   BB++B4c                 ~    ddl m} | j                  t              5   |i t               d d d        y # 1 sw Y   y xY w)Nr   )write_authority_state)anu_v3.batch_runtime_reconcilerr   assertRaisesRuntimeErrorr=   )r0   r   s     r    !test_17_refuse_write_to_frozen_v1z;RuntimeRegistryRegression.test_17_refuse_write_to_frozen_v1  s2    I|, 	.!"f-	. 	. 	.s   3<N)__name__
__module____qualname__r3   rA   rM   rQ   rU   rY   ro   ry   r}   r   r   r   r   r   r   r   r   r   r"   r    r$   r$   ;   s`    U

(I@
	G	H	H
4H8>IU	.r"   r$   __main__)	verbosity)!__doc__builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arsysunittestpathlibr   __file__resolveparents_ROOTstrpathinsert anu_v3.parallel_runtime_registryr   r   anu_v3.callback_4tuple_indexr   r   r   r	   r<   r=   r!   TestCaser$   r   mainr   r"   r    <module>r      s   ,  
  X ((+u:SXXHHOOAs5z" 6
(
Z
'*T
T		H	$'L	L
%# 
%W. 1 1 W.t zHMMA r"   