o
    GXh^                     @   s  d 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ejdkZ	dd Z
G dd dZdd	d
dZdd Zd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(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Z d4d5 Z!d6d7 Z"d8d9 Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'dBdC Z(dDdE Z)dFdG Z*dHdI Z+dJdK Z,dQdLdMZ-dNdO Z.e/dPkre.  dS dS )RzK
Collect various information about Python to help debugging test failures.
    )print_functionNwin32c                 C   s*   | d u rd S t | } tdd| } |  S )Nz\s+ )strresubstrip)text r
   9/opt/python-3.10.19/usr/lib/python3.10/test/pythoninfo.pynormalize_text   s
   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )
PythonInfoc                 C   s
   i | _ d S N)infoselfr
   r
   r   __init__   s   
zPythonInfo.__init__c                 C   s\   || j v rtd| |d u rd S t|ts't|tst|}| }|s'd S || j |< d S )Nzduplicate key: %r)r   
ValueError
isinstanceintr   r   )r   keyvaluer
   r
   r   add   s   


zPythonInfo.addc                 C   s   dd | j  D S )zU
        Get information as a key:value dictionary where values are strings.
        c                 S   s   i | ]	\}}|t |qS r
   )r   ).0r   r   r
   r
   r   
<dictcomp>1       z(PythonInfo.get_infos.<locals>.<dictcomp>)r   itemsr   r
   r
   r   	get_infos-   s   zPythonInfo.get_infosN)__name__
__module____qualname__r   r   r   r
   r
   r
   r   r      s    r   	formatterc                C   sH   |D ]}t ||d }|d u rq|| }|d ur|||}| || qd S r   )getattr)info_addobjZname_fmt
attributesr"   attrr   namer
   r
   r   copy_attributes4   s   
r)   c                 C   s2   zt ||}W n
 ty   Y d S w | || d S r   r#   AttributeError)r$   r(   modZ	attr_namer   r
   r
   r   	copy_attr?   s   r-   c                C   sH   zt ||}W n
 ty   Y d S w | }|d ur||}| || d S r   r*   )r$   r(   r,   	func_namer"   funcr   r
   r
   r   	call_funcG   s   r0   c           	      C   s   d}t | td| t| dtd t| dtd t }ttdr(d|t f }| d	| d
D ]*}tt|}|d u r;q/t|dd }|sDq/t|dd }|rRd||f }| d| | q/ttd}|rdd}nd}| d| ttd}|rud}nd}| d| d S )N)
_frameworkabiflagsapi_versionbuiltin_module_names	byteorderdont_write_bytecode
executableflags
float_infofloat_repr_style	hash_info
hexversionimplementationint_infomaxsize
maxunicodepathplatform
platlibdirprefixthread_infoversionversion_infowinverzsys.%szsys.androidapilevelgetandroidapilevelzsys.windowsversiongetwindowsversiongetfilesystemencodeerrorsz%s/%szsys.filesystem_encoding)stdinstdoutstderrencodingerrorszsys.%s.encodingZgettotalrefcountz$Yes (sys.gettotalrefcount() present)z#No (sys.gettotalrefcount() missing)zbuild.Py_DEBUGZ
getobjectszYes (sys.getobjects() present)zNo (sys.getobjects() missing)zbuild.Py_TRACE_REFS)r)   sysr0   getfilesystemencodinghasattrrK   r#   )	r$   r&   rO   r(   streamrP   Py_DEBUGr	   ZPy_TRACE_REFSr
   r
   r   collect_sysR   s:   





rV   c                 C   sp   dd l }| }dtt|}| d| | d|  | d|j dd d|   }|r6| d	| d S d S )
Nr   r   zplatform.architecturezplatform.python_implementationzplatform.platformT)Zaliasedz%s %szplatform.libc_ver)rB   ZarchitecturejoinfilterboolZpython_implementationlibc_verr   )r$   rB   ZarchrZ   r
   r
   r   collect_platform   s   

r[   c                 C   s   dd l }| d|d d S )Nr   zlocale.encodingF)localegetpreferredencoding)r$   r\   r
   r
   r   collect_locale   s   r^   c                 C   s$   | dt d | dt d d S )Nzbuiltins.float.float_formatfloatzbuiltins.float.double_formatZdouble)r_   __getformat__)r$   r
   r
   r   collect_builtins   s   ra   c              
   C   s   dd l }t|drNz*z|d|j d}W n ty+ } z
d| }W Y d }~nd }~ww | d| W d S  tyM } z|jtjkrB W Y d }~d S d }~ww d S )Nr   	getrandom   zready (initialized)znot seeded yet (%s)zos.getrandom)osrS   rb   GRND_NONBLOCKBlockingIOErrorOSErrorerrnoZENOSYS)r$   rd   stateexcr
   r
   r   collect_urandom   s$   
rk   c                 C   s  dd l }dd }d}t| |d||d dD ]}t| d| || qdd	 }t| d
|d|d t|drHz| }W n	 tyB   Y nw | d| td}|j D ]"\}}	|	 }
|
|v sl|

dsl|

drs|
drs| d| |	 qQt|dr|d}|| | dd|  d S d S )Nr   c                 S   s"   | dv rt tdd |D S |S )N)supports_follow_symlinkssupports_fdsupports_effective_idsc                 s   s    | ]}|j V  qd S r   )r   )r   r/   r
   r
   r   	<genexpr>   s    z2collect_os.<locals>.format_attr.<locals>.<genexpr>)r   sortedr'   r   r
   r
   r   format_attr   s   zcollect_os.<locals>.format_attr)r(   supports_bytes_environrn   rm   rl   zos.%sr!   )
	cpu_countgetcwdgetegidgeteuidgetgid
getloadavg	getresgid	getresuidgetuidunamec                 S   s   d tt| S )N, )rW   mapr   )groupsr
   r
   r   format_groups   s   z!collect_os.<locals>.format_groupszos.getgroups	getgroupsgetloginzos.login)>APPDATAZARZ	ARCHFLAGSZARFLAGSZAUDIODEVCCCFLAGSCOLUMNSZCOMPUTERNAMEZCOMSPECZCPPZCPPFLAGSZDISPLAYZDISTUTILS_DEBUGZDISTUTILS_USE_SDKZDYLD_LIBRARY_PATHZENSUREPIP_OPTIONSZHISTORY_FILEHOME	HOMEDRIVEHOMEPATHZIDLESTARTUPLANGZLDFLAGSZLDSHAREDZLD_LIBRARY_PATHLINESZMACOSX_DEPLOYMENT_TARGETZMAILCAPSZ	MAKEFLAGSZMIXERDEVZMSSDKPATHPATHEXTZPIP_CONFIG_FILEZPLATZPOSIXLY_CORRECTZPY_SAX_PARSERZProgramFileszProgramFiles(x86)ZRUNNING_ON_VALGRINDZSDK_TOOLS_BINZSERVER_SOFTWARESHELLSOURCE_DATE_EPOCHZ
SYSTEMROOTTEMPZTERMZTILE_LIBRARYZTIX_LIBRARYTMPTMPDIRZTRAVISZTZUSERPROFILEZVIRTUAL_ENVZWAYLAND_DISPLAYZWINDIRZ_PYTHON_HOST_PLATFORMZ_PYTHON_PROJECT_BASEZ_PYTHON_SYSCONFIGDATA_NAME__PYVENV_LAUNCHER__)ZPYTHONLC_ZVSZ	COMNTOOLSzos.environ[%s]umaskzos.umaskz0o%03o)rd   r)   r0   rS   r   rg   	frozensetenvironr   upper
startswithendswithr   )r$   rd   rr   r&   r/   r   ZloginZENV_VARSr(   r   r}   maskr
   r
   r   
collect_os   s@   

@


r   c                 C   s   zdd l }W n
 ty   Y d S w dd l}| }z||}W n ty+   d }Y nw | d| |d ur6|nd |d u r?d S t|dr[||j|j	}d
tt|}| d| d S d S )Nr   zpwd.getpwuid(%s)z
<KeyError>getgrouplistr~   zos.getgrouplist)pwdImportErrorrd   r|   getpwuidKeyErrorrS   r   pw_nameZpw_gidrW   r   r   )r$   r   rd   uidentryr   r
   r
   r   collect_pwdF  s,   
r   c                 C   s   zdd l }W n
 ty   Y d S w dd }d}t| |d||d t|dsAt|dd	}d
|v r6| dd
 d S d|v rC| dd d S d S d S )Nr   c                 S   s   t |tr	d| S |S )Nz%#x)r   r   rq   r
   r
   r   rr   g     
z%collect_readline.<locals>.format_attr)Z_READLINE_VERSIONZ_READLINE_RUNTIME_VERSION_READLINE_LIBRARY_VERSIONzreadline.%sr!   r   __doc__ zlibedit readlinezreadline.libraryzGNU readline)readliner   r)   rS   r#   )r$   r   rr   r&   docr
   r
   r   collect_readlinea  s$   

r   c                 C   sn   dd l }z|jg d|j|jdd}| d }|jrW d S W n
 ty)   Y d S w | d }| d| d S )Nr   )Zgdbz-nx	--versionTrM   rN   universal_newlinesZgdb_version)
subprocessPopenPIPEcommunicate
returncoderg   
splitlines)r$   r   procrF   r
   r
   r   collect_gdb~  s    
r   c                 C   sv   zdd l }W n	 ty   Y n
w d}t| |d| zdd l}W n
 ty)   Y d S w | }|dd}| d| d S )Nr   )Z
TK_VERSIONZTCL_VERSIONz
tkinter.%sr   
patchlevelztkinter.info_patchlevel)_tkinterr   r)   tkinterZTclcall)r$   r   r&   r   Ztclr   r
   r
   r   collect_tkinter  s   r   c              	   C   s   dd l }| d|   d}t| |d| t|drLdD ]2}ztjdd ||}W d    n1 s4w   Y  W n	 tyC   Y qw | d	| | qd S d S )
Nr   z	time.time)altzonedaylighttimezonetznameztime.%sget_clock_info)clock	monotonicperf_counterprocess_timethread_timetimeT)recordztime.get_clock_info(%s))r   r)   rS   warningscatch_warningsr   r   )r$   r   r&   r   Z
clock_infor
   r
   r   collect_time  s"   
r   c                 C   s6   zdd l }W n
 ty   Y d S w | d|j   d S )Nr   zdatetime.datetime.now)datetimer   Znow)r$   r   r
   r
   r   collect_datetime  s   r   c                 C   s   t rd S dd l}dD ]}||}|dkr|sq
t|}| d| | q
|d}|o.d|v }|r4d}nd}| d	| d
D ]}||}|rId}nd}| d| | q=d S )Nr   )ZABIFLAGSANDROID_API_LEVELr   ZCCSHAREDr   ZCFLAGSFORSHAREDZCONFIG_ARGSZHOST_GNU_TYPEZMACHDEPZ	MULTIARCHZOPT	PY_CFLAGSZPY_CFLAGS_NODISTZPY_CORE_LDFLAGSZ
PY_LDFLAGSZPY_LDFLAGS_NODISTZPY_STDMODULE_CFLAGSrU   ZPy_ENABLE_SHAREDr   ZSOABIrD   r   zsysconfig[%s]r   z-DNDEBUGz!ignore assertions (macro defined)z$build assertions (macro not defined)zbuild.NDEBUG)ZWITH_DOC_STRINGSZWITH_DTRACEZWITH_FREELISTSZWITH_PYMALLOCZWITH_VALGRINDZYesZNozbuild.)
MS_WINDOWS	sysconfigget_config_varr   )r$   r   r(   r   r   ZNDEBUGr	   r
   r
   r   collect_sysconfig  s,   



r   c              	   C   s,  dd l }zdd l}W n
 ty   Y d S w zdd l}W n ty&   d }Y nw dd }d}t| |d||d d||jfd| fd	| ffD ]\}}d
}t| |d| d| qIddg}|d urwt	|drw|
 }	||	d |	d f |D ]}z|j| }
W n	 ty   Y qyw | d| |
 qyd S )Nr   c                 S   s   |  dr	d| S |S )NZOP_z%#8xr   rq   r
   r
   r   rr     r   z collect_ssl.<locals>.format_attr)ZOPENSSL_VERSIONZOPENSSL_VERSION_INFOZHAS_SNIZOP_ALLZOP_NO_TLSv1_1zssl.%sr!   
SSLContextZdefault_https_contextZstdlib_context)Zminimum_versionZmaximum_versionprotocoloptionsZverify_modezssl.z.%sZOPENSSL_CONFZSSLKEYLOGFILEget_default_verify_paths   zssl.environ[%s])rd   sslr   _sslr)   r   ZPROTOCOL_TLS_CLIENTZ_create_default_https_contextZ_create_stdlib_contextrS   r   extendr   r   )r$   rd   r   r   rr   r&   r(   ctxZ	env_namespartsr   r
   r
   r   collect_ssl  s@   

r   c                 C   s8   zdd l }W n
 ty   Y d S w | }| d| d S )Nr   zsocket.hostname)socketr   gethostname)r$   r   hostnamer
   r
   r   collect_socket<  s   r   c                 C   8   zdd l }W n
 ty   Y d S w d}t| |d| d S )Nr   )rF   Zsqlite_versionz
sqlite3.%s)sqlite3r   r)   )r$   r   r&   r
   r
   r   collect_sqliteF     r   c                 C   r   )Nr   )ZLIB_VERSIONZLIB_RUNTIME_VERSIONzzlib.%s)zlibr   r)   )r$   r   r&   r
   r
   r   collect_zlibP  r   r   c                 C   s<   zddl m} W n
 ty   Y d S w d}t| |d| d S )Nr   )expat)ZEXPAT_VERSIONzexpat.%s)Zxml.parsersr   r   r)   )r$   r   r&   r
   r
   r   collect_expatZ  s   r   c                 C   r   )Nr   )Z__libmpdec_version__z_decimal.%s)_decimalr   r)   )r$   r   r&   r
   r
   r   collect_decimald  r   r   c                 C   s4   zdd l }W n
 ty   Y d S w t| d|d d S )Nr   zpymem.allocatorZpymem_getallocatorsname)	_testcapir   r0   )r$   r   r
   r
   r   collect_testcapin  s   r   c                 C   sr   zdd l }W n
 ty   Y d S w dd t|D }|D ]}t||}||}| d| | qt| d|d d S )Nr   c                 S      g | ]	}| d r|qS )ZRLIMIT_r   )r   r'   r
   r
   r   
<listcomp>}  r   z$collect_resource.<locals>.<listcomp>zresource.%szresource.pagesizeZgetpagesize)resourcer   dirr#   Z	getrlimitr0   )r$   r   Zlimitsr(   r   r   r
   r
   r   collect_resourcew  s   

r   c                 C   sJ   zddl m} W n
 ty   Y d S w dd t|D }t| |d| d S )Nr   )test_socketc                 S   r   )ZHAVE_r   )r   r(   r
   r
   r   r     s    
z'collect_test_socket.<locals>.<listcomp>ztest_socket.%s)testr   r   r   r)   )r$   r   r&   r
   r
   r   collect_test_socket  s   r   c                 C   s   zddl m} W n
 ty   Y d S w d}t| |d| t| d|d t| d|d | d	|jd
d | d|jd
d | d|jd
d d S )Nr   )support)ZIPV6_ENABLEDztest_support.%sztest_support._is_gui_availableZ_is_gui_availablez test_support.python_is_optimizedZpython_is_optimizedz*test_support.check_sanitizer(address=True)T)addressz)test_support.check_sanitizer(memory=True))Zmemoryz%test_support.check_sanitizer(ub=True))Zub)r   r   r   r)   r0   Zcheck_sanitizer)r$   r   r&   r
   r
   r   collect_test_support  s$   


r   c           	      C   s   dd l }dd l}|d}|sd S zdd l}||}W n ty)   | }Y nw |d z|j||j|j	dd}W n
 t
yF   Y d S w | d }|jrRd S | d }t|}| d| d S )Nr   r   r   Tr   z
CC.version)r   r   r   shlexsplitr   appendr   r   STDOUTrg   r   r   r   r   )	r$   r   r   r   r   argsr   rM   r	   r
   r
   r   
collect_cc  s6   


r  c                 C   s@   zddl m} W n
 ty   Y d S w | ddtt| d S )Nr   )_GDBM_VERSIONzgdbm.GDBM_VERSION.)_gdbmr  r   rW   r   r   )r$   r  r
   r
   r   collect_gdbm  s   r  c                 C   sn   zddl m} W n
 ty   Y d S w | }t|D ]}|| }t|D ]}| d||f t||  q$qd S )Nr   )get_configsz%s[%s])Z_testinternalcapir	  r   rp   repr)r$   r	  Zall_configsZconfig_typeZconfigr   r
   r
   r   collect_get_config  s   r  c                 C   s   dd l }t| |dd d S )Nr   zsubprocess.%s)_USE_POSIX_SPAWN)r   r)   )r$   r   r
   r
   r   collect_subprocess  s   r  c              	   C   s  zdd l }W n
 ty   Y d S w t|dsd S |d}|j}z|j}W n ty0   d}Y nw ||_d|_t	| }| d| zdd l
}|tj}| d| W n ttfy]   Y nw dd l}z|jg d|j|jd	d
d}	|	 \}
}|	jr|d}
W n	 ty   Y n3w |
 D ]-}| }|dr|d }|r| d| q|dr|d }|r| d| qz|jdgd
|j|jd
d}	|	 d }
|	jrd}
W n
 ty   Y d S w |
 }
|
 d }|r| d| d S d S )Nr   WinDLLntdllz<function not available>r
   zwindows.RtlAreLongPathsEnabledzwindows.dll_path)Zwmicrd   getzCaption,Versionz/valueZoemT)rM   rN   rO   r	   r   zCaption=zwindows.version_captionzVersion=zwindows.versionver)shellrM   rN   r	   zwindows.ver)ctypesr   rS   r  Zc_ubyteRtlAreLongPathsEnabledr+   ZrestypeargtypesrY   _winapiZGetModuleFileNamerQ   Z	dllhandler   r   r   r   r   rg   r   r   r   removeprefix)r$   r  r  ZBOOLEANr  resr  Zdll_pathr   r   outputrN   liner
   r
   r   collect_windows  s   










r  c                 C   s   zdd l }W n ty   d }Y nw |d urt| d|d z)tddd}|  }W d    n1 s5w   Y  |rD| d| W d S W d S  tyP   Y d S w )Nr   zfips.openssl_fips_modeZget_fips_modez/proc/sys/crypto/fips_enabledzutf-8)rO   zfips.linux_crypto_fips_enabled)_hashlibr   r0   openr   rstriprg   )r$   r  fpr  r
   r
   r   collect_fips-  s"   r   c                 C   s   d}| j }ttttttttt	t
tttttttttttttttttttfD ]/}z|| W q$ tyS   d}td|j  t!j"d t#j$t!j"d tt!j"d t!j"%  Y q$w |S )NFTzERROR: %s() failedfile)&r   rk   ra   r  r   r   r   r   r   r  r  r^   r   r[   r   r   r   r   r   r   r  rV   r   r   r   r   r  r   r   r   	Exceptionprintr   rQ   rN   	traceback	print_excflush)r   errorr$   Zcollect_funcr
   r
   r   collect_info@  sX   %
r)  c                 C   sj   d}t | t dt|  t   |  }t| }|D ]\}}|dd}t d||f  qt   d S )NzPython debug information=
r   z%s: %s)r$  lenr   rp   r   replace)r   r"  titleZinfosr   r   r
   r
   r   	dump_infov  s   
r/  c                  C   s:   t  } t| }t|  |rtdtjd td d S d S )Nz"Collection failed: exit with errorr!  rc   )r   r)  r/  r$  rQ   rN   exit)r   r(  r
   r
   r   main  s   r1  __main__r   )0r   Z
__future__r   rh   r   rQ   r%  r   rB   r   r   r   r)   r-   r0   rV   r[   r^   ra   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r)  r/  r1  r   r
   r
   r
   r   <module>   sb    
B 	>5




	#	H
6

