a
    ze                     @   s  d dl mZ d dlZd dlmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZejdkZejdkZd ZdZdZdZdZdZd	Zd
d Zdd ZG dd dZG dd deejZG dd deejZG dd deejZe dkre!  dS )    )supportN)
namedtuplentdarwin            c                 C   s.   t j| } t j| d }| d S )Nr   _d)ospathbasenamesplitextcasefoldendswith)Zprogramname r   %/usr/lib/python3.9/test/test_embed.pydebug_build"   s    r   c                  C   s,   t tj} t| D ]}|dr| |= q| S )NZPYTHON)dictr   environlist
startswith)envkeyr   r   r   remove_python_envvars(   s
    

r   c                   @   s:   e Zd Zdd Zdd Zdddddddd	Zd
d ZdS )EmbeddingTestsMixinc                 C   s   t jt}t jt jt j|}d}tr^ttjr>dndd }||7 }t jtj}nt j	|d}t j	|| | _
}t j|s| d|  t  | _t | d S )N
_testembedr
    z.exeZProgramsz%r doesn't exist)r   r   abspath__file__dirname
MS_WINDOWSr   sys
executablejointest_exeexistsZskipTestgetcwdoldcwdchdir)selfhereZbasepathZexenameextZexepathZexer   r   r   setUp2   s    
zEmbeddingTestsMixin.setUpc                 C   s   t | j d S N)r   r*   r)   r+   r   r   r   tearDownE   s    zEmbeddingTestsMixin.tearDownNr   )r   timeout
returncodeinputcwdc                G   s   | j g}|| |d ur4tr4| }tjd |d< tj|tjtjd||d}z|j	||d\}	}
W n   |
  |   Y n0 |j|krtjrtd| d td|	  td|
  td	 | |j|d
|j|
f  |	|
fS )NZ
SYSTEMROOTT)stdoutstderruniversal_newlinesr   r5   )r4   r2   z--- z failed ---zstdout:
zstderr:
z------zbad returncode %d, stderr is %r)r&   extendr"   copyr   r   
subprocessPopenPIPEcommunicate	terminatewaitr3   r   verboseprintassertEqual)r+   r   r2   r3   r4   r5   argscmdpouterrr   r   r   run_embedded_interpreterH   s:    

z,EmbeddingTestsMixin.run_embedded_interpreterc                 c   s"  |  d\}}| |d d}tdd}d}g }| D ]}|d|krv| t|d tjdkrlt| |d7 }q8| 	t|d	 t
||}|d u r| || ||  }	tjdkrt|	 | |	j | |	j | |	j ||	 t|d	kr8|d }
| |	|
 |V  g }q8d S )
NZ&test_repeated_init_and_subinterpretersr   zS^interp (\d+) <(0x[\dA-F]+)>, thread state <(0x[\dA-F]+)>: id\(modules\) = ([\d]+)$Interpzid interp tstate modulesr   z--- Pass {} ---r      )rI   rC   r   
splitlinesformatlenr   rA   rB   Z
assertLessrematchZassertRegexgroupsZ
assertTrueinterptstatemodulesappend)r+   rG   rH   Z
interp_patrJ   ZnumloopsZcurrent_runlinerP   rR   mainr   r   r   %run_repeated_init_and_subinterpretersk   s:    



z9EmbeddingTestsMixin.run_repeated_init_and_subinterpreters)__name__
__module____qualname__r.   r1   rI   rX   r   r   r   r   r   1   s   #r   c                   @   sp   e Zd 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d Zdd Zdd Zdd Zdd ZdS )EmbeddingTestsi  c                 C   s(   |   D ]}|d }| |jd qd S )Nr   0)rX   rC   id)r+   runrW   r   r   r   test_subinterps_main   s    z#EmbeddingTests.test_subinterps_mainc                 C   sT   |   D ]F}|^}}}t|j}t|D ]"\}}| |jt|| d  q*qd S )Nr   )rX   intr^   	enumeraterC   str)r+   r_   rW   subs_Zmainidisubr   r   r   test_subinterps_different_ids   s
    
z,EmbeddingTests.test_subinterps_different_idsc                 C   sj   |   D ]\}|^}}}d|v r*td|D ]4}| |j|j | |j|j | |j|j q.qd S )NZ0x0zplatform prints pointers as 0x0)rX   unittestZSkipTestZassertNotEqualrR   rS   rT   )r+   r_   rW   rd   re   rg   r   r   r   test_subinterps_distinct_state   s    
z-EmbeddingTests.test_subinterps_distinct_statec                 C   sP   |  d\}}| |d dd tdtd D }d|d }| || d S )Ntest_repeated_init_and_inittabr   c                 S   s   g | ]}d | dqS )z	--- Pass z ---r   ).0rf   r   r   r   
<listcomp>       zAEmbeddingTests.test_repeated_init_and_inittab.<locals>.<listcomp>r   
)rI   rC   range
INIT_LOOPSr%   )r+   rG   rH   linesr   r   r   rk      s
    z-EmbeddingTests.test_repeated_init_and_inittabc                 C   s   t tjdd}| jd|d\}}tjdkr@t  t| t| d}d}dg d	}|j|||d
}d | _	| 
| | d S )Nzutf-8:surrogateescape)ZPYTHONIOENCODINGtest_forced_io_encodingr   r   utf-8surrogateescapero   )z--- Use defaults ---Expected encoding: defaultExpected errors: defaultzstdin: {in_encoding}:{errors}zstdout: {out_encoding}:{errors}'stderr: {out_encoding}:backslashreplacez--- Set errors only ---rw   zExpected errors: ignorezstdin: {in_encoding}:ignorezstdout: {out_encoding}:ignorery   z--- Set encoding only ---Expected encoding: iso8859-1rx   zstdin: iso8859-1:{errors}zstdout: iso8859-1:{errors}"stderr: iso8859-1:backslashreplacez--- Set encoding and errors ---rz   zExpected errors: replacezstdin: iso8859-1:replacezstdout: iso8859-1:replacer{   )Zin_encodingZout_encodingerrors)r   r   r   rI   r   rA   rB   r%   rM   maxDiffrC   strip)r+   r   rG   rH   Zexpected_stream_encodingZexpected_errorsexpected_outputr   r   r   rs      s     
z&EmbeddingTests.test_forced_io_encodingc                 C   sp   t tjtjtjd}| jd|d\}}tr6| j	}ntjt
 d}d| d}| || | |d d S )N)
PYTHONPATHtest_pre_initialization_apirt   Zspamzsys.executable: ro   r   )r   r   r   pathsepr%   r#   r   rI   r"   r&   r(   assertInrC   )r+   r   rG   rH   Zexpected_pathr   r   r   r   r      s    z*EmbeddingTests.test_pre_initialization_apic                 C   sJ   t  }tjtj|d< | jd|d\}}d}| || | |d d S )Nr   #test_pre_initialization_sys_optionsrt   zsys.warnoptions: ['once', 'module', 'default']
sys._xoptions: {'not_an_option': '1', 'also_not_an_option': '2'}
warnings.filters[:3]: ['default', 'module', 'once']
r   )	r   r   r   r%   r#   r   rI   r   rC   )r+   r   rG   rH   r   r   r   r   r     s    
z2EmbeddingTests.test_pre_initialization_sys_optionsc                 C   s*   |  d\}}| |d | |d d S )Ntest_bpo20891r   rI   rC   r+   rG   rH   r   r   r   r     s    zEmbeddingTests.test_bpo20891c                 C   s*   |  d\}}| |d | |d d S )Ntest_initialize_twicer   r   r   r   r   r   r   !  s    z$EmbeddingTests.test_initialize_twicec                 C   s.   |  d\}}| | d | |d d S )Ntest_initialize_pymainz6Py_Main() after Py_Initialize: sys.argv=['-c', 'arg2']r   rI   rC   rstripr   r   r   r   r   *  s    z%EmbeddingTests.test_initialize_pymainc                 C   s.   |  d\}}| | d | |d d S )Ntest_run_mainz%Py_RunMain(): sys.argv=['-c', 'arg2']r   r   r   r   r   r   r   2  s    zEmbeddingTests.test_run_mainc                 C   s2   d}|  d\}}| |d|  | |d d S )NrK   test_run_main_loopz&Py_RunMain(): sys.argv=['-c', 'arg2']
r   r   )r+   ZnlooprG   rH   r   r   r   r   7  s    z!EmbeddingTests.test_run_main_loopN)rY   rZ   r[   r}   r`   rh   rj   rk   rs   r   r   r   r   r   r   r   r   r   r   r   r\      s   +		r\   c                9   @   s"  e Zd ZdZerdndZe Ze Ze	e
ddddddZerJeddi eeedeedZeeeddddddd	Zg d
Ze	dddddddddddddeededdgg g g ddeeeeeeeejddddddddddddeedddddddddd8Zer
eddi eeedddZeeeddddddddddZerFded< ddddZdgZg dZerzed ed dZedd Zdd Zdd Z dd Z!dxdd Z"d!d" Z#d#d$ Z$d%d& Z%dyddd'dd(d)d*Z&d+d, Z'd-d. Z(d/d0 Z)d1d2 Z*d3d4 Z+d5d6 Z,d7d8 Z-d9d: Z.d;d< Z/d=d> Z0d?d@ Z1dAdB Z2dCdD Z3dEdF Z4dGdH Z5dIdJ Z6dKdL Z7dMdN Z8dOdP Z9dQdR Z:dSdT Z;dUdV Z<dWdX Z=dYdZ Z>d[d\ Z?d]d^ Z@d_d` ZAdadb ZBdcdd ZCdzdedfZDeEjFdgdh ZGdidj ZHdkdl ZIeJKedmdndo ZLdpdq ZMdrds ZNdtdu ZOdvdw ZPdS ){InitConfigTestsi   surrogatepassrv   r   r   )_config_init	allocator
parse_argvconfigure_localecoerce_c_localeZcoerce_c_locale_warn	utf8_modelegacy_windows_fs_encoding)r   r   r   r   )r   r   isolateduse_environmentr   dev_moder   )r   r   r   Nr   default)8r   r   r   r   _use_peg_parserinstall_signal_handlersuse_hash_seed	hash_seedfaulthandlertracemallocimport_timeshow_ref_countZ	dump_refsmalloc_statsfilesystem_encodingfilesystem_errorspycache_prefixprogram_namer   argv
_orig_argvxoptionswarnoptionspythonpath_envhomer$   base_executableprefixbase_prefixexec_prefixbase_exec_prefixmodule_search_paths
platlibdirsite_importbytes_warninginspectinteractiveoptimization_levelparser_debugwrite_bytecoderA   quietuser_site_directoryconfigure_c_stdiobuffered_stdiostdio_encodingstdio_errorsZskip_source_first_linerun_commandZ
run_modulerun_filenameZ_install_importlibcheck_hash_pycs_modepathconfig_warnings
_init_main_isolated_interpreterlegacy_windows_stdio)r   r   r   )
r   r   r   r   r   r   r   r   r   r   )ZPy_HasFileSystemDefaultEncodingZPy_HashRandomizationFlagZ$_Py_HasFileSystemDefaultEncodeErrors)ZPy_UTF8Moder   ))ZPy_BytesWarningFlagr   )ZPy_DebugFlagr   )ZPy_DontWriteBytecodeFlagr   T)Z Py_FileSystemDefaultEncodeErrorsr   )ZPy_FileSystemDefaultEncodingr   )ZPy_FrozenFlagr   T)ZPy_IgnoreEnvironmentFlagr   T)ZPy_InspectFlagr   )ZPy_InteractiveFlagr   )ZPy_IsolatedFlagr   )ZPy_NoSiteFlagr   T)ZPy_NoUserSiteDirectoryr   T)ZPy_OptimizeFlagr   )ZPy_QuietFlagr   )ZPy_UnbufferedStdioFlagr   T)ZPy_VerboseFlagrA   ))ZPy_LegacyWindowsFSEncodingFlagr   ))ZPy_LegacyWindowsStdioFlagr   c                 C   s
   d | _ d S r/   )EXPECTED_CONFIG)clsr   r   r   tearDownClass  s    zInitConfigTests.tearDownClassc                 C   s<   i }|D ].}d|v r.| dd\}}|||< qd||< q|S )N=r   T)split)r+   Zxoptions_listr   optr   valuer   r   r   main_xoptions  s    

zInitConfigTests.main_xoptionsc                 C   s   t  }td}tjdd|g}tj||tjtjd}|jrRt	d|j
d|j|j
d}zt|W S  tjy   | d| Y n0 d S )	Na4  
            import json
            import sys
            import _testinternalcapi

            configs = _testinternalcapi.get_configs()

            data = json.dumps(configs)
            data = data.encode('utf-8')
            sys.stdout.buffer.write(data)
            sys.stdout.buffer.flush()
        z-S-c)r   r6   r7   z)failed to get the default config: stdout=z stderr=ru   fail to decode stdout: )r   textwrapdedentr#   r$   r;   r_   r=   r3   	Exceptionr6   r7   decodejsonloadsJSONDecodeErrorfail)r+   r   coderD   procr6   r   r   r   _get_expected_config_impl   s$    
z)InitConfigTests._get_expected_config_implc                 C   sl   t }|jd u r|  |_i }|j D ]@\}}i }| D ]"\}}t|trT| }|||< q:|||< q&|S r/   )r   r   r   items
isinstancer   r:   )r+   r   configsZ
config_keyZconfig_valueconfigr   r   r   r   r   _get_expected_config  s    




z$InitConfigTests._get_expected_configc                 C   s(  | j }|  }|d }| D ]\}	}
|
| ju r||	 ||	< q|d rN|tkrbdD ]}	| j||	< qR|d st| j|d< |d dkr|d | ju rd|d< |d | ju r| j|d< |d	 | ju rd|d	< |d
 | ju rd|d
< tr| j}n4|d | jurt	j
|d }nt	j
t	 d}|d | ju r2||d< |d | ju rJ||d< |d | ju rbd|d< |d }| D ]"\}	}
|
| ju rr||	 ||	< qr|d | jur |d }|d ur|t	j
j}g ||d |d< |d ur |d  |d< ||d  | jD ]}	|	|vr||	 ||	< qd S )N
pre_configr   )r   r   r   r   r   r   r   ru   r   r   r   rv   r   r   r$   r   z./_testembedr   r   r   )	__class__r   r   GET_DEFAULT_CONFIG
API_COMPATIGNORE_CONFIGUTF8_MODE_ERRORSr"   r&   r   r   r   r%   r(   r   r   r:   COPY_PRE_CONFIG)r+   expected_preconfigexpectedr   apimodify_path_cbr   r   r   r   r   Zdefault_executabler   r   pathsr   r   r   get_expected_config/  s\    






z#InitConfigTests.get_expected_configc                 C   sN   t |d }t| D ]$\}}|| ju r||d  ||= q| || d S )Nr   r   r   r   r   poprC   )r+   r   r   r   r   r   r   r   r   check_pre_configo  s    
z InitConfigTests.check_pre_configc                 C   sN   t |d }t| D ]$\}}|| ju r||d  ||= q| || d S )Nr   r   )r+   r   r   r   r   r   r   r   r   check_configw  s    
zInitConfigTests.check_configc           	      C   s   |d }|d }t | j}| jD ]D}t|dkrP|\}}}|| rFdnd||< q |\}}|| ||< q | jD ]D}t|dkr|\}}}|| rdnd||< ql|\}}|| ||< ql| |d | d S )Nr   r   r   r   r   Zglobal_config)r   DEFAULT_GLOBAL_CONFIGCOPY_GLOBAL_CONFIGrN   COPY_GLOBAL_PRE_CONFIGrC   )	r+   r   r   r   r   itemZ
global_keyZcore_keyZoppositer   r   r   check_global_config  s     




z#InitConfigTests.check_global_configF)preconfig_apir   ignore_stderrr5   c                C   sb  t  }|d ur|| |}|d u r(|}|tkr8| j}n|tkrH| j}n| j}|d u rZi }t|fi |}|d u rvi }|tkr| j}n|tkr| j	}n| j
}t|fi |}| ||||| | j|||
d\}}|d u r|d sd}|d ur|	s| | | zt|}W n& tjy:   | d| Y n0 | || | || | | |S )N)r   r5   rA   r   r   )r   updateAPI_ISOLATEDPRE_CONFIG_ISOLATED
API_PYTHONPRE_CONFIG_PYTHONPRE_CONFIG_COMPATr   CONFIG_PYTHONCONFIG_ISOLATEDCONFIG_COMPATr   rI   rC   r   r   r   r   r   r   r   r   )r+   ZtestnameZexpected_configr   r   r7   r   r   r   r   r5   Znew_envZdefault_preconfigZdefault_configrG   rH   r   r   r   r   check_all_configs  sR    


z!InitConfigTests.check_all_configsc                 C   s   | j dtd d S )NZtest_init_initialize_configr   r  r   r0   r   r   r   test_init_default_config  s    z(InitConfigTests.test_init_default_configc                 C   s   | j dtd d S )Ntest_preinit_compat_configr  r  r0   r   r   r   r    s    z*InitConfigTests.test_preinit_compat_configc                 C   s   | j dtd d S )Ntest_init_compat_configr  r  r0   r   r   r   r	    s    z'InitConfigTests.test_init_compat_configc                 C   s@   ddi}ddddgdddddddddd}| j d||td	 d S )
Nr   r   z./globalvarr   default::BytesWarningr   )r   r   r   r   r   r   r   r   rA   r   r   r   r   test_init_global_configr  r  r+   	preconfigr   r   r   r   r    s&    
z'InitConfigTests.test_init_global_configc              $   C   s~   t dd}dddddddddddd	d
dgg ddg dg ddddddddddddddd| jdddd#}| jd||td d S )Nr   r   r   r   {   r   	iso8859-1replaceZconf_pycache_prefixz./conf_program_namer   arg2)python3-Wcmdline_warnoption-Xcmdline_xoptionr   passr  )zconfig_xoption1=3zconfig_xoption2=Zconfig_xoption3r  )r  r
  Zconfig_warnoptionpass
Zmy_platlibdiralways)#r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rA   r   r   r   r   r   r   r   r   r   r   test_init_from_configr  PYMEM_ALLOCATOR_MALLOCr   r  r   r  r   r   r   r    sT    7
z%InitConfigTests.test_init_from_configc                 C   sP   dt i}dddddddddddddd	ddd
gd| jdd}| jd||td d S )Nr   r   *   r   /my/pathenv_pycache_prefixr   r  r  EnvVarenv_platlibdirr   r   r   r   r   r   r   r   r   r   rA   r   r   r   r   r   r   r   r   r   test_init_compat_envr  r  r  r   r   r   r$  '  s4    
z$InitConfigTests.test_init_compat_envc                 C   sR   t dd}dddddddddddddd	ddd
gd| jdd}| jd||td d S )Nr   r  r  r   r  r   r   r  r  r!  r"  r#  test_init_python_envr  )r  r   r  r   r  r   r   r   r%  D  s6    
z$InitConfigTests.test_init_python_envc                 C   s0   t td}t dddgd}| jd||td d S )Nr   r   r   r   r   r   test_init_env_dev_moder  )r   PYMEM_ALLOCATOR_DEBUGr  r   r  r   r   r   r(  b  s    

z&InitConfigTests.test_init_env_dev_modec                 C   s0   t td}t dddgd}| jd||td d S )Nr&  r   r   r'  test_init_env_dev_mode_allocr  )r   r  r  r   r  r   r   r   r*  j  s    

z,InitConfigTests.test_init_env_dev_mode_allocc                 C   s,   dt i}dddgd}| jd||td d S )Nr   r   r   )r   r   r   test_init_dev_moder  )r)  r  r   r  r   r   r   r+  r  s    
z"InitConfigTests.test_init_dev_modec                 C   sD   dt i}dgg dtjddddgdgd}| jd||td	 d S )
Nr   	script.py)r  r  devr,  r   r   r-  )r   r   r   r   r   r   r   test_preinit_parse_argvr  )r)  r   r   r   r  r   r  r   r   r   r.  ~  s    
	
z'InitConfigTests.test_preinit_parse_argvc                 C   s2   ddi}g d}||dd}| j d||td d S )Nr   r   )r  -Ez-Ir  r-  r  utf8r,  )r   r   r   test_preinit_dont_parse_argvr  r  r   )r+   r  r   r   r   r   r   r1    s    
z,InitConfigTests.test_preinit_dont_parse_argvc                 C   s    dddd}| j d|td d S )Nr   r   r   r   r   test_init_isolated_flagr  r  r   r+   r   r   r   r   r4    s
    z'InitConfigTests.test_init_isolated_flagc                 C   s    dddd}| j d|td d S )Nr   r   r3  test_preinit_isolated1r  r  r6  r   r   r   r7    s
    z&InitConfigTests.test_preinit_isolated1c                 C   s    dddd}| j d|td d S )Nr   r   r3  test_preinit_isolated2r  r  r6  r   r   r   r8    s
    z&InitConfigTests.test_preinit_isolated2c                 C   s   | j dtd d S )Ntest_preinit_isolated_configr  r2  r0   r   r   r   r9    s    z,InitConfigTests.test_preinit_isolated_configc                 C   s   | j dtd d S )Ntest_init_isolated_configr  r2  r0   r   r   r   r:    s    z)InitConfigTests.test_init_isolated_configc                 C   s   | j dtd d S )Ntest_preinit_python_configr  r5  r0   r   r   r   r;    s    z*InitConfigTests.test_preinit_python_configc                 C   s   | j dtd d S )Ntest_init_python_configr  r5  r0   r   r   r   r<    s    z'InitConfigTests.test_init_python_configc                 C   s    ddd}| j di |td d S )Nr   )r   r   test_init_dont_configure_localer  r5  )r+   r  r   r   r   r=    s    
z/InitConfigTests.test_init_dont_configure_localec                 C   s(   ddd}dd }| j d|t|d d S )Nz./init_read_setZmy_executable)r   r$   c                 S   s   |  dd | d d S )Nr   Ztest_path_insert1Ztest_path_append)insertrU   )r   r   r   r   modify_path  s    z7InitConfigTests.test_init_read_set.<locals>.modify_pathtest_init_read_set)r   r   r5  )r+   r   r?  r   r   r   r@    s    z"InitConfigTests.test_init_read_setc                 C   s.   dg dg dg dd}| j d|td d S )Nr   )Zconfig_xoptionr  Zsysadd_xoptionr   )ignore:::cmdline_warnoptionzignore:::sysadd_warnoptionzignore:::config_warnoption)r  r  rA  r  r  )r   r   r   r   test_init_sys_addr  r5  r6  r   r   r   rB    s    z!InitConfigTests.test_init_sys_addc                 C   s8   d}ddgdd|dgd|d dd}| j d	|td
 d S )NRimport _testinternalcapi, json; print(json.dumps(_testinternalcapi.get_configs()))r   r  r  	./python3ro   r   )r   r   r   r   r   test_init_run_mainr  r5  r+   r   r   r   r   r   rE    s    
z"InitConfigTests.test_init_run_mainc                 C   s<   d}ddgdd|dgd|d ddd	}| j d
|tdd d S )NrC  r   r  r  rD  ro   r   r   )r   r   r   r   r   r   test_init_mainz)Run Python code before _Py_InitializeMain)r   r7   r5  rF  r   r   r   rG    s    
zInitConfigTests.test_init_mainc                 C   s.   dg dg ddddd}| j d|td	 d S )
Nr   )r   arg1-varg3./argv0r/  r   r  rH  rI  rJ  rL  r  r   )r   r   r   r   r   r   test_init_parse_argvr  r5  r6  r   r   r   rM    s    z$InitConfigTests.test_init_parse_argvc                 C   s4   ddi}dg dg ddd}| j d||td d S )Nr   r   rK  rL  )r   r   r   r   test_init_dont_parse_argvr  r5  )r+   r   r   r   r   r   rN    s    
z)InitConfigTests.test_init_dont_parse_argvc                 C   sD   t rd}| j}nd}tr | j}nt|p,d}||||d d S )Npythonr  r   )r   r   r$   )r"   r&   MACOSshutilwhichr   )r+   r   r   r$   r   r   r   default_program_name&  s    z$InitConfigTests.default_program_namec                 C   sX   |   }|d d }|ddddd}| | dtjj|i}| jd|t|dd d S )	Nr   r   r   )r   r   r   r   r   TESTPATHtest_init_setpathTr   r   r   )r   rS  r   r   r   r%   r  r   r+   r   r   r   r   r   r   rU  6  s    
z!InitConfigTests.test_init_setpathc              	   C   sT   |   }|d d }|dddddddd}dtjj|i}| jd|t|d	d
 d S )Nr   r   r   Zconf_program_nameZconf_executable)r   r   r   r   r   r   r   r$   rT  test_init_setpath_configTrV  )r   r   r   r   r%   r  r   rW  r   r   r   rX  I  s    z(InitConfigTests.test_init_setpath_configc              
   C   s   |   }|d u r|d d }|d u r0|d d }tr@|d d S tj}tj|tjd|j |j	 dtj|tjd|j d|j	 tj|tjd|j d|j	 dgS d S )Nr   r   r   rO  z.zip.lib-dynload)
r   r"   r#   version_infor   r   r%   r   majorminor)r+   r   r   r   verr   r   r   r   ^  s$    z#InitConfigTests.module_search_pathsc              	   c   s   t  }tj|}trldd l}tj| j}t	|D ]0}||dr:t
tj||tj|| q:tj|tj| j}t
| j| t
| j| || _|V  W d    n1 s0    Y  d S )Nr   z*.dll)tempfileTemporaryDirectoryr   r   realpathr"   fnmatchr!   r&   listdirrQ  copyfiler%   r   copystat)r+   tmpdirrb  ZexedirfZ	exec_copyr   r   r   tmpdir_with_pythonq  s    
"z"InitConfigTests.tmpdir_with_pythonc                 C   s   |   }|d d }tjj|}|D ]8}tj|s8q&tjtj|dr&tj|} qpq&| d| | }}t	j
}| j||d}	||	|||||d}| | ||d}
| jd|t|
d	 d S )
Nr   r   os.pyzUnable to find home in )r   r   )r   r   r   r   r   r   r   )ZTESTHOMEr   test_init_setpythonhome)r   r   )r   r   r   r   r%   isdirr'   r!   r   r#   r[  r   rS  r  r   )r+   r   r   	paths_strr   r   r   r   r^  Zexpected_pathsr   r   r   r   rj    s4    	

z'InitConfigTests.test_init_setpythonhomec                 C   s6   |   }|d d }tjj|}||d< d|i}|S )Nr   r   r   r   )r   r   r   r   r%   )r+   r   Zall_configsr   rl  r   r   r   r   copy_paths_by_env  s    z!InitConfigTests.copy_paths_by_envz#Windows does not use pybuilddir.txtc           
   	   C   s   |   }d}tj||}t| tj|d}t|ddd}|| W d    n1 sb0    Y  |  }||d< | j}|||d}| 	|}	| j
d|t|	d	|d
 W d    n1 s0    Y  d S )Nlibdirzpybuilddir.txtwr0  encoding)r   r$   r   r	  Tr   r   r   r5   )rh  r   r   r%   mkdiropenwriter   r&   rm  r  r   )
r+   rf  Zsubdirrn  filenamefpr   r$   r   r   r   r   r   test_init_pybuilddir  s&    

(
z$InitConfigTests.test_init_pybuilddirc                 C   s  |   }t }tj}tsRtj|tj	d|j
 d|j d}t| n0tj|d}t| ttjtj|d tj|d}t|ddd	,}td
| |d td|d W d    n1 s0    Y  |  }ts||d< nZt|D ]H\}}	|dkr&tj|tj|	||< qtj|tj|	||< q||d< | j}
|}|||
|
|d}trz||d< ||d< | |}| jd|t|d|d}tr| |d d tj|tj| jd d  W d    n1 s0    Y  W d    n1 s0    Y  d S )NrO  rY  rZ  libri  z
pyvenv.cfgro  r0  rp  z	home = %sfilez$include-system-site-packages = falserr  r   )r   r   r   r$   r   r   r   r	  Trs  ZwindowsZpython3_dll)rh  r_  r`  r#   r[  r"   r   r   r%   r   r\  r]  makedirsrQ  rd  r    ru  rB   r   rb   r   r&   rm  r  r   rC   r   )r+   rf  Zpyvenv_homer^  Zlib_dynloadrw  rx  r   indexr   r$   r   r   r   actualr   r   r   test_init_pyvenv_cfg  sf    
*



z$InitConfigTests.test_init_pyvenv_cfgc           
         s   t d t d} fdd}|d}|d}|d}|d}|d	}|d
}| d }	| | tjj|	d  | | |	d  | | |	d  | | |	d  | | |	d  | | |	d  d S )Nctypes_testinternalcapic                    s   t  j| }d|_ j|_|S )Nr   )getattrZ	pythonapiargtypesZ	c_wchar_pZrestype)r   funcr  r   r   get_func  s    z8InitConfigTests.test_global_pathconfig.<locals>.get_func
Py_GetPathPy_GetPrefixPy_GetExecPrefixPy_GetProgramNamePy_GetProgramFullPathPy_GetPythonHomer   r   r   r   r   r$   r   )r   import_moduleZget_configsrC   r   r   r   r   )
r+   r  r  r  r  r  r  r  r  r   r   r  r   test_global_pathconfig  s$    

z&InitConfigTests.test_global_pathconfigc                 C   s<   g d}t td}ddd|g dd}| jd||td d S )N)zignore:::PyConfig_Insert0r   zignore:::env1zignore:::env2zignore:::cmdline1zignore:::cmdline2r
  zignore:::PySys_AddWarnOption1zignore:::PySys_AddWarnOption2zignore:::PyConfig_BeforeReadzignore:::PyConfig_AfterReadr&  r   )r  z-Wignore:::cmdline1z-Wignore:::cmdline2)r   r   r   r   r   test_init_warnoptionsr  )r   r)  r  r   )r+   r   r  r   r   r   r   r  3  s    
	
z%InitConfigTests.test_init_warnoptionsc                 C   s   |  d d S )Ntest_get_argc_argvrI   r0   r   r   r   r  N  s    z"InitConfigTests.test_get_argc_argv)N)NNNN)NN)QrY   rZ   r[   r}   r"   r   objectr   r   r   PYMEM_ALLOCATOR_NOT_SETr   r   r   r   r   r   r   r   r#   r   r  r  r  r   r   r   r9   r   classmethodr   r   r   r   r   r   r   r   r  r  r  r	  r  r  r$  r%  r(  r*  r+  r.  r1  r4  r7  r8  r9  r:  r;  r<  r=  r@  rB  rE  rG  rM  rN  rS  rU  rX  r   
contextlibcontextmanagerrh  rj  rm  ri   ZskipIfry  r  r  r  r  r   r   r   r   r   @  sh  	
D



 
@   3?			

!

=&r   c                   @   sL   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d Z
dS )AuditingTestsc                 C   s   |  d d S )Ntest_open_code_hookr  r0   r   r   r   r  T  s    z!AuditingTests.test_open_code_hookc                 C   s   |  d d S )N
test_auditr  r0   r   r   r   r  W  s    zAuditingTests.test_auditc                 C   s   |  d d S )Ntest_audit_subinterpreterr  r0   r   r   r   r  Z  s    z'AuditingTests.test_audit_subinterpreterc                 C   s   | j dtjdd d S )Ntest_audit_run_commandr   r2   r3   rI   r   SHORT_TIMEOUTr0   r   r   r   r  ]  s    z$AuditingTests.test_audit_run_commandc                 C   s   | j dtjdd d S )Ntest_audit_run_filer   r  r  r0   r   r   r   r  b  s    z!AuditingTests.test_audit_run_filec              	   C   s   t j| jtjd }t|ddd(}td|d td|d W d    n1 sR0    Y  z4i t d|i}| j	d	tj
d
|d W t | nt | 0 d S )N.pyro  ru   rp  z
import sysr{  z&sys.__interactivehook__ = lambda: NonePYTHONSTARTUPtest_audit_run_interactivehook
   r2   r3   r   r   r   r%   r)   r   ZTESTFNru  rB   r   rI   r  unlinkr+   Zstartuprg  r   r   r   r   r  g  s    *z,AuditingTests.test_audit_run_interactivehookc              	   C   s   t j| jtjd }t|ddd}td|d W d    n1 sF0    Y  z4i t d|i}| j	dtj
d	|d
 W t | nt | 0 d S )Nr  ro  ru   rp  r  r{  r  test_audit_run_startupr  r  r  r  r   r   r   r  t  s    *z$AuditingTests.test_audit_run_startupc                 C   s   | j dtjdd d S )Ntest_audit_run_stdinr   r  r  r0   r   r   r   r    s    z"AuditingTests.test_audit_run_stdinN)rY   rZ   r[   r  r  r  r  r  r  r  r  r   r   r   r   r  S  s   r  __main__)"testr   ri   collectionsr   r  r   r   rO   rQ  r;   r#   r_  r   r   r"   platformrP  r  r)  r  r   r   r   rq   r   r   r   ZTestCaser\   r   r  rY   rW   r   r   r   r   <module>   sJ   

	n "        2
