
    üi2(                     P   d Z ddlZddlZddlZddlmZ ddlZ ee      j                  j                  Z	ej                  j                  d ee	             e	dz  dz  Zej                  j                  d ee             ddlZe	dz  dz  Ze	dz  dz  Zd	 Zd
 Zd Zd Zd Zd Zy)u  
test_task_2352_cancel.py

카마소츠 (개발7팀 테스터) 작성 — task-2352 취소 신호 강제 처리 자동 검증

테스트 케이스:
1. test_cancel_task_invalid_id_returns_error
2. test_cancel_task_creates_cancelled_marker
3. test_cancel_task_idempotent_stop_marker
4. test_finish_task_blocks_on_cancelled_marker
5. test_finish_task_detects_top_stop_marker
6. test_qc_verify_handle_gate_skips_on_cancelled
    N)Pathteamssharedmemorytaskseventsc                  X    t        j                  d      } | d   dk(  sJ d| d           y)uG   task_id 형식이 틀린 경우 status=="error"를 반환해야 한다.z	not-validstatuserroru   예상 'error', 실제: N)dispatchcancel_task)results    L/home/jay/workspace/.worktrees/task-2487-dev2/tests/test_task_2352_cancel.py)test_cancel_task_invalid_id_returns_errorr   (   s8    !!+.F(w&U*B6(CSBT(UU&    c                     d} t         |  dz  }t        |  dz  }|j                  d       |j                  d       t         j                  dd       |j	                  dd	       	 t        j                  |       }|j                         s
J d
|        |j                  d	      }d|j                         d   v sJ d|j                         d          |d   dk(  sJ d|d           d|d   v sJ d       d|d   v sJ d       	 |j                  d       |j                  d       y# |j                  d       |j                  d       w xY w)u_   cancel_task 호출 시 .cancelled 이벤트 파일과 task md CANCELLED 마커가 생성된다.z
task-99950.md
.cancelledT
missing_okparentsexist_okz# Test
utf-8encodingu   .cancelled 파일이 없음: 	CANCELLEDr   u.   task md 첫 줄에 CANCELLED 없음. 첫 줄: r
   oku   예상 'ok', 실제: stop_marker_addedactionsu#   actions에 stop_marker_added 없음cancelled_eventu!   actions에 cancelled_event 없음N)

_TASKS_DIR_EVENTS_DIRunlinkmkdir
write_textr   r   exists	read_text
splitlines)task_id	task_filecancelled_filer   contents        r   )test_cancel_task_creates_cancelled_markerr.   2   s   Gy_,I gYj#99N %T* TD1g6/%%g. $$&X*GGW(XX& %%w%7g002155 	
<W=O=O=QRS=T<WX	
5
 h4'S+@AQ@R)SS' #fY&77^9^^7 F9$55Z7ZZ5 	D). 	D).s   *B"D2 2&Ec                  4   d} t         |  dz  }t        |  dz  }|j                  d       |j                  d       d}t         j                  dd       |j	                  | dd	
       	 t        j                  |        |j                  d	
      }|j                         dd }t        d |D              }|dk  sJ d| d       	 |j                  d       |j                  d       y# |j                  d       |j                  d       w xY w)ur   task md에 이미 STOP 마커가 있는 경우, cancel_task 재호출 시 마커가 중복 삽입되지 않는다.z
task-99951r   r   Tr   u0   ★★★ 작업 취소됨 (CANCELLED) ★★★r   z	

# Test
r   r   N   c              3   *   K   | ]  }d |v sd  yw)r      N ).0lines     r   	<genexpr>z:test_cancel_task_idempotent_stop_marker.<locals>.<genexpr>q   s     ID[D5HaIs   	r2   u"   CANCELLED 마커가 head-3 내에 u!   번 등장 (중복 삽입 발생))
r"   r#   r$   r%   r&   r   r   r(   r)   sum)r*   r+   r,   stop_markerr-   head3cancelled_counts          r   'test_cancel_task_idempotent_stop_markerr;   \   s;   Gy_,I gYj#99N %T* EKTD1K=5H/W% %%w%7""$Ra(IEII!# 	
00AAbc	
#
 	D). 	D).s   /AC1 1&Dc                     d} t         |  dz  }t        |  dz  }t        |  dz  }|j                  d       |j                  d       |j                  d       t         j                  dd       t        j                  dd       |j	                  dd	
       | ddd}|j	                  t        j                  |      d	
       	 t        j                  dt        t        dz  dz        | gdd      }|j                  dk(  s!J d|j                   d|j                          |j                  |j                  z   }d|v s%d|v s!J d|j                   d|j                          |j                         r
J d|        	 |j                  d       |j                  d       |j                  d       y# |j                  d       |j                  d       |j                  d       w xY w)u`   finish-task.sh 실행 시 .cancelled 마커가 있으면 .done 파일이 생성되지 않는다.z
task-99952r   r   .doneTr   r   z# Test task-99952
r   r   2026-05-02T00:00:00testr*   cancelled_atreasonbashscriptsfinish-task.shcapture_outputtextr   /   finish-task.sh가 비정상 종료 (returncode=
)
stderr: z[CANCELLED]u   .cancelled 마커 발견u1   CANCELLED 메시지가 출력에 없음.
stdout: z	
stderr: 1   .done 파일이 생성되었음 (차단 실패): N)r"   r#   r$   r%   r&   jsondumps
subprocessrunstr
_WORKSPACE
returncodestderrstdoutr'   )r*   r+   r,   	done_filecancelled_datar   combineds          r   +test_finish_task_blocks_on_cancelled_markerrX      s'   Gy_,I gYj#99N	//I %T*% TD1dT2.A "):O[abNdjj87K*Si/2BBCWM
   A% 	
=f>O>O=P Q}}o'	
% ==6==0(,F(,R 	
@zZ`ZgZgYhi	
R
 ##%f)Z[dZe'ff%% 	D).D) 	D).D)s   B:F= =8G5c                  H   d} t         |  dz  }t        |  dz  }t        |  dz  }|j                  d       |j                  d       |j                  d       t         j                  dd       t        j                  dd       |j	                  dd	
       	 t        j                  dt        t        dz  dz        | gdd      }|j                  dk(  s!J d|j                   d|j                          |j                         s
J d|        |j                         r
J d|        	 |j                  d       |j                  d       |j                  d       y# |j                  d       |j                  d       |j                  d       w xY w)uv   task md 첫 줄에 STOP 마커가 있으면 finish-task.sh가 .cancelled를 생성하고 .done은 만들지 않는다.z
task-99953r   r   r=   Tr   r   uD   ★★★ 작업 취소됨 (CANCELLED) ★★★

# Test task-99953
r   r   rC   rD   rE   rF   r   rI   rJ   uA   STOP 마커 감지 후 .cancelled 파일이 생성되지 않음: rK   N)r"   r#   r$   r%   r&   rN   rO   rP   rQ   rR   rS   r'   )r*   r+   r,   rU   r   s        r   (test_finish_task_detects_top_stop_markerrZ      s   Gy_,I gYj#99N	//I %T*% TD1dT2Q  
*Si/2BBCWM
   A% 	
=f>O>O=P Q}}o'	
% $$& 	
OP^O_`	
&
 ##%f)Z[dZe'ff%% 	D).D) 	D).D)s   BE) )8F!c                 x   ddl }d}t        | dz  }t        | dz  }|j                  d       |j                  d       | j                  dt	        t
                     t        j                  dd	       |d
dd}|j                  t        j                  |      d       di d}	 |j                  ||d       |j                         r
J d|        |d   dk(  sJ d|d           	 |j                  d       |j                  d       y# |j                  d       |j                  d       w xY w)u~   _handle_gate 호출 시 .cancelled 마커가 있으면 .qc-result가 생성되지 않고 overall이 CANCELLED로 변경된다.r   Nz
task-99954r   z
.qc-resultTr   WORKSPACE_ROOTr   r>   r?   r@   r   r   PASS)overallchecksdev7uA   .qc-result 파일이 생성되었음 (.cancelled 가드 실패): r^   r   u    overall이 CANCELLED가 아님: )	qc_verifyr#   r$   setenvrP   rQ   r%   r&   rL   rM   _handle_gater'   )monkeypatchra   r*   r,   qc_result_filerV   dummy_results          r   -test_qc_verify_handle_gate_skips_on_cancelledrg      sd   G gYj#99N gYj#99N T*T* 'Z9 dT2!(:O[abNdjj87K%4L/|Wf= "((* 	
OP^O_`	
*
 I&+5 	
.|I/F.GH	
5
 	.. 	..s   +AD &D9)__doc__rL   rN   syspathlibr   pytest__file__parentrQ   pathinsertrP   _SHAREDr   r"   r#   r   r.   r;   rX   rZ   rg   r3   r   r   <module>rq      s      
   (^""))
 3z? # w

) 3w<   ("W,
8#h.V#/T/F.*j,*f%/r   