
    @jl                       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
mZ ddlZddlZddlZddlmZ ddlmZ ddlZ ee      j-                         j.                  d   Zedz  dz  Z ej4                  d	e      Zg ZdZeeuZeZerej@                  Z!dZ"e!e"uZ#e#ZesB ejH                  d
efdeef      d ejJ                         v s ejL                  e      r ejN                  e      nd ejN                  e      dz  Z(dde(iz  Z)ejU                  e)       er ejH                  d
e#fde!e"f      d ejJ                         v s ejL                  e      r ejN                  e      nd ejN                  e!       ejN                  e"      dz  Z+dde+iz  Z,ejU                  e,        ejZ                  ed      i z  Z.dde.iz  Z/ e0 ejb                  e/            dxZxZxZxZxZ!xZ#Z" ejd                  e      Z3e3ejh                  d	<   ej@                  jk                  e3       d<dZ6ddd=dZ7d>dZ8d Z9d Z:d Z;d Z<d Z=d  Z>d! Z?d" Z@d# ZAd$ ZBd% ZCd& ZDd' ZEddlFZGd?d(ZHd) ZId* ZJd+ ZKd, ZLd- ZMd. ZNd/ ZOd0 ZPd1 ZQd2 ZRd3 ZSd4 ZTd5 ZUd6 ZVd7 ZWd8 ZXd9 ZYeZd:k(  r% ej                   ej                  ed;g             yy)@u\  task-2777 — read-only anu_control_status.py (자동화 조종석) 회귀 테스트.

검증 불변식(작업지시서 + spec §6):
  ① read-only 보장 — 격리 tmp root 실행 전후 모든 파일의 sha256+mtime 불변 ·
     파일 생성 0 · append 0 (driver_runs/flag/ledger/state 무변경).
  ② absent graceful — state/audit/jsonl/ledger 부재 시 crash 0.
  ③ level 판정 정확 — 전 flag OFF + LIVE_PENDING 1 + LIVE_PROCESSED 0 + ACTIVE=false
     → L2_DONE_L3_BLOCK_EVIDENCE_ACTIVE_FALSE.
  ④ JSON schema 안정 — 필수 key 존재 · 값 타입 안정.
  ⑤ raw key 미출력 — sealed key env(sentinel) 가 stdout/json/report 에 0.
  ⑥ no driver execution — driver_runs.jsonl 신규 append 0(① 로 입증).
  ⑦ no flag write — driver/event_strategy/callback/epoch/kill 생성·수정 0.
  ⑧ dirty count — git read-only 명령만(비-git tmp root → 'unknown', mutation 0).
  ⑨ human summary smoke · ⑩ --json smoke · ⑪ cron UNKNOWN(raw key 미사용).

★ read-only: 본 테스트 자체도 production state 를 건드리지 않는다. 전부 tmp root.
    )annotationsN)redirect_stdout)Path   scriptszanu_control_status.pyanu_control_status)is not)z%(py2)s is not %(py5)s_specpy2py5%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14%(py16)spy16zassert %(py19)spy19c                d    | j                   j                  dd       | j                  |d       y )NTparentsexist_okutf-8encoding)parentmkdir
write_text)pathtexts     D/home/jay/workspace/tests/regression/test_anu_control_status_2777.py_writer#   *   s)    KKdT2OOD7O+    Twith_sourcesc          	     >   | dz  }|j                  dd       |s|S t        |dz  dz  dz  d       |dz  dz  d	z  }t        j                  d
ddddd      t        j                  ddd ddd      g}t        |dj	                  |      dz          t        |dz  dz  dz  t        j                  ddd      dz          t        d      D ]!  }t        |dz  dz  dz  dd|z    dz  d       # t        d       D ]!  }t        |dz  dz  d!z  dd"|z    dz  d       # |S )#NrepoTr   memorystatep0b_driver_enabled	disabled
	p0b_statedriver_runs.jsonlz2026-06-28T10:00:00+09:00LIVE_PENDING_OWNER_PROOFSELFz	scan-liveenabled)tsverdictowner_key_classdriver
activationz2026-06-28T12:59:18+09:00NOOP_DISABLEDzsystemd-pathdisabled
zcallback_launch_audit.jsonlz2026-06-26T00:00:00+09:00
REAL_FIRED)r2   event   reports p0b_inbox_backlog_archive_260627ztask-i  z.result.jsonz{}r   )phase_x_pending_fixture_quarantine_260628i  )r   r#   jsondumpsjoinrange)tmp_pathr&   rootrunslinesis         r"   _build_rootrI   /   s|   fDJJtdJ+ 4(?W$';;\J (?[(+>>D

-:T%I
 	 	

-/#~Z
 		E 45!D() x+%(EE

5MNQUU 1X 
8Oi'*LLdQhZ|,-	

 1X 
8Oi'*UUdQhZ|,-	

 Kr$   c                T   i }t        | j                  d            D ]  }|j                         s|j                         }|j	                         }t        j                  |      j                         |j                  |j                  f|t        |j                  |             <    |S )N*)sortedrglobis_file
read_bytesstathashlibsha256	hexdigestst_mtime_nsst_sizestrrelative_to)rE   snappdatasts        r"   	_snapshotr\   a   s    DDJJsO$ 99;<<>DBt$..0

.DQ]]4()*	 Kr$   c                
   t        | d      }t        |      }t        j                  t	        |            }t        j                  |      }t        j                  |      }t        j                         }t        |      5  t        j                  dt	        |      g      }t        j                  dt	        |      dg      }d d d        g }d}	|	k(  }
|
}|
r	d}|k(  }|}|sXt        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  }|j#                  |       |
rt        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  }|j#                  |       t        j$                  |d      i z  }dd|iz  }t'        t        j(                  |            d x}x}x}
x}	x}}t        |      }|j*                  } |       }	t-        |	      }|j*                  } |       }t-        |      }||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                   |	      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  }t        j.                  d      dz   d|iz  }t'        t        j(                  |            d x}x}	x}x}x}x}}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      nddt        j                         v st        j                  |      rt        j                   |      nddz  }t        j.                  d      dz   d|iz  }t'        t        j(                  |            d }y # 1 sw Y   xY w) NTr%   --root--jsonr   ==z%(py2)s == %(py5)src1r   r   r   z%(py9)s == %(py12)src2r   py12%(py14)sr   assert %(py17)spy17)z%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.keys
}()
})
} == %(py16)s
{%(py16)s = %(py9)s(%(py14)s
{%(py14)s = %(py12)s
{%(py12)s = %(py10)s.keys
}()
})
}setbeforeafter)
py0py1py3r   r   r   py10rg   r   r   u*   파일 집합 변동(생성/삭제) 발생z
>assert %(py18)spy18)z%(py0)s == %(py2)srn   r   u/   파일 내용/mtime 변경(append/write) 발생
>assert %(py4)spy4)rI   r\   acsbuild_statusrV   format_jsonformat_humanioStringIOr   main
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanationkeysrk   _format_assertmsg)rD   rE   rl   rZ   _bufrc   re   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert11@py_assert10@py_format6@py_format8@py_format13@py_format15@py_format16@py_format18rm   @py_assert2@py_assert6@py_assert13@py_assert15@py_assert8@py_format17@py_format19@py_format3@py_format5s                                 r"    test_readonly_invariant_no_writer   p   s   xd3Dt_F CI&DAA
++-C		 8hh#d),-hh#d)X678 !! 3!8 q q    3!      3   3   !       q            q              dOE{{`{}`3}`UZZ`Z\`\!2`!22```!2``````3```3``````v```v```{```}``````````````````U```U```Z```\```!2```4`````````U?MMM6UMMMMMM6MMM6MMMMMMUMMMUMMMMMMMMMMM8 8s    AU00U:c           
        t        | d      }t        |      }t        j                  t	        |            }t        |t              }|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d }|d   }d}||u }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}t        j                  } ||      }	t        |	t              }
|
s|ddt        j                         v st        j                  t
              rt        j                  t
              nd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t        j                  |	      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      dz  }t        t        j                  |            d x}x}	}
t        j                   } ||      }	t        |	t              }
|
s|ddt        j                         v st        j                  t
              rt        j                  t
              nd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t        j                  |	      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      dz  }t        t        j                  |            d x}x}	}
t        |      }||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                  |      d!t        j                         v st        j                  |      rt        j                  |      nd!d"z  }d#d$|iz  }t        t        j                  |            d x}}y )%NFr%   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancerZ   dictrn   ro   r   ru   activeisz%(py1)s is %(py4)sro   ru   assert %(py6)spy6flagsr5   r8   r`   z%(py1)s == %(py4)scountsr:   r   LIVE_PROCESSEDr/   archivezuassert %(py9)s
{%(py9)s = %(py0)s(%(py6)s
{%(py6)s = %(py3)s
{%(py3)s = %(py1)s.format_human
}(%(py4)s)
}, %(py7)s)
}rv   rV   )rn   ro   rp   ru   r   r   r   ztassert %(py9)s
{%(py9)s = %(py0)s(%(py6)s
{%(py6)s = %(py3)s
{%(py3)s = %(py1)s.format_json
}(%(py4)s)
}, %(py7)s)
}z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sr\   rE   rl   rn   ro   rp   r   zassert %(py7)sr   )rI   r\   rv   rw   rV   r   r   r   r   r}   r   r   r   r   r~   ry   rx   )rD   rE   rl   rZ   r   r   r   r   @py_format7@py_assert5r   @py_format10r   r   r   s                  r"   %test_absent_sources_graceful_no_crashr      s   xe4Dt_FCI&DdD!!!!!!!!:!!!:!!!!!!d!!!d!!!!!!D!!!D!!!!!!!!!!>"U">U"""">U""">"""U"""""""="0j0"j0000"j000"000j0000000>,',1,'1,,,,'1,,,',,,1,,,,,,,>*+0q0+q0000+q000+000q0000000>45::5::::5:::5::::::::::>)$))$))))$)))$))))))))))&&2&t,2:,c22222222:222:222222c222c222&222222t222t222,222222c222c2222222222oo1od+1:+S11111111:111:111111c111c111o111111d111d111+111111S111S1111111111T?$?f$$$$?f$$$$$$9$$$9$$$$$$T$$$T$$$?$$$$$$f$$$f$$$$$$$r$   c                v   t        | d      }t        j                  t        |            }|d   }d}||u }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}|d
   d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}|d
   d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}|d
   d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}|d
   d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}|d
   d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}y )NTr%   r   Fr   r   r   r   r   r   r/      r`   r   r   r   r:   r   r<   pending_fixture_quarantiner   automation_level&L2_DONE_L3_BLOCK_EVIDENCE_ACTIVE_FALSElast_verdictr7   	rI   rv   rw   rV   r}   r~   r   r   r   rD   rE   rZ   r   r   r   r   r   s           r"   test_level_l2_done_l3_blockr      s   xd3DCI&D>"U">U"""">U""">"""U""""""">45::5::::5:::5::::::::::>*+0q0+q0000+q000+000q0000000>,',1,'1,,,,'1,,,',,,1,,,,,,,>)$))$))))$)))$))))))))))>67<1<71<<<<71<<<7<<<1<<<<<<<"#O'OO#'OOOOO#'OOOO#OOO'OOOOOOOO2?2?2222?222222?2222222r$   c            
        dddddd} t         j                  }d}ddd} ||| |      }d}||k(  }|s2t        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                  |       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}}t         j                  }d}ddd} ||| |      }d}||k(  }|s2t        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                  |       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}}t         j                  }d}ddd} ||| |      }d}||k(  }|s2t        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                  |       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}}t         j                  }d}i | ddi}	ddd}
 |||	|
      }d}||k(  }|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                  |      t        j                  |	      t        j                  |
      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}	x}
x}x}}y )Nr8   F)r5   event_strategycallbackepoch_presentkillr   r   )r/   r   )r   r   r   r   r`   )zz%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.compute_level
}(active=%(py4)s, flags=%(py5)s, counts=%(py7)s)
} == %(py12)srv   
base_flags)rn   r   ru   r   r   r   rg   zassert %(py14)sr   L0_L2_READY_ACTIVE_FALSEINDETERMINATE_REVIEW_REQUIREDTr5   r1   )z|%(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.compute_level
}(active=%(py4)s, flags=%(py6)s, counts=%(py8)s)
} == %(py13)s)rn   r   ru   r   py8rq   py13zassert %(py15)spy15)
rv   compute_levelr}   r~   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   @py_assert7@py_assert9@py_assert12@py_format14r   s                  r"   test_level_compute_unit_casesr      s'   5J
  22,-C2JC 2 
22  
22 2 2 !2 12  
22 2 ,262 2 21  2 2 )2	  2 2 )2	  2 2 )2	 2 2 ,262 2 21 '2 2 )2	 '2 2 )2	 D2 2 )2	 2 2 )2		12 2 2 2 212 2 2
  $$,-C$JC $ 
$$  
$$ $ $ $#$  
$$ $ $V$ $ $#  $ $ $)  $ $ $)  $ $ $) $ $ $V$ $ $# '$ $ $) '$ $ $) D$ $ $) $ $ $)	#$ $ $ $ $#$ $ $
  )),-C)JC ) 
))  
)) ) ) )()  
)) ) #)&) ) )(  ) )  )y  ) )  )y  ) )  )y ) ) #)&) ) )( ') )  )y ') )  )y D) )  )y ) )  )y	() ) ) ) )() ) )
  ))>j>(I>),-C)>C ) 
))  
)) ) ) )()  
)) ) #)&) ) )(  ) )  )y  ) )  )y  ) )  )y ) )  )y ?) )  )y D) )  )y ) )  )y	() ) ) ) )() ) ) )r$   c                d   t        | d      }t        j                  t        |            }g d}|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  }t	        j                  d	|       d
z   d|iz  }t        t	        j                  |            d } |d   }t        |t              }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t              }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t              }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t              }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t              }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t              }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t              }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t              }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t               }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t              }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t               }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}|d   }t        |t               }|sd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t	        j                  |      dz  }	t        t	        j                  |	            d x}}t        j#                  |      }
t%        j&                  |
      }|d   }|d   }||k(  }|slt	        j
                  d|fd ||f      t	        j                  |      t	        j                  |      d!z  }d"d#|iz  }t        t	        j                  |            d x}x}}|d   j)                         D ]#  }t        |t*              }|sd$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%d&t        j                         v st	        j                  t*              rt	        j                  t*              nd&t	        j                  |      d'z  }t        t	        j                  |            d }& y )(NTr%   )r   r   r   r   r   last_evidencegitsystemdcroninboxr   pending_approvalsnext_allowed_actionforbidden_actionswarningsin)z%(py0)s in %(py2)skrZ   rs   u   필수 key 누락: rt   ru   r   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r   rV   )rn   r   rp   r   r   boolr   r   r   r   r   r   r   r   listr   r   r   r`   r   r   r   r   r   vintr   )rI   rv   rw   rV   r}   r~   r   r   r   r   r   r   r   r   r   r   r   rx   r@   loadsvaluesr   )rD   rE   rZ   requiredr   r   r   r   r   r   sparsedr   r   r   r   r   s                    r"   (test_json_schema_required_keys_and_typesr      s   xd3DCI&DH
  4Dy333qD333333q333q333333D333D3333/s33333334-.4:.44444444:444:444.44444444444444444448n+:nd++++++++:+++:+++n++++++d+++d++++++++++7m*:mT********:***:***m******T***T**********8n+:nd++++++++:+++:+++n++++++d+++d++++++++++5k(:k4((((((((:(((:(((k((((((4(((4((((((((((9o,:ot,,,,,,,,:,,,:,,,o,,,,,,t,,,t,,,,,,,,,,7m*:mT********:***:***m******T***T**********9o,:ot,,,,,,,,:,,,:,,,o,,,,,,t,,,t,,,,,,,,,,./6:/66666666:666:666/6666666666666666666017:1377777777:777:7771777777377737777777777./6:/66666666:666:666/6666666666666666666:&-:&--------:---:---&-------------------AZZ]F$%A.@)AA%)AAAAA%)AAAA%AAA)AAAAAAAA(^""$ "!S!!!!!!!!z!!!z!!!!!!!!!!!!!!!!!S!!!S!!!!!!!!!!"r$   c           	        d}|j                  d|       |j                  dd       t        | d      }t        j                  t	        |            }t        j                  |      }t        j                  |      }||fD ]v  }||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 }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 |d   }t	        |      }|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                  |      t        j                  |      dz  }t        t        j                  |            d x}x}x}x}}y )N!SENTINEL_ANU_KEY_DO_NOT_LEAK_2777COKACDIR_KEY_ANUCOKACDIR_KEY_DEV!SENTINEL_DEV_KEY_DO_NOT_LEAK_2777Tr%   not inz%(py0)s not in %(py2)ssentinelblobrs   assert %(py4)sru   z%(py1)s not in %(py3)sro   rp   assert %(py5)sr   r   UNKNOWNzlassert %(py10)s
{%(py10)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}.startswith
}(%(py8)s)
}rV   )rn   r   ru   r   r   rq   )setenvrI   rv   rw   rV   ry   rx   r}   r~   r   r   r   r   r   r   
startswith)rD   monkeypatchr   rE   rZ   humanjsr   r   r   r   r   r   @py_format4r   r   r   r   r   @py_format11s                       r"   test_no_raw_key_in_outputr      s   2H)84)+NOxd3DCI&DT"E		B ?t####xt######x###x######t###t#######2>2$>>>>2$>>>2>>>>>>$>>>$>>>>>>>? F|23|2''2	2'	2222222232223222|222222'222	22222222222r$   c           	        t        | d      }|dz  dz  }dD ]  }||z  }|j                  } |       }| }|sddt        j                         v st	        j
                  |      rt	        j                  |      nddt        j                         v st	        j
                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}x}x}} |d	z  j                  d
      }	t        j                  t        |             t        j                  dt        |      g       t        j                  dt        |      dg       dD ]  }||z  }|j                  } |       }| }|st	        j                  d|       dz   dt        j                         v st	        j
                  |      rt	        j                  |      nddt        j                         v st	        j
                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}x}x}} d	}
||
z  }|j                  }d
} ||      }||	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                  |      t	        j                  |      dt        j                         v st	        j
                  |	      rt	        j                  |	      nddz  }dd|iz  }t        t	        j                  |            d x}
x}x}x}x}}y )NTr%   r)   r*   )p0b_event_strategy_enabledp0b_callback_launch_enabledp0b_activation_epochp0b_killzQassert not %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = (%(py0)s / %(py1)s).exists
}()
}f)rn   ro   ru   r   r+   r   r   r^   r_   u   flag 파일 생성됨: zS
>assert not %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = (%(py0)s / %(py1)s).exists
}()
}r`   )ze%(py9)s
{%(py9)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).read_text
}(encoding=%(py7)s)
} == %(py11)sdriver_before)rn   r   r   r   r   r   assert %(py13)sr   )rI   existsr   r   r}   r   r   r   r   	read_textrv   rw   rV   r|   r   r~   )rD   rE   r*   r  r   r   r   r   r   r  r   r   r   r   r   @py_format12r   s                    r"   test_no_flag_writer     s   xd3D8Og%E2 (AI'I%%'%'''''''''''E'''E''''''A'''A'''%''''''''''( 11<<g<NMSYHHhD	"#HHhD	8,-2 GAIFI%%F%'F''F'FF+B1#)FFFFFFFEFFFEFFFFFFAFFFAFFF%FFF'FFFFFFFG )VE((V(33VWV3WEVEVVVVEVVVVVVEVVVEVVV(VVV3VVVWVVVEVVVVVVVVVVVVVVVVVr$   c                   t        | d      }|dz  dz  dz  }|j                         }t        j                  t	        |             t        j                  dt	        |      dg       |j                  } |       }||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d x}x}}y )NTr%   r)   r-   r.   r^   r_   r`   )zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_bytes
}()
} == %(py6)srF   before_bytes)rn   r   ru   r   u.   driver_runs.jsonl 변경(append/실행) 발생z
>assert %(py8)sr   )rI   rO   rv   rw   rV   r|   r}   r~   r   r   r   r   r   r   r   )	rD   rE   rF   r  r   r   r   r   @py_format9s	            r"   test_no_driver_runs_appendr  	  s    xd3D(?[(+>>D??$LSYHHhD	8,-??^?^,^^^^^^^^^4^^^4^^^?^^^^^^^^^^^^^^^^.^^^^^^^^r$   c                   t        | d      }t        j                  t        |            }|d   d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            d x}x}}|d   d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            d x}x}}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}
}y )NTr%   r   tracked_dirtyunknownr`   r   r   r   r   branchz.gitzQassert not %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
}rE   )rn   r   r   r   )rI   rv   rw   rV   r}   r~   r   r   r   r  r   r   r   )rD   rE   rZ   r   r   r   r   r   r   r   r   r   r  s                r"   !test_dirty_count_readonly_non_gitr    sQ   xd3DCI&D;'494'94444'9444'44494444444;x -I- I---- I--- ---I-------'v'%%'%'''''''''''''''''v'''%'''''''''''r$   c                    dj                  g d      } t        j                  } ||       }d}||k(  }|s
t        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t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}x}}t        j                  }d } ||      }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                  |      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                  |            d x}x}x}x}}	y )Nr9   )z M memory/foo.pyz D memory/bar.pyzM  scripts/baz.pyz?? memory/new.txtzMM scripts/qux.pyr   r`   )zZ%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._tracked_dirty_count
}(%(py3)s)
} == %(py8)srv   	porcelain)rn   r   rp   r   r   zassert %(py10)srq   r  )zZ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._tracked_dirty_count
}(%(py4)s)
} == %(py9)srn   r   ru   r   r   assert %(py11)sr   )rB   rv   _tracked_dirty_countr}   r~   r   r   r   r   r   r   )r  r   r   r   r   r  r   r   r   r   r   r
  s               r"   test_tracked_dirty_parser_unitr    s[   		  I ##3#I.3!3.!3333.!33333333333333#333333I333I333.333!3333333##6D6#D)6Y6)Y6666)Y66666636663666#666D666)666Y66666666r$   c                 	   t        | d      }t        j                         }t        |      5  t        j                  dt        |      g       d d d        |j                         }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}||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}||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}||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        j                         }t        |      5  t        j                  dt        |      dg       d d d        t!        j"                  |j                               }	|	d   }d}
||
u }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
|	d   }d}
||
k(  }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
y # 1 sw Y   xY w# 1 sw Y   :xY w)NTr%   r^   u   ANU 자동화 조종석r   z%(py1)s in %(py3)sr   r   r   r   z9automation level : L2_DONE_L3_BLOCK_EVIDENCE_ACTIVE_FALSEzACTIVE : falseWIRED(gated, ACTIVE=false)r_   r   Fr   r   r   r   r   r   r   r`   r   )rI   rz   r{   r   rv   r|   rV   getvaluer}   r~   r   r   r   r   r   r   r@   r   )rD   rE   r   r   r   r   r   r   buf2r   r   r   r   s                r"   test_human_and_json_smoker   )  s   xd3D
++-C		 ((CI&'(LLNE$-$----$---$----------------FOF%OOOOF%OOOFOOOOOO%OOO%OOOOOOO$u$$$$u$$$$$$$$$u$$$u$$$$$$$'0'50000'5000'000000500050000000;;=D		 2(CIx012ZZ(F($u$u$$$$u$$$$$$u$$$$$$$$%Q)QQ%)QQQQQ%)QQQQ%QQQ)QQQQQQQQ( (2 2s   !Q&"Q3&Q03Q=c                X   t        | d      }t        j                  t        |            }|d   }d}||v }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}y )
NTr%   r   )UNKNOWN_KEY_REQUIREDUNKNOWN_NO_KEYr   )z%(py1)s in %(py4)sr   r   r   r   r   s           r"   test_cron_unknown_no_raw_keyr$  =  st    xd3DCI&D<EEE<EEEEE<EEEE<EEEEEEEEEEEr$   c                   t        | d      }t        j                  t        |            }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   }|sNt	        j                  d
      dz   dt	        j                  |      iz  }t        t	        j                  |            d }|d   j                         D ]  \  }}	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}
}g }
d}|j                  } |       }||v}|}|sd}|	j                  } |       }||v }|}|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }|
j                  |       |st	        j
                  dfdf      t	        j                  |      dt        j                         v st	        j                  |	      rt	        j                  |	      ndt	        j                        t	        j                  |      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}x}x}} y )!NTr%   wired_gated_axesr   r  rZ   r   r   r   u   gated 축 비어있음z
>assert %(py1)sro   r  r`   z%(py0)s == %(py3)slabelrn   rp   r   zactive=falser   )zH%(py3)s not in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.lower
}()
}axis)rp   r   r   r   z%(py11)sr   )zJ%(py14)s in %(py20)s
{%(py20)s = %(py18)s
{%(py18)s = %(py16)s.lower
}()
})r   r   rr   py20z%(py22)spy22r   zassert %(py25)spy25)rI   rv   rw   rV   r}   r~   r   r   r   r   r   r   r   itemslowerr   r   )rD   rE   rZ   r   r   r   r   @py_format2r*  r(  r   r   r   r   r   @py_assert17@py_assert19r   r   r
  @py_format21@py_format23@py_format24@py_format26s                           r"   test_wired_not_active_labelsr7  D  sE   xd3DCI&D%%%%%%%%%%%%%%%%%%%%%%%%"#=#==%====#=====./557 Oe44u44444u4444444u444u44444444444NxNtzzNz|Nx|+N~NNN~/NNNNNx|NNNxNNNNNNtNNNtNNNz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NNNNNNNNNNNNNNNNOr$   c                2    t        j                  | |||      S N)_subprocessCompletedProcess)cmdrcstdoutstderrs       r"   
_completedr@  T  s    ''R@@r$   c                   d }| j                  t        j                  d|       t        j                  t        j                        \  }}}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}}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}}d |D        }t        |      }	|	sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |	      dz  }
t        t        j                  |
            d
x}}	d |D        }t        |      }	|	sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |	      dz  }
t        t        j                  |
            d
x}}	|D ]M  }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}||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}}P y
)u   DBus/session bus 불가(stdout empty + stderr) → crash 0 · unavailable ·
    SYSTEMD_STATUS_UNAVAILABLE warning · raw stderr 가 status/출력 오염 0.c                    t        | ddd      S )N    z)Failed to connect to bus: No medium foundr@  r<  kws     r"   fake_runz2test_systemctl_dbus_failure_safe.<locals>.fake_run\  s    #q"&QRRr$   rununavailabler`   r'  r   r)  r   r   Nr1   c              3  $   K   | ]  }d |v  
 ywSYSTEMD_STATUS_UNAVAILABLEN .0ws     r"   	<genexpr>z3test_systemctl_dbus_failure_safe.<locals>.<genexpr>d       @Q+q0@   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyrn   r   ru   c              3  $   K   | ]  }d |v  
 yw)dbus_unavailableNrN  rO  s     r"   rR  z3test_systemctl_dbus_failure_safe.<locals>.<genexpr>e  s     61!Q&6rT  Failed to connect to busr   r   rQ  r   zNo medium found)setattrrv   
subprocess_systemdSYSTEMD_UNITr}   r~   r   r   r   r   r   r   rV  )r   rH  r   r1   warnsr   r   r   r   r   r   rQ  r   s                r"    test_systemctl_dbus_failure_safer`  Y  sr   S x8 \\#*:*:;FGU""6]""""6]""""""6"""6"""]"""""""##7m####7m######7###7###m#######@%@@3@@@@@@@@@3@@@3@@@@@@@@@@@@@@6663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 *)2)2222)222)2222222222222222 ) )))) ))) ))))))))))))))))*r$   c                @   d }|j                  t        j                  d|       t        | d      }t        j	                  t        |            }|d   d   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}x}}d |d   D        }
t        |
      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            dx}
}t        j                  |      }t!        j"                  |      }|d   d   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}x}}t        j%                  |      }||fD ]M  }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}||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}}P y)u   systemctl 실패 + git 부재여도 build_status crash 0 · JSON round-trip 정상 ·
    raw stderr 가 human/json 출력 어디에도 0.c                N    | r| d   dk(  rt        | ddd      S t        | ddd      S )Nr   	systemctlrC  rD  z3Failed to connect to bus: No such file or directoryr   rE  rF  s     r"   rH  z<test_systemctl_failure_does_not_break_json.<locals>.fake_runo  s3    3q6[(c1b*_``#q"b))r$   rI  Tr%   r   	is_activerJ  r`   r   r   r   r   N
is_enabledc              3  >   K   | ]  }|j                  d         ywrL  )r   rO  s     r"   rR  z=test_systemctl_failure_does_not_break_json.<locals>.<genexpr>y  s     Taq||89Ts   r   rU  rV  rW  rZ  r   r   r   r   r   r   zNo such file or directory)r[  rv   r\  rI   rw   rV   r}   r~   r   r   r   rV  r   r   r   rx   r@   r   ry   )rD   r   rH  rE   rZ   r   r   r   r   r   r   r   r   r   r   r   r   s                    r"   *test_systemctl_failure_does_not_break_jsonrg  l  s   *
 x8xd3DCI&D	?;'8=8'=8888'=888'888=8888888	?<(9M9(M9999(M999(999M9999999T4
CSTT3TTTTTTTTT3TTT3TTTTTTTTTTTTTT		BZZ^F)[):]:)]::::)]:::):::]:::::::T"EU 7)5)5555)555)5555555555555555*6*$6666*$666*666666$666$66666667r$   c                ~   d }| j                  t        j                  d|       t        j                  t        j                        \  }}}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}}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}}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   nonzero exit 라도 stdout 이 정상 status 토큰이면 신뢰(is-active inactive=exit3,
    is-enabled disabled=exit1). 실패로 오인하지 않는다.c                B    d| v rt        | ddd      S t        | ddd      S )Nz	is-activer<   z	inactive
rD  r   r,   rE  rF  s     r"   rH  zEtest_systemctl_nonzero_but_recognized_token_trusted.<locals>.fake_run  s,    #c1lB77#q,33r$   rI  inactiver`   r'  r   r)  r   r   Nr8   r1   r_  )r[  rv   r\  r]  r^  r}   r~   r   r   r   r   r   r   )	r   rH  r   r1   r_  r   r   r   r   s	            r"   3test_systemctl_nonzero_but_recognized_token_trustedrk    sD   4
 x8 \\#*:*:;FGU6Z6Z66Z  7j    7j      7   7   j       5B;5B55Br$   c                   d }| j                  t        j                  d|       t        j                  t        j                        \  }}}g }d}||k(  }|}|r	d}	||	k(  }
|
}|sXt        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}
}	d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}y)uW   systemctl 바이너리 부재(FileNotFoundError) → crash 0 · unavailable · warning.c                    t        d      )Nrc  )FileNotFoundErrorrF  s     r"   rH  z5test_systemctl_command_missing_safe.<locals>.fake_run  s    ,,r$   rI  rJ  r`   rb   r   r   r   r   rd   r1   rf   rh   r   r   ri   rj   Nc              3  $   K   | ]  }d |v  
 yw)command_missingNrN  rO  s     r"   rR  z6test_systemctl_command_missing_safe.<locals>.<genexpr>  s     5! A%5rT  rU  rV  rW  r[  rv   r\  r]  r^  r}   r~   r   r   r   r   r   r   r   r   rV  r   rH  r   r1   r_  r   r   r   r   r   r   r   r   r   r   r   r   r   s                     r"   #test_systemctl_command_missing_safers    s^   - x8 \\#*:*:;FGU?]?6]"?-?w-'?????6]??????6???6???]???????w-??????w???w???-??????????????5u5535555555553555355555555555555r$   c                   d }| j                  t        j                  d|       t        j                  t        j                        \  }}}g }d}||k(  }|}|r	d}	||	k(  }
|
}|sXt        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}
}	d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}y)u8   systemctl timeout → crash 0 · unavailable · warning.c                .    t        j                  | d      )N   )r:  TimeoutExpiredrF  s     r"   rH  z-test_systemctl_timeout_safe.<locals>.fake_run  s    ((b11r$   rI  rJ  r`   rb   r   r   r   r   rd   r1   rf   rh   r   r   ri   rj   Nc              3  $   K   | ]  }d |v  
 yw)timeoutNrN  rO  s     r"   rR  z.test_systemctl_timeout_safe.<locals>.<genexpr>  s     -!yA~-rT  rU  rV  rW  rq  rr  s                     r"   test_systemctl_timeout_saferz    s^   2 x8 \\#*:*:;FGU?]?6]"?-?w-'?????6]??????6???6???]???????w-??????w???w???-??????????????-u--3---------3---3--------------r$   c                   d }| j                  t        j                  d|       t        j                  t        j                        \  }}}g }d}||k(  }|}|r	d}	||	k(  }
|
}|sXt        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}
}	d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}y)uO   exit 0 이지만 stdout empty(미인식) → unavailable(확정 표시 금지).c                    t        | ddd      S )Nr   rD  rE  rF  s     r"   rH  z2test_systemctl_empty_stdout_safe.<locals>.fake_run  s    #q"b))r$   rI  rJ  r`   rb   r   r   r   r   rd   r1   rf   rh   r   r   ri   rj   Nc              3  $   K   | ]  }d |v  
 ywrL  rN  rO  s     r"   rR  z3test_systemctl_empty_stdout_safe.<locals>.<genexpr>  rS  rT  rU  rV  rW  rq  rr  s                     r"    test_systemctl_empty_stdout_safer~    s^   * x8 \\#*:*:;FGU?]?6]"?-?w-'?????6]??????6???6???]???????w-??????w???w???-??????????????@%@@3@@@@@@@@@3@@@3@@@@@@@@@@@@@@r$   c                   d }|j                  t        j                  d|       t        | d      }t	        |      }t        j                  t        |            }t        j                  |      }t        j                  |      }t	        |      }||k(  }|s9t        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                  |      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)uT   systemctl 실패 경로에서도 read-only 불변 — 파일 생성/수정/append 0.c                N    | r| d   dk(  rt        | ddd      S t        | ddd      S )Nr   rc  rC  rD  rZ  r   rE  rF  s     r"   rH  z;test_systemctl_failure_readonly_invariant.<locals>.fake_run  s3    3q6[(c1b*DEE#q"b))r$   rI  Tr%   r`   r   r\   rE   rl   r   u2   systemctl 실패 경로에서 파일 변동 발생z
>assert %(py7)sr   N)r[  rv   r\  rI   r\   rw   rV   rx   ry   r}   r~   r   r   r   r   r   r   r   )rD   r   rH  rE   rl   rZ   r   r   r   r   r   s              r"   )test_systemctl_failure_readonly_invariantr    s   *
 x8xd3Dt_FCI&DAAT?Z?f$ZZZ?fZZZZZZ9ZZZ9ZZZZZZTZZZTZZZ?ZZZZZZfZZZfZZZZ&ZZZZZZZr$   c                   d| j                  t        j                  dfd       t        t	        dz
              }ddl}g }dD ]g  }| j                  d|       	 t        d      }t        |d	      r|j                          t        j                  |      \  }}|j                  ||f       i d
 |D        }t        |      }	|	st        j                  |      dz   dt!        j"                         v st        j$                  t              rt        j&                  t              ndt        j&                  |      t        j&                  |	      dz  }
t)        t        j*                  |
            dx}}	|}y# t        $ r Y w xY w)uH   unix numeric epoch age 는 TZ 환경(KST/UTC)에 독립적으로 동일.g   tAtimec                      S r9  rN  )	fixed_nows   r"   <lambda>z9test_epoch_numeric_timezone_independent.<locals>.<lambda>  s    ) r$     r   N)UTCz
Asia/SeoulzAmerica/New_YorkTZtzsetc              3  &   K   | ]	  }|d k(    yw))r  NNrN  )rP  rs     r"   rR  z:test_epoch_numeric_timezone_independent.<locals>.<genexpr>  s     2QqL 2s   z.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allrW  )r[  rv   r  rV   r   osr   
__import__hasattrr  	Exception_epoch_age_secondsr   r  r}   r   r   r   r   r   r   r   )r   	epoch_str_osresultstztime_modagewarnr   r   r   r   r  s               @r"   'test_epoch_numeric_timezone_independentr    s(   I&*;<C	D()*IG7 	$4$	!&)Hx)  **95	TT{#	$ 3'2;322;2;;G;;;;;;3;;;3;;;2;;;2;;;;;;A  		s   'E99	FFc                    t         j                  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	}||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]   naive ISO datetime → local(KST) 임의 해석 금지 → age None + UNKNOWN_NAIVE_DATETIME.z2026-06-28T10:00:00Nr   z%(py0)s is %(py3)sr  r)  r   r   UNKNOWN_NAIVE_DATETIMEr`   r'  r  )
rv   r  r}   r~   r   r   r   r   r   r   )r  r  r   r   r   r   s         r"   1test_epoch_naive_datetime_not_locally_interpretedr    s    &&'<=IC3$;3$33$++4+++++4+++++++4+++4+++++++++++r$   c                 j   t         j                  d      \  } }g }t        | t              }|}|r	d}| |kD  }|}|sd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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }|j                  |       |rt        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  }	|j                  |	       t        j                  |d      i z  }
dd|
iz  }t        t        j                  |            dx}x}x}x}}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}}y)uH   tz-aware ISO datetime → offset 으로 정상 age(>=0), warning 없음.z2020-01-01T00:00:00+00:00r   .%(py6)s
{%(py6)s = %(py2)s(%(py3)s, %(py4)s)
}r   r  r   r   rp   ru   r   )>)z%(py8)s > %(py11)s)r   r   z%(py13)sr   zassert %(py16)sr   Nr   r  r  r)  r   r   )rv   r  r   r   r   r   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_epoch_aware_datetime_uses_offsetr    sk   &&'BCIC+:c3++!+C!G++++++:+++:++++++c+++c++++++3+++3++++++++++C!++++++C+++C+++!++++++++++++++44<44444r$   c                    t        t        j                  j                         dz         } t        j                  |       \  }}g }d}||k(  }|}|r	d}||k(  }|}|sXt	        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  }
|j                  |
       |rt	        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  }|j                  |       t	        j                  |d      i z  }dd|iz  }t        t	        j                  |            dx}x}x}x}x}}dD ]  }t        j                  |      \  }}g }d}||u }|}|r	d}||k(  }|}|sqt	        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  }
|j                  |
       |rt	        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  }|j                  |       t	        j                  |d      i z  }t	        j                  |||f      dz   d|iz  }t        t	        j                  |            dx}x}x}x}x}} t        j                  }d} ||      }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                  |      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}x}x}}t        j                  }d} ||      }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                  |      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}x}x}}y) ug   미래 epoch → 0 + EPOCH_IN_FUTURE · 파싱 실패/inf → None + EPOCH_PARSE_UNAVAILABLE (crash 0).i'  r   EPOCH_IN_FUTUREr`   rb   r  r   r   r   rd   r  rf   rh   r   ri   rj   N)z
not-a-dateinfnanz2026-13-99T99:99:99EPOCH_PARSE_UNAVAILABLEr   z%(py2)s is %(py5)sarQ  
>assert %(py17)s)NN)zX%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._epoch_age_seconds
}(%(py4)s)
} == %(py9)srv   r  r  r   rD  )rV   rv   r  r  r}   r~   r   r   r   r   r   r   r   r   r   )futurer  r  r   r   r   r   r   r   r   r   r   r   r   r   badr  rQ  r   r   r   r   r
  s                          r"   "test_epoch_future_and_garbage_safer    s/   6)*F&&v.IC1!13!81 11 1111113!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 111111111111111B I%%c*1HDHqDyH";HQ";;HHHHqDHHHHHHqHHHqHHHDHHHHHHHQ";HHHHHHQHHHQHHH";HHHHHHHHHHc1a[HHHHHHHHI !!7$7!$'7<7'<7777'<77777737773777!777$777'777<7777777!!5"5!"%55%5555%55555535553555!555"555%55555555555r$   c                 ^	   dD ]  } t         j                  |       \  }}g }g }d}||u }|}|r	d}||k(  }	|	}|}
|s g }t        |t              }|}|rd}||v }|}|}
|
sbt	        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  }|j                  |       |rt	        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  }|j                  |       t	        j                  |d      i z  }dd|iz  }|j                  |       |sd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dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                        dz  }j                  |       |rt	        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  }|j                  |       t	        j                  |d      i z  }dd|iz  }|j                  |       t	        j                  |d      i z  }t	        j                  | ||f      d z   d!|iz  }t        t	        j                  |            dx}
x}x}x}x}x}x}	x}x}x}x}x}}|| |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)(u   극단 날짜(0001-01-01 등, platform time_t 범위 밖) tz-aware → timestamp() 가
    OverflowError/OSError 를 던져도 crash 0 · EPOCH_PARSE_UNAVAILABLE 반환 · raw 유출 0.)0001-01-01T00:00:00+00:00z9999-12-31T23:59:59+00:00z0001-01-01T00:00:00ZNr  )Nr  r   )z%(py4)s is %(py7)sr  )ru   r   z%(py9)sr   r`   )z%(py11)s == %(py14)srQ  )r   r   r   r   r   z%(py19)sr   z3%(py27)s
{%(py27)s = %(py23)s(%(py24)s, %(py25)s)
}r   r   )py23py24r-  py27r   )z%(py29)s in %(py32)s)py29py32z%(py34)spy34z%(py37)spy37r   z
>assert %(py40)spy40r   r   extremers   r   ru   )rv   r  r   r   r}   r~   r   r   r   r   r   r   r   r   r   )r  r  rQ  r   r   r   r   r   r   r   r   @py_assert22@py_assert26@py_assert21@py_assert31@py_assert30r   r   r   r   r   @py_format20@py_format28@py_format33@py_format35@py_format36@py_format38@py_format39@py_format41r   r   s                                  r"    test_epoch_extreme_date_no_crashr    s    $
 %%g.1	T 	T	 	#< 	a#<< 	 	q#		(A	#$(A#A	 				T 	 	F	 	  	 	  	 	  	 	 	F					a#< 	 	F	 	   	 	   	 	 $= 	 	 	F		N	 	 	F		 	F	 	 	 	 	 	F	 	 	 	 	 	F	 	 	 	 	 	 	 	F	 				#$(A	 	F	 	 $%	 	 $%	 	 )B	 	 	F		N	 	 	F		N	 			GQ?	 	 		 	 	 	 	 =!####7!######7###7######!###!#######$r$   c                   ddl fd}t        t        fD ]  }| j                  d ||             t        j                  d      \  }}g }d}||u }|}|r	d}	||	k(  }
|
}|sqt        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }t        j                  |||f      dz   d|iz  }t        t        j                   |            dx}x}x}x}x}
}	 y)u   tz-aware dt.timestamp() 가 OverflowError/OSError 를 던지는 플랫폼(time_t 범위
    밖)에서도 except 절이 잡아 None + EPOCH_PARSE_UNAVAILABLE 반환 · crash 0 (결정적 검증).r   Nc                >      G  fdd       G fdd      }|S )Nc                  F    e Zd ZW  j                  j                  ZfdZy)Otest_epoch_timestamp_overflow_oserror_caught.<locals>._make_fake.<locals>._Boomc                     d      )Nz*timestamp out of range for platform time_trN  )selfexcs    r"   	timestampzYtest_epoch_timestamp_overflow_oserror_caught.<locals>._make_fake.<locals>._Boom.timestamp  s    FGGr$   N)__name__
__module____qualname__timezoneutctzinfor  )_dtr  s   r"   _Boomr    s    \\%%FHr$   r  c                  "    e Zd Ze fd       Zy)Wtest_epoch_timestamp_overflow_oserror_caught.<locals>._make_fake.<locals>._FakeDateTimec                            S r9  rN  )_sr  s    r"   fromisoformatzetest_epoch_timestamp_overflow_oserror_caught.<locals>._make_fake.<locals>._FakeDateTime.fromisoformat  s
    wr$   N)r  r  r  staticmethodr  )r  s   r"   _FakeDateTimer    s     r$   r  rN  )r  r  r  r  s   ` @r"   
_make_fakez@test_epoch_timestamp_overflow_oserror_caught.<locals>._make_fake  s!    	H 	H	 	
 r$   datetimer  r  r   r  r  r   r   r   r`   rd   rQ  rf   rh   r   r  rj   )r  OverflowErrorOSErrorr[  rv   r  r}   r~   r   r   r   r   r   r   r   r   r   )r   r  r  r  rQ  r   r   r   r   r   r   r   r   r   r   r   r   r  s                    @r"   ,test_epoch_timestamp_overflow_oserror_caughtr    s,     w' ICZ_=%%&AB1HDHqDyH";HQ";;HHHHqDHHHHHHqHHHqHHHDHHHHHHHQ";HHHHHHQHHHQHHH";HHHHHHHHHHc1a[HHHHHHHHIr$   c                   t        | d      }t        |dz  dz  dz  d       t        j                  t	        |            }|d   d   }d}||u }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }g }	d}
||
u }|}|st        |t              }|}|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  }|	j                  |       |sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                        dz  }|	j                  |       t        j                   |	d      i z  }t        j"                  |      dz   d|iz  }t        t        j                  |            dx}x}	x}x}
}d |d   D        }	t%        |	      }|sddt        j                         v st        j                  t$              rt        j                  t$              ndt        j                  |	      t        j                  |      d z  }t        t        j                  |            dx}	}y)!u:  극단 날짜 epoch 가 state 파일에 있어도 build_status crash 0 · raw 유출 0 · read-only.

    (플랫폼에 따라 aware 극단 날짜는 timestamp() 가 OverflowError/OSError 없이 큰 age 를
    돌려줄 수도, 예외를 던질 수도 있다. 어느 쪽이든 crash 0 이 핵심 불변식이다.)Tr%   r)   r*   r  z0001-01-01T00:00:00+00:00
r   r   r   r   r   r   r   Nepoch_age_secondsr  r  r   r   r   z2%(py13)s
{%(py13)s = %(py9)s(%(py10)s, %(py11)s)
}r   r   )r   rq   r   r   r   z
>assert %(py16)sr   c              3  $   K   | ]  }d |v 
 yw)z
0001-01-01NrN  rO  s     r"   rR  zEtest_epoch_extreme_date_surfaces_in_build_no_crash.<locals>.<genexpr>1  s     ?|1$?rT  r   rU  r  rW  )rI   r#   rv   rw   rV   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r  )rD   rE   rZ   r   r   r   r   r   r  r   r   r   r   r   r   r   r   s                    r"   2test_epoch_extreme_date_surfaces_in_build_no_crashr  $  s   
 xd3D
4(?W$'==(*CI&D=)1T1)T1111)T111)111T1111111
w-+
,C3$33$;3*S#.3.3333$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3S333S333333#333#333.3333333333333333?d:.>??3?????????3???3??????????????r$   c                   t        | d      }t        |dz  dz  dz  d       t        j                  t	        |            }|d   d   }d}||u }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||u }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}d |d   D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}y)uK   naive epoch 가 build_status warnings 에 표면화 · age=none · crash 0.Tr%   r)   r*   r  z2026-06-28T10:00:00
r   r   r   r   r   r   r   Nr  c              3  $   K   | ]  }d |v  
 yw)r  NrN  rO  s     r"   rR  z=test_epoch_naive_surfaces_warning_in_build.<locals>.<genexpr>;       G'1,GrT  r   rU  rV  rW  )rI   r#   rv   rw   rV   r}   r~   r   r   r   rV  r   r   r   )	rD   rE   rZ   r   r   r   r   r   r   s	            r"   *test_epoch_naive_surfaces_warning_in_buildr  4  sM   xd3D
4(?W$'==?VWCI&D=)1T1)T1111)T111)111T1111111=,-55-5555-555-5555555555Gd:6FGG3GGGGGGGGG3GGG3GGGGGGGGGGGGGGr$   c                   t        | d      }t        j                  t        |            }|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}g }|d   }t        |t              }	|	}|	r|d   }
|
}|s<d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t	        j                  |	      dz  }|j                  |       |	r+ddt	        j                  
      iz  }|j                  |       t	        j                  |d      i z  }dd|iz  }t        t	        j                  |            d
x}x}x}x}	}
g }d}|d   }|j                  } |       }
||
v }|}|s d}|d   }|j                  } |       }||v }|}|sNt	        j
                  d|fd||
f      t	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |
      dz  }dd|iz  }|j                  |       |st	        j
                  dfdf      t	        j                  |      t	        j                        t	        j                        t	        j                  |      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}
x}x}x}x}}d# |d$   D        }t!        |      }|sd%d&t        j                         v st	        j                  t               rt	        j                  t               nd&t	        j                  |      t	        j                  |      d'z  }t        t	        j                  |            d
x}}t        j#                  |      }t        j%                  |      }||fD ]M  }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/}||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}}P y
)0uj   sealed read-only cron helper 부재 → UNKNOWN_KEY_REQUIRED + 명시 reason ·
    cron 등록/raw key 0.Tr%   r   r"  r`   r   r   r   r   Ncron_reasonz.%(py7)s
{%(py7)s = %(py2)s(%(py4)s, %(py5)s)
}r   rV   )r   ru   r   r   z%(py10)srq   r   r  r   zraw keyhelperr   )zF%(py3)s in %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.lower
}()
})rp   r   r   rq   z%(py12)srg   )zJ%(py15)s in %(py22)s
{%(py22)s = %(py20)s
{%(py20)s = %(py18)s.lower
}()
})r   rr   r+  r,  z%(py24)sr  r   zassert %(py27)sr  c              3  $   K   | ]  }d |v  
 yw)zcron count unavailableNrN  rO  s     r"   rR  z=test_cron_unknown_key_required_with_reason.<locals>.<genexpr>H  r  rT  r   rU  rV  rW  z--keyr   r   r   r   r   r   z	cron-list)rI   rv   rw   rV   r}   r~   r   r   r   r   r   r   r   r   r   r/  rV  rx   ry   )!rD   rE   rZ   r   r   r   r   r   r   r   r   r   r   r
  r   r   r   r   @py_assert14r1  r2  r  @py_assert16r   r4  @py_format25r6  r  r   r   r   r   r   s!                                    r"   *test_cron_unknown_key_required_with_reasonr  ?  s    xd3DCI&D<111<11111<1111<11111111111Gd=)G:)3/G/G/D4GG4GGGGGGG:GGG:GGG)GGGGGG3GGG3GGG/GGGG/GGG4GGGGGGGGGGGGGG^9^]+^+11^13^933^x^4CV^CVC\C\^C\C^^xC^7^^^^^93^^^9^^^+^^^1^^^3^^^^^^^xC^^^^x^^^CV^^^C\^^^C^^^^^^^^^^^^^^^^Gd:6FGG3GGGGGGGGG3GGG3GGGGGGGGGGGGGG		BT"EU '"wd""""wd"""w""""""d"""d"""""""&{$&&&&{$&&&{&&&&&&$&&&$&&&&&&&'r$   c                    t         j                         \  } }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}}g }t        |t              }|}|r|}|sd	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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }|j                  |       |rXdddt	        j
                         v st        j                  |      rt        j                  |      ndiz  }	|j                  |	       t        j                  |d      i z  }
dd|
iz  }t        t        j                  |            dx}x}}y)uN   _cron_count 는 (value, reason) 튜플 — helper 부재 시 UNKNOWN + reason.r"  r`   r'  valuer)  r   r   Nr  r   reasonrV   r  z%(py8)sr   r   r  r   )rv   _cron_countr}   r~   r   r   r   r   r   r   r   rV   r   r   )r  r  r   r   r   r   r   r   r   r  r   r
  s               r"    test_cron_value_unit_tuple_shaper  Q  s@   OO%ME6**5*****5*******5***5***********-:fc"-"-"v------:---:------f---f------c---c---"----"-----v---v------------r$   __main__z-v)r    r   r!   rV   returnNone)rD   r   r&   r   r  r   )rE   r   r  r   )rD  rD  )]__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter}   rQ   importlib.utilutil_ilurz   r@   sys
contextlibr   pathlibr   pytest__file__resolver   _ROOT	_MOD_PATHspec_from_file_locationr
   r   r   r   r   loaderr   r   r   r~   r   r   r   r   r   r   r   r   r   r   r  r   r   module_from_specrv   modulesexec_moduler#   rI   r\   r   r   r   r   r   r   r  r  r  r  r   r$  r7  r\  r:  r@  r`  rg  rk  rs  rz  r~  r  r  r  r  r  r  r  r  r  r  r  r  exitr|   rN  r$   r"   <module>r     s[  " #     	  
 &   	X ((+I 77	$$$%99E 5D 5uD 5U\\ 5 5\5 5 5 5uD 5 5 5 5 5u 5 5 5u 5 5 5D 5 5 5 5 5 5 5\ 5 5 5 5 5U 5 5 5U 5 5 5\ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5dE"$'  !    ,
 9= .dN,%(
3)8"@3"W*_(	7R(FO !A
*&726.A[".,
6$&I2@ H'$. zCHH[V[[(D)*+ r$   