
    /j                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZmZ d dlZd dlZd dlZd dlmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZm Z  d dl!m"Z"m#Z# erd dl$m%Z%  G d d	ej&                  Z' ej(        d
did
dig           G d de'                      Z) ej(        d
did
dig           G d de'                      Z* ej(        d
did
dig           G d dej&                              Z+ ej(        d
did
dig           G d dej&                              Z, G d de'          Z- ej.        ej/        dk    d           G d de-                      Z0 G d de+          Z1 G d de,          Z2 G d  d!ej&                  Z3d4d$Z4 ej.        ej/        dk    d%           G d& d'e'                      Z5 ej.        ej/        dk    d%           G d( d)e'                      Z6 ej.        ej/        dk    d*           G d+ d,e'                      Z7 G d- d.e'          Z8 G d/ d0ej&                  Z9 G d1 d2e'          Z:e;d3k    r ej<                     dS dS )5    )annotationsN)TYPE_CHECKINGAny)
ModelProto	NodeProtoTensorProtocheckerhelperparsershape_inference)_ALLOWED_EXTERNAL_DATA_KEYSExternalDataInfo convert_model_from_external_dataconvert_model_to_external_dataload_external_data_for_modelload_external_data_for_tensorsave_external_dataset_external_data)
from_arrayto_array)Sequencec                  X    e Zd ZU dZdZded<   ddZddZdd	Z	 dddZ	dddZ
ddZdS )TestLoadExternalDataBasezBase class for testing external data related behaviors.

    Subclasses should be parameterized with a serialization format.
    protobufstrserialization_formatreturnNonec                   t          j                    | _        | j        j        | _        t          j        d                              dd                              t
          j	                  dz   | _
        t          j        d                              dd                              t
          j	                  dz   | _        |                                 | _        d S N         i      )tempfileTemporaryDirectory_temp_dir_objnametemp_dirnparangereshapeastypefloat32initializer_valueattribute_valuecreate_test_modelmodel_filenameselfs    a/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/onnx/test/test_external_data.pysetUpzTestLoadExternalDataBase.setUp5   s    %8::!/4!#1!5!5a!;!;!B!B2:!N!NQT!T!y||33Aq99@@LLsR"4466    c                8    | j                                          d S Nr'   cleanupr3   s    r5   tearDownz!TestLoadExternalDataBase.tearDown<       ""$$$$$r7   c                    t           j                            | j        t	          t          j                              dz             S Nz.onnxospathjoinr)   r   uuiduuid4r3   s    r5   get_temp_model_filenamez0TestLoadExternalDataBase.get_temp_model_filename?   -    w||DM3tz||+<+<w+FGGGr7    value	list[Any]tensor_namelocationr   c                   t          t          j        |                    }||_        |p| d}t	          ||           t          t          j                            | j	        |          d          5 }|
                    |j                   d d d            n# 1 swxY w Y   |                    d           t          j        j        |_        |S )N.binrL   wbraw_data)r   r*   arrayr(   r   openrA   rB   rC   r)   writerQ   
ClearFieldonnxr   EXTERNALdata_location)r4   rI   rK   rL   tensortensor_filename	data_files          r5   create_external_data_tensorz4TestLoadExternalDataBase.create_external_data_tensorB   s     BHUOO,,!":&:&:&:&?;;;;"',,t}o>>EE 	-OOFO,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-*%%%#/8s   4BB"Bc           	        t           j                            dg dg|                     | j        d                    }|                     | j        d|          g}t          j        dt           j        j        | j        j	                  g}t          j
        |gd|g |          }t          j        |          }t          j                            | j        d          }t          j        ||| j                   |S )	NConstantvaluesr0   inputsoutputsrI   input_value
test_graphra   rb   initializer
model.onnx)rV   r
   	make_noder\   r0   r/   make_tensor_value_infor   FLOATshape
make_graph
make_modelrA   rB   rC   r)   
save_modelr   )r4   rL   constant_nodeinitializersra   graphmodelr2   s           r5   r1   z*TestLoadExternalDataBase.create_test_modelP   s	   --J22$! 	 . 
 
 ,,& 
 )t/5t7M7S 
 !O$
 
 
 !%((dm\BB~t/HIIIr7   c                x    | j         dk    r|                     d           t          j        | j                   d S )Nr   zDcheck_model supports protobuf only as binary when provided as a path)r   skipTestr	   check_modelr2   r3   s    r5   test_check_modelz)TestLoadExternalDataBase.test_check_modelv   sE    $
22MMV   	D/00000r7   Nr   r   )r   r   rH   rI   rJ   rK   r   rL   r   r   r   )rL   r   r   r   )__name__
__module____qualname____doc__r   __annotations__r6   r<   rF   r\   r1   rv    r7   r5   r   r   -   s          
 !+****7 7 7 7% % % %H H H H CE    $ $ $ $ $L1 1 1 1 1 1r7   r   r   r   	textprotoc                  &    e Zd ZddZddZddZdS )TestLoadExternalDatar   r   c                t   t          j        | j        | j                  }|j        j        d         }t          j                            t          |          | j
                   |j        j        d         j        d         j        }t          j                            t          |          | j                   d S Nr   rV   
load_modelr2   r   rq   rf   r*   testingassert_allcloser   r/   node	attributetr0   r4   rr   initializer_tensorattribute_tensors       r5   test_load_external_dataz,TestLoadExternalData.test_load_external_data   s     3T5NOO"[4Q7

""8,>#?#?AWXXX ;+A.8;=

""8,<#=#=t?STTTTTr7   c                   t          j        | j        | j        d          }t	          || j                   |j        j        d         }t          j	        
                    t          |          | j                   |j        j        d         j        d         j        }t          j	        
                    t          |          | j                   d S )NFload_external_datar   )rV   r   r2   r   r   r)   rq   rf   r*   r   r   r   r/   r   r   r   r0   r   s       r5   !test_load_external_data_for_modelz6TestLoadExternalData.test_load_external_data_for_model   s    !:u
 
 
 	%UDM:::"[4Q7

""8,>#?#?AWXXX ;+A.8;=

""8,<#=#=t?STTTTTr7   c                   t          j        | j        | j                  }t          j                            | j        d          }t	          j        |           t          j                            |d          }t          j	        ||| j                   t          j        || j                  }|j
        j        d         }t          j                            t          |          | j                   |j
        j        d         j        d         j        }t          j                            t          |          | j                   d S N	save_copyrg   r   rV   r   r2   r   rA   rB   rC   r)   mkdirrn   rq   rf   r*   r   r   r   r/   r   r   r   r0   r4   rr   r)   new_model_filename	new_modelr   r   s          r5   test_save_external_dataz,TestLoadExternalData.test_save_external_data        3T5NOO7<<{;;
W\\(LAA143LMMMO$68QRR	&_8;

""8,>#?#?AWXXX$?/2<Q?A

""8,<#=#=t?STTTTTr7   Nrw   )rz   r{   r|   r   r   r   r   r7   r5   r   r   ~   s^        U U U U	U 	U 	U 	UU U U U U Ur7   r   c                      e Zd ZddZddZddZej                             ej	        d	                    dd            Z
dS )TestLoadExternalDataSingleFiletensors_datalist[tuple[list[Any], Any]]r   list[TensorProto]c           	        d}g }t          t          j                            | j        |          d          5 }|D ]\  }}t          t          j        |                    }|                                }|dz  dk    r)|	                    dd|dz  z
  z             |dz   |dz  z
  }|	                    |j
                   t          ||||                                |z
             ||_        |                    d           t          j        j        |_        |                    |           	 d d d            n# 1 swxY w Y   |S )Ntensors.binab   r       rL   offsetlengthrQ   )rS   rA   rB   rC   r)   r   r*   rR   tellrT   rQ   r   r(   rU   rV   r   rW   rX   append)	r4   r   rZ   tensorsr[   rI   rK   rY   r   s	            r5   create_external_data_tensorsz;TestLoadExternalDataSingleFile.create_external_data_tensors   s    ("',,t}o>>EE 	'&2 ' '"{#BHUOO44"))D=A%%OOETFTM-A$BCCC#d]Vd]:F000!,!$>>++f4	    *!!*---'+'7'@$v&&&&#'	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'( s   C9D>>EEr   c                t   t          j        | j        | j                  }|j        j        d         }t          j                            t          |          | j
                   |j        j        d         j        d         j        }t          j                            t          |          | j                   d S r   r   r   s       r5   #test_load_external_single_file_datazBTestLoadExternalDataSingleFile.test_load_external_single_file_data   s     3T5NOO"[4Q7

""8,>#?#?AWXXX ;+A.8;=

""8,<#=#=t?STTTTTr7   c                   t          j        | j        | j                  }t          j                            | j        d          }t	          j        |           t          j                            |d          }t          j	        ||| j                   t          j        || j                  }|j
        j        d         }t          j                            t          |          | j                   |j
        j        d         j        d         j        }t          j                            t          |          | j                   d S r   r   r   s          r5   #test_save_external_single_file_datazBTestLoadExternalDataSingleFile.test_save_external_single_file_data   r   r7   )TFuse_absolute_pathboolc                   t          j        | j        | j                  }t          j                            | j        d          }t	          j        |           t          j                            | j        d          }t	          j        |           |r!t          j                            |d          }nd}t          j                            | j        d          }t	          j        |           t          j                            |d          }dd} |||           | 	                    t           j
        j                  5  t          j        ||| j                   d d d            d S # 1 swxY w Y   d S )Nr   invalid_external_datar   z$../invalid_external_data/tensors.binexternal_datarg   rr   r   rL   r   c                n    | j         j        D ]'}|                    d          rt          ||           (d S )NrQ   )rq   rf   HasFieldr   )rr   rL   rY   s      r5   'convert_model_to_external_data_no_checkzTestLoadExternalDataSingleFile.test_save_external_invalid_single_file_data_and_check.<locals>.convert_model_to_external_data_no_check   sE    +1 8 8??:.. 8%fh7778 8r7   rO   )rr   r   rL   r   )rV   r   r2   r   rA   rB   rC   r)   r   assertRaisesr	   ValidationErrorrn   )	r4   r   rr   	model_dirtraversal_external_data_dir traversal_external_data_locationexternal_data_dirnew_model_filepathr   s	            r5   5test_save_external_invalid_single_file_data_and_checkzTTestLoadExternalDataSingleFile.test_save_external_invalid_single_file_data_and_check   s     3T5NOOGLL<<	
&(gllM2'
 '
# 	,--- 	V/1w||+]0 0,, 0V,GLLHH
"###W\\)\BB	8 	8 	8 	8
 	0/5	
 	
 	
 	

 t|;<< 	R 	ROE#5t7PQQQ	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	Rs   E..E25E2Nr   r   r   r   rw   )r   r   r   r   )rz   r{   r|   r   r   r   parameterizedexpand	itertoolsproductr   r   r7   r5   r   r      s           8U U U UU U U U  ''		
 	
 
#R #R #R 
#R #R #Rr7   r   c                      e Zd ZU dZded<   ddZd ZddZddZ e	j
        edk    d          dd            ZddZddZddZddZddZddZddZddZddZddZddZddZdS )  TestSaveAllTensorsAsExternalDatar   r   r   r   r   c                   t          j                    | _        | j        j        | _        t          j        d                              dd                              t
          j	                  dz   | _
        t          j        d                              dd                              t
          j	                  dz   | _        |                                 | _        d S r    )r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   create_test_model_protorr   r3   s    r5   r6   z&TestSaveAllTensorsAsExternalData.setUp  s    %8::!/4!#1!5!5a!;!;!B!B2:!N!NQT!T!y||33Aq99@@LLsR1133


r7   c                    t           j                            | j        t	          t          j                              dz             S r?   r@   r3   s    r5   rF   z8TestSaveAllTensorsAsExternalData.get_temp_model_filename  rG   r7   r   r   r   c                    g }|D ]B\  }}t          t          j        |                    }||_        |                    |           C|S r9   )r   r*   rR   r(   r   )r4   r   r   rI   rK   rY   s         r5   create_data_tensorsz4TestSaveAllTensorsAsExternalData.create_data_tensors!  sS     ". 	# 	#E;00F%FKNN6""""r7   r   c                j   |                      | j        df| j        dfg          }t          j                            dg dg|d                   }t	          j        dt          j        j        | j        j	                  g}t	          j
        |gd|g |d         g	          }t	          j        |          S )
Nr0   rc   r^   r_   r   r`   rd      re   )r   r0   r/   rV   r
   rh   ri   r   rj   rk   rl   rm   )r4   r   ro   ra   rq   s        r5   r   z8TestSaveAllTensorsAsExternalData.create_test_model_proto,  s    **%'89'7
 
 --rH:WQZ . 
 

 )t/5t7M7S 
 !O 
 
 
  '''r7   :check_model supports protobuf only when provided as a pathc                8    t          j        | j                   d S r9   r	   ru   rr   r3   s    r5   rv   z1TestSaveAllTensorsAsExternalData.test_check_modelG      
 	DJ'''''r7   c                B   |                                  }t          | j        d           t          j        | j        || j                   t          j        || j                  }|j        j        d         }| 	                    |
                    d                     d S )N   size_thresholdr   rX   )rF   r   rr   rV   rn   r   r   rq   rf   assertFalser   r4   model_file_pathrr   r   s       r5   7test_convert_model_to_external_data_with_size_thresholdzXTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_with_size_thresholdN  s    6688&tz$GGGG
OT5NOOO1JKK"[4Q7+44_EEFFFFFr7   c                   |                                  }t          | j        d           t          j        | j        || j                   t          j        || j                  }|j        j        d         }| 	                    |
                    d                     t          j                            t          |          | j                   d S )Nr   r   rX   )rF   r   rr   rV   rn   r   r   rq   rf   
assertTruer   r*   r   r   r   r/   r   s       r5   :test_convert_model_to_external_data_without_size_thresholdz[TestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_without_size_thresholdX  s    6688&tz!DDDD
OT5NOOO1JKK"[4Q7*33ODDEEE

""8,>#?#?AWXXXXXr7   c                   |                                  }t          t          j                              }t	          | j        dd|           t          j        | j        || j                   | 	                    t          j                            t          j                            | j        |                               t          j        || j                  }t!          |           |                                  }t          j        ||| j                   t          j        || j                  }|j        j        d         }|                     t)          |j                             |                     |j        t0          j                   t4          j                            t;          |          | j                   |j        j        d         j         d         j!        }|                     t)          |j                             |                     |j        t0          j                   t4          j                            t;          |          | j"                   d S )Nr   T)r   all_tensors_to_one_filerL   )#rF   r   rD   rE   r   rr   rV   rn   r   r   rA   rB   isfilerC   r)   r   r   rq   rf   r   lenr   assertEqualrX   r   DEFAULTr*   r   r   r   r/   r   r   r   r0   )r4   r   external_data_filerr   r   r   s         r5   ?test_convert_model_to_external_data_from_one_file_with_locationz`TestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_from_one_file_with_locationb  s   6688 ..&J$('		
 	
 	
 	
 	
OT5NOOOrw||DMCU'V'VWWXXX1JKK 	)///66880IJJJ1JKK"[4Q7/=>>???+9;;NOOO

""8,>#?#?AWXXX ;+A.8;=-;<<===)79LMMM

""8,<#=#=t?STTTTTr7   c                   |                                  }t          | j        dd           t          j        | j        || j                   |                     t          j        	                    |                     |                     t          j        	                    t          j        
                    | j        |                               d S )Nr   T)r   r   rF   r   rr   rV   rn   r   r   rA   rB   r   rC   r)   r4   r   s     r5   Rtest_convert_model_to_external_data_from_one_file_without_location_uses_model_namezsTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_from_one_file_without_location_uses_model_name  s     6688&Jq$	
 	
 	
 	
 	
OT5NOOO77888rw||DM?'S'STTUUUUUr7   c                V   |                                  }t          | j        ddd           t          j        | j        || j                   |                     t          j        	                    |                     |                     t          j        	                    t          j        
                    | j        d                               |                     t          j        	                    t          j        
                    | j        d                               d S )Nr   Fr   r   convert_attributerc   r0   )rF   r   rr   rV   rn   r   r   rA   rB   r   rC   r)   r   r   s     r5   Itest_convert_model_to_external_data_one_file_per_tensor_without_attributezjTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_one_file_per_tensor_without_attribute  s     6688&J$)#		
 	
 	
 	
 	
OT5NOOO77888rw||DM='Q'QRRSSST]DU(V(VWWXXXXXr7   c                V   |                                  }t          | j        ddd           t          j        | j        || j                   |                     t          j        	                    |                     |                     t          j        	                    t          j        
                    | j        d                               |                     t          j        	                    t          j        
                    | j        d                               d S )Nr   FTr   rc   r0   r   r   s     r5   Ftest_convert_model_to_external_data_one_file_per_tensor_with_attributezgTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_one_file_per_tensor_with_attribute  s     6688&J$)"		
 	
 	
 	
 	
OT5NOOO77888rw||DM='Q'QRRSSSrw||DMCT'U'UVVWWWWWr7   c                .   |                                  }t          | j        ddd           t          j        | j        || j                   |                     t          j        	                    t          j        
                    | j        d                               |                     t          j        	                    t          j        
                    | j        d                               t          j        || j                  }|j        j        d         }|                     |                    d                     |j        j        d         j        d         j        }|                     |                    d                     d S )Nr   F)r   r   r   rc   r0   rX   )rF   r   rr   rV   rn   r   r   rA   rB   r   rC   r)   r   r   rq   rf   r   r   r   r   r4   r   rr   r   r   s        r5   Etest_convert_model_to_external_data_does_not_convert_attribute_valueszfTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_does_not_convert_attribute_values  sE    6688&J#$)		
 	
 	
 	
 	
OT5NOOOrw||DM='Q'QRRSSST]DU(V(VWWXXX1JKK"[4Q7*33ODDEEE ;+A.8;=)22?CCDDDDDr7   c                   |                                  }t          | j        dd           t          j        | j        || j                   t          j        || j                  }|j        j        d         }t          j
                            t          |          | j                   |                     |                    d                     |j        j        d         j        d         j        }t          j
                            t          |          | j                   |                     |                    d                     d S )Nr   Tr   r   rX   )rF   r   rr   rV   rn   r   r   rq   rf   r*   r   r   r   r/   r   r   r   r   r   r0   r   s        r5   =test_convert_model_to_external_data_converts_attribute_valuesz^TestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_converts_attribute_values  s   6688&JqD	
 	
 	
 	
 	
OT5NOOO1JKK"[4Q7

""8,>#?#?AWXXX*33ODDEEE ;+A.8;=

""8,<#=#=t?STTT(11/BBCCCCCr7   c                   |                                  }t          j        | j        || j        d           |                     t          j                            |                     t          j	        || j                  }|j
        j        d         }|                     |                    d                     |j
        j        d         j        d         j        }|                     |                    d                     d S )NF)save_as_external_datar   rX   )rF   rV   rn   rr   r   r   rA   rB   r   r   rq   rf   r   r   r   r   r   r   s        r5   Etest_save_model_does_not_convert_to_external_data_and_saves_the_modelzfTestSaveAllTensorsAsExternalData.test_save_model_does_not_convert_to_external_data_and_saves_the_model  s     6688J%"'		
 	
 	
 	
 	778881JKK"[4Q7+44_EEFFF ;+A.8;=)22?CCDDDDDr7   c           
     ~   |                                  }t          j        | j        || j        ddd dd           t          j        || j                  }|j        j        d         }|                     |	                    d                     t          j                            t          |          | j                   |j        j        d         j        d         j        }|                     |	                    d                     t          j                            t          |          | j                   d S )NTr   Fr   r   rL   r   r   rX   rF   rV   rn   rr   r   r   rq   rf   r   r   r*   r   r   r   r/   r   r   r   r   r0   r   s        r5   0test_save_model_does_convert_and_saves_the_modelzQTestSaveAllTensorsAsExternalData.test_save_model_does_convert_and_saves_the_model  s   6688J%"&$(#		
 		
 		
 		
 1JKK"[4Q7*33ODDEEE

""8,>#?#?AWXXX ;+A.8;=)22?CCDDD

""8,<#=#=t?STTTTTr7   c           	        |                                  }t          j        | j        || j        dd dd           t          j        || j        d          }t          j        ||| j        dd dd           t          j        || j                  }|j        j        d         }|                     |	                    d                     t          j                            t          |          | j                   |j        j        d         j        d         j        }|                     |	                    d                     t          j                            t          |          | j                   d S )NTr   F)r   rL   r   r   r   rX   r   r   s        r5   -test_save_model_without_loading_external_datazNTestSaveAllTensorsAsExternalData.test_save_model_without_loading_external_data  sn   6688J%"&#	
 	
 	
 	
 T65
 
 
 	%"&#	
 	
 	
 	
 1JKK"[4Q7*33ODDEEE

""8,>#?#?AWXXX ;+A.8;=)22?CCDDD

""8,<#=#=t?STTTTTr7   c                   |                                  }| j        j        j        d         j        }t          j        | j        || j        dd           |                     t          j
                            |                     t          j        || j        d          }|j        j        d         }d|_        t          || j                   |                     |j        |           d S )Nr   T)r   r   Fr   s   dummpy_raw_data)rF   rr   rq   rf   rQ   rV   rn   r   r   rA   rB   r   r   r   r)   r   )r4   r   original_raw_datarr   r   s        r5   6test_save_model_with_existing_raw_data_should_overridezWTestSaveAllTensorsAsExternalData.test_save_model_with_existing_raw_data_should_override&  s    6688 J,8;DJ%"&	
 	
 	
 	
 	77888T65
 
 
 #[4Q7&8#%&8$-HHH+46GHHHHHr7   Nrw   r   r   r   )rz   r{   r|   r   r~   r6   rF   r   r   unittestskipIfrv   r   r   r   r   r   r   r   r   r   r   r   r  r   r7   r5   r   r     s         !+****4 4 4 4H H H	 	 	 	( ( ( (6 X_
*D ( ( (	 (G G G GY Y Y YU U U U>V V V VY Y Y Y"X X X X"E E E E.D D D D$E E E E&U U U U.!U !U !U !UFI I I I I Ir7   r   c                      e Zd ZU dZded<   ddZed             ZddZdd
Z	 e
j        edk    d          dd            ZddZddZddZdS )TestExternalDataToArrayr   r   r   r   r   c                r   t          j                    | _        | j        j        | _        t
          j                            | j        d          | _        t          j
                            ddd                              t          j                  | _        d| _        |                                 | _        d S )Nrg   
   <   d   )   i,  )r%   r&   r'   r(   r)   rA   rB   rC   _model_file_pathr*   randomrandr-   r.   
large_data
small_datar1   rr   r3   s    r5   r6   zTestExternalDataToArray.setUpE  s    %8::!/4%'W\\$-%N%N)..R55<<RZHH$++--


r7   c                    | j         S r9   )r  r3   s    r5   r   z'TestExternalDataToArray.model_file_pathM  s    $$r7   c                8    | j                                          d S r9   r:   r3   s    r5   r<   z TestExternalDataToArray.tearDownQ  r=   r7   r   c                "   t          j        dt          j        | j        j                  }t          j        dt          j        | j        j        t          j        	                    | j                  d          }t          j        | j        t          j                  }t          j        dt          j        |j        t          j        	                    |          d          }t          j        dt          j        | j                  }t          j                             dddgdg          }t          j                             d	dgdgt          j        
          }t          j        ||gd|g|g||g          }t          j        |d          S )NXT)r(   	data_typedimsvalsrawShapeCReshapeY)ra   rb   Cast)ra   rb   toz
test-model)rf   zonnx-example)producer_name)r
   ri   r   rj   r  rk   make_tensorrV   numpy_helpertobytes_little_endianr*   rR   r  int64INT64rh   rl   rm   )	r4   r  
input_init
shape_data
shape_initr  r,   cast	graph_defs	            r5   r1   z)TestExternalDataToArray.create_test_modelT  st   )#{/@$/BWXX'!'&"88II
 
 

 Xdorx88
'!'!"88DD
 
 

 )#{/@$/RR+''>E ( 
 

 {$$C53%K4E % 
 
 %dOCC#Z0
 
 
	  .IIIIr7   r   c                8    t          j        | j                   d S r9   r   r3   s    r5   rv   z(TestExternalDataToArray.test_check_modelz  r   r7   c                    t          j        | j        | j        | j        ddd           t          j        | j        | j        d          }|                     t          j        t          j	        |d           d S )NTFr   r   r   r   r   )strict_mode)
rV   rn   rr   r   r   loadr   r   InferenceErrorinfer_shapes)r4   model_without_external_datas     r5   .test_reshape_inference_with_external_data_failzFTestExternalDataToArray.test_reshape_inference_with_external_data_fail  s    J %"&$)	
 	
 	
 	
 '+i $";PU'
 '
 '
# 	*('	 	 	
 	
 	
 	
 	
r7   c                .   t          j        | j        | j        | j        ddd           t          j        | j        | j        d          }t          |j        j        d         | j	                  }t          j                            || j                   d S )NTFr   r.  r   )rV   rn   rr   r   r   r0  r   rq   rf   r)   r*   r   r   r  )r4   rr   loaded_large_datas      r5    test_to_array_with_external_dataz8TestExternalDataToArray.test_to_array_with_external_data  s    J %"&$)	
 	
 	
 	
 	 $";PU
 
 
 %U[%<Q%?OO

""#4doFFFFFr7   c           
        t          j        | j        | j        | j        ddd dd           t          j        | j        | j        d          }|j        j        d         }|                     |	                    d                     t          j                            t          || j                  | j                   |j        j        d         }|                     |	                    d                      t          j                            t          |          | j                   t          j        || j        | j        ddd dd           t          j        | j        | j        d          }|j        j        d         }|                     |	                    d                     t          j                            t          || j                  | j                   |j        j        d         }|                     |	                    d                     t          j                            t          || j                  | j                   d S )	NTFr   r   r   r   rX   r   )rV   rn   rr   r   r   r0  rq   rf   r   r   r*   r   r   r   r)   r  r  )r4   model_without_loading_externallarge_input_tensorsmall_shape_tensors       r5   1test_save_model_with_external_data_multiple_timeszITestExternalDataToArray.test_save_model_with_external_data_multiple_times  sN    	J %"&$)"		
 		
 		
 		
 *. $";PU*
 *
 *
& <AMaP*33ODDEEE

""'77	
 	
 	
 <AMaP.77HHHIII

""8,>#?#?QQQ 	* %"&$)"		
 		
 		
 		
 *. $";PU*
 *
 *
& <AMaP*33ODDEEE

""'77	
 	
 	
 <AMaP*33ODDEEE

""'77	
 	
 	
 	
 	
r7   Nrw   r  )rz   r{   r|   r   r~   r6   propertyr   r<   r1   r  r  rv   r4  r7  r<  r   r7   r5   r  r  <  s         !+****. . . . % % X%% % % %$J $J $J $JL X_
*D ( ( (	 (
 
 
 
,G G G G"5
 5
 5
 5
 5
 5
r7   r  c                  6    e Zd ZdZ	 ddd
ZddZddZddZdS )3TestNotAllowToLoadExternalDataOutsideModelDirectoryEssential test to check that onnx (validate) C++ code will not allow to load external_data outside the model
    directory.
    rH   rI   rJ   rK   r   rL   r   r   c                    t          t          j        |                    }||_        |p| d}t	          ||           |                    d           t          j        j        |_	        |S )NrN   rO   rQ   )
r   r*   rR   r(   r   rU   rV   r   rW   rX   )r4   rI   rK   rL   rY   rZ   s         r5   r\   zOTestNotAllowToLoadExternalDataOutsideModelDirectory.create_external_data_tensor  sm     BHUOO,,!":&:&:&:&?;;;;*%%%#/8r7   r   c                    |                      d          | _        |                     t          j        j                  5  t	          j        | j                   ddd           dS # 1 swxY w Y   dS )MWe only test the model validation as onnxruntime uses this to load the model.z../../file.binNr1   r2   r   rV   r	   r   ru   r3   s    r5   rv   zDTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model  s    "445EFFt|;<< 	5 	5 3444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5   A&&A*-A*c                    |                      d          | _        |                     t          j        j                  5  t	          j        | j                   ddd           dS # 1 swxY w Y   dS )More relative path test.z../test/../file.binNrD  r3   s    r5   test_check_model_relativezMTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model_relative  s    "445JKKt|;<< 	5 	5 3444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5rE  c                    |                      d          | _        |                     t          j        j                  5  t	          j        | j                   ddd           dS # 1 swxY w Y   dS )JONNX checker disallows using absolute path as location in external tensor.z
//file.binNrD  r3   s    r5   test_check_model_absolutezMTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model_absolute  s    "44\BBt|;<< 	5 	5 3444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5rE  Nrx   ry   rw   )rz   r{   r|   r}   r\   rv   rH  rK  r   r7   r5   r?  r?    sz         
 CE    5 5 5 55 5 5 55 5 5 5 5 5r7   r?  ntzSkip Windows test)reasonc                  *    e Zd ZdZddZddZddZdS )	<TestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindowsr@  r   r   c                    |                      d          | _        |                     t          j        j                  5  t	          j        | j                   ddd           dS # 1 swxY w Y   dS )rC  z..\..\file.binNrD  r3   s    r5   rv   zMTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model  s    "445GHHt|;<< 	5 	5 3444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5rE  c                    |                      d          | _        |                     t          j        j                  5  t	          j        | j                   ddd           dS # 1 swxY w Y   dS )rG  z..\test\..\file.binNrD  r3   s    r5   rH  zVTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model_relative  s    "445MNNt|;<< 	5 	5 3444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5rE  c                    |                      d          | _        |                     t          j        j                  5  t	          j        | j                   ddd           dS # 1 swxY w Y   dS )rJ  zC:/file.binNrD  r3   s    r5   rK  zVTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model_absolute  s    "44]CCt|;<< 	5 	5 3444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5rE  Nrw   )rz   r{   r|   r}   rv   rH  rK  r   r7   r5   rO  rO    sZ         5 5 5 55 5 5 55 5 5 5 5 5r7   rO  c                        e Zd Zd fdZ xZS )(TestSaveAllTensorsAsExternalDataWithPathr   pathlib.Pathc                h    t          j        t                                                                S r9   )pathlibPathsuperrF   )r4   	__class__s    r5   rF   z@TestSaveAllTensorsAsExternalDataWithPath.get_temp_model_filename!  s#    |EGG;;==>>>r7   r   rU  )rz   r{   r|   rF   __classcell__)rZ  s   @r5   rT  rT     s=        ? ? ? ? ? ? ? ? ? ?r7   rT  c                  &    e Zd Zedd            ZdS )TestExternalDataToArrayWithPathr   rU  c                4    t          j        | j                  S r9   )rW  rX  r  r3   s    r5   r   z/TestExternalDataToArrayWithPath.model_file_path&  s    |D1222r7   Nr[  )rz   r{   r|   r=  r   r   r7   r5   r^  r^  %  s2        3 3 3 X3 3 3r7   r^  c                  F    e Zd ZddZddZddZddZddZddZddZ	dS )TestFunctionsAndSubGraphsr   r   c                $   t          j                    | _        | j        j        }t          j                            |d          | _        t          j	        d          
                    t          j                  }t          |d          | _        d S )Nrg   r   rY   )r%   r&   r'   r(   rA   rB   rC   r  r*   r+   r-   r.   r   _tensor)r4   r)   rR   s      r5   r6   zTestFunctionsAndSubGraphs.setUp,  sh    %8::%*%'W\\(L%I%I	$&&rz22!%22r7   c                8    | j                                          d S r9   r:   r3   s    r5   r<   z"TestFunctionsAndSubGraphs.tearDown3  r=   r7   rY   r   c                P    |                      |j        t          j                   d S r9   )r   rX   r   r   r4   rY   s     r5   _check_is_internalz,TestFunctionsAndSubGraphs._check_is_internal6  s$    -{/BCCCCCr7   c                P    |                      |j        t          j                   d S r9   )r   rX   r   rW   rf  s     r5   _check_is_externalz,TestFunctionsAndSubGraphs._check_is_external9  s$    -{/CDDDDDr7   rr   r   nodesSequence[NodeProto]c                D   |D ]^}|                      |j        d           |j        d         j        }|                    | j                   |                     |           _t          |dd           |D ])}|j        d         j        }|                     |           *dS )a  Check that the tensors in the model are externalized.

        The tensors in the specified sequence of Constant nodes are set to self._tensor,
        an internal tensor. The model is then converted to external data format.
        The tensors are then checked to ensure that they are externalized.

        Arguments:
            model: The model to check.
            nodes: A sequence of Constant nodes.

        r^   r   Tr   N)	r   op_typer   r   CopyFromrc  rg  r   ri  )r4   rr   rj  r   rY   s        r5   _checkz TestFunctionsAndSubGraphs._check<  s      	, 	,DT\:666^A&(FOODL)))##F++++&uQRVWWWW 	, 	,D^A&(F##F++++	, 	,r7   c                    d}t          j        |          }|                     ||j        d         j        d         g           d S )Na|  
           <ir_version: 7,  opset_import: ["": 15, "local": 1]>
           agraph (float[N] X) => (float[N] Y)
            {
              Y = local.add(X)
            }

            <opset_import: ["" : 15],  domain: "local">
            add (float[N] X) => (float[N] Y) {
              C = Constant <value = float[1] {1.0}> ()
              Y = Add (X, C)
           }
        r   )r   parse_modelro  	functionsr   )r4   
model_textrr   s      r5   test_functionz'TestFunctionsAndSubGraphs.test_functionT  sG    
 ":..EEOA.3A6788888r7   c                    d}t          j        |          }|j        j        d         }d |j        D             }|                     ||           d S )Na2  
           <ir_version: 7,  opset_import: ["": 15, "local": 1]>
           agraph (bool flag, float[N] X) => (float[N] Y)
            {
              Y = if (flag) <
                then_branch = g1 () => (float[N] Y_then) {
                    B = Constant <value = float[1] {0.0}> ()
                    Y_then = Add (X, C)
                },
                else_branch = g2 () => (float[N] Y_else) {
                    C = Constant <value = float[1] {1.0}> ()
                    Y_else = Add (X, C)
                }
              >
            }
        r   c                2    g | ]}|j         j        d          S )r   )gr   ).0attrs     r5   
<listcomp>z;TestFunctionsAndSubGraphs.test_subgraph.<locals>.<listcomp>x  s     GGGT$&+a.GGGr7   )r   rq  rq   r   r   ro  )r4   rs  rr   if_nodeconstant_nodess        r5   test_subgraphz'TestFunctionsAndSubGraphs.test_subgraphe  sZ    
  ":..+"1%GGW5FGGGE>*****r7   Nrw   )rY   r   r   r   )rr   r   rj  rk  r   r   )
rz   r{   r|   r6   r<   rg  ri  ro  rt  r}  r   r7   r5   ra  ra  +  s        3 3 3 3% % % %D D D DE E E E, , , ,09 9 9 9"+ + + + + +r7   ra  r   tuple[ModelProto, np.ndarray]c                     t          j        d          } t          j        dt          j                  }| j        j                            t          |d                     | |fS )zPCreate a simple model with a large initializer suitable for external data tests.z
        <ir_version: 7, opset_import: ["": 17]>
        agraph (float[100, 100] input) => (float[100, 100] output) {
            output = Identity(input)
        }
        )r  r  dtypeweightr(   )	r   rq  r*   onesr.   rq   rf   r   r   )rr   rR   s     r5   _make_external_data_test_modelr  |  sa    	 E GJbj111E	K"":e(#C#C#CDDD%<r7   z/Symlinks require elevated privileges on Windowsc                      e Zd ZdZddZdS )%TestSaveExternalDataSymlinkProtectionzSTest that save_external_data rejects symlinks to prevent arbitrary file overwrites.r   r   c           	        t           j                            | j        d          }t	          |d          5 }|                    d           ddd           n# 1 swxY w Y   t                      \  }}t           j                            | j        d          }d}t          j        ||dd|d	           t           j                            | j        |          }t          j	        |           t          j
        ||           t          j        |d
          }|                                |j        j        d         _        |                     t"          j                  5  t          j        ||dd|d	           ddd           n# 1 swxY w Y   t	          |          5 }|                     |                                d           ddd           dS # 1 swxY w Y   dS )z4Saving external data must refuse to follow symlinks.zsensitive.txtwSENSITIVE DATANrg   data.binTr   r   r   rL   r   Fr   r   )rA   rB   rC   r)   rS   rT   r  rV   rn   removesymlinkr0  tobytesrq   rf   rQ   r   r	   r   r   read)	r4   sensitive_filefrr   rR   
model_pathext_dataext_data_pathloaded_models	            r5    test_save_rejects_symlink_targetzFTestSaveExternalDataSymlinkProtection.test_save_rejects_symlink_target  sw   dm_EE.#&& 	&!GG$%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 677uW\\$->>
"&$(	
 	
 	
 	
 T]H==
	-   

>=111yFFF5:]]__&q)2w677 	 	O&*(,!#   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 .!! 	9QQVVXX'7888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9s5   AAA!FFF")GGGNrw   )rz   r{   r|   r}   r  r   r7   r5   r  r    s1         ^]&9 &9 &9 &9 &9 &9r7   r  c                  *    e Zd ZdZddZddZddZdS )	%TestLoadExternalDataSymlinkProtectionzQTest that loading external data rejects symlinks to prevent arbitrary file reads.r   r   c                   t                      \  }}t          j                            | j        d          }d}t          j        ||dd|d           t          j                            | j        d          }t          |d          5 }|                    d           d	d	d	           n# 1 swxY w Y   t          j                            | j        |          }t          j	        |           t          j
        ||           |                     t          j                  5  t          j        |           d	d	d	           d	S # 1 swxY w Y   d	S )
zLLoading a model whose external data is a symlink must raise ValidationError.rg   r  Tr   r  
target.txtr  r  N)r  rA   rB   rC   r)   rV   rn   rS   rT   r  r  r   r	   r   r0  )r4   rr   _r  r  target_filer  r  s           r5   'test_load_rejects_symlink_external_datazMTestLoadExternalDataSymlinkProtection.test_load_rejects_symlink_external_data  s   133qW\\$->>
"&$(	
 	
 	
 	
 gll4=,??+s## 	&qGG$%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& T]H==
	-   

;... w677 	" 	"Ij!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s$   B**B.1B."EEEc                   t                      \  }}t          j                            | j        d          }d}t          j        ||dd|d           t          j                            | j        d          }t          |d          5 }|                    d           d	d	d	           n# 1 swxY w Y   t          j                            | j        |          }t          j	        |           t          j
        ||           t          j        |d
          }|                     t          j                  5  t          || j                   d	d	d	           d	S # 1 swxY w Y   d	S )zAload_external_data_for_model must reject symlinked external data.rg   r  Tr   r  r  r  r  NFr   )r  rA   rB   rC   r)   rV   rn   rS   rT   r  r  r0  r   r	   r   r   )	r4   rr   r  r  r  r  r  r  r  s	            r5   1test_load_external_data_for_model_rejects_symlinkzWTestLoadExternalDataSymlinkProtection.test_load_external_data_for_model_rejects_symlink  s   133qW\\$->>
"&$(	
 	
 	
 	
 gll4=,??+s## 	&qGG$%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& T]H==
	-   

;... yFFFw677 	F 	F(t}EEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	Fs$   B**B.1B.8EE"Ec                   t           j                            | j        d          }t          j        |           t           j                            |d          }t          |d          5 }|                    d           ddd           n# 1 swxY w Y   t           j                            | j        d          }t          j        |           t           j                            |d          }t          j        |           t                      \  }}t           j                            |d          }t          j	        ||d	d	d
d           t          j        |           t          j        ||           t          j        |d          }	|                     t          j                  5  t#          |	|           ddd           dS # 1 swxY w Y   dS )zIA symlink in the parent directory must be caught by realpath containment.	sensitivez
secret.binrP   sx  SENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATASENSITIVE DATANr   subdirrg   Tzsubdir/secret.binr   r  Fr   )rA   rB   rC   r)   makedirsrS   rT   r  rV   rn   shutilrmtreer  r0  r   r	   r   r   )
r4   sensitive_dirsecret_filer  r   subdir_pathrr   r  r  r  s
             r5   *test_load_rejects_parent_directory_symlinkzPTestLoadExternalDataSymlinkProtection.test_load_rejects_parent_directory_symlink  s-    T]K@@
M"""gll=,??+t$$ 	-GG+,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- GLL<<	
Igll9h77
K    233qW\\)\::
"&$((	
 	
 	
 	
 	k"""

=+... yFFFw677 	B 	B(yAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Bs$   *BBB-GGGNrw   )rz   r{   r|   r}   r  r  r  r   r7   r5   r  r    sc         \[" " " "6F F F F8"B "B "B "B "B "Br7   r  z'Hardlinks behave differently on Windowsc                      e Zd ZdZddZdS )&TestLoadExternalDataHardlinkProtectionzFTest that loading external data rejects files with multiple hardlinks.r   r   c                    t                      \  }}t          j                            | j        d          }d}t          j        ||dd|d           t          j                            | j        |          }t          j                            | j        d          }t          j        ||           |                     t          j
                  5  t          j        |           ddd           dS # 1 swxY w Y   dS )zVLoading a model whose external data has multiple hardlinks must raise ValidationError.rg   r  Tr   r  zhardlink_data.binN)r  rA   rB   rC   r)   rV   rn   linkr   r	   r   r0  )r4   rr   r  r  r  r  hardlink_paths          r5   *test_load_rejects_hardlinked_external_datazQTestLoadExternalDataHardlinkProtection.test_load_rejects_hardlinked_external_data   s(   133qW\\$->>
"&$(	
 	
 	
 	
 T]H==T]4GHH
}--- w677 	" 	"Ij!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   C33C7:C7Nrw   )rz   r{   r|   r}   r  r   r7   r5   r  r    s.        PP" " " " " "r7   r  c                      e Zd ZdZddZdS )*TestSaveExternalDataAbsolutePathValidationz4Test that save_external_data rejects absolute paths.r   r   c                $   t          j        dt           j                  }t          |d          }t	          |d           |                     t          j                  5  t          || j	                   ddd           dS # 1 swxY w Y   dS )z;Absolute paths must be rejected as external data locations.)r  r  r  r  z/etc/passwdrO   N)
r*   r  r.   r   r   r   r	   r   r   r)   )r4   rR   rY   s      r5   test_save_rejects_absolute_pathzJTestSaveExternalDataAbsolutePathValidation.test_save_rejects_absolute_path<  s    bj111E111&=9999w677 	6 	6vt}555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s   "BB	B	Nrw   )rz   r{   r|   r}   r  r   r7   r5   r  r  9  s.        >>6 6 6 6 6 6r7   r  c                  ~    e Zd ZdZe	 ddd	            ZddZddZddZddZ	ddZ
ddZddZddZddZddZdS )TestExternalDataInfoSecuritya  Tests for ExternalDataInfo hardening against attribute injection and bounds.

    Covers all attack vectors from the security advisory: unknown key injection,
    dunder attribute injection, negative offset/length bypass, and validates
    that legitimate keys still work correctly.
    test_tensorentriesdict[str, str]rK   r   r   r   c                ,   t                      }||_        t           j        |_        |j                            dg           t           j        |_        |                                 D ],\  }}|j	        
                                }||_        ||_        -|S )z@Create a TensorProto with given external_data key-value entries.   )r   r(   rj   r  r  extendrW   rX   itemsr   addkeyrI   )r  rK   rY   r  rI   entrys         r5   _make_tensor_with_external_dataz<TestExternalDataInfoSecurity._make_tensor_with_external_dataM  s     !&,A3*3!--// 	  	 JC(,,..EEIEKKr7   r   c                   |                      ddddd          }t          |          }|                     |j        d           |                     |j        d           |                     |j        t                     |                     |j        d           |                     |j        t                     |                     |j        d           dS )	zCAll valid external_data keys must be accepted and correctly parsed.weights.bin161024zsha256:abc123)rL   r   r   checksum   r   N)	r  r   r   rL   r   assertIsInstanceintr   r  r4   rY   infos      r5   !test_valid_external_data_acceptedz>TestExternalDataInfoSecurity.test_valid_external_data_accepted^  s    55) +	 
 
  ''666b)))dk3///d+++dk3///88888r7   c                   |                      ddd          }t          j        d          5 }t          j        d           t	          |          }ddd           n# 1 swxY w Y   |                     t          |d          d	           |                     |j        d           | 	                    t          d
 |D                       d           dS )zJUnknown external_data keys must not be set as object attributes (CWE-915).r  
evil_value)rL   malicious_attrTrecordalwaysNr  z;Unknown key 'malicious_attr' should not become an attributec              3  B   K   | ]}d t          |j                  v V  dS )r  Nr   messagerx  r  s     r5   	<genexpr>zITestExternalDataInfoSecurity.test_unknown_key_rejected.<locals>.<genexpr>  s0      CCq C	NN2CCCCCCr7   z3Expected warning about unknown key 'malicious_attr')r  warningscatch_warningssimplefilterr   r   hasattrr   rL   r   any)r4   rY   caughtr  s       r5   test_unknown_key_rejectedz6TestExternalDataInfoSecurity.test_unknown_key_rejectedp  s*   55&,GG
 
 $D111 	,V!(+++#F++D	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	D*++I	
 	
 	

 	666CCFCCCCCA	
 	
 	
 	
 	
s   $AA"%A"c                <   |                      ddi          }|j                                        }d|_        d|_        t
          }t          j        d          5 }t          j        d           t          |          }ddd           n# 1 swxY w Y   | 	                    ||           | 
                    t          |          j        d	           | 
                    |j        d           |                     t          d
 |D                       d           dS )zDunder keys like '__class__' must not be injected via external_data (CWE-915).

        Without the whitelist, setattr(self, '__class__', ...) would corrupt
        the object type, enabling type confusion attacks.
        rL   r  rZ  zbuiltins.dictTr  r  Nr   c              3  B   K   | ]}d t          |j                  v V  dS )rZ  Nr  r  s     r5   r  zHTestExternalDataInfoSecurity.test_dunder_key_rejected.<locals>.<genexpr>  s/      >>!s19~~->>>>>>r7   z-Expected warning about dunder key '__class__')r  r   r  r  rI   r   r  r  r  r  r   typerz   rL   r   r  )r4   rY   dunder_entryoriginal_classr  r  s         r5   test_dunder_key_rejectedz5TestExternalDataInfoSecurity.test_dunder_key_rejected  sV    55z=6QRR+//11&,)$D111 	,V!(+++#F++D	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	dN333d,.@AAA666>>v>>>>>;	
 	
 	
 	
 	
s   $BBBc                ,   |                      ddd          }|                     t                    5 }t          |           ddd           n# 1 swxY w Y   |                     dt          |j                                                             dS )zBNegative offset must raise ValueError to prevent seek(-1) attacks.r  z-1rL   r   Nnon-negativer  r   
ValueErrorr   assertInr   	exceptionlowerr4   rY   ctxs      r5   test_negative_offset_rejectedz:TestExternalDataInfoSecurity.test_negative_offset_rejected  s    55&$77
 
 z** 	%cV$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%nc#-&8&8&>&>&@&@AAAAA   AAAc                ,   |                      ddd          }|                     t                    5 }t          |           ddd           n# 1 swxY w Y   |                     dt          |j                                                             dS )zCNegative length must raise ValueError to prevent underflow attacks.r  z-100rL   r   Nr  r  r  s      r5   test_negative_length_rejectedz:TestExternalDataInfoSecurity.test_negative_length_rejected  s    55&&99
 
 z** 	%cV$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%nc#-&8&8&>&>&@&@AAAAAr  c                    |                      dddd          }t          |          }|                     |j        d           |                     |j        d           |                     |j        d           dS )zNZero values for offset/length should be accepted (edge case for bounds check).r  0r   r   N)r  r   r   rL   r   r   r  s      r5   $test_zero_offset_and_length_acceptedzATestExternalDataInfoSecurity.test_zero_offset_and_length_accepted  s    55&#EE
 
  ''666a(((a(((((r7   c                   |                      ddddd          }t          j        d          5 }t          j        d           t	          |          }d	d	d	           n# 1 swxY w Y   |                     t          |d
                     |                     t          |d                     |                     |j        d           d |D             }|                     t          |          dd           | 
                    d
|d                    | 
                    d|d                    | 
                    d|d                    d	S )z>Multiple unknown keys in a single tensor must all be rejected.r  abc)rL   evil_oneevil_two__dict__Tr  r  Nr  r  c                    g | ]>}d t          |j                                                  v *t          |j                  ?S )zunknown external data key)r   r  r  r  s     r5   rz  zXTestExternalDataInfoSecurity.test_multiple_unknown_keys_all_rejected.<locals>.<listcomp>  sI      
  
  
*c!)nn.B.B.D.DDD 	NNDDDr7   r   z.Expected 1 aggregated warning for unknown keysr   r  )r  r  r  r  r   r   r  r   rL   r   r  )r4   rY   r  r  unknown_key_warningss        r5   'test_multiple_unknown_keys_all_rejectedzDTestExternalDataInfoSecurity.test_multiple_unknown_keys_all_rejected  s   55)	 
 
 $D111 	,V!(+++#F++D	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	z22333z22333666 
  
 
  
  

 	$%%<	
 	
 	
 	j"6q"9:::j"6q"9:::j"6q"9:::::s   $A  A$'A$c                    |                      t          t                     |                     t          t          h d                     dS )z>The whitelist must be a frozenset to prevent runtime mutation.>   r   r   basepathr  rL   N)r  r   	frozensetr   r3   s    r5   $test_allowed_keys_constant_is_frozenzATestExternalDataInfoSecurity.test_allowed_keys_constant_is_frozen  sP    99EEE'NNNOO	
 	
 	
 	
 	
r7   c                    |                      ddd          }|                     t                    5  t          |           ddd           dS # 1 swxY w Y   dS )zFNon-numeric offset string must raise ValueError from int() conversion.r  abcr  Nr  r   r  r   rf  s     r5   test_non_numeric_offset_raisesz;TestExternalDataInfoSecurity.test_non_numeric_offset_raises  s    55&%88
 
 z** 	% 	%V$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%   AAAc                    |                      ddd          }|                     t                    5  t          |           ddd           dS # 1 swxY w Y   dS )zFNon-numeric length string must raise ValueError from int() conversion.r  not_a_numberr  Nr  rf  s     r5   test_non_numeric_length_raisesz;TestExternalDataInfoSecurity.test_non_numeric_length_raises  s    55&.AA
 
 z** 	% 	%V$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%r	  N)r  )r  r  rK   r   r   r   rw   )rz   r{   r|   r}   staticmethodr  r  r  r  r  r  r  r   r  r  r  r   r7   r5   r  r  E  s          )    \ 9 9 9 9$
 
 
 
*
 
 
 
4B B B BB B B B	) 	) 	) 	); ; ; ;>
 
 
 
% % % %% % % % % %r7   r  c                  *    e Zd ZdZddZddZddZdS )	&TestLoadExternalDataFileSizeValidationzQTests for defense-in-depth file-size validation in load_external_data_for_tensor.r   r   c                |   t          j        dt           j                  }t          |d          }t	          |d           t
          j                            | j        d          }t          |d          5 }|
                    |j                   ddd           n# 1 swxY w Y   t
          j                            |          }t	          |d|d	z   
           |                    d           |                     t          d          5  t!          || j                   ddd           dS # 1 swxY w Y   dS )z.Offset beyond file size must raise ValueError.r  r  r  r  r  rO   rP   Nr  r  rQ   zoffset.*exceeds file sizer*   r  r.   r   r   rA   rB   rC   r)   rS   rT   rQ   getsizerU   assertRaisesRegexr  r   r4   rR   rY   	data_pathr  	file_sizes         r5   $test_offset_exceeds_file_size_raiseszKTestLoadExternalDataFileSizeValidation.test_offset_exceeds_file_size_raises  s   BJ///E111&:6666GLL
;;	)T"" 	%aGGFO$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% GOOI..	&:i#oNNNN*%%%##J0KLL 	A 	A)&$-@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A$   8BB#&B#D11D58D5c                |   t          j        dt           j                  }t          |d          }t	          |d           t
          j                            | j        d          }t          |d          5 }|
                    |j                   ddd           n# 1 swxY w Y   t
          j                            |          }t	          |d|d	z  
           |                    d           |                     t          d          5  t!          || j                   ddd           dS # 1 swxY w Y   dS )z;Length that overflows available data must raise ValueError.r  r  r  r  r  rO   rP   Ni  r  rQ   zlength.*exceeds available datar  r  s         r5   )test_length_exceeds_available_data_raiseszPTestLoadExternalDataFileSizeValidation.test_length_exceeds_available_data_raises	  s   BJ///E111&:6666GLL
;;	)T"" 	%aGGFO$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% GOOI..	&:i$>NOOOO*%%%##J0PQQ 	A 	A)&$-@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	Ar  c                   t          j        g dt           j                  }t          |d          }|j        }t
          j                            | j        d          }t          |d          5 }|
                    |           ddd           n# 1 swxY w Y   t          |ddt          |          	           |                    d
           t          || j                   |                     |j        |           dS )z;Valid offset+length within file size should load correctly.)g      ?g       @g      @g      @r  r  r  r  rP   Nr   r   rQ   )r*   rR   r.   r   rQ   rA   rB   rC   r)   rS   rT   r   r   rU   r   r   )r4   rR   rY   r  r  r  s         r5   +test_valid_offset_and_length_load_correctlyzRTestLoadExternalDataFileSizeValidation.test_valid_offset_and_length_load_correctly  s#   ---RZ@@@E111oGLL
;;	)T"" 	aGGCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	&:aCQQQQ*%%%%fdm<<<#.....s   0BBBNrw   )rz   r{   r|   r}   r  r  r  r   r7   r5   r  r    s^        [[A A A A$A A A A$/ / / / / /r7   r  __main__)r   r~  )=
__future__r   r   rA   rW  r  r%   r  rD   r  typingr   r   numpyr*   r   rV   r   r   r   r	   r
   r   r   onnx.external_data_helperr   r   r   r   r   r   r   r   onnx.numpy_helperr   r   collections.abcr   TestCaser   parameterized_classr   r   r   r  r?  r  r(   rO  rT  r^  ra  r  r  r  r  r  r  r  rz   mainr   r7   r5   <module>r(     sY   # " " " " "     				       % % % % % % % %                          	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 3 2 2 2 2 2 2 2 )((((((N1 N1 N1 N1 N1x0 N1 N1 N1b #"	,	- !U !U !U !U !U3 !U !U !UH #"	,	- ]R ]R ]R ]R ]R%= ]R ]R ]R@ #"	,	- eI eI eI eI eIx'8 eI eI eIP	 #"	,	- [
 [
 [
 [
 [
h/ [
 [
 [
|"5 "5 "5 "5 "5:R "5 "5 "5J D)<===5 5 5 5 575 5 >=54? ? ? ? ?/O ? ? ?
3 3 3 3 3&= 3 3 3N+ N+ N+ N+ N+ 1 N+ N+ N+b    GtOM  )9 )9 )9 )9 )9,D )9 )9 )9X GtOM  \B \B \B \B \B,D \B \B \B~ D)RSSS" " " " "-E " " TS"8	6 	6 	6 	6 	61I 	6 	6 	6l% l% l% l% l%8#4 l% l% l%^5/ 5/ 5/ 5/ 5/-E 5/ 5/ 5/p zHMOOOOO r7   