
    Yj                       d dl mZ d dlZd dlmc mZ d dlZd dl	Z	d dl
Z
d dlmZ d dlmZ d dlZd dlZ G d de      Z G d de      Z G d	 d
e      Z ee      j-                  d      ZddZddZddZej6                  j9                  d eej<                              dd       ZddZ ej6                  j9                  dg d      dd       Z!ddZ"ddZ#ddZ$y)    )annotationsN)Path)	TypedDictc                  "    e Zd ZU ded<   ded<   y)
BindingRowstrpathsha256N__name__
__module____qualname____annotations__     W/home/cube/projects/richard/traning coach/.omo/evidence/task26/test_archive_verifier.pyr   r      s    
IKr   r   c                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   y
)
ArchiveRowr   
archive_idschemamanifest_sha256receipt_sha256z	list[int]taskszlist[BindingRow]binding_filesNr   r   r   r   r   r      s$    OK##r   r   c                  6    e Zd ZU ded<   ded<   ded<   ded<   y)	FixtureInventoryr   r   archive_parentNone	candidatezlist[ArchiveRow]archivesNr   r   r   r   r   r      s    KOr   r   zverify_retained_archives.pyc                P    t        j                  | ddd      j                         S )NFT),:)ensure_ascii	sort_keys
separators)jsondumpsencode)values    r   	canonicalr+   &   s     ::e%4JW^^``r   c                    g dxdfd | d       t        j                  dj                              j                         fS )Nr   c                   | j                         rrdz  j                  d|j                         z          t        | j	                         d       D ]+  } ||dk(  r|j
                  n| d|j
                          - y dz  j                  d|j                         z   dz   t        j                  | j                               j                         j                         z          y )	N   s   d c                    | j                   S )N)name)items    r   <lambda>z,tree_digest.<locals>.visit.<locals>.<lambda>3   s    diir   )key./s   f     )
is_dirappendr)   sortediterdirr0   hashlibr
   
read_bytes	hexdigest)r   relativechilddirectoriesfilesrowsvisits      r   rC   ztree_digest.<locals>.visit.   s    1KKK!223	 1 1 39OPe8s?UZZ8*Aejj\@Z[ Q QJEKK**U2W^^IDXDXDZ5[5e5e5g5n5n5ppr   r4      
)r   r   r>   r   returnr   )r;   r
   joinr=   )r	   r@   rA   rB   rC   s    @@@@r   tree_digestrG   *   sP    DEK  
$>>%**T*+557KKr   r   c           	        | j                  ddd       | dz  }|j                  d       |dz  j                  d       t        j                  |   }g }t        |      D ]  \  }}|dz  |j                  z  }|dk(  r|j
                  j                  ddd       |j                  dk(  r#|j                  d	      }|j                  d
       n9|j                  d       |dz  }	|	j                  d	      }|	j                  d
       t        |      \  }
}}|j                  |j                  d|
||d       |j                  |j                  dd ddd        ||j                  t        |      |d}||j                  t        j                  t        |            j!                         t        |      d}d|fd|ffD ]8  \  }}||z  }|j                  t        |      dz         }|j                  d
       : |S )N  T)modeparentsexist_ok aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarJ   payloadr   files   fixture  leaf)r0   presentdigestrA   r@   F)r   r   scope_countscopes)r   r   archive_digestarchived_scope_countmanifest.jsonreceipt.jsonrD   )mkdirverifierSCHEMAS	enumeraterelative_pathparentkindwrite_byteschmodrG   r8   r0   lenr;   r
   r+   r=   )tmp_pathr   archivecontractrV   indexscopetarget_rR   rT   rA   r@   manifestreceiptr0   r*   r	   s                     r   fixture_archivern   ?   s   NNtdN;(#GMMuMyU+'H&(F!(+u9$u':'::A:MMUD4HzzV#&&z2U#%($$Z0

5!)4V)<&FE;MM5::$&[`q|}~MM5::%4Z[lmno ,  !SQW[djkHw||w~~^ghp^qOrO|O|O~  Y\  ]c  Yd  eG((3ng5NOe~Yu-56

5 P Nr   c                   t        | |      }t        j                  |      }|d   }||k(  }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }t        t        j                  |            d x}}|d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }	dd|	iz  }
t        t        j                  |
            d x}x}}y )Nr   ==)z%(py1)s == %(py3)spy1py3assert %(py5)spy5statusPASSz%(py1)s == %(py4)srs   py4assert %(py6)spy6)rn   r\   verify_archive_path
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanation)re   r   rf   result@py_assert0@py_assert2@py_format4@py_format6@py_assert3@py_format5@py_format7s              r   1test_each_retained_schema_dispatches_and_verifiesr   _   s    h/G))'2F(%v%%%%v%%%%%%%%%v%%%v%%%%%%%(%v%v%%%%v%%%%%%v%%%%%%%r   c                H   t        | d      }|dz  }|j                  |j                         j                  ddd            }t	        j
                  t        j                  d      5  t        j                  |      }d d d        t        | dz  d      }|dz  }|j                  |j                         j                  d	d
            }t	        j
                  t        j                  d      5  t        j                  |      }d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Ndualcoach-rehearsal-archive-v1rY   s	   "schema":s   "schema":"duplicate","schema":r.   zduplicate JSON keymatchunknowns   dualcoach-rehearsal-archive-v1s   dualcoach-rehearsal-archive-v9zunknown schema)	rn   rb   r<   replacepytestraisesr\   VerificationErrorr~   )re   rf   rl   rk   s       r   1test_duplicate_key_and_unknown_schema_fail_closedr   g   s    h(HIG/)HX002::<IjlmnoA	x119M	N((1 
O h24TUG(HX002::;\^  A  	BA	x119I	J((1 
K	J 
O	N 
K	Js   'D-DDD!damage)rO   countrJ   hardlinksymlink
unexpectedc                n   t        | d      }|dz  }|dk(  r|j                  d      }n|dk(  r5|dz  }|j                  |j                         j                  dd            }n|d	k(  r|j	                  d
       no|dk(  r|dz  }t        j                  ||       nN|dk(  r"|j                          |j                  d       n'|dz  }|j                  d      }|j	                  d       t        j                  t        j                        5  t        j                  |      }d d d        y # 1 sw Y   y xY w)Nr   zpayload/customers/registry.jsonrO   s   driftr   rY   s   "scope_count":12s   "scope_count":11rJ   i  r   zpayload/aliasr   z/etc/passwdextra   xrQ   )rn   rb   r<   r   rc   oslinkunlink
symlink_tor   r   r\   r   r~   )re   r   rf   rj   rk   rl   aliasr   s           r   1test_archive_drift_and_unsafe_members_fail_closedr   u   s   h(HIG88Fx(	7	_,  !4!4!6!>!>?RTg!hi	6	U	:	/)
	9	-('!d#E	x11	2((1 
3	2	2s   D++D4c           
        t        | dz  d      }|dz  j                         }|dz  j                         }| dz  }|j                  d|j                   dd	      }|j	                  d
       |j                  dt        j                  |      j                         t        j                  |      j                         dgt        |      t        j                  |j                               j                         dgd}dt        |j                        d |gd}| dz  }|j                  t        |      dz         }|j	                  d
       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}}d|d<   |j                  t        |      dz         }t'        j(                  t        j*                  d      5  t        j                  |d      }d d d        y # 1 sw Y   y xY w)Nrootr   rY   rZ   zbinding.txtzarchive 
utf-8encodingrQ      )r	   r
   )r   r   r   r   r   r   z$task26-retained-archive-inventory-v1)r   r   r   r    zinventory.jsonrD   F)verify_candidatearchive_countr.   rp   ry   rz   r|   r}   @0000000000000000000000000000000000000000000000000000000000000000r   zraw manifest hashr   )rn   r<   
write_textr0   rc   r;   r
   r=   r   r`   rb   r+   r\   verify_inventoryr   r   r   r   r   r   r   r   )re   rf   manifest_rawreceipt_rawbindingrk   archive_row	inventoryr	   r   r   r   r   r   r   s                  r   1test_inventory_parent_binding_chain_rejects_driftr      s   h/1QRGo-99;L^+779K&GXgll^26IAMM%ll2">>,7AAC!..5??A#&w<7>>'J\J\J^;_;i;i;klmK 9gnn- M	#I &&D9-56AJJu&&teDF/"'a'"a''''"a'''"'''a'''''''%-K!"9-56A	x119L	M%%dUC 
N	M	Ms   +IIc           
     p   | dz  }|j                  d       |dz  }|j                  d      }|j                  d       |j                  d       t        j                  }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                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}x}x}x}	}y )NsealedrI   rN   zcontrol.jsons   {}   i@  fixtureT)r   rp   )zi%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.read_path
}(%(py3)s, %(py5)s, sealed=%(py7)s)
} == %(py12)sr\   rR   )py0py2rt   rv   py7py9py12zassert %(py14)spy14)r[   rb   rc   r\   	read_pathr   r   r   r   r   r   r   r   )re   r`   rR   rk   @py_assert1@py_assert4@py_assert6@py_assert8@py_assert11@py_assert10@py_format13@py_format15s               r   8test_sealed_file_under_private_sealed_parent_is_readabler      s    F
LLeLN"DAJJu
LLDIDdDdId;DuD;uDDDD;uDDDDDD8DDD8DDDDDDDDDdDDDdDDDIDDDdDDD;DDDuDDDDDDDDr   c                 n   t         j                  d      } 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  }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}}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 )Nr   r   )zimport shutilz.extractz.restorezimport socketzimport requestszimport httpxzimport urllib)not in)z%(py0)s not in %(py2)s	forbiddensource)r   r   zassert %(py4)sr{   
O_NOFOLLOW)in)z%(py1)s in %(py3)srr   ru   rv   zos.fstat)
MODULE_PATH	read_textr   r   r   r   r   r   r   r   )	r   r   r   @py_format3r   r   r   r   r   s	            r   5test_source_has_no_restore_extract_or_network_surfacer      s=   ""G"4F D	&&&&y&&&&&&y&&&y&&&&&&&&&&&&&&&& D!<6!!!!<6!!!<!!!!!!6!!!6!!!!!!!:::r   )r*   objectrE   bytes)r	   r   rE   ztuple[str, int, int])re   r   r   r   rE   r   )re   r   r   r   rE   r   )re   r   rE   r   )re   r   r   r   rE   r   )rE   r   )%
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r;   r'   r   pathlibr   typingr   r   verify_retained_archivesr\   r   r   r   __file__	with_namer   r+   rG   rn   markparametrizer9   r]   r   r   r   r   r   r   r   r   r   <module>r      s    "     	    + 
$ $y  8n&&'DEaL*@ 6(*:*:#;<& =&2 #de2 f20D@E r   