
    i_                         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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(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      ndd	z  }t        j                  d
      dz   d|iz  }	t        t        j                  |	            d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      ndd	z  }t        j                  d      dz   d|iz  }	t        t        j                  |	            d}y)u=   정상 running task: watchdog 실행 후 timer.json 무변경r   r   r   g?==z%(py0)s == %(py2)sbefore_mtimeafter_mtimepy0py2u   timer.json mtime이 변경됨
>assert %(py4)spy4Nbefore_contentafter_content   timer.json 내용이 변경됨)r#   statst_mtimer3   rC   timesleep
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanation)
rH   r   
timer_filerN   rU   rO   rV   @py_assert1@py_format3@py_format5s
             r"   0test_watchdog_does_not_mutate_timers_json_normalri   \   sT   !-	BF,,J??$--L))+N&JJsO//#,,K((*M;&GGG<;GGGGGG<GGG<GGGGGG;GGG;GGGG(GGGGGGG]*LLL>]LLLLLL>LLL>LLLLLL]LLL]LLLL,LLLLLLLr$   c                 (   t        | dd      }|dz  }|j                         }t        |       t        j                  |j                               }|d   d   d   }d}||k(  }|st        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}}|j                  }
 |
       }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }	t        j                  d      dz   d|	iz  }t        t        j                  |            dx}
x}}y)uS   task-2414/2417/2420 사고 시나리오: .done 존재 시 status=escalated 박제 Xr   Tr   r   r   r   r   r   rK   z%(py1)s == %(py4)spy1rT   )   status가 escalated로 박제됨 (회귀)
>assert %(py6)spy6NzH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}()
} == %(py6)sre   rU   rQ   rR   rT   rq   rW   
>assert %(py8)spy8r#   r3   rC   r   loadsr\   r]   ra   rb   rc   rd   r^   r_   r`   rH   r   re   rU   
after_data@py_assert0@py_assert3@py_assert2rh   @py_format7rf   @py_assert5@py_format9s                r"   5test_watchdog_does_not_mutate_timers_with_done_markerr   l   sU   !-	TRF,,J))+N&J0023Jg{+H5oo5Booo5ooo5ooooooDooooooooU!U!^3UUU!^UUUUUU:UUU:UUUUUU!UUUUUU^UUU^UUUU5UUUUUUUUr$   c                    t        | dd      }|dz  }|j                         }t        |       t        j                  |j                               }|d   d   d   }d}||k(  }|st        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}}|j                  }
 |
       }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      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}
x}}y)u6   superseded 마커 존재 시 status=escalated 박제 Xr   T)r   r	   r   r   r   r   rK   rl   rm   ro   rp   rq   Nrr   re   rU   rs   zassert %(py8)sru   rv   rx   s                r"   ;test_watchdog_does_not_mutate_timers_with_superseded_markerr   y   sG   !-	SWXF,,J))+N&J0023Jg{+H5oo5Booo5ooo5ooooooDoooooooo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^333^3333333r$   c                 r   t        | d      }t        |dz  j                  d            }t        |       t        |dz  j                  d            }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  |      rt	        j                  |      ndd	z  }t	        j                  d
      dz   d|iz  }t        t	        j                  |            d}y)uA   watchdog 실행 후 .backoff 파일이 새로 생성되지 않음r   rJ   r   z	*.backoffrK   rM   backoff_files_beforebackoff_files_afterrP   u.   backoff 파일이 watchdog에 의해 생성됨rS   rT   N)r#   listglobrC   r\   r]   r^   r_   r`   ra   rb   rc   rd   )rH   r   r   r   rf   rg   rh   s          r"   +test_watchdog_does_not_create_backoff_filesr      s    !-	BF,!6 < <[ IJ& 5;;KHI#66hhh#6hhhhhhhhhhhhhhh#6hhh#6hhhh8hhhhhhhr$   c                    t        | dd      }|dz  }t        |       t        j                  |j	                               }|d   d   }g }d}||v}|}|s
|d   }	|	 }
|
}|st        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  }|j                  |       |s+ddt        j                  	      iz  }|j                  |       t        j                  |d      i z  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}x}x}x}	}
y)uK   타임 무변경 검증: end_time이 watchdog에 의해 작성되지 않음r   Trk   r   r   r   end_time)not in)z%(py3)s not in %(py5)stask)py3py5z%(py7)spy7znot %(py10)spy10r(   u3   end_time이 watchdog에 의해 작성됨 (mutation)z
>assert %(py14)spy14N)r#   rC   r   rw   r3   r\   r]   ra   r^   r_   r`   append_format_booloprb   rc   rd   )rH   r   re   ry   r   rf   r|   @py_assert4rz   @py_assert9@py_assert11@py_format6@py_format8@py_format12@py_format13@py_format15s                   r"   *test_watchdog_does_not_call_task_timer_endr      s    !-	TRF,,J&J0023Jg{+Dp:p:T!pj)9p)9%9p%9ppp:Tppp:ppppppTpppTppppppp)9ppppppppp;ppppppppr$   c                     t         j                         } t        j                  d|       }t	        |      }d}||k(  }|st        j                  d|fd||f      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t        j                  |      t        j                  |      dz  }t        j                  d|       d	z   d
|iz  }t        t        j                  |            dx}x}}y)u@   소스 코드 정적 검증: jq .status = "escalated" write 0건z!jq[^|]*\.status\s*=\s*"escalated"r   rK   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenmatchesrQ   rn   r   rq   u    jq status 박제 패턴 잔존: rt   ru   Nr2   r3   refindallr   r\   r]   r^   r_   r`   ra   rb   rc   rd   srcr   r|   r~   r   r}   r   s          r"   %test_watchdog_grep_no_jq_status_writer      s    

#
#
%Cjj=sCGw<J1J<1JJJ<1JJJJJJ3JJJ3JJJJJJwJJJwJJJ<JJJ1JJJ @	JJJJJJJJr$   c                     t         j                         } t        j                  d|       }t	        |      }d}||k(  }|st        j                  d|fd||f      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t        j                  |      t        j                  |      dz  }t        j                  d|       d	z   d
|iz  }t        t        j                  |            dx}x}}y)u=   소스 코드 정적 검증: BACKOFF_FILE에 echo 작성 0건z%echo[^>]*>\s*"?\$\{?BACKOFF_FILE\}?"?r   rK   r   r   r   r   u#   BACKOFF_FILE 쓰기 패턴 잔존: rt   ru   Nr   r   s          r"   #test_watchdog_grep_no_backoff_writer      s    

#
#
%CjjA3GGw<M1M<1MMM<1MMMMMM3MMM3MMMMMMwMMMwMMM<MMM1MMM CG9MMMMMMMMr$   c                  *   t        j                  ddt        t              gdd      } | j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      d	z  }t        j                  d
| j                         dz   d|iz  }t        t        j                  |            dx}x}}y)u   bash -n 통과r+   z-nT)r.   r/   r   rK   )z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)srB   )rQ   rR   r   u   bash -n 실패: z
>assert %(py7)sr   N)r:   r;   r<   r2   
returncoder\   r]   r^   r_   r`   ra   rb   stderrrc   rd   )rB   rf   r   r{   r   r   s         r"   test_watchdog_bash_syntax_validr      s    ^^	s?+,F
 EE!EEEEEEEEE6EEE6EEEEEEEEE%5fmm_#EEEEEEEEr$   rE   )__doc__builtinsr^   _pytest.assertion.rewrite	assertionrewriter\   r   r6   r   r:   rF   rZ   pathlibr   pytest	WORKSPACEr2   r#   rC   fixturerH   ri   r   r   r   r   r   r   r    r$   r"   <module>r      s      	 	     &'	i'*?? /8qEch !d !Ht 4  
M 
V
4i	qKNFr$   