
     j                    @   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ZddlZddlmZ ddlZ ee      j%                         j&                  d   Z ee      ej,                  vr"ej,                  j/                  d ee             ddlmZ edz  dz  Zej8                  j;                  d      Ze eedd	      xs d	 ee      k7  r e ej8                        D  cg c]  } | dk(  s| jC                  d
      s|  c} D ]  Z"ej8                  e"=   ejF                  de eedz        g      Z$g Z%dZ&e$e&uZ'e'Z(e're$jR                  Z*dZ+e*e+uZ,e,Z(e(sB ejZ                  de'fde$e&f      d ej\                         v s ej^                  e$      r ej`                  e$      nd ej`                  e&      dz  Z1dde1iz  Z2e%jg                  e2       e'r ejZ                  de,fde*e+f      d ej\                         v s ej^                  e$      r ej`                  e$      nd ej`                  e*       ej`                  e+      dz  Z4dde4iz  Z5e%jg                  e5        ejl                  e%d      i z  Z7dde7iz  Z8 e9 ejt                  e8            dxZ(xZ%xZ'xZ&xZ*xZ,Z+ ejv                  e$      Z<e<ej8                  d<   e$jR                  j{                  e<       ddl>m?Z@ ddddddddZAdHd ZBdId!ZCdJdKd"ZDdLd#ZEddlFZGdMdNd$ZHd% ZIdOdPd&ZJdQdPd'ZKd( ZLd) ZMd* ZNd+ ZOd, ZPd- ZQd. ZRd/ ZSd0 ZTd1 ZUd2 ZVd3 ZWd4 ZXej                  j                  d5g d6      d7        Z[d8 Z\d9 Z]d: Z^d; Z_d< Z`d= Zad> Zbd? Zcd@ ZddA ZedB ZfdC ZgdD ZhdE ZidF ZjdG Zkyc c} w )Ru[  task-2721 P0-b ANU pickup driver — regression (11).

대상 모듈: dispatch.anu_pickup_driver (불칸 동시 구현).

절대 제약:
- ANU key literal 'c119085...' 를 테스트 코드에 절대 쓰지 않는다 (0건).
- pickup_once 실호출 절대 금지 — 전부 mock/stub. pickup_fn / verify_fn 은
  호출 인자로 mock 주입한다. 실제 wake/cron 발사 0건.
- tmp_path fixture 만 사용. 실제 memory 디렉토리에 쓰지 않는다.
  activation flag 도 tmp dir 에만 둔다.

이 파일은 driver 의 공개 API 계약(task-2721 spec)에 맞춰 작성된 회귀 테스트다.
    )annotationsN)Path   dispatchz__init__.py__file__ z	dispatch.)submodule_search_locationsis not)z%(py2)s is not %(py5)s_spec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16assert %(py19)spy19)anu_pickup_drivertask-999EXECUTOR_RESULT_WRITTENsch-1task_idschedule_idzr.mdabc)r   completion_signalcollector_envelopereport_pathsha256c                j    | dz  dz  j                  dd       | dz  dz  j                  dd       | S )uV   tmp_path 안에 memory/events, memory/state 디렉토리를 만들고 root 를 반환.memoryeventsTparentsexist_okstate)mkdir)tmp_paths    ]/home/jay/workspace/.worktrees/task-2729-dev6/tests/regression/test_anu_pickup_driver_2721.py
_make_dirsr,   C   sA    8#**4$*G7"))$)FO    c                    | dz  dz  S )Nr#   r$    )roots    r+   _events_dirr1   J   s    (?X%%r-   c                ~    t        |       |z  }|t        }|j                  t        j                  |      d       |S )u@   memory/events 아래에 result.json 을 쓰고 경로를 반환.utf-8encoding)r1   VALID_PAYLOAD
write_textjsondumps)r0   namepayloadps       r+   _write_resultr=   N   s9    DD ALLG$wL7Hr-   c                    | dz  dz  dz  }|j                   j                  dd       |j                  t        j                  dz   d       y	)
u7   tmp dir 의 activation flag 파일에 'enabled' 작성.r#   r(   p0b_driver_enabledTr%   
r3   r4   N)parentr)   r7   drvACTIVATION_ENABLED)r0   flags     r+   _enable_activationrE   W   sH    (?W$';;DKKdT2OOC**T1GODr-   c                t    t        j                         |z
  }t        j                  t	        |       ||f       y)u   result 파일 mtime/atime 을 과거로 설정해 readiness 'aged' 게이트를 통과시킨다.
    (write race 방어 readiness window 회피용 — 테스트에서 writer flush 완료 상태 모사.)N)_timetimeosutimestr)pathsecondspasts      r+   _agerO   a   s*     ::<'!DHHSYt%r-   c                      y Nr/   )aks     r+   <lambda>rT   i       r-   c                (     g  fd}|_         |S )u   pickup_fn mock. 호출 인자를 calls 리스트에 기록한다.

    mock.calls -> list[(args, kwargs)]
    호출 시 SimpleNamespace(verdict, ok, argv, task_id, reasons) 반환.
    실제 wake/cron 발사는 전혀 하지 않는다 (순수 stub).
    c                 f    j                  | |f       t        j                  dk(  dgdg       S )N
WAKE_BUILTxr   )verdictokargvr   reasonsappendtypesSimpleNamespaceargskwargscallsrZ   s     r+   _pickupz!make_pickup_mock.<locals>._pickupv   s<    dF^$$$<'
 	
r-   re   )rZ   rf   re   s   ` @r+   make_pickup_mockrh   m   s     E
 GMNr-   c                (     g  fd}|_         |S )uA   verify_fn mock. 호출 인자를 calls 리스트에 기록한다.c                 b    j                  | |f       t        j                  dk(  dg       S )NAUTHORITATIVEr   )rZ   r[   classificationr]   r^   rb   s     r+   _verifyz!make_verify_mock.<locals>._verify   s7    dF^$$$?*	
 	
r-   rg   )rZ   rm   re   s   ` @r+   make_verify_mockrn      s    E
 GMNr-   c                n	   t        |       }t               }t        j                  ||d d      }t	        |      }d}||k(  }|st        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  }d
d|iz  }t        t        j                  |            d x}x}}|d   }	|	j                  }
t        j                  }|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |
      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }d
d|iz  }t        t        j                  |            d x}
x}}|	j                  }
t        j                   }|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |
      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }d
d|iz  }t        t        j                  |            d x}
x}}|j"                  }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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )Nc                      y rQ   r/   r/   r-   r+   rT   z,test_default_disabled_noop.<locals>.<lambda>   rU   r-   F)	pickup_fnflag_readerwrite_evidence   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenrecordspy0py1py3py6assert %(py8)spy8r   )zZ%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_NOOP_DISABLED
}recrB   r{   r   py4r~   )z[%(py2)s
{%(py2)s = %(py0)s.activation
} == %(py6)s
{%(py6)s = %(py4)s.ACTIVATION_DISABLED
}zK%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.calls
})
} == %(py8)spickupr{   r|   r}   r   r   assert %(py10)spy10)r,   rh   rB   	scan_oncerx   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationrZ   VERDICT_NOOP_DISABLED
activationACTIVATION_DISABLEDre   )r*   r0   r   ry   @py_assert2@py_assert5@py_assert4@py_format7@py_format9r   @py_assert1@py_assert3@py_assert7@py_assert6@py_format11s                  r+   test_default_disabled_noopr      s   hDFmm 	G w<1<1<133ww<1
!*C;;3#333;33333;333333333333333;333333#333#33333333333>>4S444>44444>444444434443444>444444S444S44444444444||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c           
        t        |       }t        |      }t               }|dz  }|dz  }|dz  }|||fD ]  }|j                  dd        |dz  }|j                  t	        j
                  t              d       t        j                  }	t        |      }
 |	|
      }d}||u }|sgt        j                  d	|fd
||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      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                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}	x}
x}x}}t        j                  }	t        |      }
 |	|
      }d}||u }|sgt        j                  d	|fd
||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      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                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}	x}
x}x}}t        j                  }	t        |      }
 |	|
      }d}||u }|sgt        j                  d	|fd
||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      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                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}	x}
x}x}}t        j                  }	t        |      }
 |	|
      }d}||u }|sgt        j                  d	|fd
||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      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                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}	x}
x}x}}|||fD ]C  }t        j$                  t        |      ||      }|j&                  }	t        j(                  }
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      dz  }dd|iz  }t!        t        j"                  |            d x}	x}}
F |j*                  }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                  |      t        j                  |      d z  }d!d"|iz  }t!        t        j"                  |            d x}x}x}}y )#Nzfoo.mdz	bar.jsonlztask-1.result.json.tmp-9rY   r3   r4   ztask-7.result.jsonTis)zn%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.is_target
}(%(py6)s
{%(py6)s = %(py3)s(%(py4)s)
})
} is %(py11)srB   rK   finalr{   r   r}   r   r~   r   r   assert %(py13)spy13Fp_mdp_jsonlp_tmp)r0   rq   ru   )z\%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_NOOP_NOT_TARGET
}r   r   r   r   r   r   rx   r   r   r   r   )r,   r1   rh   r7   r8   r9   r6   rB   	is_targetrK   r   r   r   r   r   r   r   r   process_onerZ   VERDICT_NOOP_NOT_TARGETre   rx   )r*   r0   evr   r   r   r   r<   r   r   r   r   @py_assert10@py_assert9@py_format12@py_format14r   r   r   r   r   r   r   r   s                           r+   test_scan_limited_not_targetr      sP   hD	T	BF=D;G++EGU# ,	S7+, %%E	TZZ.A==,U,=$,,$,,,,$,,,,,,3,,,3,,,=,,,,,,,,,,,,,,,U,,,U,,,,,,$,,,,,,,,,,==,T,=#,u,#u,,,,#u,,,,,,3,,,3,,,=,,,,,,,,,,,,,,,T,,,T,,,,,,#,,,u,,,,,,,==/W/=&/%/&%////&%//////3///3///=///////////////W///W//////&///%///////==-U-=$--$----$------3---3---=---------------U---U------$---------- GU# :ooc!f46B{{9c999{99999{9999999s999s999{999999c999c99999999999: ||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c           
        t        |       }t        |       t               }t        |      dz  }|j	                  dd       t        |       |j                  } |       }|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                  |      t        j                  |      t        j                  |      d	z  }	d
d|	iz  }
t        t        j                  |
            d x}x}x}x}}t!        j"                  t%        |      ||t&              }|j(                  }t         j*                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|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  }dd|iz  }t        t        j                  |            d x}x}}|j.                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j0                  }t3        |      }d}||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  t2              rt        j                  t2              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd |iz  }t        t        j                  |            d x}x}x}}|j4                  } |       }| }|sd!dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d"z  }t        t        j                  |            d x}x}}|d#z  d$z  d%z  }d}||z  }|j4                  } |       }|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}}d#}||z  }d)}||z  }d%}||z  }d}||z  }|j4                  } |       }| }|sd*d+t        j                         v st        j                  |      rt        j                  |      nd+t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      d,z  }t        t        j                  |            d x}x}x}x}x}x}x}x}x}x}}y )-Ntask-999.result.jsonr   r3   r4   r   ru   )z`%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.stat
}()
}.st_size
} == %(py9)sr<   )r{   r   r   r~   r   zassert %(py11)sr   r0   rq   sleep_fnzW%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_QUARANTINE
}r   rB   r   r   r   size0z9%(py2)s
{%(py2)s = %(py0)s.quarantine_reason
} == %(py5)sr{   r   r   assert %(py7)sr   Tr   z3%(py2)s
{%(py2)s = %(py0)s.quarantined
} is %(py5)sr   rx   r   r   r   r   Eassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r{   r   r   r#   	p0b_state
quarantineMassert %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
}qdirr{   r   r   r   r$   zzassert not %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = ((((%(py0)s / %(py2)s) / %(py5)s) / %(py8)s) / %(py11)s).exists
}()
}r0   r{   r   r   r   r   r   r   )r,   rE   rh   r1   r7   rO   statst_sizer   r   r   r   r   r   r   r   rB   r   rK   	_NO_SLEEPrZ   VERDICT_QUARANTINEquarantine_reasonquarantinedre   rx   exists)r*   r0   r   r<   r   r   r   @py_assert8r   @py_format10r   r   r   r   r   @py_format6@py_format8r   r   r   r   r   r   @py_assert12@py_assert13@py_assert15@py_assert17@py_format18s                               r+   test_quarantine_size0r      s   hDtFD22ALLgL&G66 68 8 q q    q      1   1   6   8      q       
//#a&tv	
RC;;0#000;00000;000000030003000;000000#000#00000000000  +G+ G++++ G++++++3+++3+++ +++G+++++++??"d"?d""""?d""""""3"""3"""?"""d"""""""||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!! xxxzz>>qqxz(?[(<7D)3D))3)113133333333D333D333)33313333333333\x\(\(*\\\*\9\<R\9<RR\RZZ\Z\\\\\\\\\\\\\\\\\x\\\(\\\\\\\<R\\\Z\\\\\\\\\\\\r-   c                   t        |       }t        |       t               }t        |      dz  }|j	                  dd       t        |       t        j                  t        |      ||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      d	t        j                         v st        j                   t              rt        j"                  t              nd	t        j"                  |      d
z  }dd|iz  }	t%        t        j&                  |	            d x}x}}|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  }dd|iz  }t%        t        j&                  |            d x}x}}
|j*                  }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"                  |
      t        j"                  |      dz  }	dd|	iz  }t%        t        j&                  |            d x}x}
x}}y )Nr   z"{invalid jsonr3   r4   r   ru   r   r   rB   r   r   r   
parse_failr   r   r   r   r   r   rx   r   r   r   r   )r,   rE   rh   r1   r7   rO   rB   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   r   re   rx   r*   r0   r   r<   r   r   r   r   r   r   r   r   r   r   r   r   r   s                    r+   test_quarantine_parse_failr      s   hDtFD22ALL!GL4G
//#a&tv	
RC;;0#000;00000;000000030003000;000000#000#00000000000  0L0 L0000 L00000030003000 000L0000000||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c                F   t        |       }t        |       t               }t        |      dz  }|j	                  t        j                  ddi      d       t        |       t        j                  t        |      ||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t!        j"                         v st        j$                  |      rt        j&                  |      nd	t        j&                  |      d
t!        j"                         v st        j$                  t              rt        j&                  t              nd
t        j&                  |      dz  }dd|iz  }	t)        t        j*                  |	            d x}x}}|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  }dd|iz  }t)        t        j*                  |            d x}x}}
|j.                  }t1        |      }
d}|
|k(  }|s
t        j                  d|fd|
|f      dt!        j"                         v st        j$                  t0              rt        j&                  t0              nddt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |
      t        j&                  |      dz  }	dd|	iz  }t)        t        j*                  |            d x}x}
x}}y )Nr   foort   r3   r4   r   ru   r   r   rB   r   r   r   schema_failr   r   r   r   r   r   rx   r   r   r   r   )r,   rE   rh   r1   r7   r8   r9   rO   rB   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   r   re   rx   r   s                    r+   test_quarantine_schema_failr      s   hDtFD22ALLUAJ''L:G
//#a&tv	
RC;;0#000;00000;000000030003000;000000#000#00000000000  1M1 M1111 M11111131113111 111M1111111||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c                   t        |       }t        |       t               }t        d      }t	        |      }t        |       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      dz  }	d	d
|	iz  }
t%        t        j&                  |
            d x}x}}|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  }dd|iz  }t%        t        j&                  |            d x}x}}|j*                  }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"                  |      t        j"                  |      dz  }
dd|
iz  }t%        t        j&                  |            d x}x}x}}|j.                  }t        j0                  }||k7  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      dz  }	d	d
|	iz  }
t%        t        j&                  |
            d x}x}}|j.                  }t        j2                  t        j4                  f}||v }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            d x}x}}y )NQUARANTINEDrZ   r0   rq   	verify_fnr   ru   r   r   rB   r   r   r   owner_proof_failr   r   r   r   r   r   rx   r   r   r   r   )!=)zT%(py2)s
{%(py2)s = %(py0)s.owner_key_class
} != %(py6)s
{%(py6)s = %(py4)s.OKC_ANU
}in)z7%(py2)s
{%(py2)s = %(py0)s.owner_key_class
} in %(py5)s)r,   rE   rh   rn   r=   rO   rB   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   r   re   rx   owner_key_classOKC_ANUOKC_FOREIGNOKC_SELF)r*   r0   r   verifyr<   r   r   r   r   r   r   r   r   r   r   r   r   r   s                     r+    test_quarantine_owner_proof_failr     s   hDtFm4FdAG
//#a&tv#,.C;;0#000;00000;000000030003000;000000#000#00000000000  6$66 $66666 $666666636663666 666$66666666||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!-#++-+----+------3---3---------#---#---+-------A3??CLL"AA"AAAAA"AAAAAAA3AAA3AAAAAA"AAAAAAAAr-   c                J   t        |       }t        |       t               }t               }t	        t
              }|j                  d       t        ||      }t        |       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }	|	st        j                   d|	fd||f      dt#        j$                         v st        j&                  |      rt        j(                  |      ndt        j(                  |      dt#        j$                         v st        j&                  t              rt        j(                  t              ndt        j(                  |      dz  }
d	d
|
iz  }t+        t        j,                  |            d x}x}	}|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  }dd|iz  }t+        t        j,                  |            d x}x}	}|j0                  }t3        |      }d}||k(  }|s
t        j                   d|fd||f      dt#        j$                         v st        j&                  t2              rt        j(                  t2              nddt#        j$                         v st        j&                  |      rt        j(                  |      ndt        j(                  |      t        j(                  |      t        j(                  |      dz  }dd|iz  }t+        t        j,                  |            d x}x}x}}y )Nr   r;   r   ru   r   r   rB   r   r   r   owner_unprovabler   r   r   r   r   r   rx   r   r   r   r   )r,   rE   rh   rn   dictr6   popr=   rO   rB   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   r   re   rx   )r*   r0   r   r   r;   r<   r   r   r   r   r   r   r   r   r   r   r   r   r   s                      r+    test_quarantine_owner_unprovabler      s   hDtFF=!GKK$%dG,AG
//#a&tv#,.C;;0#000;00000;000000030003000;000000#000#00000000000  6$66 $66666 $666666636663666 666$66666666||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c                J   t        |       }t        |       t               }t        d      }t	        |      }t        |       t        |      dz  }|j                  dd       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }	|	st        j                  d|	fd	||f      d
t!        j"                         v st        j$                  |      rt        j&                  |      nd
t        j&                  |      dt!        j"                         v st        j$                  t              rt        j&                  t              ndt        j&                  |      dz  }
dd|
iz  }t)        t        j*                  |            d x}x}	}|j,                  }d}||u }	|	st        j                  d|	fd||f      d
t!        j"                         v st        j$                  |      rt        j&                  |      nd
t        j&                  |      t        j&                  |      dz  }dd|iz  }t)        t        j*                  |            d x}x}	}|j.                  }t1        |      }d}||k(  }|s
t        j                  d|fd||f      dt!        j"                         v st        j$                  t0              rt        j&                  t0              nddt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |      t        j&                  |      dz  }dd|iz  }t)        t        j*                  |            d x}x}x}}y )Nrk   r   task-999.pickup.donedoner3   r4   r   ru   zX%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_PICKUP_SKIP
}r   rB   r   r   r   Fr   r   r   r   r   r   r   rx   r   r   r   r   )r,   rE   rh   rn   r=   rO   r1   r7   rB   r   rK   r   rZ   VERDICT_PICKUP_SKIPr   r   r   r   r   r   r   r   r   re   rx   )r*   r0   r   r   r<   markerr   r   r   r   r   r   r   r   r   r   r   r   r   s                      r+   test_dedupe_done_marker_noopr   5  s   hDtFo6FdAG!77F
fw/
//#a&tv#,.C;;1#111;11111;111111131113111;111111#111#11111111111??#e#?e####?e######3###3###?###e#######||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c                
   t        |       }t        |       t        d      }t        d      }t	        |      }t        |       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      d	z  }	d
d|	iz  }
t%        t        j&                  |
            d x}x}}|j(                  }t        j*                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      d	z  }	d
d|	iz  }
t%        t        j&                  |
            d x}x}}|j,                  }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"                  |      t        j"                  |      dz  }
dd|
iz  }t%        t        j&                  |            d x}x}x}}|j,                  d   \  }}|d   }t        |      }||k(  }|st        j                  d|fd||f      t        j"                  |      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"                  |      dz  }	d
d|	iz  }
t%        t        j&                  |
            d x}x}}y )NrX   r   rk   r   ru   zW%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_WAKE_BUILT
}r   rB   r   r   r   zT%(py2)s
{%(py2)s = %(py0)s.owner_key_class
} == %(py6)s
{%(py6)s = %(py4)s.OKC_ANU
}rt   r   rx   r   r   r   r   r   )z0%(py1)s == %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}rK   r<   )r|   r}   r   r~   r,   rE   rh   rn   r=   rO   rB   r   rK   r   rZ   VERDICT_WAKE_BUILTr   r   r   r   r   r   r   r   r   r   re   rx   )r*   r0   r   r   r<   r   r   r   r   r   r   r   r   r   r   r   rc   rd   @py_assert0s                      r+   #test_six_conditions_pass_wake_builtr   K  s   hDtl3Fo6FdAG
//#a&tv#,.C;;0#000;00000;000000030003000;000000#000#00000000000-#++-+----+------3---3---------#---#---+------- ||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!<<?LD&7c!f7f7f7cc!!fr-   c           
        t        |       }t        |       t        d      }t        d      }t	        |      }t        |       t        j                  |||dt              }t        |      }d}||k\  }|st        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  }	dd|	iz  }
t!        t        j"                  |
            d x}x}}|dz  dz  dz  }|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}}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                  |      t        j                  |      t        j                  |      dz  }t!        t        j"                  |            d x}x}x}x}x}x}x}x}}|j'                  d      }|j)                         D cg c]  }|j+                         s| }}t        |      }d}||k\  }|st        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  }	dd|	iz  }
t!        t        j"                  |
            d x}x}}|D ]n  }t-        j.                  |      }|j0                  }d} ||      }t        j2                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d t        j                         v st        j                  t              rt        j                  t              nd t        j                  |      d!z  }d"d#|iz  }t!        t        j"                  |            d x}x}x}x}}q 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}}t        j2                  }||v }|st        j                  d%|fd+||f      d t        j                         v st        j                  t              rt        j                  t              nd 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.}||v}|st        j                  d/|fd0||f      d1t        j                         v st        j                  |      rt        j                  |      nd1d't        j                         v st        j                  |      rt        j                  |      nd'd2z  } d3d4| iz  }t!        t        j"                  |            d }y c c}w )5NrX   r   rk   Trq   r   rs   r   rt   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)srx   ry   rz   r   r   r#   r   zdriver_runs.jsonlAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}evidencer   r$   zp0b_driver_runs.jsonlzmassert not %(py13)s
{%(py13)s = %(py11)s
{%(py11)s = (((%(py0)s / %(py2)s) / %(py5)s) / %(py8)s).exists
}()
}r0   )r{   r   r   r   r   r   r3   r4   linesdriverru   )zl%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py10)s
{%(py10)s = %(py8)s.DRIVER_NAME
}objrB   )r{   r   r   r~   r   r   assert %(py12)spy12z"driver"r   z%(py1)s in %(py3)scontentr|   r}   assert %(py5)sr   )z3%(py2)s
{%(py2)s = %(py0)s.DRIVER_NAME
} in %(py4)szassert %(py6)sr~   c119085addb0f8b7not inz%(py0)s not in %(py2)s	forbiddenr{   r   assert %(py4)sr   )r,   rE   rh   rn   r=   rO   rB   r   r   rx   r   r   r   r   r   r   r   r   r   	read_text
splitlinesstripr8   loadsgetDRIVER_NAME)!r*   r0   r   r   r<   ry   r   r   r   r   r   r  r   r   @py_format5r   r   r   r   r   @py_assert14@py_format15r  lnr  r
  r   @py_format13r   @py_format4r   r  @py_format3s!                                    r+   test_scan_once_evidence_jsonlr%  b  s   hDtl3Fo6FdAGmmG w<1<1<133ww<1h,/BBH???88?NxN(N(*N-DN*-DDNDLLNLNNNNNNNNNNNNNNNNNxNNN(NNN-DNNNLNNNNNNNNNNNN  ' 2G!,,.=B"((*R=E=u::?:33uu: 4jjnww3x3wx 3COO3 O3333 O333333s333s333w333x333 333333C333C333O333333334
  :    :   :                ??%?g%%%%?g%%%%%%3%%%3%%%?%%%%%%g%%%g%%%%%%% (IG####9G######9###9######G###G####### >s   a"&a"c                   t        |       }t        |       t        d      }t        d      }t	        |      }t        |       t        j                  t        |      |||t              }t        j                  |j                               }d}||v}|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  }	dd|	iz  }
t'        t        j(                  |
            d }y )NrX   r   rk   r   r  r  r  r  dumpedr  r  r   )r,   rE   rh   rn   r=   rO   rB   r   rK   r   r8   r9   to_jsonr   r   r   r   r   r   r   r   )r*   r0   r   r   r<   r   r'  r  r   r$  r  s              r+   test_no_key_literal_in_recordsr)    s    hDtl3Fo6FdAG
//#a&tv#,.C ZZ&F'IF""""9F""""""9"""9""""""F"""F"""""""r-   c            	     H   t        t              j                         j                  d   } | dz  dz  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}|j                  }d}d} |||      }	||	v}|st        j                  d|fd||	f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}x}x}}	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}}y)uL   HIGH-1: entrypoint lock 경로에 UID 포함 + /tmp 고정 경로 미사용.r   scriptsanu_pickup_entrypoint.shr3   r4   UIDr   r  shr  r  r   Nz/tmp/anu-pickup.driver.lockXDG_RUNTIME_DIRr   r  )z\%(py1)s not in %(py11)s
{%(py11)s = %(py5)s
{%(py5)s = %(py3)s.replace
}(%(py7)s, %(py9)s)
})r|   r}   r   r   r   r   r   r   flock)r   r   resolver&   r  r   r   r   r   r   r   r   r   replace)r0   r.  r   r   r#  r   r   r   r   r   r   r   s               r+   &test_entrypoint_lock_path_uid_isolatedr3    s   >!!#++A.D

7
7	B	BG	B	TB5B;5B5BB(Q

Q;LQbQ
;Lb0QQ(0QQQQQ(0QQQQ(QQQQQQQQQQQQ
QQQ;LQQQbQQQ0QQQQQQQQQ7b=7b7bbr-   c                 (	   t         j                  } | j                  }d} ||      }|sddt        j                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx} x}x}}t         j                  } | j                  }d} ||      }|sddt        j                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx} x}x}}t         j                  } | j                  }d} ||      }| }|sddt        j                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx} x}x}x}}t         j                  } | j                  }d} ||      }| }|sd	dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx} x}x}x}}t         j                  } d}| |k(  }|st        j                  d
|fd| |f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx} x}}y)uU   HIGH-2: quarantine/evidence 출력 경로가 watched 디렉터리(memory/events) 밖.zmemory/p0b_stateztassert %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.QUARANTINE_DIR_REL
}.startswith
}(%(py6)s)
}rB   )r{   r   r   r~   r   Nztassert %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.EVIDENCE_JSONL_REL
}.startswith
}(%(py6)s)
}zmemory/eventszxassert not %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.QUARANTINE_DIR_REL
}.startswith
}(%(py6)s)
}zxassert not %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.EVIDENCE_JSONL_REL
}.startswith
}(%(py6)s)
}ru   )z6%(py2)s
{%(py2)s = %(py0)s.EVENTS_DIR_REL
} == %(py5)sr   r   r   )rB   QUARANTINE_DIR_REL
startswithr   r   r   r   r   r   r   EVIDENCE_JSONL_RELEVENTS_DIR_RELr   )
r   r   r   r   r   r   r   r   r   r   s
             r+   'test_driver_outputs_outside_watched_dirr9    s   !!@!,,@-?@,-?@@@@@@@@3@@@3@@@!@@@,@@@-?@@@@@@@@@@!!@!,,@-?@,-?@@@@@@@@3@@@3@@@!@@@,@@@-?@@@@@@@@@@%%A%00AA0AAAAAAAAAAAsAAAsAAA%AAA0AAAAAAAAAAAAAA%%A%00AA0AAAAAAAAAAAsAAAsAAA%AAA0AAAAAAAAAAAAAA000000000000300030000000000000r-   evil_task_id)z../../../etc/task-pwnz../task-escapezsub/dir/task-xz..\task-winz/abs/task-absc                n   t        |       }t        |       t        d      }t        d      }t	        t
              }||d<   |dd|d<   t        ||      }t        |       t        j                  t        |      |||t        	      }|j                  }t        j                  }	||	k(  }
|
st        j                  d
|
fd||	f      dt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      dt!        j"                         v st        j$                  t              rt        j&                  t              ndt        j&                  |	      dz  }dd|iz  }t)        t        j*                  |            d x}x}
}	|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  }dd|iz  }t)        t        j*                  |            d x}x}
}|j.                  }t1        |      }d}||k(  }|s
t        j                  d
|fd||f      dt!        j"                         v st        j$                  t0              rt        j&                  t0              nddt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |      t        j&                  |      dz  }dd|iz  }t)        t        j*                  |            d x}x}x}}|j.                  }t1        |      }d}||k(  }|s
t        j                  d
|fd||f      dt!        j"                         v st        j$                  t0              rt        j&                  t0              nddt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |      t        j&                  |      dz  }dd|iz  }t)        t        j*                  |            d x}x}x}}t3        |      }t5        |j6                  j6                  j9                  d            }g }||k(  }|st        j                  d
|fd||f      d t!        j"                         v st        j$                  |      rt        j&                  |      nd t        j&                  |      d!z  }d"d#|iz  }t)        t        j*                  |            d x}}y )$NrX   r   rk   r   r   r   r   r   r   ru   r   r   rB   r   r   r   r   r   r   r   r   r   r   rx   r   r   r   r   r   z*.pickup.donez%(py0)s == %(py3)sleakedr{   r}   r  r   )r,   rE   rh   rn   r   r6   r=   rO   rB   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   r   re   rx   r1   listrA   rglob)r*   r:  r0   r   r   r;   r<   r   r   r   r   r   r   r   r   r   r   r   r   r   
result_dirr=  r#  s                          r+   &test_path_traversal_task_id_quarantinerB    sT    hDtl3Fo6F=!G%GI0<W$UG !dG,AG
//#a&tv#,.C ;;0#000;00000;000000030003000;000000#000#00000000000  1M1 M1111 M11111131113111 111M1111111||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!! T"J*##**00ABF6R<6R66Rr-   c                   t        |       }t        |       t        d      }t        d      }t	        |      }t        |       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      d	z  }	d
d|	iz  }
t%        t        j&                  |
            d x}x}}|j(                  }t        j*                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      d	z  }	d
d|	iz  }
t%        t        j&                  |
            d x}x}}|j,                  }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"                  |      t        j"                  |      dz  }
dd|
iz  }t%        t        j&                  |            d x}x}x}}y )NrX   r   rk   r   ru   r   r   rB   r   r   r   r   rt   r   rx   r   r   r   r   r   )r*   r0   r   r   r<   r   r   r   r   r   r   r   r   r   r   r   s                   r+   *test_normal_task_id_passes_traversal_guardrD    s$   hDtl3Fo6FdAG
//#a&tv#,.C;;0#000;00000;000000030003000;000000#000#00000000000-#++-+----+------3---3---------#---#---+-------||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c           
        t        |       }|dz  dz  dz  }|j                  j                  dd       |j                  d       t        j
                  }t        |      } ||      }d}||k(  }|sgt        j                  d|fd	||f      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      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                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}x}x}}t        j                  }t        |      } ||      }d}||u }|sgt        j                  d|fd||f      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      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                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}x}x}}t!               }
t	        j"                  t        |      |
d      }t%        |      }d}||k(  }|st        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  }dd|iz  }t        t        j                  |            d x}x}}|d   }|j&                  }t        j(                  }||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}|
j*                  }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                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            d x}x}x}}y )%Nr#   r(   r?   Tr%   s
    enabledr   ru   )zt%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.read_activation
}(%(py6)s
{%(py6)s = %(py3)s(%(py4)s)
})
} == %(py11)srB   rK   r0   r   r   r   Fr   )zq%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.is_activated
}(%(py6)s
{%(py6)s = %(py3)s(%(py4)s)
})
} is %(py11)s)rq   rs   rt   rw   rx   ry   rz   r   r   r   )zZ%(py3)s
{%(py3)s = %(py1)s.verdict
} == %(py7)s
{%(py7)s = %(py5)s.VERDICT_NOOP_DISABLED
})r|   r}   r   r   assert %(py9)sr   r   r   r   r   r   )r,   rA   r)   write_bytesrB   read_activationrK   r   r   r   r   r   r   r   r   is_activatedrh   r   rx   rZ   r   re   )r*   r0   rD   r   r   r   r   r   r   r   r   ry   r   r   r   r   r   r   r   r   r   s                        r+   %test_failsafe_activation_invalid_utf8rJ    s   hD(?W$';;DKKdT2() /s4y/y)/R/)R////)R//////3///3/////////s///s//////4///4///y///)///R////////CI/I&/%/&%////&%//////3///3/////////C///C////////////I///&///%///////FmmCINGw<1<1<133ww<11::::!:!::!:::::!::::::::::::::::::::!::::::::||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c                P   t        |       }|dz  dz  dz  }|j                  j                  dd       |j                  d       t        j
                  }d}t        |      }t        |      } ||||      }d}||u }	|	st        j                  d	|	fd
||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      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                  |      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                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}x}x}x}x}	}y )Nr#   r$   zcallback_4tuple_index.jsonlTr%   s    not utf8r   Fr   )z%(py14)s
{%(py14)s = %(py2)s
{%(py2)s = %(py0)s._dedupe_hit
}(%(py4)s, %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}, %(py12)s
{%(py12)s = %(py9)s(%(py10)s)
})
} is %(py17)srB   rK   ledgerr0   )r{   r   r   r   r~   r   r   r   r  r   py17r   r   )r,   rA   r)   rG  rB   _dedupe_hitrK   r   r   r   r   r   r   r   r   )r*   r0   rL  r   r   r   @py_assert11r   @py_assert16r   r   @py_format20s               r+   (test_failsafe_dedupe_ledger_invalid_utf8rR    s   hDH_x'*GGF
MMt4
+, ??G:Gs6{GCIG?:{I>G%G>%GGGG>%GGGGGG3GGG3GGG?GGG:GGGGGGsGGGsGGGGGG6GGG6GGG{GGGGGGCGGGCGGGGGGGGGGGGIGGG>GGG%GGGGGGGGr-   c                   dd l t        |       }t        |       t        |      dz  }|j	                  dd       t        |       fd}|j                  t        j                   d|       t        j                  t        |      t        |      d       }d }||u}|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      dz  }dd|iz  }	t!        t        j"                  |	            d x}}g }d}|j$                  }
 |
       }||v }|}|sd}||v }|}|st        j                  d|fd||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |
      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
dz  }dd|iz  }|j'                  |       t        j(                  |d      i z  }dd|iz  }t!        t        j"                  |            d x}x}x}x}x}
x}x}}t+               }t        j,                  t        |      t        |      |t.              }|j0                  }t        j2                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d t        j                         v st        j                  t              rt        j                  t              nd t        j                  |      d!z  }d"d#|iz  }t!        t        j"                  |            d x}x}}|j4                  }t7        |      }d}||k(  }
|
s
t        j                  d|
fd$||f      d%t        j                         v st        j                  t6              rt        j                  t6              nd%d&t        j                         v st        j                  |      rt        j                  |      nd&t        j                  |      t        j                  |      t        j                  |      d'z  }d(d)|iz  }t!        t        j"                  |            d x}x}x}
}y )*Nr   r   r   r3   r4   c                &    j                  d      )Nzsimulated shutil.ErrorErrorsrcdst_shs     r+   _boomz4test_failsafe_quarantine_shutil_error.<locals>._boom#  s    ii011r-   mover
   )z%(py0)s is not %(py3)smsgr>  r  r   shutilu   실패r   )zD%(py3)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.lower
}()
})r}   r   r   r   z%(py11)sr   )z%(py14)s in %(py16)s)r   r   z%(py18)spy18rt   zassert %(py21)spy21r   ru   r   r   rB   r   r   r   r   rx   r   r   r   r   )r^  r,   rE   r1   r7   rO   setattrrB   _quarantine_moverK   r   r   r   r   r   r   r   r   lowerr_   _format_booloprh   r   r   rZ   r   re   rx   )r*   monkeypatchr0   r<   r[  r]  r   r   r#  r   r   r   r   r   r   r   r   r   @py_format17@py_format19rQ  @py_format22r   r   r   r   r   r   r   r   rZ  s                                 @r+   %test_failsafe_quarantine_shutil_errorri    s   hDtD22ALLgL&G2

FE2 

s1vs4y$
7C3d?3d33d585syy5y{58{"5h5h#o55558{5558555555s555s555y555{5555555h#555h555555#555#555555555555555 F
//#a&s4yFY
WC;;0#000;00000;000000030003000;000000#000#00000000000||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c                P   t        |       }t        |       t               }t               }t	        |      dz  }|j                  dd       t        j                  t        |      t        |      ||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      d	t        j                         v st        j                   t              rt        j"                  t              nd	t        j"                  |      d
z  }	dd|	iz  }
t%        t        j&                  |
            d x}x}}|j(                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            d x}x}}|j*                  }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"                  |      t        j"                  |      dz  }
dd|
iz  }t%        t        j&                  |            d x}x}x}}|j*                  }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"                  |      t        j"                  |      dz  }
dd|
iz  }t%        t        j&                  |            d x}x}x}}|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}}|dz  dz  d z  dz  }|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}x}}y )#Nr   '{"task_id": "task-999", "completion_sigr3   r4   r   ru   z[%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_NOOP_NOT_READY
}r   rB   r   r   r   Fr   r   r   r   r   r   r   rx   r   r   r   r   r   r  r<   r   r#   r   r   r   qfile)r,   rE   rh   rn   r1   r7   rB   r   rK   r   rZ   VERDICT_NOOP_NOT_READYr   r   r   r   r   r   r   r   r   re   rx   r   )r*   r0   r   r   r<   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rm  s                       r+   %test_partial_json_recent_mtime_defersro  7  s   hDtFFD22ALL:WLM //#a&s4yFf#,.C;;4#444;44444;444444434443444;444444#444#44444444444??#e#?e####?e######3###3###?###e#######||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!888::118:8Ok)L8;QQE|||~~uu|~r-   c           
     
   t        |       }t        |       t               }t        |      dz  }|j	                  dd       t        |d       t        j                  t        |      t        |      |t              }|j                  }t        j                  }||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                   |      rt        j"                  |      nd
t        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      dz  }dd|iz  }	t%        t        j&                  |	            d x}x}}|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  }dd|iz  }t%        t        j&                  |            d x}x}}
|j*                  }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"                  |
      t        j"                  |      dz  }	dd|	iz  }t%        t        j&                  |            d x}x}
x}}|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}x}}d}||z  }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"                  |      t        j"                  |      t        j"                  |      t        j"                  |      d#z  }t%        t        j&                  |            d x}x}x}
x}x}x}x}x}x}}y )$Nr   rk  r3   r4   
   rM   r   ru   r   r   rB   r   r   r   r   r   r   r   r   r   r   rx   r   r   r   r   r   r<   r   r#   r   r   vassert %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = ((((%(py0)s / %(py2)s) / %(py5)s) / %(py8)s) / %(py11)s).exists
}()
}r0   r   )r,   rE   rh   r1   r7   rO   rB   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   r   re   rx   r   )r*   r0   r   r<   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rf  s                          r+   -test_old_invalid_json_quarantines_after_gracert  R  s=   hDtFD22ALL:WLMB
//#a&s4yFY
WC;;0#000;00000;000000030003000;000000#000#00000000000  0L0 L0000 L00000030003000 000L0000000||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!xxxzz>>qqxz[D8O[k[Ok)[L[)L8[;Q[8;QQ[QYY[Y[[[[[[[[D[[[D[[[8[[[k[[[L[[[;Q[[[Y[[[[[[[[[[[[r-   c           
     >   t        |       }t        |       t               }t        |      dz  }|j	                  d       t        j                  t        |      t        |      |t              }|j                  }t
        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dt        j                         v st        j                  t
              rt        j                   t
              ndt        j                   |      dz  }d	d
|iz  }	t#        t        j$                  |	            d x}x}}|j&                  }d}
||
u }|st        j                  d|fd||
f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      t        j                   |
      dz  }dd|iz  }t#        t        j$                  |            d x}x}}
|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       t        j                  t        |      t        |      |t              }|j                  }t
        j,                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dt        j                         v st        j                  t
              rt        j                   t
              ndt        j                   |      dz  }d	d
|iz  }	t#        t        j$                  |	            d x}x}}|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  }dd|iz  }t#        t        j$                  |            d x}x}}
|j0                  }t3        |      }
d}|
|k(  }|s
t        j                  d|fd|
|f      dt        j                         v st        j                  t2              rt        j                   t2              nddt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      t        j                   |
      t        j                   |      dz  }	dd |	iz  }t#        t        j$                  |            d x}x}
x}}|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}x}}d"}||z  }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                   |      t        j                   |      t        j                   |      t        j                   |      d'z  }t#        t        j$                  |            d x}x}x}
x}x}x}x}x}x}}y )(Nr   s"   {"task_id": "task-999"   truncatedr   ru   rl  	rec_deferrB   r   r   r   Fr   r   r   r   r   r  r<   r   rq  rr  r   rec_q	null_byter   r   r   rx   r   r   r   r   r   r#   r   r   rs  r0   r   )r,   rE   rh   r1   rG  rB   r   rK   r   rZ   rn  r   r   r   r   r   r   r   r   r   r   rO   r   r   re   rx   )r*   r0   r   r<   rv  r   r   r   r   r   r   r   r   r  rw  r   r   r   r   r   r   r   r   r   rf  s                            r+   $test_null_byte_defer_then_quarantinery  g  s   hDtF 	D22AMM=>ASY&S\]I: : :: ::::: :::::::9:::9::::::::::::::: ::::::::  )E) E)))) E))))))9)))9))) )))E)))))))888::118: 	BOOCFTfyYE==2C222=22222=222222252225222=222222C222C22222222222""1k1"k1111"k11111151115111"111k1111111||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!xxxzz>>qqxz[D8O[k[Ok)[L[)L8[;Q[8;QQ[QYY[Y[[[[[[[[D[[[D[[[8[[[k[[[L[[[;Q[[[Y[[[[[[[[[[[[r-   c                	   ddl m  t        |       }t        |      dz  }|j                  t	        j
                  t              d       fd}t        j                  t        |      |t              \  }}d}||u }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }dd|iz  }	t#        t        j$                  |	            d x}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }dd|iz  }	t#        t        j$                  |	            d x}}t'        |d       t        j                  t        |      |t              \  }
}d}|
|u }|st        j                  d	|fd
|
|f      dt        j                         v st        j                  |
      rt        j                   |
      ndt        j                   |      dz  }dd|iz  }	t#        t        j$                  |	            d x}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }dd|iz  }	t#        t        j$                  |	            d x}}t        j                  t        t        |      dz        |t              \  }}d}||u }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }dd|iz  }	t#        t        j$                  |	            d x}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }dd|iz  }	t#        t        j$                  |	            d x}}y )Nr   datetimer   r3   r4   c                 B     j                  t        j                        S rQ   )nowrB   KSTr{  s   r+   rT   z+test_check_readiness_unit.<locals>.<lambda>  s    HLL) r-   )clockr   Fr   z%(py0)s is %(py3)sreadyr>  r  r   recent_mtimeru   r<  reasonrq  rr  Tready2reason2znope.result.jsonready3	stat_failreason3)r|  r,   r1   r7   r8   r9   r6   rB   _check_readinessrK   r   r   r   r   r   r   r   r   r   rO   )r*   r0   r<   r  r  r  r   r   r#  r   r  r  r  r  r|  s                 @r+   test_check_readiness_unitr    s   !hDD22ALLM*WL=)E ((QuyQME65E>5E55E##6^####6^######6###6###^####### 	B**3q6SOFG6T>6T66T7g7g77g **3{4/@CU/U+V16LOFG6U?6U66U!!7k!!!!7k!!!!!!7!!!7!!!k!!!!!!!r-   c                   t        |       }t        |       t        d      }t        d      }t	        |      }t        |       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      d	z  }	d
d|	iz  }
t%        t        j&                  |
            dx}x}}|j(                  } |       }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            dx}x}x}}|dz  dz  dz  }d}||z  }|j(                  } |       }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      t        j"                  |      t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            dx}x}x}x}x}}t+        j*                  t        t-        |      dz              }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      d z  }d!d"|iz  }t%        t        j&                  |            dx}}y)#u   WAKE_BUILT 도달 시 원본 memory/events 에서 삭제 + processed 에 존재.
    glob 재매칭 0 입증 (무한 재트리거 소멸 확인).rX   r   rk   r   ru   r   r   rB   r   r   r   NFr   zE%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
} is %(py7)sr<   r{   r   r   r   rF  r   r#   r   	processedr   TzR%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
} is %(py10)sr{   r   r   r   r   r  r  task-*.result.jsonr<  	remainingr>  r  r   )r,   rE   rh   rn   r=   rO   rB   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   r   globr1   )r*   r0   r   r   r<   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r"  r  r   r#  r   s                           r+   +test_wake_built_moves_result_out_of_watchedr    s    hDtl3Fo6FdAG
//#a&tv#,.C;;0#000;00000;000000030003000;000000#000#00000000000 888:::118: x+-;I.@I..@.66@68@D@8D@@@@8D@@@@@@I@@@I@@@.@@@6@@@8@@@D@@@@@@@@ 		#k$/2FFGHI9?999r-   c                   t        |       }t        |       t               }t        d      }t	        |      }t        |       t        |      dz  }|j                  dd       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }	|	st        j                  d|	fd	||f      d
t!        j"                         v st        j$                  |      rt        j&                  |      nd
t        j&                  |      dt!        j"                         v st        j$                  t              rt        j&                  t              ndt        j&                  |      dz  }
dd|
iz  }t)        t        j*                  |            dx}x}	}|j,                  } |       }	d}|	|u }|st        j                  d|fd|	|f      dt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |	      t        j&                  |      dz  }dd|iz  }t)        t        j*                  |            dx}x}	x}}|dz  dz  dz  }d}||z  }	|	j,                  } |       }d}||u }|st        j                  d|fd||f      dt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |      t        j&                  |      t        j&                  |      dz  }dd|iz  }t)        t        j*                  |            dx}x}	x}x}x}}t/        j.                  t        t        |      d z              }g }||k(  }|st        j                  d|fd!||f      d"t!        j"                         v st        j$                  |      rt        j&                  |      nd"t        j&                  |      d#z  }d$d%|iz  }t)        t        j*                  |            dx}}y)&uJ   dedupe done marker 존재 시 PICKUP_SKIP → 원본 processed 로 이동.rk   r   r   r   r3   r4   r   ru   r   r   rB   r   r   r   NFr   r  r<   r  rF  r   r#   r   r  r   Tr  r  r  r  r  r<  r  r>  r  r   )r,   rE   rh   rn   r=   rO   r1   r7   rB   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   r   r  )r*   r0   r   r   r<   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r"  r  r   r#  r   s                            r+   &test_pickup_skip_done_marker_moves_outr    s   hDtFo6FdAG!77F
fw/
//#a&tv#,.C;;1#111;11111;111111131113111;111111#111#11111111111 888:::118: x+-;I.@I..@.66@68@D@8D@@@@8D@@@@@@I@@@I@@@.@@@6@@@8@@@D@@@@@@@@ 		#k$/2FFGHI9?999r-   c                b	   t        |       }t        |       t        d      }t        d      }t	        |      }t        |       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      d	z  }	d
d|	iz  }
t%        t        j&                  |
            dx}x}}|j(                  } |       }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            dx}x}x}}|dz  dz  dz  }d}||z  }|j(                  } |       }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      t        j"                  |      t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            dx}x}x}x}x}}|j*                  }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"                  |      t        j"                  |      d!z  }
d"d#|
iz  }t%        t        j&                  |            dx}x}x}}y)$uH   pickup_fn 이 SKIP_TERMINAL 반환 시 PICKUP_SKIP → processed 이동.SKIP_TERMINALr   rk   r   ru   r   r   rB   r   r   r   NFr   r  r<   r  rF  r   r#   r   r  r   Tr  r  r  r  rt   r   rx   r   r   r   r   )r,   rE   rh   rn   r=   rO   rB   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   r   re   rx   )r*   r0   r   r   r<   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r"  r   r   s                         r+   2test_pickup_skip_terminal_from_pickup_fn_moves_outr    s   hDto6Fo6FdAG //#a&tv#,.C;;1#111;11111;111111131113111;111111#111#11111111111 888:::118: x+-;I.@I..@.66@68@D@8D@@@@8D@@@@@@I@@@I@@@.@@@6@@@8@@@D@@@@@@@@ ||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!r-   c                	   t        |       }t        |       t               }t               }t	        |      dz  }|j                  dd       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      d	t        j                         v st        j                   t              rt        j"                  t              nd	t        j"                  |      d
z  }	dd|	iz  }
t%        t        j&                  |
            dx}x}}|j(                  } |       }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            dx}x}x}}|dz  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+        j*                  t        t	        |      dz              }t-        |      }d}||k(  }|st        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  }	dd|	iz  }
t%        t        j&                  |
            dx}x}}y) u   최근 mtime(부분 JSON) → NOOP_NOT_READY. 파일 잔류 + glob 길이 1 입증.
    DEFER 는 terminal 아님 — 의도적 잔류.r   rk  r3   r4   r   ru   rl  r   rB   r   r   r   NTr   r  r<   r  rF  r   r#   r   r  zQassert not %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
}r   r  rt   rw   rx   r  rz   )r,   rE   rh   rn   r1   r7   rB   r   rK   r   rZ   rn  r   r   r   r   r   r   r   r   r   r  rx   )r*   r0   r   r   r<   r   r   r   r   r   r   r   r   r   r  r   r   r  r   s                      r+   test_defer_stays_for_retriggerr    s    hDtFFD22ALL:WLM //#a&tv#,.C;;4#444;44444;444444434443444;444444#444#44444444444 888:::118: x+-;I2<	22<2::<:<<<<<<<<<<<	<<<	<<<2<<<:<<<<<<<<<<< 		#k$/2FFGHIy>Q>Q>Q33yy>Qr-   c                   t        |       }t        |       t        d      }t        d      }t	        |      }t        |       t        j                  |||dt              }t        j                  t        t        |      dz              }g }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                   |      rt        j"                  |      nd	t        j"                  |      d
z  }	dd|	iz  }
t%        t        j&                  |
            dx}}|D cg c]"  }|j(                  t        j*                  k(  s!|$ }}t-        |      }d}||k(  }|st        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  }dd|iz  }t%        t        j&                  |            dx}x}}yc c}w )us   scan_once WAKE_BUILT 완료 후 watched(memory/events) 에 result.json 0건.
    무한 재트리거 소멸 입증.rX   r   rk   Fr  r  ru   r<  r  r>  r  r   Nrt   rw   rx   wake_recordsrz   r   r   )r,   rE   rh   rn   r=   rO   rB   r   r   r  rK   r1   r   r   r   r   r   r   r   r   rZ   r   rx   )r*   r0   r   r   r<   ry   r  r   r   r#  r   rr  r   r   r   r   s                    r+   )test_scan_once_no_glob_rematch_after_waker    s    hDtl3Fo6FdAGmmG 		#k$/2FFGHI9?999  'N!!))s7M7M*MANLN|!!!!!!!!!!!!3!!!3!!!!!!|!!!|!!!!!!!!!!!!! Os   7"I1I1c                D   ddl t        |       }t        |       t        d      }t	        d      }t        |      }t        |       d }fd}|j                  t        j                  d|       |j                  t        j                   d	|       t        j                  t        |      |||t        
      }|j                  }	t        j                  }
|	|
k(  }|st        j                   d|fd|	|
f      dt#        j$                         v st        j&                  |      rt        j(                  |      ndt        j(                  |	      dt#        j$                         v st        j&                  t              rt        j(                  t              ndt        j(                  |
      dz  }dd|iz  }t+        t        j,                  |            dx}	x}}
|j.                  }	d}|	|u}|st        j                   d|fd|	|f      dt#        j$                         v st        j&                  |      rt        j(                  |      ndt        j(                  |	      t        j(                  |      dz  }dd|iz  }t+        t        j,                  |            dx}	x}}y)u   os.replace / shutil.move 둘 다 실패해도 process_one 크래시 없이 반환.
    rec.verdict==WAKE_BUILT 유지, rec.error 에 이동 실패 메시지 기록.r   NrX   r   rk   c                    t        d      )Nzsimulated os.replace failure)OSError)rX  rY  s     r+   boom_oserrorz1test_terminal_move_failsafe.<locals>.boom_oserrorD  s    455r-   c                &    j                  d      )Nzsimulated shutil.move failurerU  rW  s     r+   boom_shutilerrorz5test_terminal_move_failsafe.<locals>.boom_shutilerrorG  s    ii788r-   r2  r\  r   ru   r   r   rB   r   r   r   r
   )z1%(py2)s
{%(py2)s = %(py0)s.error
} is not %(py5)sr   r   r   )r^  r,   rE   rh   rn   r=   rO   ra  rB   rI   r   rK   r   rZ   r   r   r   r   r   r   r   r   r   error)r*   re  r0   r   r   r<   r  r  r   r   r   r   r   r   r   r   r   rZ  s                    @r+   test_terminal_move_failsafer  7  s    hDtl3Fo6FdAG69 	<8

F,<= //#a&tv#,.C ;;0#000;00000;000000030003000;000000#000#00000000000 99 D 9D    9D      3   3   9   D       r-   c                   t        |       }t        |      dz  }|j                  t        j                  t
              d       t        j                  t        |      t        |      d      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                   |            dx}}|dz  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}
}t        |      dz  }t%        t
              }d|d<   |j                  t        j                  |      d       t        j                  t        |      t        |      d      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                   |            dx}}t'        j(                  t        |            }|D cg c]  }|j+                  d      s| }}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t-        |       d      dz   d|iz  }t        t        j                   |            dx}x}
}yc c}w )u|   동일 basename 두 번 _quarantine_move: 첫 파일 보존 + 두 번째는 suffix 별도 파일.
    덮어쓰기 0 검증.r   r3   r4   Nr   r  err1r>  r  r   r#   r   r   r   r   r   r   retryerr2r  r  rx   matchingrz   u(   overwrite 방지 실패: quarantine 에 z (u   개만 존재)z
>assert %(py8)sr   )r,   r1   r7   r8   r9   r6   rB   rb  rK   r   r   r   r   r   r   r   r   r   r   rI   listdirr6  rx   _format_assertmsg)r*   r0   p1r  r   r   r#  r   r   r   r   r   r   p2payload2r  	all_filesfr  r   r   r   s                         r+   $test_quarantine_overwrite_protectionr  [  s.    hD 
T	3	3BMM$**]+gM>BTD9D44<44444(?[(<7D)3D))3)113133333333D333D333)33313333333333 
T	3	3BM"HHWMM$**X&M9BTD9D44<44444 

3t9%I$Ma5K(LMHMx= A =A   =A                                38,bX~^      Ns   Q/1Q/c                    t        t              j                         j                  d   } | dz  dz  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}||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}||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}||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}||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}}y)u   scripts/anu_pickup_entrypoint.sh 정적 분석:
    /tmp 고정 경로 미사용, XDG_RUNTIME_DIR 우선, mkdir -p 보장,
    symlink 거부 가드(-L), flock single-flight 유지.r   r+  r,  r3   r4   z/tmpr  )z%(py1)s not in %(py3)sr.  r  u?   /tmp 고정 경로가 entrypoint 에 있어서는 안 됩니다z
>assert %(py5)sr   Nr/  r   r  u6   XDG_RUNTIME_DIR 이 entrypoint 에 있어야 합니다zmkdir -pu/   mkdir -p 가 entrypoint 에 있어야 합니다z-LuF   symlink 거부 가드(-L 검사)가 entrypoint 에 있어야 합니다r0  u:   flock single-flight 가 entrypoint 에 있어야 합니다)r   r   r1  r&   r  r   r   r   r   r   r   r  r   r   )script_rootr.  r   r   r#  r   s         r+   -test_entrypoint_lock_no_tmp_and_symlink_guardr  |  sD    x.((*2215K
	
!$>
>	I	ISZ	I	[B ^6^^^6^^^6^^^^^^^^^^^^^^^^^^^^ \"\\\\\\\\\\\\\\\\\\\$\\\\\\\ N:NNN:NNN:NNNNNNNNNNNNNNNNNNNN _42:___42___4______2___2___________ V7b=VVV7bVVV7VVVVVVbVVVbVVVVVVVVVVVr-   )r*   r   returnr   )r0   r   r  r   )r   N)r0   r   r:   rK   r  r   )r0   r   r  None)g      $@)rM   floatr  r  )rX   )rZ   rK   )rk   )l__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r  r8   rI   sysr`   pathlibr   pytestr   r1  r&   _ROOTrK   rL   insertimportlib.utilutil_ilu
_real_initmodulesr  _cachedgetattrr?  r6  _kspec_from_file_locationr   r   r   r   r   loaderr   r   r   r   r   r   r   r   r   r_   r   rf  rd  r   rQ  r   r   module_from_spec_pkgexec_moduler   r   rB   r6   r,   r1   r=   rE   rH   rG   rO   r   rh   rn   r   r   r   r   r   r   r   r   r   r%  r)  r3  r9  markparametrizerB  rD  rJ  rR  ri  ro  rt  ry  r  r  r  r  r  r  r  r  r  )rS   s   0r+   <module>r     s1   #     	 
    	X ((+u:SXXHHOOAs5z" Z-/

++//*
%
?ww
B7=2#j/Qs{{+\QqJ!,,{B[q\ KKO(D((JC
@R<S;TE :9599T9T!9999599999599959999999999T9999999999999T9999999999999 4  'D"CKK
	LLT" - 2&0I&E & !	.("*"<]6"$"&B*"*",.$$T#&	1  * @"&"*H":6\*\6"8<@":>">!HBWe ]s   $N N