
    jq*                       d Z ddlmZ ddlZddlmc mZ ddl	Z	e	j                  j                  dd       ddlZddlZddlZej                  j!                  dd       ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddZ G d	 d
      Z G d d      Z  G d d      Z! G d d      Z" G d d      Z# G d d      Z$ G d d      Z% G d d      Z& G d d      Z' G d d      Z(y)zTests for v3.6 Layer 4: Closeout Marker Watcher.

chair_authorization_id=CHAIR-AUTH-TASK-2704-V36-CONTROL-PLANE-P0-MVP-260528

Coverage:
- 5 marker patterns detected
- 6-state transitions
- priority field correct
- signal_anu writes the correct file
    )annotationsNz/home/jay/workspaceANU_V36_HARNESS_TEST_MODE1)detect_closeout_statescan_closeout_markers
signal_anuWORK_CLOSEOUT_STARTEDFINISH_IN_PROGRESSCALLBACK_LAUNCHEDDONEANU_RECEIVEDCHAIR_REPORTEDPRIORITY_NORMAL_CALLBACK PRIORITY_CLOSEOUT_MARKER_WATCHERPRIORITY_FALLBACK_SAFETY_NETc                t    t        | d      5 }|j                  |xs d       d d d        | S # 1 sw Y   | S xY w)Nwz{})openwrite)pathcontentfhs      G/home/jay/workspace/tests/harness/test_v36_closeout_watcher_contract.pytouchr   )   s7    	dC "B
D!"K"Ks   -7c                      e Zd ZdZd Zy)TestPattern1ActiveJsonzPattern: <task_id>.*active.jsonc                   t        |      }t        t        j                  j	                  |d             t        d|      }|d   }t        f}||v }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|d          d	z   d
|iz  }t        t        j                  |            d x}x}}y )Nztask-2704.harness-active.json	task-2704
events_dirstatein)z%(py1)s in %(py4)spy1py4z<Expected WORK_CLOSEOUT_STARTED for active.json pattern, got z
>assert %(py6)spy6)strr   osr   joinr   r	   
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanation)	selftmp_patheventsresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7s	            r   test_active_json_detectedz0TestPattern1ActiveJson.test_active_json_detected4   s    Xbggll6#BCD&{vFg 	
#8": 	
":: 	
 	
": 	
 	
 		  	
 	
 		 #; 	
 	
  K6RY?J[\	
 	
 	
 	
 	
 	
    N)__name__
__module____qualname____doc__r:    r;   r   r   r   1   s
    )
r;   r   c                      e Zd ZdZd Zd Zy)TestPattern2HarnessMvpActivez&Pattern: <task_id>.harness-mvp-active*c                   t        |      }t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }d	d
|iz  }t        t        j                  |            d x}}y N!task-2704.harness-mvp-active.jsonr   r   r!   ==z%(py1)s == %(py3)sr	   r%   py3assert %(py5)spy5r(   r   r)   r   r*   r   r	   r+   r,   r-   @py_builtinslocals_should_repr_global_namer/   r0   r1   r2   r3   r4   r5   r7   @py_format4@py_format6s           r    test_harness_mvp_active_detectedz=TestPattern2HarnessMvpActive.test_harness_mvp_active_detected@       Xbggll6#FGH&{vFg7"77777"7777777777"7777"77777777r;   c                   t        |      }t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }d	d
|iz  }t        t        j                  |            d x}}y )Nztask-2704.harness-mvp-activer   r   r!   rF   rH   r	   rI   rK   rL   rM   rQ   s           r   )test_harness_mvp_active_without_extensionzFTestPattern2HarnessMvpActive.test_harness_mvp_active_without_extensionF   s    Xbggll6#ABC&{vFg7"77777"7777777777"7777"77777777r;   N)r<   r=   r>   r?   rT   rW   r@   r;   r   rB   rB   =   s    088r;   rB   c                      e Zd ZdZd Zy)TestPattern3DonezPattern: <task_id>.done*c                   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	d
z  }dd|iz  }t        t        j                  |            d x}}y NrE   task-2704.doneztask-2704.done.notifiedr   r   r!   rF   rH   r   rI   rK   rL   r(   r   r)   r   r*   r   r   r+   r,   r-   rN   rO   rP   r/   r0   rQ   s           r   test_done_marker_detectedz*TestPattern3Done.test_done_marker_detectedP       Xbggll6#FGHbggll6#345bggll6#<=>&{vFg&$&&&&$&&&&&&&&&$&&&$&&&&&&&r;   N)r<   r=   r>   r?   r^   r@   r;   r   rY   rY   M   s
    "'r;   rY   c                      e Zd ZdZd Zd Zy)TestPattern4CallbackzPattern: <task_id>.callback-*c                J   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd	z  }d
d|iz  }t        t        j                  |            d x}}y )NrE   ztask-2704.callback-cause.jsonr   r   r!   rF   rH   r
   rI   rK   rL   r(   r   r)   r   r*   r   r
   r+   r,   r-   rN   rO   rP   r/   r0   rQ   s           r   test_callback_cause_detectedz1TestPattern4Callback.test_callback_cause_detected\   s    Xbggll6#FGHbggll6#BCD&{vFg4"44444"4444444444"4444"44444444r;   c                J   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd	z  }d
d|iz  }t        t        j                  |            d x}}y NrE   task-2704.callback-launch.jsonr   r   r!   rF   rH   r   rI   rK   rL   r(   r   r)   r   r*   r   r   r+   r,   r-   rN   rO   rP   r/   r0   rQ   s           r   5test_callback_launch_detected_callback_launched_statezJTestPattern4Callback.test_callback_launch_detected_callback_launched_statec       Xbggll6#FGHbggll6#CDE&{vFg3"33333"3333333333"3333"33333333r;   N)r<   r=   r>   r?   rd   ri   r@   r;   r   ra   ra   Y   s    '54r;   ra   c                      e Zd ZdZd Zy)TestPattern5CompletionTxtz!Pattern: <task_id>.completion.txtc                J   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd	z  }d
d|iz  }t        t        j                  |            d x}}y NrE   ztask-2704.completion.txtr   r   r!   rF   rH   r
   rI   rK   rL   rc   rQ   s           r   test_completion_txt_detectedz6TestPattern5CompletionTxt.test_completion_txt_detectedn       Xbggll6#FGHbggll6#=>?&{vFg4"44444"4444444444"4444"44444444r;   N)r<   r=   r>   r?   ro   r@   r;   r   rl   rl   k   s
    +5r;   rl   c                  4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestSixStateTransitionsz All 6 closeout states reachable.c                   t        |      }t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }d	d
|iz  }t        t        j                  |            d x}}y rD   rM   rQ   s           r   test_work_closeout_startedz2TestSixStateTransitions.test_work_closeout_startedy   rU   r;   c                J   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd	z  }d
d|iz  }t        t        j                  |            d x}}y rn   rc   rQ   s           r   test_finish_in_progressz/TestSixStateTransitions.test_finish_in_progress   rp   r;   c                J   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd	z  }d
d|iz  }t        t        j                  |            d x}}y rf   rh   rQ   s           r   test_callback_launchedz.TestSixStateTransitions.test_callback_launched   rj   r;   c                   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	d
z  }dd|iz  }t        t        j                  |            d x}}y r[   r]   rQ   s           r   	test_donez!TestSixStateTransitions.test_done   r_   r;   c                   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	d
z  }dd|iz  }t        t        j                  |            d x}}y )NrE   r\   z&task-2704.anu-signal-ANU_RECEIVED.jsonr   r   r!   rF   rH   r   rI   rK   rL   )r(   r   r)   r   r*   r   r   r+   r,   r-   rN   rO   rP   r/   r0   rQ   s           r   test_anu_receivedz)TestSixStateTransitions.test_anu_received   s    Xbggll6#FGHbggll6#345bggll6#KLM&{vFg.,....,.........,...,.......r;   c                   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	d
z  }dd|iz  }t        t        j                  |            d x}}y )NrE   r\   z(task-2704.anu-signal-CHAIR_REPORTED.jsonr   r   r!   rF   rH   r   rI   rK   rL   )r(   r   r)   r   r*   r   r   r+   r,   r-   rN   rO   rP   r/   r0   rQ   s           r   test_chair_reportedz+TestSixStateTransitions.test_chair_reported   s    Xbggll6#FGHbggll6#345bggll6#MNO&{vFg0.0000.000000000.000.0000000r;   N)
r<   r=   r>   r?   rt   rv   rx   rz   r|   r~   r@   r;   r   rr   rr   v   s#    *854'/1r;   rr   c                  "    e Zd ZdZd Zd Zd Zy)TestPriorityFieldz Recovery priority field correct.c                J   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd	z  }d
d|iz  }t        t        j                  |            d x}}y )NrE   rg   r   r   priorityrF   rH   r   rI   rK   rL   )r(   r   r)   r   r*   r   r   r+   r,   r-   rN   rO   rP   r/   r0   rQ   s           r   test_normal_callback_priority_1z1TestPriorityField.test_normal_callback_priority_1   s    Xbggll6#FGHbggll6#CDE&{vFj!=!%=====!%====!======%====%========r;   c                   t        |      }t        t        j                  j	                  |d             t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }d	d
|iz  }t        t        j                  |            d x}}y )NrE   r   r   r   rF   rH   r   rI   rK   rL   )r(   r   r)   r   r*   r   r   r+   r,   r-   rN   rO   rP   r/   r0   rQ   s           r   test_watcher_priority_2z)TestPriorityField.test_watcher_priority_2   s    Xbggll6#FGH&{vFj!E!%EEEEE!%EEEE!EEEEEE%EEEE%EEEEEEEEr;   c                   t        |      }t        d|      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              nddz  }dd	|iz  }t        t        j                  |            d x}}y )
Nr   r   r   rF   rH   r   rI   rK   rL   )r(   r   r   r+   r,   r-   rN   rO   rP   r/   r0   rQ   s           r   (test_fallback_priority_3_when_no_markersz:TestPriorityField.test_fallback_priority_3_when_no_markers   s|    X&{vFj!A!%AAAAA!%AAAA!AAAAAA%AAAA%AAAAAAAAr;   N)r<   r=   r>   r?   r   r   r   r@   r;   r   r   r      s    *>FBr;   r   c                  (    e Zd ZdZd Zd Zd Zd Zy)TestSignalAnuz#signal_anu writes the correct file.c                B   t        |      }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        j                  j                  |d	t         d
      }t        j                  }|j                  }	 |	|      }
|
st	        j                   d|       dz   dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |
      dz  }t        t	        j                  |            d x}x}	}
y )Nr   task_idr!   r   r    )is not)z%(py0)s is not %(py3)sr4   py0rJ   rK   rL   task-2704.anu-signal-.jsonzSignal file not created: zd
>assert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isfile
}(%(py5)s)
}r)   expected_filer   py2r&   rL   py7)r(   r   r   r   r+   r,   rN   rO   rP   r-   r/   r0   r)   r   r*   isfiler.   )r1   r2   r3   r4   r7   @py_assert1rR   rS   r   r6   @py_assert6@py_format8s               r   test_signal_anu_writes_filez)TestSignalAnu.test_signal_anu_writes_file   s=   X5	
 "!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!V/D\NRW-XYwwYw~~Y~m,Y,YY0I-.YYYYYYYrYYYrYYYwYYY~YYYYYYmYYYmYYY,YYYYYYr;   c                   t        |      }t        dt        t        |       t        j
                  j                  |dt         d      }t        |      5 }t        j                  |      }d d d        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   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                          v st        j"                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}}|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                          v st        j"                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d 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 # 1 sw Y   }xY w)Nr   r   r   r   r   rF   )z%(py1)s == %(py4)sr$   zassert %(py6)sr'   closeout_staterH   r	   rI   rK   rL   r   r   priority_namecloseout_marker_watcher)r(   r   r	   r   r)   r   r*   r   jsonloadr+   r,   r-   r/   r0   rN   rO   rP   )r1   r2   r3   signal_pathr   datar5   r6   r7   r8   r9   rR   rS   s                r   ,test_signal_anu_file_contains_correct_fieldsz:TestSignalAnu.test_signal_anu_file_contains_correct_fields   s   X'5		
 ggll6-BCXBYY^+_`+ 	!"99R=D	!I-+-+----+------+-------$%>%)>>>>>%)>>>>%>>>>>>)>>>>)>>>>>>>>JC#CCCCC#CCCCCCCCCC#CCCC#CCCCCCCCO$A(AA$(AAAAA$(AAAA$AAA(AAAAAAAA	! 	!s   K''K1c                *    t        dt        dd      }y )Nr      z%/nonexistent/path/that/does/not/existr   )r   r   )r1   r4   s     r   2test_signal_anu_safe_fail_returns_none_on_bad_pathz@TestSignalAnu.test_signal_anu_safe_fail_returns_none_on_bad_path   s    >	
r;   c                   t        |      }t        dt        t        |       t        j
                  j                  |dt         d      }t        j
                  }|j                  } ||      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d x}x}}y )	Nr   r   r   r   zbassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isfile
}(%(py5)s)
}r)   r   r   )r(   r   r   r   r)   r   r*   r   rN   rO   r+   rP   r-   r/   r0   )r1   r2   r3   r   r   r6   r   r   s           r   $test_signal_anu_chair_reported_statez2TestSignalAnu.test_signal_anu_chair_reported_state   s    X;0HU[\ggll6-B>BRRW+XYww*w~~*~k********r***r***w***~******k***k**********r;   N)r<   r=   r>   r?   r   r   r   r   r@   r;   r   r   r      s    -
ZB 
+r;   r   c                  "    e Zd ZdZd Zd Zd Zy)TestScanCloseoutMarkersz?scan_closeout_markers returns list of markers across all tasks.c                r   t        |      }t        |      }t        |t              }|sd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                  |      dz  }t        t        j                  |            d }y )Nr   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer4   list)r   r%   r   r&   )r(   r   r   r   rN   rO   r+   rP   r-   r/   r0   )r1   r2   r3   r4   r6   r8   s         r   test_scan_returns_listz.TestScanCloseoutMarkers.test_scan_returns_list   s    X&&9&$''''''''z'''z''''''&'''&''''''$'''$''''''''''r;   c                   t        |      }t        t        j                  j	                  |d             t        t        j                  j	                  |d             t        |      }|D ch c]  }|d   	 }}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }	t        t        j                  |	            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }	t        t        j                  |	            d x}}y c c}w )NrE   z!task-2703.harness-mvp-active.jsonr   r   r   r"   )z%(py1)s in %(py3)stask_idsrI   rK   rL   z	task-2703)r(   r   r)   r   r*   r   r+   r,   r-   rN   rO   rP   r/   r0   )
r1   r2   r3   r4   rr   r5   r7   rR   rS   s
             r   test_scan_finds_multiple_tasksz6TestScanCloseoutMarkers.test_scan_finds_multiple_tasks   s   Xbggll6#FGHbggll6#FGH&&9*01QAiL11&{h&&&&{h&&&{&&&&&&h&&&h&&&&&&&&{h&&&&{h&&&{&&&&&&h&&&h&&&&&&& 2s   .Gc                h   t        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 )	Nz/nonexistent/dirr   rF   )z%(py0)s == %(py3)sr4   r   rK   rL   )	r   r+   r,   rN   rO   rP   r-   r/   r0   )r1   r4   r7   r   rR   rS   s         r   "test_scan_safe_fail_on_missing_dirz:TestScanCloseoutMarkers.test_scan_safe_fail_on_missing_dir   se    &2DEv|vvvr;   N)r<   r=   r>   r?   r   r   r   r@   r;   r   r   r      s    I(
'r;   r   c                      e Zd ZdZd Zy)TestFixtureCoveragez*Verify fixture file covers all 5 patterns.c                   t         j                  j                  t         j                  j                  t              d      }t        |      5 }t        j                  |      }d d d        t        t        t        t        t        h}j                         D ch c]  }|d   	 }}||z
  }| }|s~t        j                  d|       dz   ddt!        j"                         v st        j$                  |      rt        j&                  |      ndiz  }	t)        t        j*                  |	            d }y # 1 sw Y   xY wc c}w )Nz!fixtures/v36_closeout_states.jsonexpected_statez%Fixture missing coverage for states: z
>assert not %(py0)sr   missing)r)   r   r*   dirname__file__r   r   r   r	   r
   r   r   r   valuesr+   r.   rN   rO   rP   r-   r/   r0   )
r1   fixture_pathr   fixturesexpected_statesvfixture_statesr   r   @py_format2s
             r   test_fixture_has_all_5_patternsz3TestFixtureCoverage.test_fixture_has_all_5_patterns  s    ww||GGOOH%/
 , 	%2yy}H	% "
 8@7HI!!,-II!N2{M{MMCG9MMMMMMM7MMM7MMMMMM	% 	% Js   D1D=1D:N)r<   r=   r>   r?   r   r@   r;   r   r   r     s    4Nr;   r   )N))r?   
__future__r   builtinsrN   _pytest.assertion.rewrite	assertionrewriter+   sysr   insertr   r)   pytestenviron
setdefault+scripts.harness.v36.closeout_marker_watcherr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   rB   rY   ra   rl   rr   r   r   r   r   r@   r;   r   <module>r      s   	 #   
 ( )  	  

  13 7   $	
 	
8 8 	' 	'4 4$5 5-1 -1`B B,-+ -+` ,N Nr;   