
    i_                         d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	Z	 ed      Z
e
dz  dz  Zddddd	d
efdZddefdZe	j                  d        Zd Zd Zd Zd Zd Zd Zd Zd Zy)u  task-2422 Fix A 회귀 테스트: watchdog alert 전용화

검증 포인트:
- watchdog 실행 후 timer.json mtime/내용 동일
- .escalate, .superseded_by, .backoff 등 마커 파일이 watchdog에 의해 새로 생성되지 않음
- task-timer.py end가 호출되지 않음 (timer.json end_time 무변경)
- task-2414/2417/2420 사고 시나리오: status=running인 task에 .done이 있어도 status=escalated 박제 X
    N)Pathz/home/jay/workspacescriptszsession-watchdog.shrunningF)statusretry	with_donewith_supersededtmpc          
         | dz  }|dz  j                  d       |dz  j                          |dz  j                          | dz  j                          |dz  dz  j                  d	       dd
|dddd|ddii}|dz  j                  t        j                  |d             |r|dz  dz  j	                          |r|dz  dz  j	                          |S )uH   임시 timer.json + heartbeats 디렉토리 + events 디렉토리 생성memory
heartbeatsT)parentseventstaskslogsztask-9999.mdz# Test task	task-9999z	dev1-teamz2026-05-01T00:00:00z
test-schedzmemory/tasks/task-9999.md   )r   team_id
start_timeschedule_id	task_fileretry_count	max_retrytask-timers.json)indentztask-9999.doneztask-9999.superseded_by)mkdir
write_textjsondumpstouch)r
   r   r   r   r	   r   timerss          5/home/jay/workspace/tests/test_watchdog_alert_only.py_make_timers_fixturer#      s     8^Fl!!$!/hg6\ g&22=A 	 &3+8$

F   ,,TZZq-IJ	(	-	-446	(	6	6==?M    memory_rootc                    | j                   }|dz  }t        j                         }|j                  dd| dd      }|dz  j	                  d       |j	                  |       |j                  d       t        j                  j                         }d	|d
<   |r|j                  |       t        j                  dt        |      g|ddd      }|S )uM   수정된 WORKSPACE를 가리키도록 wrapper 스크립트 작성 후 실행zwatchdog_test.shzWORKSPACE="/home/jay/workspace"zWORKSPACE=""   z	.env.keysz,ANU_BOT_TOKEN=dummy
COKACDIR_KEY_DEV1=dummy
i  1WATCHDOG_DRY_RUNbashT   )envcapture_outputtexttimeout)parentWATCHDOG_SCRIPT	read_textreplacer   chmodosenvironcopyupdate
subprocessrunstr)r%   monkeypatch_envworkspace_root
tmp_scriptoriginalpatchedr-   results           r"   _run_watchdogrC   <   s     ''N"44J((*H@KP^O__`BacdeGk!--.^_'"U
**//
C!C

?#^^	Z!F Mr$   c               #   x   K   t        j                         5 } t        |        d d d        y # 1 sw Y   y xY wwN)tempfileTemporaryDirectoryr   )r
   s    r"   tmp_workspacerH   V   s1     		$	$	& #3i  s   :.	:7:c                 @   t        | d      }|dz  }|j                         j                  }|j                         }t	        |       t        j                  d       |j                         j                  }|j                         }||k(  sJ d       ||k(  sJ d       y)u=   정상 running task: watchdog 실행 후 timer.json 무변경r   r   r   g?u   timer.json mtime이 변경됨   timer.json 내용이 변경됨N)r#   statst_mtimer3   rC   timesleep)rH   r   
timer_filebefore_mtimebefore_contentafter_mtimeafter_contents          r"   0test_watchdog_does_not_mutate_timers_json_normalrU   \   s    !-	BF,,J??$--L))+N&JJsO//#,,K((*M;&G(GG&]*L,LL*r$   c                    t        | dd      }|dz  }|j                         }t        |       t        j                  |j                               }|d   d   d   dk(  sJ d       |j                         |k(  sJ d	       y
)uS   task-2414/2417/2420 사고 시나리오: .done 존재 시 status=escalated 박제 Xr   Tr   r   r   r   r   r   )   status가 escalated로 박제됨 (회귀)rK   Nr#   r3   rC   r   loadsrH   r   rP   rR   
after_datas        r"   5test_watchdog_does_not_mutate_timers_with_done_markerr]   l   s    !-	TRF,,J))+N&J0023Jg{+H5BoDooB!^3U5UU3r$   c                     t        | dd      }|dz  }|j                         }t        |       t        j                  |j                               }|d   d   d   dk(  sJ d       |j                         |k(  sJ y	)
u6   superseded 마커 존재 시 status=escalated 박제 Xr   T)r   r	   r   r   r   r   rX   NrY   r[   s        r"   ;test_watchdog_does_not_mutate_timers_with_superseded_markerr_   y   s    !-	SWXF,,J))+N&J0023Jg{+H5BoDooB!^333r$   c                     t        | d      }t        |dz  j                  d            }t        |       t        |dz  j                  d            }||k(  sJ d       y)uA   watchdog 실행 후 .backoff 파일이 새로 생성되지 않음r   rJ   r   z	*.backoffu.   backoff 파일이 watchdog에 의해 생성됨N)r#   listglobrC   )rH   r   backoff_files_beforebackoff_files_afters       r"   +test_watchdog_does_not_create_backoff_filesre      sa    !-	BF,!6 < <[ IJ& 5;;KHI#66h8hh6r$   c                     t        | dd      }|dz  }t        |       t        j                  |j	                               }|d   d   }d|vs|d   rJ d       y	y	)
uK   타임 무변경 검증: end_time이 watchdog에 의해 작성되지 않음r   TrW   r   r   r   end_timeu3   end_time이 watchdog에 의해 작성됨 (mutation)N)r#   rC   r   rZ   r3   )rH   r   rP   r\   tasks        r"   *test_watchdog_does_not_call_task_timer_endri      sj    !-	TRF,,J&J0023Jg{+DT!j)9p;pp9)9!r$   c                      t         j                         } t        j                  d|       }t	        |      dk(  s
J d|        y)u@   소스 코드 정적 검증: jq .status = "escalated" write 0건z!jq[^|]*\.status\s*=\s*"escalated"r   u    jq status 박제 패턴 잔존: Nr2   r3   refindalllensrcmatchess     r"   %test_watchdog_grep_no_jq_status_writerr      s@    

#
#
%Cjj=sCGw<1J @	JJr$   c                      t         j                         } t        j                  d|       }t	        |      dk(  s
J d|        y)u=   소스 코드 정적 검증: BACKOFF_FILE에 echo 작성 0건z%echo[^>]*>\s*"?\$\{?BACKOFF_FILE\}?"?r   u#   BACKOFF_FILE 쓰기 패턴 잔존: Nrk   ro   s     r"   #test_watchdog_grep_no_backoff_writert      s@    

#
#
%CjjA3GGw<1M CG9MMr$   c                      t        j                  ddt        t              gdd      } | j                  dk(  sJ d| j
                          y)u   bash -n 통과r+   z-nT)r.   r/   r   u   bash -n 실패: N)r:   r;   r<   r2   
returncodestderr)rB   s    r"   test_watchdog_bash_syntax_validrx      sL    ^^	s?+,F
 !E%5fmm_#EE!r$   rE   )__doc__r   r6   rl   r:   rF   rN   pathlibr   pytest	WORKSPACEr2   r#   rC   fixturerH   rU   r]   r_   re   ri   rr   rt   rx    r$   r"   <module>r      s     	 	     &'	i'*?? /8qEch !d !Ht 4  
M 
V
4i	qKNFr$   