
    i                        d Z ddlmZ ddlZddlZddlZddlmZmZmZ ddl	m
Z
  e
d      ZdddZdddZdd	Zdd
ZddZy)u   tests/start_guard/test_cleanup_stale.py
stale lock 정리 테스트:
- test_cleanup_old_lock: 30분 이전 heartbeat lock → 삭제 + evidence 생성
- test_cleanup_fresh_lock: 최근 heartbeat lock은 보존
    )annotationsN)datetime	timedeltatimezone)PathzI/home/jay/workspace/.worktrees/task-2454-dev4/scripts/start_task_guard.pyc           
         t        j                  dt        t              g| z   t        |      dddi t        j
                  |xs i       S )u   스크립트 실행 헬퍼.python3T   )cwdcapture_outputtexttimeoutenv)
subprocessrunstrSCRIPTosenviron)argsr   r   s      ;/home/jay/workspace/tests/start_guard/test_cleanup_stale.py_runr      sI    >>	CK 4'H)rzz)ciR)     c                    | j                  dd       | | dz  }|||ddd| d|d}|j                  t        j                  |d	d
      d       |S )u   lock 파일 생성 헬퍼.T)parentsexist_okz.lockdev9z	/tmp/testztask/z-dev9)task_idpidheartbeat_timestampbotworktreebranch
started_atF   )ensure_asciiindentutf-8encoding)mkdir
write_textjsondumps)	locks_dirr   heartbeat_tsr   	lock_pathdatas         r   
_make_lockr3      sq    OOD4O0wiu--I+'%("D DuQGRYZr   c                j   d}| dz  dz  }t        j                  t        j                        t	        d      z
  j                  d      }t        |||      }|j                         sJ t        dg|       }|j                  d	k(  s!J d
|j                   d|j                          |j                         r
J d|        | dz  dz  | dz  }|j                         s
J d|        t        j                  |j                  d            }|d   |k(  sJ d|v sJ d|v sJ d|v sJ |d   dk\  sJ y)uL   30분 초과 heartbeat lock이 삭제되고 evidence가 생성됨을 확인.ztask-stale-old.taskslocks<   minutes%Y-%m-%dT%H:%M:%SZ--cleanup-staler   r      --cleanup-stale 실패
stdout: 	
stderr: u#   stale lock이 삭제되지 않음: memoryevents.lock-cleanup.jsonu   evidence 파일 미생성: r(   r)   r   cleanup_reason
cleanup_atelapsed_secondsi  N)r   nowr   utcr   strftimer3   existsr   
returncodestdoutstderrr-   loads	read_text)tmp_pathr   r/   old_tsr1   resultevidence_pathevidences           r   test_cleanup_old_lockrS   2   sp   G8#g-I ll8<<(9R+@@JJK_`F9gv6I$%84F! 
*6==/FMM?S!
 !T%H#TT! x'(2y@R5SSM!P%@#PP! zz-1171CDHI')))x'''8###(((%&(222r   c                   d}| dz  dz  }t        j                  t        j                        t	        d      z
  j                  d      }t        |||      }|j                         sJ t        dg|       }|j                  d	k(  s!J d
|j                   d|j                          |j                         s
J d|        | dz  dz  | dz  }|j                         r
J d|        y)uK   최근(5분 전) heartbeat lock은 삭제되지 않고 보존됨을 확인.ztask-fresh-lockr5   r6      r8   r:   r;   r<   r   r=   r>   u    fresh lock이 잘못 삭제됨: r?   r@   rA   u3   fresh lock에 대한 evidence가 잘못 생성됨: N)r   rE   r   rF   r   rG   r3   rH   r   rI   rJ   rK   )rN   r   r/   fresh_tsr1   rP   rQ   s          r   test_cleanup_fresh_lockrW   U   s   G8#g-I X\\*Yq-AAKKL`aH9gx8I$%84F! 
*6==/FMM?S!
 M!A)MM x'(2y@R5SSM##%l)\]j\k'll%%r   c                z   | dz  dz  }d}d}t        j                  t        j                        t	        d      z
  j                  d      }t        |||      }t        j                  t        j                        t	        d      z
  j                  d      }t        |||      }t        d	g| 
      }|j                  dk(  sJ |j                         rJ d       |j                         sJ d       | dz  dz  | dz  }	| dz  dz  | dz  }
|	j                         sJ d       |
j                         rJ d       y)u;   stale lock은 삭제, fresh lock은 보존 (동시 처리).r5   r6   ztask-stale-mixztask-fresh-mix-   r8   r:   
   r;   r<   r   u!   stale lock이 삭제되지 않음u   fresh lock이 잘못 삭제됨r?   r@   rA   u   stale evidence 없음u"   fresh evidence가 잘못 생성됨N)
r   rE   r   rF   r   rG   r3   r   rI   rH   )rN   r/   
stale_task
fresh_taskstale_ts
stale_lockrV   
fresh_lockrP   stale_evidencefresh_evidences              r   test_cleanup_mixed_locksrb   p   sJ   8#g-I!J!J X\\*Yr-BBLLMabHIz8<J X\\*Yr-BBLLMabHIz8<J$%84F!!!  "G$GG"@ @@(83DV6WWN(83DV6WWN  ";$;;"$$&L(LL&&r   )N)r   z	list[str]r   r   r   zdict | Nonereturnzsubprocess.CompletedProcess)i )
r/   r   r   r   r0   r   r   intrc   r   )rN   r   )__doc__
__future__r   r-   r   r   r   r   r   pathlibr   r   r   r3   rS   rW   rb    r   r   <module>ri      sH   
 #  	  2 2 	Y	Z	*3Fm6Mr   