
    ǂjo-                    P   d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZ d dlZ ee      j                  Zej                  dz  Zd*dZ eded	z        Z ed
ed	z        Zd+dZd,dZd,dZej0                  j3                  dg d      	 	 	 	 	 	 	 	 d-d       Zd,dZ	 	 	 	 	 	 d,dZ	 	 	 	 	 	 d,dZd.dZd/dZd/dZ ddddd0dZ!dddd1dZ"d2dZ#d2dZ$d2d Z%d2d!Z&d2d"Z'd2d#Z(d,d$Z)ej0                  j3                  d%d&d'g      	 	 	 	 	 	 	 	 	 	 d3d(       Z*d2d)Z+y)4    )annotationsN)Path)SimpleNamespace)Mockz5task26-post-lifecycle-cleanup-v3-4a6c7ee5-st_01a00e50c                    t         j                  j                  | |      }|r|j                  sJ t         j                  j	                  |      }|j                  j                  |       |S N)	importlibutilspec_from_file_locationloadermodule_from_specexec_module)namepathspecmodules       e.omo/evidence/task26/task26-post-lifecycle-cleanup-v5-4a6c7ee5-st_01a00ed7/test_cleanup_controller.pyloadr      sR    >>11$=DDKK^^,,T2FKKF#M    
cleanup_v5cleanup_controller.pycleanup_v3_regressionc                6    t        | j                  d            S )Nz.task26-cleanup-*)listglob)r   s    r   temp_entriesr      s    		-.//r   c                    t         j                  g dfd}|j                  t        j                   d|       | dz  }d}t        j	                  ||       |j                         |k(  sJ t              dk(  sJ t        |       g k(  sJ y )Nc                h    t        dt        |            }j                  |        | |d |       S )N   )minlenappend)fdrawsizecalls
real_writes      r   partialzHtest_atomic_repeated_partial_writes_publish_exact_bytes.<locals>.partial%   s2    1c#hT"c%4j))r   writepayloads   0123456789abcdef   r#   intr$   bytes | memoryviewreturnr-   )osr)   setattrMODULEatomic
read_bytesr!   r   )tmp_pathmonkeypatchr(   targetexpectedr&   r'   s        @@r   7test_atomic_repeated_partial_writes_publish_exact_bytesr9   !   s    JE*
 		7G4	!F"H
MM&(#(***u:??!R'''r   c                
   t         j                  ddfd}|j                  t        j                   d|       | dz  }t        j	                  |d       |j                         dk(  sJ dk(  sJ t        |       g k(  sJ y )Nr   c                6    dz  dk(  rt          | |      S )N   )InterruptedError)r#   r$   attemptsr'   s     r   interrupted_oncezMtest_atomic_retries_interrupted_write_then_succeeds.<locals>.interrupted_once7   s&    Aq="""c""r   r)   receipt.jsons   {"status":"PASS"}
r   r,   )r0   r)   r1   r2   r3   r4   r   )r5   r6   r?   r7   r>   r'   s       @@r   3test_atomic_retries_interrupted_write_then_succeedsrA   3   s    JH# 		7,<=&F
MM&01"8888q==!R'''r   	bad_count)r   c   Tc                d   | dz  }|j                  d       |j                  t        j                  dfd       t	        j
                  t        j                  d      5  t        j                  |d       d d d        |j                         dk(  sJ t        |       g k(  sJ y # 1 sw Y   /xY w)Narchives
   sealed-oldr)   c                    S r    )_fd_rawrB   s     r   <lambda>zItest_atomic_rejects_invalid_write_counts_without_rename.<locals>.<lambda>L   s    ir   zinvalid write countmatchs   new-archive)
write_bytesr1   r2   r0   pytestraisesCleanupErrorr3   r4   r   )r5   r6   rB   r7   s     ` r   7test_atomic_rejects_invalid_write_counts_without_renamerR   F   s     	!F
}%		7,GH	v**2G	Hfn- 
I-///!R''' 
I	Hs   !B&&B/c                (   | dz  }dd}|j                  t        j                  d|       t        j                  t
        d      5  t        j                  |d       d d d        |j                         rJ t        |       g k(  sJ y # 1 sw Y   ,xY w)Nr@   c                    t        d      )Nzsimulated media failure)OSError)rI   rJ   s     r   failz>test_atomic_oserror_never_renames_or_leaves_temp.<locals>.failV   s    /00r   r)   zmedia failurerL   s   must-not-publish)rI   r-   rJ   r.   r/   r-   )	r1   r2   r0   rO   rP   rU   r3   existsr   )r5   r6   r7   rV   s       r   0test_atomic_oserror_never_renames_or_leaves_temprX   S   sv    &F1 		7D1	wo	6f12 
7}}!R''' 
7	6s   BBc           	        | dz  }|j                          |dz  j                  d       t        || dz  d      }t        t	        d            }|j                  t        j                  d|       |j                  t        j                  d	t        t        d
                   ddt        j                  d      ddg}t        j                  t        d
      5  t        j                  |i ddiddg|i i        d d d        |j                  dz  j                         rJ |j                  dz  j                         rJ |j                   dk(  sJ y # 1 sw Y   YxY w)Nprofilezauthority.jsons	   authorityarchivesrun)rZ   archive_rootrun_idmutation command must not runside_effectr)   zarchive write failed	   0600)r   r%   sha256moderL   r   unused)bindingsservicez.pending-runr   )mkdirrN   r   r   AssertionErrorr1   r2   
subprocessr0   rU   digestrO   rP   archive_prestater]   rW   
call_count)r5   r6   rZ   argsmutation_runnerrowss         r   Gtest_archive_write_failure_removes_pending_and_runs_no_mutation_commandrr   `   s7    "GMMO,,\:7J9NW\]D~6U'VWO))5/B		7DWE[=\,]^%qFMM,<WaghiD	w&<	=268BT&UXhWikoqsuwx 
>!!E)11333!!N2::<<<%%***	 
>	=s   !EEc                4   t         j                  dfd}| dz  }|j                  t        j                   d|       t        j	                  |d       |j                         dk(  sJ | dz  }t        j	                  |d       |j                         dk(  sJ y )Nc                     | |d d       S )N   rH   )r#   r$   r'   s     r   r(   zOtest_regression_v3_truncates_partial_write_while_v4_writes_all.<locals>.partialw   s    "c"1g&&r   v3r)   s   abcdefghs   abcv4r,   )r0   r)   r1   	V3_MODULEr3   r4   r2   )r5   r6   r(   
old_target
new_targetr'   s        @r   >test_regression_v3_truncates_partial_write_while_v4_writes_allr{   r   s     J' DJ	gw7Z-  "f,,,DJ
MM*k*  "k111r   c                J   t        t        d            }| j                  t        j                  d|       t        j                  t        j                  d      5  t        j                  t               dddii       d d d        |j                  d	k(  sJ y # 1 sw Y   xY w)
Nr_   r`   r\   zforbids mutation replayrL   completed_cleanupstatus%PASS_VERIFIED_DISABLED_ARCHIVED_CLEANr   )r   rj   r1   r2   rk   rO   rP   rQ   executer   rn   )r6   rp   s     r   9test_completed_cleanup_blocks_execute_before_any_mutationr      s    ~6U'VWO))5/B	v**2K	L(+>Kr@s*tu 
M%%*** 
M	Ls   #BB"c                 *   t        j                  t        dz  j                               } | d   }| d   d   dk(  sJ | d   d   dk(  sJ |d   d	k(  sJ t	        j
                  t        d
z  j                               j                         |d   k(  sJ t	        j
                  t        dz  j                               j                         |d   k(  sJ t	        j
                  t        dz  j                               j                         |d   k(  sJ y )Nzschema-contract-v5.jsonr}   rg   candidate_digest@4a6c7ee54cf9526a30de8bb576c1d71b411938beba33a04914738f6e1b6ed1cblifecycle_seal_sha256@50e7556e58a876d8136fbfb2023ede8bcb46ac816d97d4b85e1d0559f463d008archive_root_sha256@9f5d72840b4cc1fcb57720a61ebc53529fa00202d9201615e4ebdbb3e047a635z	SEAL.jsonv3_seal_sha256zinventory.jsonv3_inventory_sha256r   v3_controller_sha256)	jsonloadsHERE	read_texthashlibrd   V3r4   	hexdigest)contract	completeds     r   @test_successor_bindings_are_exact_and_predecessors_are_immutabler      s   zz4";;FFHIH,-IJ 237yyyyJ 78<~~~~*+/qqqq>>2+779:DDF)TdJeeee>>2 00<<>?IIKyYnOoooo>>2 77CCEFPPRV_`vVwwwwr   c                     t         dz  j                         } | | j                  d      d  }d|vsJ d|v sJ | j                  d      dk(  sJ y )Nr   zdef atomic(z	os.write(zwrite_all(fd, raw)r<   )r   r   indexcount)sourceoutside_helpers     r   :test_every_atomic_payload_and_receipt_write_uses_write_allr      s_    ,,779FFLL79:Nn,,,>111<<&!+++r   r<   
   d   )ppidsessionstartc                   dt        |      dt        |      gdgdz  z   t        |      gz   }|  ddj                  |       dj                         S )NS100   z (test process)  
)strjoinencode)pidr   r   r   fieldss        r   	proc_statr      sU    3t9dCL1SEBJ>#e*MFU"388F#3"4B7>>@@r   r   r   c                   | t        |      z  }|j                          |dz  j                  t        |||             |dz  j                  dj	                  d |D              dz          y )Nstatr   cmdline    c              3  F   K   | ]  }t        j                  |        y wr   )r0   fsencode).0args     r   	<genexpr>zadd_process.<locals>.<genexpr>   s     0RTcS1ATs   !)r   ri   rN   r   r   )rootr   argvr   r   processs         r   add_processr      s\    SXoGMMOv""9SD#IJy%%ejj0RT0R&RUZ&Z[r   c                $   t        | dddt        j                  gd       t        j                  t	        d      t        j                  | d      }|d	   d
   }|d   dk(  sJ |d   dk(  sJ |d   ddt        j                  gk(  sJ d|d   v sJ y )Ne   
journalctl-fui	  )r   /target/profile  	proc_rootself_pid
violationsr   r   start_time_ticksr   target_journal_followerreasonsr   r2   SERVICE_NAMEenumerate_processesr   )r5   result	violations      r   >test_journalctl_fu_follower_is_rejected_with_identity_evidencer      s    #eV5H5HIQTU''->(?ATAT`hsv'wF|$Q'IUs"""'(C///YL%9L9L#MMMM$	)(<<<<r   c           
         t        d      }t        | dddt        |dz        g       t        j	                  |t        j
                  | d      }|d   d	   d
   g dk(  sJ y )Nr   f   inotifywaitz-mzlive-v64-events.jsonlr   r   r   r   r   )exact_profile_path_referenceobserver_script_or_eventtarget_inotify_watcherr   r   r   r2   r   r   r5   rZ   r   s      r   (test_target_inotify_observer_is_rejectedr      sr    $%G#tSCZ9Z5[\]''1D1DPXcf'gF,"9- 2   r   c                    t        d      }t        | ddddt        |dz        g       t        j	                  |t        j
                  | d      }|d	   d
   d   dgk(  sJ y )Nr   g   pythonz
gateway.pyz--statezstate.dbr   r   r   r   r   r   r   r   s      r   4test_profile_process_without_hermes_home_is_rejectedr      so    $%G#,	3wQ[G[C\]^''1D1DPXcf'gF,"9-2P1QQQQr   c                    t        | dg d       t        j                  t        d      t        j                  | d      }|d   g k(  sJ |d   d   d	   d
k(  sJ y )Nh   )r   z--userr   zother.servicer   r   r   r   same_uid_processesr   classification	unrelated)r   r2   r   r   r   r5   r   s     r   *test_unrelated_service_follower_is_allowedr      sh    #OP''->(?ATAT`hsv'wF,2%%%&'*+;<KKKr   c                    t        | dddt        j                  dg       t        j                  t	        d      t        j                  | d      }|d   g k(  sJ |d   d   d	   d
k(  sJ y )Ni   r   r   r   r   r   r   r   r   self_excludedr   r   s     r   ?test_self_is_excluded_even_when_command_references_every_targetr      sw    #eV5H5HJ[\]''->(?ATAT`hsv'wF,2%%%&'*+;<OOOr   c                    t        d      }t        | dddd| g       t        | dddd	d
t        |      gd       t        j	                  |t        j
                  | d      }|d   g k(  sJ |d   D cg c]  }|d   	 c}ddgk(  sJ y c c}w )Nr   m   bashz-cz.python cleanup_controller.py verify --profile n   r   r   verifyz	--profile)r   r   r   r   r   verifier_command_excludedr   r   )r5   rZ   r   rows       r   6test_parent_shell_running_verifier_command_is_excludedr      s    $%G#0^_f^g.hij#*A8[Z]^eZfgnqr''1D1DPXcf'gF,2%%%-34H-IJ-IcC !-IJ#O   Js   4Bc                   t        | dddg       t        j                  ddfd}|j                  t        d|       t        j	                  t        d      t        j                  | d	      }|d
   g k(  sJ |d   dddgk(  sJ y )Nj   sleep1r   c                6    dz  dk(  rt          | |      S )Nr<   r   )FileNotFoundError)proc_fdr   r&   	real_reads     r   	disappearz;test_disappeared_pid_is_captured_as_race.<locals>.disappear   s&    
A:##$''r   _read_proc_filer   r   r   r   process_racesdisappeared_during_read)r   race)r   r-   r   r   r/   bytes)r   r2   r   r1   r   r   r   )r5   r6   r   r   r&   r   s       @@r   (test_disappeared_pid_is_captured_as_racer      s    #~.&&IE(  19=''->(?ATAT`hsv'wF&'2---/"s<U'V&WWWWr   )filenamer$   message)r   s   not a proc stat
zmalformed /proc/107/stat)r   s   unterminatedzmalformed /proc/107/cmdlinec                $   t        | dddg       | dz  |z  j                  |       t        j                  t        j
                  |      5  t        j                  t        d      t        j                  | d       d d d        y # 1 sw Y   y xY w)	Nk   r   r   107rL   r   r   r   )	r   rN   rO   rP   r2   rQ   r   r   r   )r5   r   r$   r   s       r   0test_malformed_same_uid_proc_entries_fail_closedr     sq     #~. --c2	v**'	:""4(9#:F<O<O[cnq"r 
;	:	:s   1BBc                    t        | dg d       t        j                  t        d      t        j                  |       }|d   dk(  sJ |d   dk(  sJ |d	   g k(  sJ y )
Nl   )r   r   zunrelated.servicer   )r   r~   PASSpassesr   target_processes)r   r2   process_poststater   r   )r5   proofs     r   6test_two_pass_poststate_reports_no_background_sessionsr    sk    #IJ$$T*;%<f>Q>Q]e$fE?f$$$?a#$***r   )r   r   r   r   )r   r   r/   z
list[Path])r5   r   r6   pytest.MonkeyPatchr/   None)r5   r   r6   r  rB   r-   r/   r  )r6   r  r/   r  )r/   r  )
r   r-   r   r-   r   r-   r   r-   r/   r   )r   r   r   r-   r   z	list[str]r   r-   r   r-   r/   r  )r5   r   r/   r  )
r5   r   r   r   r$   r   r   r   r/   r  ),
__future__r   r   importlib.utilr	   r   r0   pathlibr   typesr   unittest.mockr   rO   __file__parentr   r   r   r2   rx   r   r9   rA   markparametrizerR   rX   rr   r{   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rH   r   r   <module>r     s   "    	  !  H~	[[JJ 
lD#::	;("/F*FG	0($(& &78	(	(!3	(@C	(		( 9	(
(++!3+	+$22!32	2"+x, ()# A HKXY \=RLP	X$ "BCss!s(-s8;s	ss+r   