
    i                        d Z ddlm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mZ ddlZ ed      Zd
ddZddZddZdd	Zy)u  tests/start_guard/test_lock.py
lock 파일 관련 테스트:
- test_lock_json_format: --update-heartbeat 동작 + heartbeat_timestamp 갱신 확인
- test_lock_missing: lock 없을 때 --update-heartbeat exit 1
- test_atomic_write: sequential 연속 write에서 corruption 없음
    )annotationsN)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      2/home/jay/workspace/tests/start_guard/test_lock.py_runr      sI    >>	CK 4'H)rzz)ciR)     c           	     
   d}| dz  dz  }|j                  dd       || dz  }d}|dd	||t        |       d
| dd}|j                  t        j                  |dd      d       |j
                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}t        d|dg|       }	|	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|	j$                         d z   d!|iz  }t        t        j                  |            dx}x}}
t        j&                  |j)                  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  }t        j                   d'      d(z   d)|iz  }t        t        j                  |            dx}}|d"   }||k7  }|st        j                  d*|fd+||f      t        j                  |      d,t        j                         v st        j                  |      rt        j                  |      nd,d&z  }t        j                   d-|d"          d(z   d)|iz  }t        t        j                  |            dx}}|d.   }||k(  }|st        j                  d|fd/||f      t        j                  |      d.t        j                         v st        j                  |      rt        j                  |      nd.d&z  }d0d)|iz  }t        t        j                  |            dx}}|d1   }d}||k(  }|slt        j                  d|fd2||f      t        j                  |      t        j                  |      d3z  }d4d5|iz  }t        t        j                  |            dx}x}}|d6   }d	}||k(  }|slt        j                  d|fd2||f      t        j                  |      t        j                  |      d3z  }d4d5|iz  }t        t        j                  |            dx}x}}y)7uU   lock 파일 mock 후 --update-heartbeat 실행 시 heartbeat_timestamp 갱신 확인.ztask-lock-test.taskslocksTparentsexist_ok.lock2026-01-01T00:00:00Zdev4i90  task/-dev4task_idbotpidheartbeat_timestamp
started_atworktreebranchF   ensure_asciiindentutf-8encodingzAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	lock_path)py0py2py4N--task--update-heartbeatr   r   ==z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresultr2   r3   py5u"   --update-heartbeat 실패
stdout: 	
stderr: 
>assert %(py7)spy7r&   inz%(py1)s in %(py3)supdated_datapy1py3u!   heartbeat_timestamp 필드 없음
>assert %(py5)sr=   !=z%(py1)s != %(py3)sold_tsu,   heartbeat_timestamp가 갱신되지 않음: r#   z%(py1)s == %(py3)sassert %(py5)sr$   z%(py1)s == %(py4)srF   r4   assert %(py6)spy6r%   )mkdirr   
write_textjsondumpsexists@py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationr   
returncode_call_reprcompare_format_assertmsgstdoutstderrloads	read_text)tmp_pathr#   	locks_dirr1   rL   initial_data@py_assert1@py_assert3@py_format5r;   @py_assert4@py_format6@py_format8rD   @py_assert0@py_assert2@py_format4@py_format7s                     r   test_lock_json_formatrs   #   s   G8#g-IOOD4O0wiu--I $F%M'%(L LuQOZab99 	701F   !                    !"    .fmm_Jv}}oV    
 ::i1171CDL U L0UUU LUUU UUUUUULUUULUUUU2UUUUUUU-. .&8  .&    /      39    39    7|DY7Z6[\     	"-"g----"g---"------g---g-------(&(&((((&((((((&((((((('%'%''''%''''''%'''''''r   c                   d}| dz  dz  }| d}||z  }|j                   } |       }| }|sddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      t        j
                  |      dz  }t        t        j                  |            dx}x}x}x}}t        d	|d
g|       }	|	j                  }d}||k7  }|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|	j                         dz   d|
iz  }t        t        j                  |            dx}x}}g }d}|	j                  }||v }|}|sd}|	j                  }||v }|}|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |	      rt        j
                  |	      ndt        j
                  |      dz  }dd|iz  }|j                  |       |st        j                  dfdf      t        j
                  |      dt        j                         v st        j                  |	      rt        j
                  |	      ndt        j
                  |      dz  }dd|iz  }|j                  |       t        j                  |d       i z  }t        j                  d!|	j                         d"z   d#|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}y)$uF   lock 파일이 없을 때 --update-heartbeat 실행 시 exit 1 확인.ztask-no-lockr   r   r   zQassert not %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
}rg   )r2   r3   r=   r@   Nr5   r6   r7   r   rI   )z2%(py2)s
{%(py2)s = %(py0)s.returncode
} != %(py5)sr;   r<   u1   lock 파일 없는데 exit 0 (비정상)
stdout: r>   r?   r@   z[GUARD ERROR]u   update-heartbeat 실패rA   )z.%(py3)s in %(py7)s
{%(py7)s = %(py5)s.stderr
})rG   r=   r@   z%(py9)spy9)z2%(py12)s in %(py16)s
{%(py16)s = %(py14)s.stderr
})py12py14py16z%(py18)spy18   u    에러 메시지 없음
stderr: z
>assert %(py21)spy21)rW   rX   rY   rZ   r[   r\   r]   r^   r   r_   r`   ra   rb   rc   append_format_boolop)rf   r#   rg   ri   rj   rl   @py_assert6@py_assert8@py_format9r;   rm   rn   rp   ro   @py_assert11@py_assert15@py_assert13@py_format10@py_format17@py_format19@py_format20@py_format22s                         r   test_lock_missingr   Q   s6   G8#g-I&iu-7	--7-557577777777777	777	777-777577777777777	701F   !                    !"    =V]]O:V\VcVcUde    ? fmm ?m+ /H FMM /HM/Y   ?m          %    %    ,     /HM    0I      MS    MS    MZ        ,FMM?;      r   c           	     
   d}| dz  dz  }|j                  dd       || dz  }d}|dt        j                         ||t        |       d	| d
d}|j	                  t        j                  |dd      d       t        d      D ]x  }t        d|dg|       }|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|dz    d|j"                         dz   d|iz  }t%        t        j&                  |            dx}x}
}		 t        j(                  |j+                  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(   }||k(  }|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}}{ t        j(                  |j+                  d            }|d!   }||k7  }|st        j                  d*|fd+||f      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}}|d(   }||k(  }|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/   }d}
||
k(  }|slt        j                  d|fd0||
f      t        j                  |      t        j                  |
      d1z  }d2d3|iz  }t%        t        j&                  |            dx}x}}
y# t
        j,                  $ r)}t/        j0                  d|dz    d |        Y d}~d}~ww xY w)4uG   sequential 연속 heartbeat 갱신에서 JSON corruption 없음 확인.ztask-atomicr   r   Tr   r   r   r   r    r!   r"   Fr*   r+   r.   r/      r5   r6   r7   r   r8   r:   r;   r<   u   갱신 rz   u   회차 실패: r?   r@   Nu   회차 후 JSON corruption: r&   rA   rC   datarE   rN   r=   r#   rM   rI   rK   init_tsu'   최종 heartbeat가 초기값과 동일rH   r$   rO   rP   rQ   rR   )rS   r   getpidr   rT   rU   rV   ranger   r_   rZ   r`   rX   rY   r[   r\   ra   rc   r]   r^   rd   re   JSONDecodeErrorpytestfail)rf   r#   rg   r1   r   rh   ir;   ri   rl   rj   rm   rn   r   ero   rp   rq   
final_datark   rr   s                        r   test_atomic_writer   h   s   G8#g-IOOD4O0wiu--I %Gyy{&M'%(L LuQOZab 1X *w 45
   TAT A%TTT ATTTTTTvTTTvTTT TTTATTT1_V]]O'TTTTTTTT	H::i1171CDD %,$,,,,$,,,$,,,,,,,,,,,,,,,,I)'))))')))))))))')))')))))))* I///ABJ+,b,7bbb,bbb,bbbbbbbbbbbbb9bbbbbbbi + G++++ G+++ ++++++G+++G+++++++e&&&&&&&&&&&&&&&&&&& ## 	HKK'!A#&B1#FGG	Hs   %TU"UU)N)r   z	list[str]r   r   r   zdict | Nonereturnzsubprocess.CompletedProcess)rf   r   )__doc__
__future__r   builtinsrX   _pytest.assertion.rewrite	assertionrewriterZ   rU   r   r   pathlibr   r   r   r   rs   r   r    r   r   <module>r      sB    #    	   	Y	Z	 '(\.''r   