o
    HXîh¯¡ ã                	   @   s$	  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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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d dlZd dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dl$m%Z% e &¡  e 'd	e(¡ d dl)Z)d dl*Z*W d  ƒ n1 s·w   Y  zd dl+Z+W n e,yÍ   dZ+Y nw zd dl-Z-W n e,yß   dZ-Y nw zd dl.Z.W n e,yñ   dZ.Y nw zd dl/Z/d
d„ e/ 0¡ D ƒZ1W n e,e2fy   g Z1Y nw z
d dl3m4Z4m5Z5 W n e,y)   ej6 Z4Z5Y nw d dl7m8Z8 d dlm9Z9 d dl:m;Z; dZ<e=e	dƒrJe	 >¡ d kZ<e=edƒr]ej?j@r]ej?j@ Ad¡ZBndZBej$ Ad¡oke	 C¡ d kZDdd„ ZEd¹dd„ZFe Gej$ Ad¡d¡ZHG dd„ dejIƒZJG dd„ dejIƒZKG d d!„ d!ejIƒZLG d"d#„ d#ejIƒZMd d$lmNZN G d%d&„ d&eNjOƒZPG d'd(„ d(ejIƒZQe Re=e	d)ƒd*¡G d+d,„ d,eQƒƒZSG d-d.„ d.eQƒZTe Re=e	d)ƒd*¡G d/d0„ d0eSƒƒZUG d1d2„ d2ejIƒZVe Re=e	d3ƒd4¡G d5d6„ d6ejIƒƒZWG d7d8„ d8ejIƒZXG d9d:„ d:ejIƒZYG d;d<„ d<ejIƒZZe Re=e	d=ƒd>¡G d?d@„ d@ejIƒƒZ[e \dA¡dBkpCe \dC¡dBkpCe \dD¡dBkZ]e Ge]dE¡e Gej$dFkdG¡G dHdI„ dIejIƒƒƒZ^ej_dºdJdK„ƒZ`e Re=e	dLƒdM¡G dNdO„ dOejIƒƒZae Rej$dPkdQ¡G dRdS„ dSejIƒƒZbG dTdU„ dUejIƒZcG dVdW„ dWejIƒZde Gej$dPkdX¡G dYdZ„ dZejIƒƒZee Gej$dPkdX¡G d[d\„ d\ejIƒƒZfe Rej$dPkdQ¡G d]d^„ d^ejIƒƒZge Rej$dPkdQ¡G d_d`„ d`ejIƒƒZhe Re=e	daƒdb¡G dcdd„ ddejIƒƒZie Rej$dPkdQ¡e jjG dedf„ dfejIƒƒƒZke Rej$dPkdQ¡G dgdh„ dhejIƒƒZle Rej$dPkdQ¡G didj„ djejIƒƒZme jjG dkdl„ dlejIƒƒZnG dmdn„ dnejIƒZoG dodp„ dpejIƒZpG dqdr„ drejIƒZqG dsdt„ dtejIƒZre sdu¡e Re=e	dvƒdw¡G dxdy„ dyejIƒƒƒZte Re=e	dzƒo€e=e	d{ƒd|¡G d}d~„ d~ejIƒƒZuG dd€„ d€e*jvejwƒZxe Re=e	dƒd‚¡G dƒd„„ d„ejIƒƒZyd…d†„ Zze Rezƒ d‡¡e {dˆd‰dŠ¡G d‹dŒ„ dŒejIƒƒƒZ|e Re=e	dƒdŽ¡G dd„ dejIƒƒZ}e Re=e	d‘ƒd’¡e {d“d”¡G d•d–„ d–ejIƒƒƒZ~e Re=e	d—ƒd˜¡e {dˆd‰d™¡G dšd›„ d›ejIƒƒƒZG dœd„ dejIƒZ€G dždŸ„ dŸejIƒZG d d¡„ d¡ejIƒZ‚G d¢d£„ d£ejIƒZƒe Re=e	d¤ƒd¥¡G d¦d§„ d§ejIƒƒZ„G d¨d©„ d©ejIƒZ…G dªd«„ d«ejIƒZ†G d¬d­„ d­ejIƒZ‡G d®d¯„ d¯ejIƒZˆG d°d±„ d±ejIƒZ‰eEd²ƒG d³d´„ d´ejIƒƒZŠe=e	dµƒr…G d¶d·„ d·eˆƒZ‹eŒd¸kre ¡  dS dS )»é    N)Úsupport)Úimport_helper)Ú	os_helper)Úsocket_helper)Úthreading_helper)Úwarnings_helper)Úwin32_is_iotÚignorec                 C   ó   g | ]}|j ‘qS © )Úpw_uid)Ú.0Úur   r   ú6/opt/python-3.10.19/usr/lib/python3.10/test/test_os.pyÚ
<listcomp><   ó    r   )ÚINT_MAXÚPY_SSIZE_T_MAX©Úassert_python_ok)Ú
unix_shell)ÚFakePathFÚgeteuidÚthread_infoZlinuxthreadsZfreebsdc                 C   s   t  tt| ƒd|  ¡S )Nzrequires os.%s)ÚunittestÚ
skipUnlessÚhasattrÚos©Únamer   r   r   Úrequires_os_func[   ó   r    ó   contentc                 C   s<   t | ddƒ}| |¡ W d   ƒ d S 1 sw   Y  d S )NÚxbr   )ÚopenÚwrite)ÚfilenameZcontentÚfpr   r   r   Úcreate_file_   s   "ÿr(   Zaixz%on AIX, splice() only accepts socketsc                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú	MiscTestsc                 C   s   t  ¡ }|  |t¡ d S ©N)r   ÚgetcwdÚassertIsInstanceÚstr©ÚselfÚcwdr   r   r   Útest_getcwdj   ó   zMiscTests.test_getcwdc           
      C   sz  d}t jdkr	d}d}d}|d|t|ƒ   }t ¡ ˜}t |¡z}|}	 t ¡ }|  	||¡ |t|ƒttj
jƒ  }|dkr@nHt|ƒ|krP|dkrP|d |… }tj
 ||¡}zt |¡ t |¡ W n! tyl   Y n ty„ }	 z|	jtjkrW Y d }	~	n	‚ d }	~	ww |}q%tjr”td	t|ƒ› ƒ W d   ƒ n1 sžw   Y  W d   ƒ d S W d   ƒ d S 1 s¶w   Y  d S )
NiÐ  Úvxworkséè  éÈ   Zpython_test_dir_ÚaTr   z!Tested current directory length: )ÚsysÚplatformÚlenÚtempfileÚTemporaryDirectoryr   Z
change_cwdr   r,   ÚassertEqualÚpathÚsepÚjoinÚmkdirÚchdirÚFileNotFoundErrorÚOSErrorÚerrnoZENAMETOOLONGr   ÚverboseÚprint)
r0   Zmin_lenZdirlenÚdirnameZtmpdirr>   Úexpectedr1   ZneedÚexcr   r   r   Útest_getcwd_long_pathn   sL   


€üå€ßÿ"ÿzMiscTests.test_getcwd_long_pathc                 C   s.   t  ¡ }|  |t¡ |  t  |¡t  ¡ ¡ d S r+   )r   Úgetcwdbr-   Úbytesr=   Úfsdecoder,   r/   r   r   r   Útest_getcwdb§   s   zMiscTests.test_getcwdbN)Ú__name__Ú
__module__Ú__qualname__r2   rK   rO   r   r   r   r   r*   i   s    9r*   c                   @   s„  e Zd Zdd„ ZeZdd„ Zdd„ Zejdd„ ƒZ	d	d
„ Z
eje eek d¡ejed ddddd„ ƒƒƒZdd„ Zdd„ Ze ejdkd¡dd„ ƒZdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Ze eed$ƒd%¡d&d'„ ƒZe eed$ƒd%¡d(d)„ ƒZe eed$ƒd%¡d*d+„ ƒZe eed,ƒd-¡d.d/„ ƒZ e eed,ƒd-¡e!d0d1„ ƒƒZ"e eed,ƒd-¡e!d2d3„ ƒƒZ#e eed,ƒd-¡e!d4d5„ ƒƒZ$d6S )7Ú	FileTestsc                 C   s"   t j tj¡rt  tj¡ d S d S r+   )r   r>   Úlexistsr   ÚTESTFNÚunlink©r0   r   r   r   ÚsetUp¯   ó   ÿzFileTests.setUpc                 C   s:   t  tjt jt jB ¡}t  |¡ |  t  tjt j	¡¡ d S r+   )
r   r$   r   rU   ÚO_CREATÚO_RDWRÚcloseÚ
assertTrueÚaccessÚW_OK©r0   Úfr   r   r   Útest_access´   s   
zFileTests.test_accessc              	   C   s²   t  tjt jt jB ¡}t  |¡}z/d}||d kr9t  |¡ |d7 }|dkr+|  d¡ |t  |¡}}||d ksW t  |¡ nt  |¡ w t  	||d ¡ |  
tt j|d¡ d S )Nr   é   é
   z%couldn't allocate two consecutive fdsé   ó   a)r   r$   r   rU   rZ   r[   Údupr\   ÚskipTestÚ
closerangeÚassertRaisesrD   r%   )r0   ÚfirstÚsecondZretriesr   r   r   Útest_closerange¹   s   


ú€zFileTests.test_closerangec                 C   s<   t j}t |¡}|  ttj|d¡ t |¡}|  ||¡ d S ©Nr   )	r   rU   r8   Úgetrefcountrj   Ú	TypeErrorr   Úrenamer=   )r0   r>   ÚoldÚnewr   r   r   Útest_renameÎ   s
   

zFileTests.test_renamec                 C   s‚   t tjdƒ1}| d¡ | ¡  | ¡ }t |dd¡ t |d¡}|  	t
|ƒt¡ |  	|d¡ W d   ƒ d S 1 s:w   Y  d S )Núw+bó   spamr   é   )r$   r   rU   r%   ÚflushÚfilenor   ÚlseekÚreadr=   ÚtyperM   )r0   ÚfobjÚfdÚsr   r   r   Ú	test_readÖ   s   
"ùzFileTests.test_readzneeds INT_MAX < PY_SSIZE_T_MAXrd   rc   F)ÚsizeZmemuseÚdry_runc                 C   sh   |   tjtj¡ ttjdƒ ttjdƒ}t | ¡ |¡}W d   ƒ n1 s'w   Y  |  	|d¡ d S )Ns   testÚrb)
Ú
addCleanupr   rV   rU   r(   r$   r   r{   ry   r=   )r0   r   r'   Údatar   r   r   Útest_large_readà   s   ÿzFileTests.test_large_readc                 C   s¨   t  tjt jt jB ¡}|  tt j|d¡ t  |d¡ t  |t	dƒ¡ t  |t
dƒ¡ t  |¡ ttjdƒ}|  | ¡  ¡ g d¢¡ W d   ƒ d S 1 sMw   Y  d S )NÚbeanss   bacon
s   eggs
s   spam
rƒ   )s   bacons   eggsrv   )r   r$   r   rU   rZ   ÚO_WRONLYrj   rp   r%   Ú	bytearrayÚ
memoryviewr\   r=   r{   Ú
splitlines)r0   r~   r}   r   r   r   Ú
test_writeó   s   
ÿ"ÿzFileTests.test_writec                 G   s"   t j|t jdd}|  |d¡ d S )NT)ÚcreationflagsÚshellr   )Ú
subprocessÚcallZCREATE_NEW_CONSOLEr=   )r0   ÚargsÚretcoder   r   r   Úwrite_windows_consoleÿ   s
   üzFileTests.write_windows_consoleÚwin32z$test specific to the Windows consolec                 C   s*   d}|   tjd|¡ |   tjdd|¡ d S )Nzprint('x' * 100000)ú-cz-u)r“   r8   Ú
executable©r0   Úcoder   r   r   Útest_write_windows_console  s   z$FileTests.test_write_windows_consolec                 G   s4   t  tjt j¡}t j|g|¢R ddiŽ}| ¡  d S )NÚencodingúutf-8)r   r$   r   rU   ÚO_RDONLYÚfdopenr\   )r0   r‘   r~   ra   r   r   r   Úfdopen_helper  s   zFileTests.fdopen_helperc                 C   sB   t  tjt jt jB ¡}t  |¡ |  ¡  |  d¡ |  dd¡ d S )NÚréd   )r   r$   r   rU   rZ   r[   r\   rž   ©r0   r~   r   r   r   Útest_fdopen  s
   

zFileTests.test_fdopenc                 C   s¢   t jd }|  t jt j¡ |  t j|¡ tt jdƒ t|dƒ t t j|¡ |  ttj	t j¡ t
|ddd}|  | ¡ d¡ W d   ƒ d S 1 sJw   Y  d S )Nz.2ó   1ó   2rŸ   r›   ©rš   Ú1)r   rU   r„   rV   r(   r   Úreplacerj   rC   Ústatr$   r=   r{   )r0   ÚTESTFN2ra   r   r   r   Útest_replace  s   

"ÿzFileTests.test_replacec                 C   s"   t jtt jdd d}t  |¡ d S )Néÿ  )r>   ÚflagsÚmodeÚdir_fd)r   r$   Ú__file__rœ   r\   r`   r   r   r   Útest_open_keywords,  s   ÿzFileTests.test_open_keywordsc              	   C   s>   t  td¡}z|dtjdd d W d S  ttfy   Y d S w )NÚsymlinkÚtargetF)ÚsrcÚdstÚtarget_is_directoryr®   )r   Zget_attributer   r   rU   ÚNotImplementedErrorrD   )r0   r±   r   r   r   Útest_symlink_keywords1  s   ÿÿzFileTests.test_symlink_keywordsÚcopy_file_rangeztest needs os.copy_file_range()c                 C   ó>   |   t¡ t ddd¡ W d   ƒ d S 1 sw   Y  d S ©Nr   rc   iöÿÿÿ)rj   Ú
ValueErrorr   r¸   rW   r   r   r   Ú#test_copy_file_range_invalid_values9  ó   "ÿz-FileTests.test_copy_file_range_invalid_valuesc           	   
   C   s"  t jd }d}tt j|ƒ |  t jt j¡ tt jdƒ}|  |j¡ | ¡ }t|dƒ}|  t j|¡ |  |j¡ | ¡ }z	t 	||d¡}W n t
yc } z|jtjkrS‚ |  |¡ W Y d }~d S d }~ww |  |tddƒ¡ t|dƒ}|  | ¡ |d |… ¡ W d   ƒ d S 1 sŠw   Y  d S )Nú.3ó
   0123456789rƒ   ru   é   r   é   )r   rU   r(   r„   rV   r$   r\   ry   r   r¸   rD   rE   ÚENOSYSrh   ÚassertInÚranger=   r{   )	r0   r©   r…   Úin_fileÚin_fdÚout_fileÚout_fdÚiÚer   r   r   Útest_copy_file_range>  s.   

€ú
"ÿzFileTests.test_copy_file_rangec              
   C   s^  t jd }d}d}d}d}tt j|ƒ |  t jt j¡ tt jdƒ}|  |j¡ | ¡ }t|dƒ}|  t j|¡ |  |j¡ | ¡ }	ztj	||	|||d}
W n t
yl } z|jtjkr\‚ |  |¡ W Y d }~d S d }~ww |  |
td	|d
 ƒ¡ t|dƒ}| ¡ }W d   ƒ n1 sŒw   Y  |  |d |… d| ¡ |  ||d … ||||
 … ¡ d S )Nú.4r¿   rÁ   é   rÀ   rƒ   ru   )Ú
offset_srcÚ
offset_dstr   rc   ó    )r   rU   r(   r„   rV   r$   r\   ry   r   r¸   rD   rE   rÂ   rh   rÃ   rÄ   r{   r=   )r0   ÚTESTFN4r…   Úbytes_to_copyÚin_skipÚout_seekrÅ   rÆ   rÇ   rÈ   rÉ   rÊ   r{   r   r   r   Útest_copy_file_range_offset`  sB   



þ€ú

ÿÿz%FileTests.test_copy_file_range_offsetÚspliceztest needs os.splice()c                 C   r¹   rº   )rj   r»   r   rÖ   rW   r   r   r   Útest_splice_invalid_values  r½   z$FileTests.test_splice_invalid_valuesc              
      sþ   t jd }d}tt j|ƒ |  t jt j¡ tt jdƒ}|  |j¡ | ¡ }t 	¡ \‰ ‰|  ‡ fdd„¡ |  ‡fdd„¡ z	t 
|ˆd¡}W n tye } z|jtjkrU‚ |  |¡ W Y d }~d S d }~ww |  |tdd	ƒ¡ |  t ˆ d
¡|d |… ¡ d S )Nr¾   r¿   rƒ   c                      ó
   t  ˆ ¡S r+   ©r   r\   r   ©Úread_fdr   r   Ú<lambda>   ó   
 z'FileTests.test_splice.<locals>.<lambda>c                      rØ   r+   rÙ   r   ©Úwrite_fdr   r   rÜ   ¡  rÝ   rÀ   r   rÁ   r    )r   rU   r(   r„   rV   r$   r\   ry   r   ÚpiperÖ   rD   rE   rÂ   rh   rÃ   rÄ   r=   r{   )r0   r©   r…   rÅ   rÆ   rÉ   rÊ   r   ©rÛ   rß   r   Útest_splice’  s(   
€ú
 zFileTests.test_splicec           
   
      s  t jd }d}d}d}tt j|ƒ |  t jt j¡ tt jdƒ}|  |j¡ | ¡ }t 	¡ \‰ ‰|  ‡ fdd„¡ |  ‡fdd„¡ ztj
|ˆ||d	}W n tyk } z|jtjkr[‚ |  |¡ W Y d }~d S d }~ww |  |td
|d ƒ¡ t ˆ d¡}	|  |	|||| … ¡ d S )NrÌ   r¿   rÁ   rÍ   rƒ   c                      rØ   r+   rÙ   r   rÚ   r   r   rÜ   Ã  rÝ   z1FileTests.test_splice_offset_in.<locals>.<lambda>c                      rØ   r+   rÙ   r   rÞ   r   r   rÜ   Ä  rÝ   )rÎ   r   rc   r    )r   rU   r(   r„   rV   r$   r\   ry   r   rà   rÖ   rD   rE   rÂ   rh   rÃ   rÄ   r{   r=   )
r0   rÑ   r…   rÒ   rÓ   rÅ   rÆ   rÉ   rÊ   r{   r   rá   r   Útest_splice_offset_in³  s.   
€ú
zFileTests.test_splice_offset_inc              
      sp  t jd }d}d}d}tt j|ƒ |  t jt j¡ t ¡ \‰ ‰|  ‡ fdd„¡ |  ‡fdd„¡ t ˆ|¡ t|dƒ}|  t j|¡ |  |j	¡ | 
¡ }ztjˆ |||d	}W n tyw } z|jtjkrg‚ |  |¡ W Y d }~d S d }~ww |  |td
|d ƒ¡ t|dƒ}	|	 ¡ }
W d   ƒ n1 s—w   Y  |  |
d |… d| ¡ |  |
|d … |d |… ¡ d S )NrÌ   r¿   rÁ   rÍ   c                      rØ   r+   rÙ   r   rÚ   r   r   rÜ   å  rÝ   z2FileTests.test_splice_offset_out.<locals>.<lambda>c                      rØ   r+   rÙ   r   rÞ   r   r   rÜ   æ  rÝ   ru   )rÏ   r   rc   rƒ   rÐ   )r   rU   r(   r„   rV   r   rà   r%   r$   r\   ry   rÖ   rD   rE   rÂ   rh   rÃ   rÄ   r{   r=   )r0   rÑ   r…   rÒ   rÔ   rÇ   rÈ   rÉ   rÊ   rÅ   r{   r   rá   r   Útest_splice_offset_outÙ  s8   

€ú

ÿ z FileTests.test_splice_offset_outN)%rP   rQ   rR   rX   ÚtearDownrb   rm   r   Úcpython_onlyrt   r€   r   r   r   r   Z
bigmemtestr†   rŒ   r“   r8   r9   r™   rž   r¢   rª   r°   r·   r   r   r¼   rË   rÕ   r×   Úrequires_splice_piperâ   rã   rä   r   r   r   r   rS   ®   sT    


ÿÿ
	

!
,
$rS   c                   @   s  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Ze 	e
edƒd¡dd„ ƒZe 	e
edƒd¡dd„ ƒZe 	ejdkd¡dd„ ƒZe 	ejdkd¡e 	e
edƒd¡dd„ ƒƒZdd„ Ze 	ejdkd¡dd„ ƒZe 	ejdkd¡dd „ ƒZe 	ejdkd¡d!d"„ ƒZd#S )$ÚStatAttributeTestsc                 C   s(   t j| _|  t j| j¡ t| jdƒ d S )Nó   ABC)r   rU   Úfnamer„   rV   r(   rW   r   r   r   rX     s   zStatAttributeTests.setUpc           
   	   C   sÚ  t  |¡}|  |tj d¡ |  |jd¡ t|ƒ}ttƒD ]2}|d d… dkrO| ¡ }| d¡r5dd„ }ndd„ }|  |t||ƒƒ|tt|ƒ ¡ |  	||¡ qd 
¡ D ]}tt||ƒd ƒ}t||d	 ƒd
 }| j||dd qTz|d  |  d¡ W n	 ty…   Y nw z
d|_|  d¡ W n	 ty™   Y nw z
d|_|  d¡ W n ttfy¯   Y nw z
d|_|  d¡ W n	 tyÃ   Y nw zt  d¡}	|  d¡ W n	 tyÙ   Y nw zt  d¡}	W d S  tyì   Y d S w )NrÍ   ZST_ZTIMEc                 S   s   t | ƒS r+   )Úint©Úxr   r   r   Útrunc  s    z7StatAttributeTests.check_stat_attributes.<locals>.truncc                 S   s   | S r+   r   rì   r   r   r   rî     s    zst_atime st_mtime st_ctimei † Z_nsi'  re   ©Údeltar6   úNo exception raisedrc   ©rd   ©r   rc   re   rÍ   rw   rÀ   rÁ   é   é   é	   rd   é   é   é   é   )r   r¨   r=   ÚST_SIZEÚst_sizeÚdirÚlowerÚendswithÚgetattrrÃ   Úsplitrë   ÚassertAlmostEqualÚfailÚ
IndexErrorÚst_modeÚAttributeErrorÚst_rdevrp   ÚparrotÚstat_result)
r0   rê   ÚresultÚmembersr   Úattrrî   ZfloatyZnanosecondyÚresult2r   r   r   Úcheck_stat_attributes  sl   


ÿ€ÿÿÿÿ
ÿÿz(StatAttributeTests.check_stat_attributesc                 C   s   |   | j¡ d S r+   )r  rê   rW   r   r   r   Útest_stat_attributesM  ó   z'StatAttributeTests.test_stat_attributesc                 C   sF   z
| j  t ¡ ¡}W n ty   |  d| j  ¡ Y nw |  |¡ d S )Nz#cannot encode %a for the filesystem)rê   Úencoder8   ÚgetfilesystemencodingÚUnicodeEncodeErrorrh   r  )r0   rê   r   r   r   Útest_stat_attributes_bytesP  s   ÿz-StatAttributeTests.test_stat_attributes_bytesc                 C   óf   t  | j¡}ttjd ƒD ]#}t ||¡}|  d|¡ |dk r%|  d|¡ t |¡}|  	||¡ qd S )Nrc   s   stat_resultrw   s   cos
stat_result
)
r   r¨   rê   rÄ   ÚpickleÚHIGHEST_PROTOCOLÚdumpsrÃ   Úloadsr=   ©r0   r
  ÚprotoÚpZ	unpickledr   r   r   Útest_stat_result_pickleW  s   
úz*StatAttributeTests.test_stat_result_pickleÚstatvfsztest needs os.statvfs()c                 C   s  t  | j¡}|  |j|d ¡ d}t|ƒD ]\}}|  t|d| ƒ|| ¡ q|  t|j	t
ƒ¡ |  t|ƒd¡ z
d|_|  d¡ W n	 tyK   Y nw z
d|_|  d¡ W n	 ty_   Y nw zt  d¡}|  d¡ W n	 tyu   Y nw zt  d¡}W d S  tyˆ   Y d S w )	NrÍ   )
ZbsizeZfrsizeZblocksZbfreeZbavailÚfilesZffreeZfavailÚflagZnamemaxZf_rd   rc   rñ   rò   ró   )r   r  rê   r=   Úf_bfreeÚ	enumerater   r]   Ú
isinstanceÚf_fsidrë   r:   r  r  r  Ústatvfs_resultrp   )r0   r
  r  ÚvalueÚmemberr  r   r   r   Útest_statvfs_attributesa  s<   ÿÿ
ÿÿz*StatAttributeTests.test_statvfs_attributesúneed os.statvfs()c                 C   r  )Nrc   s   statvfs_resultrw   s   cos
statvfs_result
)
r   r  rê   rÄ   r  r  r  rÃ   r  r=   r  r   r   r   Útest_statvfs_result_pickle  s   
úz-StatAttributeTests.test_statvfs_result_pickler”   úWin32 specific testsc              
   C   s^   zt  d¡ W d S  ty   |  d¡ Y d S  ty. } z|  d¡ W Y d }~d S d }~ww )Nzc:\pagefile.syszc:\pagefile.sys does not existzCould not stat pagefile.sys)r   r¨   rC   rh   rD   r  ©r0   rÊ   r   r   r   Útest_1686475š  s   €ÿzStatAttributeTests.test_1686475rà   zrequires os.pipe()c              	   C   s   t  ¡ \}}zt  |¡ W t  |¡ t  |¡ nt  |¡ t  |¡ w |  t¡}t  |¡ W d   ƒ n1 s8w   Y  |  |jjtj	¡ d S r+   )
r   rà   r¨   r\   rj   rD   r=   Ú	exceptionrE   ÚEBADF)r0   rŸ   ÚwÚctxr   r   r   Ú
test_15261¤  s   

ÿÿzStatAttributeTests.test_15261c                 C   sL   |   t|dƒ¡ |   t|jtƒ¡ |   d|j  ko dk¡ d S   ¡ d S )NÚst_file_attributesr   ì   ÿÿ )r]   r   r#  r3  rë   )r0   r
  r   r   r   Úcheck_file_attributes²  s   *z(StatAttributeTests.check_file_attributesz$st_file_attributes is Win32 specificc                 C   sz   t  | j¡}|  |¡ |  |jtj@ d¡ tjd }t  	|¡ |  
t j|¡ t  |¡}|  |¡ |  |jtj@ tj¡ d S )Nr   rý   )r   r¨   rê   r5  r=   r3  ÚFILE_ATTRIBUTE_DIRECTORYr   rU   rA   r„   Úrmdir)r0   r
  rH   r   r   r   Útest_file_attributes·  s   

þ




þz'StatAttributeTests.test_file_attributesc                 C   sd   t j t jd | j¡}|  tj|¡ t|dƒ d}t	j
d|ddg|d t  |¡}|  |jd¡ d S )	NÚTEMPré   rõ   z
icacls.exez/denyz*S-1-5-32-545:(S)©r   r   )r   r>   r@   Úenvironrê   r„   r   rV   r(   r   Ú
check_callr¨   ÚassertNotEqualrü   )r0   rê   ZDETACHED_PROCESSr
  r   r   r   Útest_access_deniedÌ  s   

ü
z%StatAttributeTests.test_access_deniedc                 C   s6   dt j t  ¡ ¡d  }t  |¡}|  |jtj¡ d S )Nz//./r   )r   r>   Ú
splitdriver,   r¨   r=   r  ÚS_IFBLK)r0   rê   r
  r   r   r   Útest_stat_block_deviceá  s   
z)StatAttributeTests.test_stat_block_deviceN)rP   rQ   rR   rX   r  r  r  r  r   r   r   r   r(  r*  r8   r9   r-  r2  r5  r8  r>  rA  r   r   r   r   rè     s4    A

+ÿ

	ÿ

rè   c                   @   sä   e Zd Zdd„ Zdd„ Zd)dd„Zdd	„ Zed
d„ ƒZdd„ Z	dd„ Z
e ejejv d¡dd„ ƒZe ejejv d¡dd„ ƒZe ejejv 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ejd'd(„ ƒZdS )*Ú
UtimeTestsc                 C   sD   t j| _tj | jd¡| _|  t j| j¡ t 	| j¡ t
| jƒ d S )NÚf1)r   rU   rH   r   r>   r@   rê   r„   ÚrmtreerA   r(   rW   r   r   r   rX   ë  s
   zUtimeTests.setUpc                 C   s4   t  |¡}|j|d kp|j|d kp|j|d kS )Nrô   rõ   rö   )r   r¨   Úst_atimeÚst_mtimeÚst_ctime)r0   r&   Ústr   r   r   Úsupport_subsecondó  s   
ÿþzUtimeTests.support_subsecondNc                 C   s¸   |s| j }|  |¡}|rd}d}nd}d}||||fƒ t |¡}|r:| j|j|d dd | j|j|d dd n|  |j|d ¡ |  |j|d ¡ |  |j|¡ |  |j	|¡ d S )Ni8Z¹;l   °
o] ì    rT l    P¬9 ç•Ö&è.>gíµ ÷Æ°>rï   )
rê   rI  r   r¨   r  rE  rF  r=   Úst_atime_nsÚst_mtime_ns)r0   Úset_timer&   rI  Úatime_nsÚmtime_nsrH  r   r   r   Ú_test_utimeû  s"   

zUtimeTests._test_utimec                 C   ó   dd„ }|   |¡ d S )Nc                 S   ó   t j| |d d S ©N©Úns©r   Úutime©r&   rV  r   r   r   rN    ó   z'UtimeTests.test_utime.<locals>.set_time©rQ  ©r0   rN  r   r   r   Ú
test_utime  s   zUtimeTests.test_utimec                 C   s   | d d S )NrK  g•Ö&è.>r   rU  r   r   r   Ú	ns_to_sec   s   zUtimeTests.ns_to_secc                    ó   ‡ fdd„}ˆ   |¡ d S )Nc                    s0   |\}}ˆ   |¡}ˆ   |¡}t | ||f¡ d S r+   ©r^  r   rX  ©r&   rV  rO  rP  ZatimeÚmtimerW   r   r   rN  )  s   

z2UtimeTests.test_utime_by_indexed.<locals>.set_timer[  r\  r   rW   r   Útest_utime_by_indexed'  s   z UtimeTests.test_utime_by_indexedc                    r_  )Nc                    s2   |\}}ˆ   |¡}ˆ   |¡}tj| ||fd d S )N)Útimesr`  ra  rW   r   r   rN  3  s   

z0UtimeTests.test_utime_by_times.<locals>.set_timer[  r\  r   rW   r   Útest_utime_by_times2  s   zUtimeTests.test_utime_by_timesz9follow_symlinks support for utime required for this test.c                 C   rR  )Nc                 S   s   t j| |dd d S )NF)rV  Úfollow_symlinksrW  rY  r   r   r   rN  ?  s   z9UtimeTests.test_utime_nofollow_symlinks.<locals>.set_timer[  r\  r   r   r   Útest_utime_nofollow_symlinks;  s   z'UtimeTests.test_utime_nofollow_symlinksz,fd support for utime required for this test.c                 C   rR  )Nc                 S   sD   t | ddƒ}tj| ¡ |d W d   ƒ d S 1 sw   Y  d S )NÚwbr   rU  )r$   r   rX  ry   )r&   rV  r'   r   r   r   rN  H  s   "ýz*UtimeTests.test_utime_fd.<locals>.set_timer[  r\  r   r   r   Útest_utime_fdE  ó   zUtimeTests.test_utime_fdz0dir_fd support for utime required for this test.c                 C   rR  )Nc                 S   sP   t j | ¡\}}t |¡}t j|||d W d   ƒ d S 1 s!w   Y  d S )N)r®   rV  )r   r>   r  r   Úopen_dir_fdrX  )r&   rV  rH   r   Údirfdr   r   r   rN  R  s   "þz.UtimeTests.test_utime_dir_fd.<locals>.set_timer[  r\  r   r   r   Útest_utime_dir_fdO  rj  zUtimeTests.test_utime_dir_fdc                 C   s   dd„ }| j || jd d S )Nc                 S   rS  rT  rW  rY  r   r   r   rN  Z  rZ  z1UtimeTests.test_utime_directory.<locals>.set_time©r&   )rQ  rH   r\  r   r   r   Útest_utime_directoryY  s   zUtimeTests.test_utime_directoryc                 C   sb   t   ¡ }|| jƒ |  | j¡sd}nd}t | j¡}d|j||j| f }| j|j|||d d S )Ng      ð?gš™™™™™©?zst_time=%r, current=%r, dt=%r)rð   Úmsg)Útimerê   rI  r   r¨   rF  r  )r0   rN  Úcurrentrð   rH  rp  r   r   r   Ú_test_utime_current_  s   
ÿ

ÿzUtimeTests._test_utime_currentc                    r_  )Nc                    s   t  ˆ j¡ d S r+   ©r   rX  rê   rn  rW   r   r   rN  v  ó   z/UtimeTests.test_utime_current.<locals>.set_time©rs  r\  r   rW   r   Útest_utime_currentu  ó   zUtimeTests.test_utime_currentc                    r_  )Nc                    s   t  ˆ jd ¡ d S r+   rt  rn  rW   r   r   rN  |  rZ  z3UtimeTests.test_utime_current_old.<locals>.set_timerv  r\  r   rW   r   Útest_utime_current_old{  rx  z!UtimeTests.test_utime_current_oldc                 C   sp   t jdkr4tj tj |¡¡d d }dd l}|jj}| 	dd¡}| 
|d dd d d |t|ƒ¡}|r6|jS d S d S )Nr”   r   ú\Ú r    )r8   r9   r   r>   r?  ÚabspathÚctypesÚwindllÚkernel32Zcreate_unicode_bufferZGetVolumeInformationWr:   r&  )r0   r>   Úrootr}  r  ÚbufÚokr   r   r   Úget_file_system  s   

þ÷zUtimeTests.get_file_systemc                 C   sJ   |   | j¡dkr|  d¡ d}t | j||f¡ |  t | j¡j|¡ d S )NZNTFSzrequires NTFSrJ  )	rƒ  rH   rh   r   rX  rê   r=   r¨   rF  )r0   Zlarger   r   r   Útest_large_timeŽ  s
   
zUtimeTests.test_large_timec              	   C   s²  |   t¡ tj| jddd W d   ƒ n1 sw   Y  |   t¡ t | jddg¡ W d   ƒ n1 s7w   Y  |   t¡ t | jd¡ W d   ƒ n1 sSw   Y  |   t¡ t | jd¡ W d   ƒ n1 sow   Y  |   t¡ tj| jddgd W d   ƒ n1 sŽw   Y  |   t¡ tj| jdd W d   ƒ n1 s«w   Y  |   t¡ tj| jdd W d   ƒ n1 sÈw   Y  tjtjvrñ|   t¡ tj| jddd W d   ƒ n1 sìw   Y  tjtjvr.t	| jdd	ƒ&}|   t¡ t | 
¡ d¡ W d   ƒ n	1 sw   Y  W d   ƒ n	1 s)w   Y  tjtjvrW|   t¡ tj| jdd	d
 W d   ƒ d S 1 sPw   Y  d S d S )N)rÀ   rÀ   rU  rÀ   )rÀ   )rÀ   rÀ   rÀ   F©rf  rh  r   ©r®   )rj   r»   r   rX  rê   rp   Úsupports_follow_symlinksr¶   Úsupports_fdr$   ry   Úsupports_dir_fd)r0   r'   r   r   r   Útest_utime_invalid_arguments˜  sJ   ÿÿÿÿÿÿÿÿÿ€ÿ$ÿÿz'UtimeTests.test_utime_invalid_argumentsc                 C   sÔ   dd„ }|   t¡ tj| j|dƒdfd W d   ƒ n1 s w   Y  |   t¡ tj| j|dƒdfd W d   ƒ n1 sAw   Y  |   t¡ tj| j|dƒdfd W d   ƒ d S 1 scw   Y  d S )Nc                    s   G ‡ fdd„dƒ}|ƒ S )Nc                       s   e Zd Z‡ fdd„ZdS )z?UtimeTests.test_issue31577.<locals>.get_bad_int.<locals>.BadIntc                     s   ˆ S r+   r   )r‘   ©Údivmod_ret_valr   r   Ú
__divmod__º  ó   zJUtimeTests.test_issue31577.<locals>.get_bad_int.<locals>.BadInt.__divmod__N)rP   rQ   rR   r  r   r‹  r   r   ÚBadInt¹  s    r  r   )rŒ  r  r   r‹  r   Úget_bad_int¸  s   z/UtimeTests.test_issue31577.<locals>.get_bad_inté*   rc   rU  r   )rc   re   rÍ   )rj   rp   r   rX  rê   )r0   r  r   r   r   Útest_issue31577´  s   ÿÿ"ÿzUtimeTests.test_issue31577r+   )rP   rQ   rR   rX   rI  rQ  r]  Ústaticmethodr^  rc  re  r   r   r   rX  r‡  rg  rˆ  ri  r‰  rm  ro  rs  rw  ry  rƒ  r„  rŠ  r   ræ   r’  r   r   r   r   rB  ê  s<    

	ÿ
ÿ
ÿ

rB  )Úmapping_testsc                   @   sB  e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Ze	 
eo!ej e¡d¡e	 
eedƒd¡dd„ ƒƒZe	 
eo:ej e¡d¡e	 
eedƒd¡dd„ ƒƒZdd„ Zdd„ Zdd„ Zdd„ Ze	 
ejd¡dd„ ƒZdd„ Ze dd ¡d!d"„ ƒZd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Z d-d.„ Z!d/d0„ Z"d1d2„ Z#d3d4„ Z$d5d6„ Z%d7d8„ Z&dS )9ÚEnvironTestsz8check that os.environ object conform to mapping protocolNc                 C   sB   t tjƒ| _tjrt tjƒ| _|  ¡  ¡ D ]	\}}|tj|< qd S r+   )	Údictr   r;  Ú_EnvironTests__saveÚsupports_bytes_environÚenvironbÚ_EnvironTests__savebÚ
_referenceÚitems©r0   Úkeyr&  r   r   r   rX   Ë  s   ÿzEnvironTests.setUpc                 C   s>   t j ¡  t j | j¡ t jrt j ¡  t j | j¡ d S d S r+   )r   r;  ÚclearÚupdater—  r˜  r™  rš  rW   r   r   r   rå   Ò  s   

þzEnvironTests.tearDownc                 C   s   ddddœS )NZVALUE1ZVALUE2ZVALUE3)ZKEY1ZKEY2ZKEY3r   rW   r   r   r   r›  Ù  ó   zEnvironTests._referencec                 C   s   t j ¡  t jS r+   )r   r;  rŸ  rW   r   r   r   Ú_empty_mappingÜ  s   
zEnvironTests._empty_mappingzrequires a shellÚpopenzneeds os.popen()c                 C   sd   t j ¡  t jjdd t  dt ¡}| ¡  ¡ }|  |d¡ W d   ƒ d S 1 s+w   Y  d S )NZWorld)ZHELLOz%s -c 'echo $HELLO')	r   r;  rŸ  r   r£  r   r{   Ústripr=   )r0   r£  r&  r   r   r   Útest_update2á  s   
"þzEnvironTests.test_update2c                 C   sz   t  dt ¡,}t|ƒ}|  t|ƒd¡ |  t|ƒd¡ |  t|ƒd¡ |  tt|¡ W d   ƒ d S 1 s6w   Y  d S )Nz %s -c 'echo "line1
line2
line3"'zline1
zline2
zline3
)r   r£  r   Úiterr=   Únextrj   ÚStopIteration)r0   r£  Úitr   r   r   Útest_os_popen_iterë  s   ÿ"úzEnvironTests.test_os_popen_iterc                 C   s8   t j ¡ D ]\}}|  t|ƒt¡ |  t|ƒt¡ qd S r+   )r   r;  rœ  r=   r|   r.   )r0   rž  Úvalr   r   r   Útest_keyvalue_typesù  s   þz EnvironTests.test_keyvalue_typesc                 C   s.   |   ¡  ¡ D ]\}}|  tj |¡|¡ qd S r+   )r›  rœ  r=   r   r;  Úgetr  r   r   r   Ú
test_itemsþ  s   ÿzEnvironTests.test_itemsc              
   C   s4   t j}|  t|ƒd d dd„ | ¡ D ƒ¡¡¡ dS )z>Check that the repr() of os.environ looks like environ({...}).zenviron({{{}}})z, c                 s   s     | ]\}}d   ||¡V  qdS )z
{!r}: {!r}N©Úformat)r   rž  r&  r   r   r   Ú	<genexpr>  s
   € 
ÿ
ÿz-EnvironTests.test___repr__.<locals>.<genexpr>N)r   r;  r=   Úreprr°  r@   rœ  )r0   Úenvr   r   r   Útest___repr__  s   þzEnvironTests.test___repr__c                 C   s\  t j t j¡}g d¢}dt j |¡i}t j}zt|ƒt _|  |t  ¡ ¡ |  |t jd d¡ W |t _n|t _w |  |t  i ¡¡ |  dt  ddi¡¡ |  |t  |¡¡ t j	r¬zt
jdd dd	d
œ}W d   ƒ n1 snw   Y  W n	 ty}   Y n	w |  tt j|¡ |  t  ddi¡dg¡ |  t  ddi¡dg¡ |  t  ddi¡dg¡ d S d S )N)z/montyz/pythonr{  z/flying/circusÚPATH©r³  ©r{  r{  T)Úrecordr¦   r¤   )rµ  ó   PATHr¹  ó   abcÚabc)r   Údefpathr  Úpathsepr@   r;  r–  ÚassertSequenceEqualÚget_exec_pathr˜  ÚwarningsÚcatch_warningsÚBytesWarningrj   r»   )r0   Zdefpath_listZ	test_pathZtest_envZsaved_environZ	mixed_envr   r   r   Útest_get_exec_path
  s@   
ÿ€þÿÿÿïzEnvironTests.test_get_exec_pathz#os.environb required for this test.c                 C   s¸   d}z
|  t ¡ d¡}W n ty!   dt ¡ f }|  |¡ Y nw |tjd< |  tjd |¡ |  tjd |¡ d}|tjd< |  tjd |¡ | 	t ¡ d¡}|  tjd |¡ d S )	Nu   euroâ‚¬Úsurrogateescapez'U+20AC character is not encodable to %sÚunicodes   unicodeó   ÿs   bytesrM   )
r  r8   r  r  rh   r   r;  r=   r™  Údecode)r0   r&  Zvalue_bytesrp  Z	value_strr   r   r   Útest_environb3  s&   
ÿÿý

zEnvironTests.test_environbc                 C   sÈ   d}d}d|›d}t  ¡ L}| |d ¡ t ||¡ tjtjd|gdtj	dd}|  
|j ¡ t|ƒ¡ t |¡ tjtjd|gdtj	dd}|  
|j ¡ td ƒ¡ W d   ƒ d S 1 s]w   Y  d S )NZPYTHONTESTVARZ	testvaluez%import os; print(repr(os.environ.get(z)))r•   T)ÚcheckÚstdoutÚtext)r   ZEnvironmentVarGuardÚpopr   Úputenvr   Úrunr8   r–   ÚPIPEr=   rÊ  Úrstripr²  Úunsetenv)r0   r   r&  r˜   r³  Úprocr   r   r   Útest_putenv_unsetenvJ  s    
ÿ
ÿ"õz!EnvironTests.test_putenv_unsetenvrd   rÁ   c                 C   s‚   dD ]}|   ttftj|d¡ |   ttftj|¡ qtjdkr?dd }|   ttj|d¡ |   ttjd|¡ |   ttj|¡ d S d S )N)r{  z=namezna=mezname=zname zna mer&  r”   rí   é €  r¦   ÚX)rj   rD   r»   r   rÍ  rÑ  r8   r9   )r0   r   Zlongstrr   r   r   Útest_putenv_unsetenv_error]  s   
úz'EnvironTests.test_putenv_unsetenv_errorc                 C   sÀ   d}|   |tj¡ |  t¡}tj|  W d   ƒ n1 sw   Y  |  |jjd |¡ |  |jj	¡ |  t¡}tj|= W d   ƒ n1 sHw   Y  |  |jjd |¡ |  |jj	¡ d S )NZ
missingkeyr   )
ÚassertNotInr   r;  rj   ÚKeyErrorÚassertIsr.  r‘   r]   Ú__suppress_context__)r0   ÚmissingÚcmr   r   r   Útest_key_typem  s   ÿ
ÿzEnvironTests.test_key_typec                 C   sR   t |ƒ}d}t|ƒ dtj|< zt|ƒ |  tj| d¡ W tj|= d S tj|= w )NZ__new_key__Ztest_environ_iteration)r¦  r§  r   r;  r=   )r0   Z
collectionÚiteratorZnew_keyr   r   r   Ú_test_environ_iteration{  s   
z$EnvironTests._test_environ_iterationc                 C   ó   |   tj¡ d S r+   )rß  r   r;  rW   r   r   r   Ú(test_iter_error_when_changing_os_environŠ  r  z5EnvironTests.test_iter_error_when_changing_os_environc                 C   ó   |   tj ¡ ¡ d S r+   )rß  r   r;  rœ  rW   r   r   r   Ú.test_iter_error_when_changing_os_environ_items  ó   z;EnvironTests.test_iter_error_when_changing_os_environ_itemsc                 C   râ  r+   )rß  r   r;  ÚvaluesrW   r   r   r   Ú/test_iter_error_when_changing_os_environ_values  rä  z<EnvironTests.test_iter_error_when_changing_os_environ_valuesc                 C   sf   t rtj t ¡s
d S t t › d|› d¡}| ¡  ¡ }W d   ƒ n1 s&w   Y  |  ||¡ d S )Nz -c 'echo $ú')r   r   r>   Úexistsr£  r{   r¤  r=   )r0   ÚvarrI   r£  r&  r   r   r   Ú_test_underlying_process_env“  s   ÿz)EnvironTests._test_underlying_process_envc                 C   s”   d}d}|t j|< dddd|di}tt jƒ}| |¡ t j|B }|  ||¡ |  d|| ¡ | ¡ }|  tt j 	|¡¡ |  
dd¡ |  
||¡ d S ©	NÚ
_TEST_VAR_Úoriginal_valueÚ_A_r¦   Ú_B_Ú2Ú3r{  )r   r;  r–  r   ÚassertDictEqualr=   rœ  rÙ  ÚNotImplementedÚ__or__rê  ©r0   Úoverridden_keyrí  Únew_vars_dictrI   ÚactualÚnew_vars_itemsr   r   r   Útest_or_operatorœ  s   



zEnvironTests.test_or_operatorc                 C   s|   d}dt j|< dddd|di}tt jƒ}| |¡ t  j|O  _|  |t j¡ |  dt j| ¡ |  dd¡ |  |d¡ d S )Nrì  rí  rî  r¦   rï  rð  rñ  ©r   r;  r–  r   r=   rê  )r0   rö  r÷  rI   r   r   r   Útest_ior_operator¯  s   


zEnvironTests.test_ior_operatorc                 C   sœ   t j ¡ }|  t¡ ddi}t  j|O  _W d   ƒ n1 s w   Y  |  t¡ ddi}t  j|O  _W d   ƒ n1 s@w   Y  |  |t j¡ d S )Nrc   rî  )r   r;  Úcopyrj   rp   r=   )r0   Zos_environ_copyZdict_with_bad_keyZdict_with_bad_valr   r   r   Útest_ior_operator_invalid_dicts¾  s   
þþz,EnvironTests.test_ior_operator_invalid_dictsc                 C   sz   d}dt j|< dd|dff}tt jƒ}| |¡ t  j|O  _|  |t j¡ |  dt j| ¡ |  dd¡ |  |d¡ d S )Nrì  rí  )rî  r¦   )rï  rð  rñ  rî  r¦   rû  )r0   rö  rù  rI   r   r   r   Ú$test_ior_operator_key_value_iterableË  s   


z1EnvironTests.test_ior_operator_key_value_iterablec                 C   s”   d}d}|t j|< dddd|di}t|ƒ}| t j¡ |t jB }|  ||¡ |  ||| ¡ | ¡ }|  tt j 	|¡¡ |  
dd¡ |  
||¡ d S rë  )r   r;  r–  r   rò  r=   rœ  rÙ  ró  Ú__ror__rê  rõ  r   r   r   Útest_ror_operatorÚ  s   

zEnvironTests.test_ror_operator)'rP   rQ   rR   Ú__doc__Z	type2testrX   rå   r›  r¢  r   r   r   r   r>   rè  r   r¥  rª  r¬  r®  r´  rÃ  r˜  rÈ  rÓ  r   Zrequires_mac_verrÖ  rÝ  rß  rá  rã  ræ  rê  rú  rü  rþ  rÿ  r  r   r   r   r   r•  Ç  sN    ÿÿ)ÿ


	r•  c                   @   sZ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú	WalkTestszTests for os.walk().c                 K   s(   d|v r|  d¡|d< tj|fi |¤ŽS ©Nrf  Úfollowlinks)rÌ  r   Úwalk)r0   ÚtopÚkwargsr   r   r   r  ó  s   zWalkTests.walkc              	   C   s:  t jj}|  tjtj¡ |tjdƒ| _|| jdƒ| _|| jdƒ| _	|| jdƒ}||dƒ}|| jdƒ}|| jdƒ}||dƒ}||dƒ}||d	ƒ| _
|tjd
ƒ}|tjd
dƒ}	||dƒ}
||dƒ}||dƒ}t  | j	¡ t  |¡ t  |¡ t  |¡ ||||	|fD ]"}t|ddd}| d| d ¡ W d   ƒ n1 sw   Y  q€t ¡ rØt  t j |¡| j
¡ t  d|
d¡ t  |ddƒ|d¡ t  |ddƒ|d¡ |dd	gg d¢f| _n|dgdgf| _t  |d¡ zt  |¡ W n ty   |  t j|tj¡ Y d S w t  |tj¡ t  |¡ t  |¡ | jd d d…= d S )NZTEST1ÚSUB1ÚSUB11ÚSUB2ZSUB21Útmp1Útmp2Útmp3ÚlinkZTEST2Útmp4Úbroken_linkÚbroken_link2Úbroken_link3rí   r›   r¥   zI'm z" and proud of it.  Blame test_os.
ÚbrokenTZtmp5)r  r  r  r  r   rc   )r   r>   r@   r„   r   rD  rU   Ú	walk_pathÚ	sub1_pathÚ
sub11_pathÚ	link_pathÚmakedirsr$   r%   Úcan_symlinkr±   r|  Ú	sub2_treeÚchmodÚlistdirÚPermissionErrorr¨   ÚS_IRWXUrV   r7  )r0   r@   Z	sub2_pathZ
sub21_pathZ	tmp1_pathZ	tmp2_pathZ	tmp3_pathZ	tmp5_pathZt2_pathZ	tmp4_pathZbroken_link_pathZbroken_link2_pathZbroken_link3_pathr>   ra   r   r   r   rX   ø  sZ   








ÿ€ÿÿ

zWalkTests.setUpc                 C   sì   t |  | j¡ƒ}|  t|ƒd¡ |d d d dk}|d d  ¡  |dd|   d  ¡  |dd|   d  ¡  |  |d | jddgd	gf¡ |  |d|  | jd
gdgf¡ |  |d|  | jg g f¡ |  |dd|   | j¡ d S )Nrw   r   rc   r	  rÍ   re   éÿÿÿÿr  r  r
  r  )	Úlistr  r  r=   r:   Úsortr  r  r  ©r0   ÚallZflippedr   r   r   Útest_walk_topdown=  s    zWalkTests.test_walk_topdownNc                 C   s¬   |d u r| j }g }|  |¡D ]\}}}| |||f¡ d|v r$| d¡ q|  t|ƒd¡ |  |d | j dgdgf¡ |d d  ¡  |d d  ¡  |  |d | j¡ d S )Nr	  re   r   r  r  rc   r   )r  r  ÚappendÚremover=   r:   r"  r  )r0   r  r$  r€  Údirsr  r   r   r   Útest_walk_pruneN  s   
€zWalkTests.test_walk_prunec                 C   s   |   t| jƒ¡ d S r+   )r)  r   r  rW   r   r   r   Útest_file_like_patha  rä  zWalkTests.test_file_like_pathc                 C   sî   t | j| jddƒ}|  t|ƒd|¡ |d d d dk}|d d  ¡  |dd|   d	  ¡  |dd|   d  ¡  |  |d | jdd
gdgf¡ |  || | jg g f¡ |  ||d  | jdgdgf¡ |  |dd|   | j¡ d S )NF©Útopdownrw   rÍ   rc   r   r	  re   r   r  r  r
  r  )	r!  r  r  r=   r:   r"  r  r  r  r#  r   r   r   Útest_walk_bottom_upd  s$   
ÿ

ÿÿÿzWalkTests.test_walk_bottom_upc                 C   sj   t  ¡ s	|  d¡ | j| jdd}|D ]\}}}|| jkr-|  |g ¡ |  |dg¡  d S q|  d¡ d S )Nzneed symlink supportTr…  r  z+Didn't follow symlink with followlinks=True)r   r  rh   r  r  r  r=   r  )r0   Úwalk_itr€  r(  r  r   r   r   Útest_walk_symlinky  s   

ýzWalkTests.test_walk_symlinkc              
   C   sÚ   g }| j | j|jd}t|ƒ\}}}|  |g ¡ d}tj ||¡}tj ||d ¡}t ||¡ z5dd„ |D ƒ}	|  	|¡ |  
||	¡ |  
||	¡ |D ]}
|
|kr\|  tj ||
¡|	¡ qKW t ||¡ d S t ||¡ w )N)Úonerrorr	  z.newc                 S   s   g | ]\}}}|‘qS r   r   )r   rŸ   Údra   r   r   r   r   ’  ó    z/WalkTests.test_walk_bad_dir.<locals>.<listcomp>)r  r  r&  r§  r=   r   r>   r@   rq   r]   r×  rÃ   )r0   Úerrorsr.  r€  r(  r  Údir1Zpath1Zpath1newÚrootsÚdir2r   r   r   Útest_walk_bad_dir‡  s&   
€þzWalkTests.test_walk_bad_dirc                    s  d}t j tjd¡‰ t jjˆ gdg| ¢R Ž }t  |¡ ‡ ‡fdd„tdƒD ƒ}t|d ƒD ]}||r6dgng g f}|D ]
}ˆ t|ƒ|¡ q<t j 	|¡}q.‡ ‡fdd„tdƒD ƒ}ˆ }t|d ƒD ]"}|||k rldgng g f}|D ]
}ˆ t|ƒ|¡ qrt j |d¡}qbd S )	Né   Zdeepr1  c                    ó   g | ]	}ˆj ˆ d d‘qS )Fr+  ©r  ©r   Új©Úbaser0   r   r   r   ¢  ó    z7WalkTests.test_walk_many_open_files.<locals>.<listcomp>r    rc   c                    r9  )Tr+  r:  r;  r=  r   r   r   ©  r?  )
r   r>   r@   r   rU   r  rÄ   r=   r§  rH   )r0   Údepthr  ZitersrÉ   rI   r©  r   r=  r   Útest_walk_many_open_filesœ  s$   
üz#WalkTests.test_walk_many_open_filesr+   )rP   rQ   rR   r  r  rX   r%  r)  r*  r-  r/  r7  rA  r   r   r   r   r  î  s    E
r  ÚfwalkzTest needs os.fwalk()c                   @   sL   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ZdS )Ú
FwalkTestszTests for os.fwalk().c                 k   s2    | j |fi |¤ŽD ]\}}}}|||fV  q
d S r+   )rB  )r0   r  r  r€  r(  r  Zroot_fdr   r   r   r  ¶  s   €ÿzFwalkTests.walkc                 O   s   t j|i |¤ŽS r+   )r   rB  ©r0   r‘   r  r   r   r   rB  º  r  zFwalkTests.fwalkc           
      C   sÂ   |  ¡ }|  ¡ }tjdddD ]O\}}|j||d |j||d i }tjdi |¤ŽD ]\}}}t|ƒt|ƒf||< q+| jdi |¤ŽD ]\}}}}	|  ||¡ |  	|| t|ƒt|ƒf¡ qCqdS )z.
        compare with walk() results.
        ©TFre   ©Úrepeat)r,  r  )r,  rf  Nr   )
rý  Ú	itertoolsÚproductr   r   r  ÚsetrB  rÃ   r=   )
r0   Úwalk_kwargsÚfwalk_kwargsr,  rf  rI   r€  r(  r  Úrootfdr   r   r   Ú_compare_to_walk½  s   þøzFwalkTests._compare_to_walkc                 C   s   dt ji}|  ||¡ d S )Nr  )r   rU   rN  )r0   r  r   r   r   Útest_compare_to_walkÏ  ó   
zFwalkTests.test_compare_to_walkc              	   C   sR   z"t  dt j¡}dtji}| ¡ }||d< |  ||¡ W t  |¡ d S t  |¡ w )NÚ.r  r®   )r   r$   rœ   r   rU   rý  rN  r\   )r0   r~   rK  rL  r   r   r   Útest_dir_fdÓ  s   
zFwalkTests.test_dir_fdc                 C   s|   t jdddD ]4\}}tj|d f}| j|d|iŽD ]!\}}}}t |¡ t |¡ |  t	t 
|¡ƒt	|ƒt	|ƒB ¡ qqd S )NrE  re   rF  rf  )rH  rI  r   rU   rB  r   Úfstatr¨   r=   rJ  r  )r0   r,  rf  r‘   r€  r(  r  rM  r   r   r   Útest_yields_correct_dir_fdÝ  s   

$úþz%FwalkTests.test_yields_correct_dir_fdc                 C   s\   t  d¡}t  |¡ tdƒD ]}|  tj¡D ]}qqt  d¡}|  t j|¡ |  ||¡ d S )Nrc   é   )	r   rg   r\   rÄ   rB  r   rU   r„   r=   )r0   ZminfdrÉ   rí   Znewfdr   r   r   Útest_fd_leaké  s   

ÿ
zFwalkTests.test_fd_leakN)rP   rQ   rR   r  r  rB  rN  rO  rR  rT  rV  rA  r   r   r   r   rC  ²  s    
rC  c                   @   ó   e Zd ZdZdd„ ZdS )ÚBytesWalkTestsúTests for os.walk() with bytes.c           	      k   s¦    d|v r|  d¡|d< tjt |¡fi |¤ŽD ]8\}}}t |¡}tttj|ƒƒ}tttj|ƒƒ}|||fV  tttj|ƒƒ|d d …< tttj|ƒƒ|d d …< qd S r  )rÌ  r   r  ÚfsencoderN   r!  Úmap)	r0   r  r  ÚbrootÚbdirsÚbfilesr€  r(  r  r   r   r   r  ü  s   €"
úzBytesWalkTests.walkN)rP   rQ   rR   r  r  r   r   r   r   rX  ú  s    rX  c                   @   s   e Zd ZdZddd„ZdS )ÚBytesFwalkTestsrY  rQ  c                 o   sš    t jt  |¡g|¢R i |¤ŽD ]:\}}}}t  |¡}ttt j|ƒƒ}	ttt j|ƒƒ}
||	|
|fV  ttt j|	ƒƒ|d d …< ttt j|
ƒƒ|d d …< qd S r+   )r   rB  rZ  rN   r!  r[  )r0   r  r‘   r  r\  r]  r^  Útopfdr€  r(  r  r   r   r   rB  
  s   €*
úzBytesFwalkTests.fwalkN)rQ  )rP   rQ   rR   r  rB  r   r   r   r   r_    s    r_  c                   @   s^   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Ze	 
ejdkd¡dd„ ƒZdd„ ZdS )ÚMakedirTestsc                 C   ó   t  tj¡ d S r+   ©r   rA   r   rU   rW   r   r   r   rX     r  zMakedirTests.setUpc              
   C   s    t j}tj |ddd¡}t |¡ tj |dddd¡}t |¡ |  ttjtj¡ tj |dddddtj¡}t |¡ tj |dtjddddd¡}t |¡ d S ©Nr4  r6  Zdir3Zdir4Zdir5Zdir6)	r   rU   r   r>   r@   r  rj   rD   Úcurdir)r0   r>  r>   r   r   r   Útest_makedir  s   


ÿzMakedirTests.test_makedirc                 C   sÌ   t  d¡W t j}tj |d¡}tj |d¡}t |d¡ |  tj |¡¡ |  tj 	|¡¡ tj
dkrT|  t |¡jd@ d¡ |  t |¡jd@ d¡ W d   ƒ d S W d   ƒ d S 1 s_w   Y  d S )Nre   r4  r6  im  Úntr«   iý  )r   Z
temp_umaskrU   r   r>   r@   r  r]   rè  Úisdirr   r=   r¨   r  )r0   r>  Úparentr>   r   r   r   Ú	test_mode'  s   
÷"ùzMakedirTests.test_modec                 C   s–   t j tjd¡}d}t  d¡}t  ||¡ |  tt j||¡ | jtt j||dd t j|ddd t j||dd t  |¡ t jt j 	d	¡dd d S )
Nr4  r«   é   F©Úexist_okiþ  T)r­   rm  ú/)
r   r>   r@   r   rU   Úumaskr  rj   rD   r|  )r0   r>   r­   Úold_maskr   r   r   Ú test_exist_ok_existing_directory3  s   

z-MakedirTests.test_exist_ok_existing_directoryc              	   C   sú   t j tjd¡}tj}d}t  d¡}zdt t  	tj¡j
¡}zt  tj||B ¡ W n ty4   t d¡‚w t  	tj¡j
|@ |krEt d¡‚t  |||B ¡ t j||dd t  |t t  	|¡j
¡| @ ¡ t j|||B dd W t  |¡ d S t  |¡ w )Nr4  r«   rk  zCannot set S_ISGID for dir.z No support for S_ISGID dir mode.Trl  )r   r>   r@   r   rU   r¨   ÚS_ISGIDro  ÚS_IMODEÚlstatr  r  r  r   ÚSkipTestr  )r0   r>   rr  r­   rp  Zexisting_testfn_moder   r   r   Útest_exist_ok_s_isgid_directoryA  s(   
ÿ
ÿ
 z,MakedirTests.test_exist_ok_s_isgid_directoryc                 C   s”   t j}tj t jd¡}t|ddd}| d¡ W d   ƒ n1 s"w   Y  |  ttj	|¡ | jttj	|dd | jttj	|dd t 
|¡ d S )	Nr4  r0  r›   r¥   r»  Frl  T)r   rU   r   r>   r@   r$   r%   rj   rD   r  r'  )r0   r>  r>   ra   r   r   r   Ú#test_exist_ok_existing_regular_file\  s   ÿz0MakedirTests.test_exist_ok_existing_regular_filerg  zrequires Windowsc                 C   sd   t j}tj tj t jd¡¡}tj|dd tjd|dgdd}t 	|¡ |  
| ¡ |› d¡ d S )	Nrý   iÀ  )r­   z	cacls.exez/sZoemr¥   z6 "D:P(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;OW)")r   rU   r   r>   r|  r@   rA   r   Úcheck_outputr7  r=   r¤  )r0   r>  r>   Úoutr   r   r   Útest_win32_mkdir_700f  s   
þz!MakedirTests.test_win32_mkdir_700c              	   C   s`   t j tjdddddd¡}t j |¡s)|tjkr)t j |¡}t j |¡s)|tjkst  |¡ d S rd  )r   r>   r@   r   rU   rè  rH   Ú
removedirs©r0   r>   r   r   r   rå   r  s   ÿÿzMakedirTests.tearDownN)rP   rQ   rR   rX   rf  rj  rq  rv  rw  r   r   r   r   rz  rå   r   r   r   r   ra    s    

ra  ÚchownzTest needs chownc                   @   sˆ   e Zd Zedd„ ƒZdd„ Ze ee	dƒd¡dd„ ƒZ
e eo$eeƒd	kd
¡dd„ ƒZe e o5eeƒd	kd¡dd„ ƒZedd„ ƒZdS )ÚChownFileTestsc                 C   rb  r+   rc  ©Úclsr   r   r   Ú
setUpClass  ru  zChownFileTests.setUpClassc                 C   s”   t  tj¡}|j}|j}ddt d¡t 	dd¡fD ]}|  
tt jtj||¡ |  
tt jtj||¡ q|  t  tj||¡¡ |  t  tjdd¡¡ d S )Ng      ð¿y       €      ð¿r   éþÿÿÿre   )r   r¨   r   rU   Úst_uidÚst_gidÚdecimalZDecimalÚ	fractionsZFractionrj   rp   r}  ÚassertIsNone)r0   r¨   ÚuidÚgidr&  r   r   r   Ú*test_chown_uid_gid_arguments_must_be_index…  s   z9ChownFileTests.test_chown_uid_gid_arguments_must_be_indexÚ	getgroupszneed os.getgroupsc                 C   s”   t  ¡ }t|ƒdk r|  d¡ |d d… \}}t  tj¡j}t  tj||¡ t  tj¡j	}|  
||¡ t  tj||¡ t  tj¡j	}|  
||¡ d S )Nre   ztest needs at least 2 groups)r   r‹  r:   rh   r¨   r   rU   rƒ  r}  r„  r=   )r0   ÚgroupsZgid_1Zgid_2rˆ  r‰  r   r   r   Útest_chown_gid  s   
zChownFileTests.test_chown_gidrc   z0test needs root privilege and more than one userc                 C   sv   t d d… \}}t tj¡j}t tj||¡ t tj¡j}|  ||¡ t tj||¡ t tj¡j}|  ||¡ d S ©Nre   )	Ú	all_usersr   r¨   r   rU   r„  r}  rƒ  r=   )r0   Úuid_1Úuid_2r‰  rˆ  r   r   r   Útest_chown_with_root   s   z#ChownFileTests.test_chown_with_rootz2test needs non-root account and more than one userc                 C   sn   t d d… \}}t tj¡j}|  t¡ t tj||¡ t tj||¡ W d   ƒ d S 1 s0w   Y  d S rŽ  )	r  r   r¨   r   rU   r„  rj   r  r}  )r0   r  r‘  r‰  r   r   r   Útest_chown_without_permission¬  s   "þz,ChownFileTests.test_chown_without_permissionc                 C   rb  r+   )r   r7  r   rU   r  r   r   r   ÚtearDownClassµ  ru  zChownFileTests.tearDownClassN)rP   rQ   rR   Úclassmethodr  rŠ  r   r   r   r   r  Úroot_in_posixr:   r  r’  r“  r”  r   r   r   r   r~  ~  s     


ÿ

ÿ
r~  c                   @   ó4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚRemoveDirsTestsc                 C   rb  r+   )r   r  r   rU   rW   r   r   r   rX   »  r  zRemoveDirsTests.setUpc                 C   s   t  t j¡ d S r+   )r   rD  rU   rW   r   r   r   rå   ¾  r  zRemoveDirsTests.tearDownc                 C   sx   t j tjd¡}t  |¡ t j |d¡}t  |¡ t  |¡ |  t j |¡¡ |  t j |¡¡ |  t j tj¡¡ d S )NÚdiraÚdirb)	r   r>   r@   r   rU   rA   r{  ÚassertFalserè  ©r0   r™  rš  r   r   r   Útest_remove_allÁ  s   


zRemoveDirsTests.test_remove_allc                 C   sŠ   t j tjd¡}t  |¡ t j |d¡}t  |¡ tt j |d¡ƒ t  |¡ |  t j 	|¡¡ |  
t j 	|¡¡ |  
t j 	tj¡¡ d S ©Nr™  rš  úfile.txt)r   r>   r@   r   rU   rA   r(   r{  r›  rè  r]   rœ  r   r   r   Útest_remove_partialË  s   


z#RemoveDirsTests.test_remove_partialc                 C   s´   t j tjd¡}t  |¡ t j |d¡}t  |¡ tt j |d¡ƒ |  t¡ t  	|¡ W d   ƒ n1 s7w   Y  |  
t j |¡¡ |  
t j |¡¡ |  
t j tj¡¡ d S rž  )r   r>   r@   r   rU   rA   r(   rj   rD   r{  r]   rè  rœ  r   r   r   Útest_remove_nothingÖ  s   

ÿz#RemoveDirsTests.test_remove_nothingN)rP   rQ   rR   rX   rå   r  r   r¡  r   r   r   r   r˜  º  s    
r˜  c                   @   ó   e Zd Zdd„ ZdS )ÚDevNullTestsc                 C   s‚   t tjddƒ}| d¡ | ¡  W d   ƒ n1 sw   Y  t tjdƒ}|  | ¡ d¡ W d   ƒ d S 1 s:w   Y  d S )Nrh  r   ó   hellorƒ   ó    )r$   r   Údevnullr%   r\   r=   r{   r`   r   r   r   Útest_devnullä  s   

þ"ÿzDevNullTests.test_devnullN)rP   rQ   rR   r§  r   r   r   r   r£  ã  ó    r£  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚURandomTestsc                 C   sr   |   tt d¡ƒd¡ |   tt d¡ƒd¡ |   tt d¡ƒd¡ |   tt d¡ƒd¡ |   tt d¡ƒd¡ d S )Nr   rc   rd   r    r5   )r=   r:   r   ÚurandomrW   r   r   r   Útest_urandom_lengthí  s
   z URandomTests.test_urandom_lengthc                 C   s0   t  d¡}|  |t¡ t  d¡}|  ||¡ d S ©Né   )r   rª  r-   rM   r=  ©r0   Zdata1Zdata2r   r   r   Útest_urandom_valueô  s   

zURandomTests.test_urandom_valuec                 C   s<   d  dd| ddf¡}td|ƒ}|d }|  t|ƒ|¡ |S )NÚ
zimport os, syszdata = os.urandom(%s)zsys.stdout.buffer.write(data)zsys.stdout.buffer.flush()r•   rc   )r@   r   r=   r:   )r0   Úcountr˜   ry  rÊ  r   r   r   Úget_urandom_subprocessú  s   ü
z#URandomTests.get_urandom_subprocessc                 C   s$   |   d¡}|   d¡}|  ||¡ d S r¬  )r²  r=  r®  r   r   r   Útest_urandom_subprocess  ó   

z$URandomTests.test_urandom_subprocessN)rP   rQ   rR   r«  r¯  r²  r³  r   r   r   r   r©  ì  s
    r©  Ú	getrandomzneed os.getrandom()c                   @   s@   e Zd Zedd„ ƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚGetRandomTestsc              
   C   sB   zt  d¡ W d S  ty  } z|jtjkrt d¡‚‚ d }~ww )Nrc   z%getrandom() syscall fails with ENOSYS)r   rµ  rD   rE   rÂ   r   ru  )r€  rJ   r   r   r   r    s   
€úzGetRandomTests.setUpClassc                 C   s*   t  d¡}|  |t¡ |  t|ƒd¡ d S r¬  )r   rµ  r-   rM   r=   r:   ©r0   r…   r   r   r   Útest_getrandom_type  s   
z"GetRandomTests.test_getrandom_typec                 C   s   t  d¡}|  |d¡ d S )Nr   r¥  )r   rµ  r=   )r0   Úemptyr   r   r   Útest_getrandom0  rP  zGetRandomTests.test_getrandom0c                 C   s   |   ttdƒ¡ d S )NÚGRND_RANDOM)r]   r   r   rW   r   r   r   Útest_getrandom_random"  rä  z$GetRandomTests.test_getrandom_randomc                 C   s*   z
t  dt j¡ W d S  ty   Y d S w ©Nrc   )r   rµ  ÚGRND_NONBLOCKÚBlockingIOErrorrW   r   r   r   Útest_getrandom_nonblock(  s
   þz&GetRandomTests.test_getrandom_nonblockc                 C   s$   t  d¡}t  d¡}|  ||¡ d S r¬  )r   rµ  r=  r®  r   r   r   Útest_getrandom_value0  r´  z#GetRandomTests.test_getrandom_valueN)
rP   rQ   rR   r•  r  r¸  rº  r¼  rÀ  rÁ  r   r   r   r   r¶    s    
r¶  ZHAVE_GETENTROPYrc   ZHAVE_GETRANDOMZHAVE_GETRANDOM_SYSCALLz*os.random() does not use a file descriptorr4   z$VxWorks can't set RLIMIT_NOFILE to 1c                   @   s0   e Zd Ze ed¡dd„ ƒZdd„ Zdd„ ZdS )	ÚURandomFDTestsz!test requires the resource modulec                 C   s   d}t d|ƒ d S )NaÌ  if 1:
            import errno
            import os
            import resource

            soft_limit, hard_limit = resource.getrlimit(resource.RLIMIT_NOFILE)
            resource.setrlimit(resource.RLIMIT_NOFILE, (1, hard_limit))
            try:
                os.urandom(16)
            except OSError as e:
                assert e.errno == errno.EMFILE, e.errno
            else:
                raise AssertionError("OSError not raised")
            r•   r   r—   r   r   r   Útest_urandom_failureB  s   z#URandomFDTests.test_urandom_failurec                 C   s   d}t d|ƒ\}}}d S )Na  if 1:
            import os
            import sys
            import test.support
            os.urandom(4)
            with test.support.SuppressCrashReport():
                os.closerange(3, 256)
            sys.stdout.buffer.write(os.urandom(4))
            ú-Scr   )r0   r˜   Úrcry  Úerrr   r   r   Útest_urandom_fd_closedY  s   	z%URandomFDTests.test_urandom_fd_closedc                 C   s–   |   tjtj¡ ttjdƒ djtjd}td|ƒ\}}}|  t|ƒd¡ |  	|dd… |dd… ¡ td|ƒ\}}}|  t|ƒd¡ |  	||¡ d S )Ns   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa­  if 1:
            import os
            import sys
            import test.support
            os.urandom(4)
            with test.support.SuppressCrashReport():
                for fd in range(3, 256):
                    try:
                        os.close(fd)
                    except OSError:
                        pass
                    else:
                        # Found the urandom fd (XXX hopefully)
                        break
                os.closerange(3, 256)
            with open({TESTFN!r}, 'rb') as f:
                new_fd = f.fileno()
                # Issue #26935: posix allows new_fd and fd to be equal but
                # some libc implementations have dup2 return an error in this
                # case.
                if new_fd != fd:
                    os.dup2(new_fd, fd)
                sys.stdout.buffer.write(os.urandom(4))
                sys.stdout.buffer.write(os.urandom(4))
            )rU   rÄ  rõ   r   rw   )
r„   r   rV   rU   r(   r°  r   r=   r:   r=  )r0   r˜   rÅ  ry  rÆ  Zout2Zerr2r   r   r   Útest_urandom_fd_reopenedg  s   èz'URandomFDTests.test_urandom_fd_reopenedN)	rP   rQ   rR   r   r   ÚresourcerÃ  rÇ  rÈ  r   r   r   r   rÂ  =  s
    

rÂ  c                 #   s~    g ‰ ‡ fdd„}‡ fdd„}z%t j}t j}t j}|t _|t _| dur&| t _ˆ V  W |t _|t _|t _dS |t _|t _|t _w )zË
    Stubs out execv and execve functions when used as context manager.
    Records exec calls. The mock execv and execve functions always raise an
    exception as they would normally never return.
    c                    s   ˆ   d| |f¡ tdƒ‚)NÚexecvzexecv called)r&  ÚRuntimeError©r   r‘   ©Úcallsr   r   Ú
mock_execv™  s   z#_execvpe_mockup.<locals>.mock_execvc                    s   ˆ   d| |f¡ ttjdƒ‚)NÚexecvezexecve called)r&  rD   rE   ÚENOTDIRrÌ  rÍ  r   r   Úmock_execve  s   z$_execvpe_mockup.<locals>.mock_execveN)r   rÊ  rÐ  r¼  )r¼  rÏ  rÒ  Z
orig_execvZorig_execveZorig_defpathr   rÍ  r   Ú_execvpe_mockupŽ  s&   €	
þrÓ  rÊ  zneed os.execv()c                   @   st   e Zd Ze ed¡dd„ ƒZdd„ Zdd„ Ze 	e
edƒd	¡d
d„ ƒZdd„ Zdd„ Ze 	ejdkd¡dd„ ƒZdS )Ú	ExecTestsz4avoid triggering a linuxthreads bug: see issue #4970c                 C   s   |   ttjddgd ¡ d S )Nzno such app-)rj   rD   r   ÚexecvperW   r   r   r   Útest_execvpe_with_bad_program²  s   ÿz'ExecTests.test_execvpe_with_bad_programc                 C   sN   |   ttjdd¡ |   ttjdg ¡ |   ttjdd¡ |   ttjddg¡ d S )NÚnotepadr   r·  r{  )rj   r»   r   rÊ  rW   r   r   r   Útest_execv_with_bad_arglist¸  s   z%ExecTests.test_execv_with_bad_arglistc                 C   sB   |   ttjdg d ¡ |   ttjdg i ¡ |   ttjddgi ¡ d S )Nr×  r{  )rj   r»   r   rÕ  rW   r   r   r   Útest_execvpe_with_bad_arglist¾  s   z'ExecTests.test_execvpe_with_bad_arglistÚ_execvpez)No internal os._execvpe function to test.c           
      C   sÌ  t jd }|tu rd}t j t  |¡|¡}|}g d¢}nd}g d¢}t j ||¡}t jdkr4t  |¡}n|}ddi}tƒ %}|  t	t j
||¡ |  t|ƒd	¡ |  |d
 d||ff¡ W d   ƒ n1 sew   Y  t|d(}| jtt j
|||d |  t|ƒd	¡ |  |d
 d|||ff¡ W d   ƒ n1 sšw   Y  tƒ :}| ¡ }	|tu r°||	d< n||	d< | jtt j
|||	d |  t|ƒd	¡ |  |d
 d|||	ff¡ W d   ƒ d S 1 sßw   Y  d S )NZabsolutepaths
   executable)s   prognameÚarg1Úarg2r–   )ZprognamerÛ  rÜ  rg  Zspamr‡   rc   r   rÊ  )r¼  r¶  rÐ  r¹  rµ  )r   r?   rM   r>   r@   rZ  r   rÓ  rj   rË  rÚ  r=   r:   rD   r¾  rý  )
r0   Z	test_typeZprogram_pathZprogramÚfullpathZnative_fullpathZ	argumentsr³  rÎ  Zenv_pathr   r   r   Ú_test_internal_execvpeÃ  sT   


ÿü
ÿ
ÿü	

ÿ
ÿ"÷z ExecTests._test_internal_execvpec                 C   s&   |   t¡ tjdkr|   t¡ d S d S )Nrg  )rÞ  r.   r   r   rM   rW   r   r   r   Útest_internal_execvpe_strô  s   

ÿz#ExecTests.test_internal_execvpe_strc                 C   sü   t jddg}tj ¡ }d|d< |  t¡ t |d ||¡ W d   ƒ n1 s(w   Y  tj ¡ }d|d< |  t¡ t |d ||¡ W d   ƒ n1 sOw   Y  tj ¡ }d|d	< |  t¡ t |d ||¡ W d   ƒ d S 1 sww   Y  d S )
Nr•   ÚpassÚcabbageúFRUIT VEGETABLEr   úorange VEGETABLE=cabbageÚFRUITÚlemonúFRUIT=ORANGE)r8   r–   r   r;  rý  rj   r»   rÐ  )r0   r‘   Únewenvr   r   r   Útest_execve_invalid_envù  s    
ÿ
ÿ
"ÿz!ExecTests.test_execve_invalid_envr”   zWin32-specific testc              
   C   sd   z
t  ddgi ¡ W n  ty* } z|  |jd u p|jdk¡ W Y d }~d S d }~ww |  d¡ d S )Nr{  Úargr   zNo OSError raised)r   rÐ  rD   r]   Úwinerrorr  r,  r   r   r   Útest_execve_with_empty_path  s   (€ÿz%ExecTests.test_execve_with_empty_pathN)rP   rQ   rR   r   ÚskipIfÚUSING_LINUXTHREADSrÖ  rØ  rÙ  r   r   r   rÞ  rß  rè  r8   r9   rë  r   r   r   r   rÔ  ¯  s    ÿ
ÿ
/rÔ  r”   r+  c                   @   sD   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 )ÚWin32ErrorTestsc              
   C   sz   zt  tj¡ W n* ty   d}Y d S  ty2 } zd}|  dtj|f ¡ W Y d }~d S d }~ww |  dtj ¡ d S )NFTz.file %s must not exist; os.stat failed with %szfile %s must not exist)r   r¨   r   rU   rC   rD   r  )r0   rè  rJ   r   r   r   rX     s   
ÿ€þzWin32ErrorTests.setUpc                 C   s   |   ttjtjtjd ¡ d S )Nz.bak)rj   rD   r   rq   r   rU   rW   r   r   r   rt   '  s   zWin32ErrorTests.test_renamec                 C   ó   |   ttjtj¡ d S r+   )rj   rD   r   r'  r   rU   rW   r   r   r   Útest_remove*  r!   zWin32ErrorTests.test_removec                 C   rï  r+   )rj   rD   r   rB   r   rU   rW   r   r   r   Ú
test_chdir-  r!   zWin32ErrorTests.test_chdirc                 C   sT   |   tjtj¡ ttjdƒ}|  ttjtj¡ W d   ƒ d S 1 s#w   Y  d S )Nrí   )	r„   r   rV   rU   r$   rj   rD   r   rA   r`   r   r   r   Ú
test_mkdir0  s   "ÿzWin32ErrorTests.test_mkdirc                 C   s   |   ttjtjd ¡ d S r+   )rj   rD   r   rX  r   rU   rW   r   r   r   r]  6  ó   zWin32ErrorTests.test_utimec                 C   s   |   ttjtjd¡ d S rn   )rj   rD   r   r  r   rU   rW   r   r   r   Ú
test_chmod9  ró  zWin32ErrorTests.test_chmodN)
rP   rQ   rR   rX   rt   rð  rñ  rò  r]  rô  r   r   r   r   rî    s    rî  c                   @   sÖ  e Zd Zg d¢Zdd„ ZeD ]Zeeƒeƒ de < qdd„ Zdd„ Ze	 
eed	ƒd
¡dd„ ƒZe	 
eedƒd¡dd„ ƒZe	 
eedƒd¡dd„ ƒZe	 
eedƒd¡dd„ ƒZe	 
eedƒd¡dd„ ƒZe	 
eedƒd¡dd„ ƒZe	 
eedƒd ¡d!d"„ ƒZe	 
eed#ƒd$¡d%d&„ ƒZe	 
eed'ƒd(¡d)d*„ ƒZe	 
eed+ƒd,¡d-d.„ ƒZe	 
eed/ƒd0¡d1d2„ ƒZe	 
eed3ƒd4¡d5d6„ ƒZe	 
eed7ƒd8¡d9d:„ ƒZe	 
eed;ƒd<¡d=d>„ ƒZd?d@„ Ze	 
eedAƒdB¡dCdD„ ƒZdES )FÚTestInvalidFD)Úfchdirrg   Ú	fdatasyncrS  ÚfstatvfsÚfsyncÚ	tcgetpgrpÚttynamec                    s   ‡ fdd„}|S )Nc                    s"   t tˆ ƒr|  ttˆ ƒ¡ d S d S r+   )r   r   rÉ  r   rW   ©ra   r   r   ÚhelperC  s   
ÿz(TestInvalidFD.get_single.<locals>.helperr   )ra   rý  r   rü  r   Ú
get_singleB  s   zTestInvalidFD.get_singleZtest_c              
   O   sh   z|t  ¡ g|¢R i |¤Ž W n ty* } z|  |jtj¡ W Y d }~d S d }~ww |  d| ¡ d S )Nz5%r didn't raise an OSError with a bad file descriptor)r   Úmake_bad_fdrD   r=   rE   r/  r  )r0   ra   r‘   r  rÊ   r   r   r   rÉ  J  s   €ÿ
ÿzTestInvalidFD.checkc                 C   s   | j tjdd d S )Nr›   r¥   )rÉ  r   r   rW   r   r   r   r¢   S  rä  zTestInvalidFD.test_fdopenÚisattyztest needs os.isatty()c                 C   s   |   t t ¡ ¡d¡ d S ©NF)r=   r   r   r   rÿ  rW   r   r   r   Útest_isattyV  s   zTestInvalidFD.test_isattyri   ztest needs os.closerange()c              	   C   sn   t  ¡ }tdƒD ]}z	t || ¡ W n	 ty   Y qw  |dk r't d¡‚|  t 	||| d ¡d ¡ d S )Nrd   re   z5Unable to acquire a range of invalid file descriptorsrc   )
r   rÿ  rÄ   r   rS  rD   r   ru  r=   ri   )r0   r~   rÉ   r   r   r   rm   Z  s   ÿÿ zTestInvalidFD.test_closerangeÚdup2ztest needs os.dup2()c                 C   ó   |   tjd¡ d S )Né   )rÉ  r   r  rW   r   r   r   Ú	test_dup2j  rZ  zTestInvalidFD.test_dup2c              
   C   sÀ   t  tt j¡}|  t j|¡ |ddg}tj|ddD ]C\}}||kr]| j||d, |  	t
¡}t  ||¡ W d   ƒ n1 s@w   Y  |  |jjtj¡ W d   ƒ n1 sXw   Y  qd S )Nr   i   €re   rF  )r~   Úfd2)r   r$   r¯   rœ   r„   r\   rH  rI  ÚsubTestrj   rD   r  r=   r.  rE   r/  )r0   Zvalid_fdÚfdsr~   r  r1  r   r   r   Útest_dup2_negative_fdn  s    ýÿý€þz#TestInvalidFD.test_dup2_negative_fdÚfchmodztest needs os.fchmod()c                 C   r  rn   )rÉ  r   r  rW   r   r   r   Útest_fchmod~  rZ  zTestInvalidFD.test_fchmodÚfchownztest needs os.fchown()c                 C   ó   |   tjdd¡ d S )Nr   )rÉ  r   r  rW   r   r   r   Útest_fchown‚  ó   zTestInvalidFD.test_fchownÚ	fpathconfztest needs os.fpathconf()c                 C   ó    |   tjd¡ |   tjd¡ d S )NÚPC_NAME_MAX)rÉ  r   Úpathconfr  rW   r   r   r   Útest_fpathconf†  ó   zTestInvalidFD.test_fpathconfÚ	ftruncateztest needs os.ftruncate()c                 C   r  rn   )rÉ  r   Útruncater  rW   r   r   r   Útest_ftruncate‹  r  zTestInvalidFD.test_ftruncaterz   ztest needs os.lseek()c                 C   r  rn   )rÉ  r   rz   rW   r   r   r   Ú
test_lseek  r  zTestInvalidFD.test_lseekr{   ztest needs os.read()c                 C   r  r½  )rÉ  r   r{   rW   r   r   r   r€   ”  rZ  zTestInvalidFD.test_readÚreadvztest needs os.readv()c                 C   s   t dƒ}|  tj|g¡ d S )Nrd   )r‰   rÉ  r   r  )r0   r  r   r   r   Ú
test_readv˜  s   zTestInvalidFD.test_readvÚ	tcsetpgrpztest needs os.tcsetpgrp()c                 C   r  rn   )rÉ  r   r  rW   r   r   r   Útest_tcsetpgrpt  rZ  zTestInvalidFD.test_tcsetpgrptr%   ztest needs os.write()c                 C   r  )Nó    )rÉ  r   r%   rW   r   r   r   rŒ   ¡  rZ  zTestInvalidFD.test_writeÚwritevztest needs os.writev()c                 C   s   |   tjdg¡ d S )Nrº  )rÉ  r   r   rW   r   r   r   Útest_writev¥  r  zTestInvalidFD.test_writevc                 C   ó   |   tj¡ |   tjd¡ d S ©NT)rÉ  r   Úget_inheritableÚset_inheritablerW   r   r   r   Útest_inheritable©  ó   zTestInvalidFD.test_inheritableÚget_blockingú-needs os.get_blocking() and os.set_blocking()c                 C   r"  r#  )rÉ  r   r(  Úset_blockingrW   r   r   r   Útest_blocking­  s   zTestInvalidFD.test_blockingN)rP   rQ   rR   Zsinglesrþ  ra   ÚlocalsrÉ  r¢   r   r   r   r   r  rm   r  r
  r  r  r  r  r  r€   r  r  rŒ   r!  r&  r+  r   r   r   r   rõ  =  sP    	













ÿrõ  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú	LinkTestsc                 C   s    t j| _tj t jd ¡| _d S )Nrð  )r   rU   Úfile1r   r>   r@   Úfile2rW   r   r   r   rX   µ  ó   zLinkTests.setUpc                 C   s,   | j | jfD ]}tj |¡rt |¡ qd S r+   )r.  r/  r   r>   rè  rV   )r0   Úfiler   r   r   rå   ¹  s
   
€þzLinkTests.tearDownc              
   C   sÒ   t |ƒ zt ||¡ W n ty% } z|  d| ¡ W Y d }~nd }~ww t|dƒ4}t|dƒ}|  tj | 	¡ | 	¡ ¡¡ W d   ƒ n1 sJw   Y  W d   ƒ d S W d   ƒ d S 1 sbw   Y  d S )Núos.link(): %srƒ   )
r(   r   r  r  rh   r$   r]   r>   Úsameopenfilery   )r0   r.  r/  rÊ   rC  Úf2r   r   r   Ú
_test_link¾  s   €ÿPÿzLinkTests._test_linkc                 C   s   |   | j| j¡ d S r+   )r5  r.  r/  rW   r   r   r   Ú	test_linkÈ  rä  zLinkTests.test_linkc                 C   s(   |   t| jt ¡ ƒt| jt ¡ ƒ¡ d S r+   )r5  rM   r.  r8   r  r/  rW   r   r   r   Útest_link_bytesË  s   ÿzLinkTests.test_link_bytesc                 C   sV   zt  d¡ W n ty   t d¡‚w |  jd7  _| jd | _|  | j| j¡ d S )Nõ   Ã±z#Unable to encode for this platform.rð  )r   rZ  ÚUnicodeErrorr   ru  r.  r/  r5  rW   r   r   r   Útest_unicode_nameÏ  s   
ÿzLinkTests.test_unicode_nameN)	rP   rQ   rR   rX   rå   r5  r6  r7  r:  r   r   r   r   r-  ´  s    
r-  zPosix specific testsc                   @   sä   e Zd ZdZdZe eedƒd¡dd„ ƒZ	e eedƒd¡dd	„ ƒZ
e eed
ƒd¡dd„ ƒZe eedƒd¡dd„ ƒZe eedƒd¡dd„ ƒZe eedƒd¡dd„ ƒZe eedƒd¡dd„ ƒZe eedƒd¡dd„ ƒZdS )ÚPosixUidGidTestsì        Úsetuidztest needs os.setuid()c                 C   sB   t  ¡ dkr|  tt jd¡ |  tt jd¡ |  tt j| j¡ d S ©Nr   z
not an int)r   Úgetuidrj   rD   r=  rp   ÚOverflowErrorÚUID_OVERFLOWrW   r   r   r   Útest_setuidß  ó   zPosixUidGidTests.test_setuidÚsetgidztest needs os.setgid()c                 C   óF   t  ¡ dkrts|  tt jd¡ |  tt jd¡ |  tt j| j¡ d S r>  )	r   r?  ÚHAVE_WHEEL_GROUPrj   rD   rD  rp   r@  ÚGID_OVERFLOWrW   r   r   r   Útest_setgidæ  ó   zPosixUidGidTests.test_setgidÚseteuidztest needs os.seteuid()c                 C   sB   t  ¡ dkr|  tt jd¡ |  tt jd¡ |  tt j| j¡ d S r>  )	r   r?  rj   rD   rJ  rp   Úsetegidr@  rA  rW   r   r   r   Útest_seteuidí  rC  zPosixUidGidTests.test_seteuidrK  ztest needs os.setegid()c                 C   rE  r>  )	r   r?  rF  rj   rD   rK  rp   r@  rG  rW   r   r   r   Útest_setegidô  rI  zPosixUidGidTests.test_setegidÚsetreuidztest needs os.setreuid()c                 C   sn   t  ¡ dkr|  tt jdd¡ |  tt jdd¡ |  tt jdd¡ |  tt j| jd¡ |  tt jd| j¡ d S r>  )r   r?  rj   rD   rN  rp   r@  rA  rW   r   r   r   Útest_setreuidû  s   zPosixUidGidTests.test_setreuidc                 C   ó   t  tjddg¡ d S )Nr•   z,import os,sys;os.setreuid(-1,-1);sys.exit(0)©r   r<  r8   r–   rW   r   r   r   Útest_setreuid_neg1	  ó   
þz#PosixUidGidTests.test_setreuid_neg1Úsetregidztest needs os.setregid()c                 C   sr   t  ¡ dkrts|  tt jdd¡ |  tt jdd¡ |  tt jdd¡ |  tt j| jd¡ |  tt jd| j¡ d S r>  )	r   r?  rF  rj   rD   rT  rp   r@  rG  rW   r   r   r   Útest_setregid	  s   zPosixUidGidTests.test_setregidc                 C   rP  )Nr•   z,import os,sys;os.setregid(-1,-1);sys.exit(0)rQ  rW   r   r   r   Útest_setregid_neg1	  rS  z#PosixUidGidTests.test_setregid_neg1N)rP   rQ   rR   rA  rG  r   r   r   r   rB  rH  rL  rM  rO  rR  rU  rV  r   r   r   r   r;  Ù  s&    






r;  c                   @   sN   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Ze e	e
d	ƒd
¡dd„ ƒZdd„ ZdS )ÚPep383Testsc                    sö   t jrt j| _nt jrt j| _nt j| _t | j¡| _g ‰ ‡ fdd„}|t jƒ t jr0|t jƒ t jr8|t jƒ ˆ s?|  	d¡ t
ƒ | _t | j¡ z'ˆ D ]!}t  tj | j|¡¡ t |¡}|| jv rgtdƒ‚| j |¡ qLW d S    t | j¡ ‚ )Nc                    s2   zt  | ¡} W n
 ty   Y d S w ˆ  | ¡ d S r+   )r   rZ  r  r&  )Úfn©Úbytesfnr   r   Úadd_filename)	  s   ÿz'Pep383Tests.setUp.<locals>.add_filenamez&couldn't create any non-ascii filenamezduplicate filename)r   ÚTESTFN_UNENCODABLErý   ZTESTFN_NONASCIIrU   r   rZ  ZbdirZTESTFN_UNICODErh   rJ  Ú	unicodefnrA   Zcreate_empty_filer>   r@   rN   r»   ÚaddÚshutilrD  )r0   r[  rX  r   rY  r   rX   	  s8   







ûzPep383Tests.setUpc                 C   s   t  | j¡ d S r+   )r_  rD  rý   rW   r   r   r   rå   D	  r  zPep383Tests.tearDownc              	   C   st   | j }tt | j¡ƒ}|  ||¡ t ¡ }zt tj¡ |  tt ¡ ƒtt tj¡ƒ¡ W t |¡ d S t |¡ w r+   )	r]  rJ  r   r  rý   r=   r,   rB   r?   )r0   rI   ÚfoundZcurrent_directoryr   r   r   Útest_listdirG	  s   "zPep383Tests.test_listdirc                 C   s.   | j D ]}ttj | j|¡dƒ}| ¡  qd S ©Nrƒ   )r]  r$   r   r>   r@   rý   r\   )r0   rX  ra   r   r   r   Ú	test_openS	  s   

þzPep383Tests.test_openr  r)  c                 C   s*   | j D ]}tj | j|¡}t |¡ qd S r+   )r]  r   r>   r@   rý   r  )r0   rX  Úfullnamer   r   r   Útest_statvfsX	  s   
ýzPep383Tests.test_statvfsc                 C   s&   | j D ]}t tj | j|¡¡ qd S r+   )r]  r   r¨   r>   r@   rý   )r0   rX  r   r   r   Ú	test_stata	  s   
ÿzPep383Tests.test_statN)rP   rQ   rR   rX   rå   ra  rc  r   r   r   r   re  rf  r   r   r   r   rW  	  s    %ÿ
rW  c                   @   sF   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Ze d	¡d
d„ ƒZ	dd„ Z
dS )ÚWin32KillTestsc                 C   s€  dd l }ddl m} dd l}|jjj}|j|_|j| 	|j
¡|j| 	|j¡| 	|j¡| 	|j¡f|_d}tjtjdd |¡gtjtjtjd}|  |jj¡ |  |jj¡ |  |jj¡ d\}}	||	k rª| ¡ d u rª| t|ƒ¡}
|| |j ¡ ¡|
| |
¡d d d ƒ}|  |dd¡ |
jr—|   ||
j !¡ ¡ nt" #d	¡ |d
7 }||	k rª| ¡ d u sj|  $d¡ t% &|j'|¡ |   | (¡ |¡ d S )Nr   ©ÚwintypesÚrunningr•   z<import sys;sys.stdout.write('{}');sys.stdout.flush();input())rÊ  ÚstderrÚstdin©r   r    zPeekNamedPipe failedçš™™™™™¹?rc   z1Did not receive communication from the subprocess))r}  ri  Úmsvcrtr~  r  ÚPeekNamedPipeÚBOOLÚrestypeÚHANDLEÚPOINTERZc_charÚDWORDÚargtypesr   ÚPopenr8   r–   r°  rÏ  r„   rÊ  r\   rk  rl  ÚpollZcreate_string_bufferr:   Zget_osfhandlery   Zsizeofr=  r&  r=   rÇ  rq  Úsleepr  r   ÚkillÚpidÚwait)r0   Úsigr}  ri  ro  rp  rp  rÒ  r±  Úmaxr  Zrsltr   r   r   Ú_killg	  sP   




û
üùÿ
ô
zWin32KillTests._killc                 C   rà  r+   )r  ÚsignalÚSIGTERMrW   r   r   r   Útest_kill_sigterm	  ru  z Win32KillTests.test_kill_sigtermc                 C   s   |   d¡ d S )Nr    )r  rW   r   r   r   Útest_kill_int¡	  s   zWin32KillTests.test_kill_intc                 C   sþ   dt  ¡  }t dd|¡}d|d< tjtjtj 	tj 
t¡d¡|gtjd}d\}}||k rN| ¡ d u rN|d dkr;n t d¡ |d7 }||k rN| ¡ d u s4t |jtj¡ |  d	¡ t |j|¡ t d
¡ | ¡ s}t |jtj¡ |  d |¡¡ d S d S )Nz
test_os_%sr   rc   r   zwin_console_handler.pyr:  rm  rn  z'Subprocess didn't finish initializationg      à?zsubprocess did not stop on {})ÚuuidZuuid1Úmmapr   rw  r8   r–   r   r>   r@   rH   r¯   ZCREATE_NEW_PROCESS_GROUPrx  rq  ry  rz  r{  r€  ÚSIGINTr  r°  )r0   Úeventr   ZtagnameÚmrÒ  r±  r~  r   r   r   Ú_kill_with_event¥	  s4   ÿþý
ü

ýzWin32KillTests._kill_with_eventz.subprocesses aren't inheriting Ctrl+C propertyc                 C   sd   ddl m} dd l }| |j¡ƒ }|jjj}| |j¡|jf|_|j|_	||dƒ |  
tjd¡ d S )Nr   rh  ÚCTRL_C_EVENT)r}  ri  rt  Zc_intr~  r  ÚSetConsoleCtrlHandlerrq  rv  rr  r‰  r€  rŠ  )r0   ri  r}  ZNULLr‹  r   r   r   Útest_CTRL_C_EVENTÂ	  s   

ÿ
z Win32KillTests.test_CTRL_C_EVENTc                 C   r  )NÚCTRL_BREAK_EVENT)r‰  r€  r  rW   r   r   r   Útest_CTRL_BREAK_EVENTÕ	  ó   z$Win32KillTests.test_CTRL_BREAK_EVENTN)rP   rQ   rR   r  r‚  rƒ  r‰  r   ÚskiprŒ  rŽ  r   r   r   r   rg  e	  s    6
rg  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚWin32ListdirTestszTest listdir on Windows.c              	   C   s¨   g | _ tdƒD ]E}d| }tj tj|¡}d| }tj tj|¡}t |¡ t|ddd}| 	d| ¡ W d   ƒ n1 s?w   Y  | j  
||g¡ q| j  ¡  d S )Nre   zSUB%dzFILE%dr0  r›   r¥   z'I'm %s and proud of it. Blame test_os.
)Úcreated_pathsrÄ   r   r>   r@   r   rU   r  r$   r%   Úextendr"  )r0   rÉ   Zdir_nameZdir_pathÚ	file_nameZ	file_pathra   r   r   r   rX   Ý	  s   
ÿzWin32ListdirTests.setUpc                 C   rb  r+   )r_  rD  r   rU   rW   r   r   r   rå   ê	  r  zWin32ListdirTests.tearDownc                 C   sH   |   tt tj¡ƒ| j¡ |   tt t tj¡¡ƒdd„ | jD ƒ¡ dS )z-Test when the path is not an "extended" path.c                 S   ó   g | ]}t  |¡‘qS r   ©r   rZ  ©r   r>   r   r   r   r   ÷	  r2  zCWin32ListdirTests.test_listdir_no_extended_path.<locals>.<listcomp>N)r=   Úsortedr   r  r   rU   r’  rZ  rW   r   r   r   Útest_listdir_no_extended_pathí	  s   þþz/Win32ListdirTests.test_listdir_no_extended_pathc                 C   sh   dt j tj¡ }|  tt  |¡ƒ| j¡ dt  	t j tj¡¡ }|  tt  |¡ƒdd„ | jD ƒ¡ dS )z&Test when the path starts with '\\?\'.ú\\?\ó   \\?\c                 S   r•  r   r–  r—  r   r   r   r   
  r2  z@Win32ListdirTests.test_listdir_extended_path.<locals>.<listcomp>N)
r   r>   r|  r   rU   r=   r˜  r  r’  rZ  r|  r   r   r   Útest_listdir_extended_pathù	  s   þþz,Win32ListdirTests.test_listdir_extended_pathN)rP   rQ   rR   r  rX   rå   r™  rœ  r   r   r   r   r‘  Ù	  s    r‘  Úreadlinkzneeds os.readlink()c                   @   sz   e Zd ZdZej e¡Ze 	e¡Z
e 	e¡Zdd„ Zdd„ Zdd„ Zdd	„ Zejd
d„ ƒZejdd„ ƒZejdd„ ƒZdS )ÚReadlinkTestsZreadlinktestc                 C   sb   t j |¡}t j |¡}tjdkr)dd„ }||ƒr|dd … }||ƒr)|dd … }|  ||¡ d S )Nr”   c                 S   s   |   t| tƒr
d¡S d¡S )Nr›  rš  )Ú
startswithr#  rM   )r  r   r   r   rÜ   
  s
    ÿÿz/ReadlinkTests.assertPathEqual.<locals>.<lambda>rw   )r   r>   Únormcaser8   r9   r=   )r0   ÚleftÚrightZ
has_prefixr   r   r   ÚassertPathEqual
  s   
zReadlinkTests.assertPathEqualc                 C   sT   |   tj | j¡¡ |   tj | j¡¡ |  tj | j¡¡ |  tj | j¡¡ d S r+   )	r]   r   r>   rè  Úfilelink_targetÚfilelinkb_targetr›  ÚfilelinkÚ	filelinkbrW   r   r   r   rX   
  s   zReadlinkTests.setUpc                 C   s0   t | jƒ}|  ttj| j¡ |  ttj|¡ d S r+   )r   r¤  rj   rD   r   r  )r0   r¤  r   r   r   Útest_not_symlink$
  s   
zReadlinkTests.test_not_symlinkc                 C   s(   |   ttjd¡ |   ttjtdƒ¡ d S )Nzmissing-link)rj   rC   r   r  r   rW   r   r   r   Útest_missing_link)
  s   
ÿzReadlinkTests.test_missing_linkc                 C   sB   t  | j| j¡ |  tj| j¡ t| jƒ}|  t  	|¡| j¡ d S r+   )
r   r±   r¤  r¦  r„   r   rV   r   r£  r  )r0   r¦  r   r   r   Útest_pathlike.
  s   
zReadlinkTests.test_pathlikec                 C   sN   t  | j| j¡ |  tj| j¡ t  t| jƒ¡}|  	|| j¡ |  
|t¡ d S r+   )r   r±   r¥  r§  r„   r   rV   r  r   r£  r-   rM   r|  r   r   r   Útest_pathlike_bytes5
  s
   z!ReadlinkTests.test_pathlike_bytesc                 C   sJ   t  | j| j¡ |  tj| j¡ t  | j¡}|  || j¡ |  	|t
¡ d S r+   )r   r±   r¥  r§  r„   r   rV   r  r£  r-   rM   r|  r   r   r   Ú
test_bytes=
  s
   zReadlinkTests.test_bytesN)rP   rQ   rR   r¦  r   r>   r|  r¯   r¤  rZ  r§  r¥  r£  rX   r¨  r©  r   Úskip_unless_symlinkrª  r«  r¬  r   r   r   r   rž  	
  s    



rž  c                   @   s¸   e Zd ZdZej e¡ZdZ	ej 
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d„ Zdd„ Ze ej d¡oKej d¡d¡dd„ ƒZdd„ Zdd „ Zd!S )"ÚWin32SymlinkTestsZfilelinktestZdirlinktestzmissing linkc                 C   s^   t j | j¡s	J ‚t j | j¡sJ ‚t j | j¡rJ ‚t j | j¡r$J ‚t j | j¡r-J ‚d S r+   )r   r>   rè  Údirlink_targetr¤  Údirlinkr¦  Úmissing_linkrW   r   r   r   rX   O
  s
   zWin32SymlinkTests.setUpc                 C   sV   t j | j¡rt  | j¡ t j | j¡rt  | j¡ t j | j¡r)t  | j¡ d S d S r+   )	r   r>   rè  r¦  r'  r°  r7  rT   r±  rW   r   r   r   rå   V
  s   ÿzWin32SymlinkTests.tearDownc                 C   ó`   t  | j| j¡ |  t j | j¡¡ |  t j | j¡¡ |  t j | j¡¡ |  	| j| j¡ d S r+   )
r   r±   r¯  r°  r]   r>   rè  rh  ÚislinkÚ
check_statrW   r   r   r   Útest_directory_link^
  ó
   z%Win32SymlinkTests.test_directory_linkc                 C   r²  r+   )
r   r±   r¤  r¦  r]   r>   rè  Úisfiler³  r´  rW   r   r   r   Útest_file_linke
  r¶  z Win32SymlinkTests.test_file_linkc                 C   sF   | j }tj |¡rt |¡ d}tj |¡rJ ‚d}t |||¡ dS )z2Create a "directory" link to a non-existent targetz"c:\\target does not exist.29r3c740TN)r±  r   r>   rT   r'  rè  r±   )r0   Zlinknamer²   Ztarget_is_dirr   r   r   Ú_create_missing_dir_linkl
  s   
z*Win32SymlinkTests._create_missing_dir_linkc                 C   ó   |   ¡  t | j¡ d S r+   )r¹  r   r'  r±  rW   r   r   r   Ú,test_remove_directory_link_to_missing_targetv
  s   z>Win32SymlinkTests.test_remove_directory_link_to_missing_targetc                 C   s    |   ¡  |  tj | j¡¡ d S r+   )r¹  r›  r   r>   rh  r±  rW   r   r   r   Ú.test_isdir_on_directory_link_to_missing_target}
  r0  z@Win32SymlinkTests.test_isdir_on_directory_link_to_missing_targetc                 C   rº  r+   )r¹  r   r7  r±  rW   r   r   r   Ú.test_rmdir_on_directory_link_to_missing_target
  r3   z@Win32SymlinkTests.test_rmdir_on_directory_link_to_missing_targetc                 C   sn   |   t |¡t |¡¡ |  t |¡t |¡¡ t |¡}|   t |¡t |¡¡ |  t |¡t |¡¡ d S r+   )r=   r   r¨   r=  rt  rZ  )r0   r  r²   Z
bytes_linkr   r   r   r´  …
  s
   
zWin32SymlinkTests.check_statc              	   C   sH  t j tj¡}t j |d¡}t j |d¡}|  tj|¡ t  |¡ t  |¡ t  |¡ t j t j |d¡¡}t	|ƒ t  
¡ }z_t  |¡ t j |d¡}t  t j |¡d¡ |  dt  t  
¡ ¡¡ |  t  |¡t  d¡¡ t  |¡ |  t  |¡t  t j |¡¡¡ t  |¡ |  t  |¡t  t j |¡¡¡ W t  |¡ d S t  |¡ w )NÚlevel2Úlevel3r.  r  )r   r>   r|  r   rU   r@   r„   rD  rA   r(   r,   rB   r±   ÚrelpathrÃ   r  r=   r¨   )r0   Zlevel1r¾  r¿  r.  Zorig_dirr  r   r   r   Ú
test_12084
  s2   




ÿ
ÿzWin32SymlinkTests.test_12084úC:\Users\All UsersúC:\ProgramDatazTest directories not foundc                 C   s"   t  d¡}|  t j |d¡¡ d S )NrÂ  rÃ  )r   r  r]   r>   Úsamefile)r0   r²   r   r   r   Ú
test_29248°
  s   
zWin32SymlinkTests.test_29248c              	   C   sè   d}t jj|gd Ž }d| |f||f|d d… |d d… fg}|D ]O\}}zt  ||¡ W n	 ty7   Y nw zt  |¡ W n	 tyH   Y nw zt  t  |¡t  |¡¡ W n	 ty`   Y q"w zt  |¡ W q" tyq   Y q"w d S )NZXXXXXXXXXXXXXXXXXXXXXXXXXXXrd   rz  é´   )r   r>   r@   r±   rC   r'  rD   rZ  )r0   Zsegmentr>   Z
test_casesr³   Údestr   r   r   Útest_buffer_overflow¿
  s8   
úÿÿÿÿîz&Win32SymlinkTests.test_buffer_overflowc                    s²   t j d¡‰ t j ˆ ¡s|  d¡ ‡ fdd„t t  ˆ ¡d¡D ƒ}|D ].}tj	r0t
ƒ  t
d|ƒ t  |¡}|  |t  |¡¡ |  t |j¡¡ |  |jtj¡  d S |  d¡ d S )Nz$%LOCALAPPDATA%\Microsoft\WindowsAppsz%test requires a WindowsApps directoryc                    s   g | ]	}t j ˆ |¡‘qS r   )r   r>   r@   ©r   r7   ©r€  r   r   r   ç
  s    ÿz6Win32SymlinkTests.test_appexeclink.<locals>.<listcomp>z*.exezTesting withz$test requires an app execution alias)r   r>   Ú
expandvarsrh  rh   ÚfnmatchÚfilterr  r   rF   rG   rt  r=   r¨   r›  ÚS_ISLNKr  Úst_reparse_tagZIO_REPARSE_TAG_APPEXECLINK)r0   ÚaliasesÚaliasrH  r   rÊ  r   Útest_appexeclinkâ
  s    

ÿ

z"Win32SymlinkTests.test_appexeclinkN)rP   rQ   rR   r¦  r   r>   r|  r¯   r¤  r°  rH   r¯  r±  rX   rå   rµ  r¸  r¹  r»  r¼  r½  r´  rÁ  r   r   rT   rè  rÅ  rÈ  rÒ  r   r   r   r   r®  F
  s.    
#
þ
#r®  c                   @   sD   e Zd ZdZej ej e¡¡Z	dd„ Z
dd„ Zdd„ Zdd	„ Zd
S )ÚWin32JunctionTestsZjunctiontestc                 C   s(   t j | j¡s	J ‚t j | j¡rJ ‚d S r+   )r   r>   rè  Újunction_targetrT   ÚjunctionrW   r   r   r   rX   ü
  ó   zWin32JunctionTests.setUpc                 C   s"   t j | j¡rt  | j¡ d S d S r+   )r   r>   rT   rÕ  rV   rW   r   r   r   rå      rY   zWin32JunctionTests.tearDownc                 C   sÆ   t  | j| j¡ |  tj | j¡¡ |  tj | j¡¡ |  tj 	| j¡¡ |  
t | j¡t | j¡¡ |  t | j¡t | j¡¡ |  tj | j¡¡ |  tj d| j ¡tj t | j¡¡¡ d S )Nrš  )Ú_winapiÚCreateJunctionrÔ  rÕ  r]   r   r>   rT   rè  rh  r=  r¨   rt  r=   r›  r³  r   r  rW   r   r   r   Útest_create_junction  s   ÿz'Win32JunctionTests.test_create_junctionc                 C   s\   t  | j| j¡ |  tj | j¡¡ |  tj | j¡¡ t 	| j¡ |  
tj | j¡¡ d S r+   )r×  rØ  rÔ  rÕ  r]   r   r>   rè  rT   rV   r›  rW   r   r   r   Útest_unlink_removes_junction  s
   z/Win32JunctionTests.test_unlink_removes_junctionN)rP   rQ   rR   rÕ  r   r>   rH   r|  r¯   rÔ  rX   rå   rÙ  rÚ  r   r   r   r   rÓ  ÷
  s    rÓ  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚWin32NtTestsc              
   C   s*  t  d¡}t  d¡}dd l}|jddd}|jj|j_|jj|j	_|jj|jj
f|j	_| ¡ }|j ¡ }| 	|| |¡¡}|  d|¡ |j}dd	d
tg}tdƒD ](}	|D ]#}
z| |
¡ W n	 tyf   Y nw zt |
¡ W qT tyw   Y qTw qP| 	|| |¡¡}|  d|¡ |j| }|  d|¡ d S )Nrg  r}  r   zKernel32.dllT)Zuse_last_errorrc   z\\?\C:z\\?\NULz	\\?\CONINrd   )r   Úimport_moduleZctypes.wintypesZWinDLLri  rs  ZGetCurrentProcessrr  rq  ZGetProcessHandleCountZLPDWORDrv  ru  Zbyrefr=   r&  r¯   rÄ   Z_getfinalpathnameÚ	Exceptionr   r¨   )r0   rg  r}  ZkernelZhprocZhandle_countr‚  Zbefore_countÚ	filenamesÚ_r   Zhandle_deltar   r   r   Útest_getfinalpathname_handles  sH   

ÿ
üþÿø
z*Win32NtTests.test_getfinalpathname_handlesc                 C   s   t j}|  t j|¡ t ¡ d }t d¡}t t	j
d||t|ƒg¡T}t ¡ |k rPzt |¡ W n tyI } z|jdks?J ‚W Y d }~nd }~ww t ¡ |k s)z| d¡ W n tjye   | ¡  Y n	w W d   ƒ d S W d   ƒ d S 1 syw   Y  d S )NrÀ   aÞ              import os
            import sys
            import time

            filename = sys.argv[1]
            deadline = float(sys.argv[2])

            while time.time() < deadline:
                try:
                    with open(filename, "w") as f:
                        pass
                except OSError:
                    pass
                try:
                    os.remove(filename)
                except OSError:
                    pass
            r•   re   rc   )r   rU   r„   rV   rq  ÚtextwrapÚdedentr   rw  r8   r–   r.   r   r¨   rC   rê  r|  ÚTimeoutExpiredÚ	terminate)r0   r&   ÚdeadlineZcommandrÒ  rÊ   r   r   r   Útest_stat_unlink_raceK  s,   
€ÿýÿÿù	"÷z"Win32NtTests.test_stat_unlink_raceN)rP   rQ   rR   rá  rç  r   r   r   r   rÜ    s    0rÜ  c                   @   r)   )ÚNonLocalSymlinkTestsc                 C   s   t  d¡ dS )zM
        Create this structure:

        base
         \___ some_dir
        zbase/some_dirN)r   r  rW   r   r   r   rX   x  s   zNonLocalSymlinkTests.setUpc                 C   s   t  d¡ d S )Nr>  )r_  rD  rW   r   r   r   rå     s   zNonLocalSymlinkTests.tearDownc                 C   s.   t j dd¡}t  d|¡ t j |¡sJ ‚dS )a¹  
        The symlink target should resolve relative to the link, not relative
        to the current directory.

        Then, link base/some_link -> base/some_dir and ensure that some_link
        is resolved as a directory.

        In issue13772, it was discovered that directory detection failed if
        the symlink target was not specified relative to the current
        directory, which was a defect in the implementation.
        r>  Z	some_linkZsome_dirN)r   r>   r@   r±   rh  )r0   r³   r   r   r   Útest_directory_link_nonlocal„  s   z1NonLocalSymlinkTests.test_directory_link_nonlocalN)rP   rQ   rR   rX   rå   ré  r   r   r   r   rè  u  s    	rè  c                   @   rÛ  )ÚFSEncodingTestsc                 C   s(   |   t d¡d¡ |   t d¡d¡ d S )Ns   abcÿu   abcÅ)r=   r   rZ  rN   rW   r   r   r   Útest_nop–  rÖ  zFSEncodingTests.test_nopc              	   C   sB   dD ]}zt  |¡}W n	 ty   Y qw |  t  |¡|¡ qd S )N)u	   unicodeÅu   latinÃ©Úascii)r   rZ  r  r=   rN   )r0   rX  rZ  r   r   r   Útest_identityš  s   ÿûzFSEncodingTests.test_identityN)rP   rQ   rR   rë  rí  r   r   r   r   rê  •  s    rê  c                   @   sV   e Zd Zdd„ Ze e d¡o"eƒ  o"e	j
 d¡p"eedƒo"eedƒd¡dd	„ ƒZd
S )ÚDeviceEncodingTestsc                 C   s   |   t d¡¡ d S )Ni@â )r‡  r   Údevice_encodingrW   r   r   r   Útest_bad_fd§  r  zDeviceEncodingTests.test_bad_fdr   ÚwinÚnl_langinfoÚCODESETz>test requires a tty and either Windows or nl_langinfo(CODESET)c                 C   s(   t  d¡}|  |¡ |  t |¡¡ d S rn   )r   rï  ZassertIsNotNoner]   ÚcodecsÚlookup)r0   rš   r   r   r   Útest_device_encoding«  s   

z(DeviceEncodingTests.test_device_encodingN)rP   rQ   rR   rð  r   r   r   r   r   r8   r9   rŸ  r   Úlocalerö  r   r   r   r   rî  ¥  s    "þrî  c                   @   sŽ   e Zd Ze eedƒd¡dd„ ƒZddd„Zdd	„ Z	d
d„ Z
e ejdkd¡dd„ ƒZe ejdkd¡dd„ ƒZe eedƒd¡dd„ ƒZdS )ÚPidTestsÚgetppidztest needs os.getppidc                 C   s<   t jtjddgt jd}| ¡ \}}|  t|ƒt 	¡ ¡ d S )Nr•   zimport os; print(os.getppid()))rÊ  )
r   rw  r8   r–   rÏ  Úcommunicater=   rë   r   Úgetpid)r0   r  rÊ  rà  r   r   r   Útest_getppidµ  s   
ÿþzPidTests.test_getppidNc                 C   sˆ   t jdkrdt j› ddd|› dg}nt jd|g}t tjt j|¡}|d ur+||ƒ t |d¡\}}|  t |¡|¡ |  ||¡ d S )Nr”   ú"r•   r   )	r8   r9   r–   r   ÚspawnvÚP_NOWAITÚwaitpidr=   Úwaitstatus_to_exitcode)r0   r˜   ÚexitcodeÚcallbackr‘   r{  Zpid2Ústatusr   r   r   Úcheck_waitpid¾  s   
zPidTests.check_waitpidc                 C   s   | j ddd d S )Nrà  r   )r˜   r  ©r  rW   r   r   r   Útest_waitpidÐ  r  zPidTests.test_waitpidc                 C   sX   d}d|› d}| j ||d |  t¡ t d¡ W d   ƒ d S 1 s%w   Y  d S )Né   zimport sys; sys.exit(ú)©r  g        )r  rj   rp   r   r  )r0   r  r˜   r   r   r   Útest_waitstatus_to_exitcodeÓ  s   "ÿz$PidTests.test_waitstatus_to_exitcoder”   úwin32-specific testc                 C   s"   d}d|› d}| j ||d d S )Nl   :   z$import _winapi; _winapi.ExitProcess(r	  r
  r  )r0   ZSTATUS_CONTROL_C_EXITr˜   r   r   r   Útest_waitpid_windowsÛ  s   zPidTests.test_waitpid_windowsc                 C   s¢   d}ddd|fD ]}|   t |d> ¡|¡ q|  t¡ t |d d> ¡ W d   ƒ n1 s/w   Y  |  t¡ t d¡ W d   ƒ d S 1 sJw   Y  d S )Nr4  r   rc   rÀ   rõ   r   )r=   r   r  rj   r»   r@  )r0   Zmax_exitcoder  r   r   r   Ú#test_waitstatus_to_exitcode_windowsã  s   ÿÿ"ÿz,PidTests.test_waitstatus_to_exitcode_windowsÚSIGKILLzneed signal.SIGKILLc                    s6   dt j› d}tj‰ ‡ fdd„}| j|ˆ  |d d S )Nzimport time; time.sleep(r	  c                    s   t  | ˆ ¡ d S r+   )r   rz  )r{  ©Úsignumr   r   Úkill_processö  r  z?PidTests.test_waitstatus_to_exitcode_kill.<locals>.kill_process)r  r  )r   ZLONG_TIMEOUTr€  r  r  )r0   r˜   r  r   r  r   Ú test_waitstatus_to_exitcode_killñ  s   z)PidTests.test_waitstatus_to_exitcode_killr+   )rP   rQ   rR   r   r   r   r   rü  r  r  r  r8   r9   r  r  r€  r  r   r   r   r   rø  ´  s    



rø  c                   @   s$  e Zd Zdddœdd„Zedƒdd„ ƒZedƒd	d
„ ƒZedƒdd„ ƒZedƒdd„ ƒZedƒdd„ ƒZ	edƒdd„ ƒZ
edƒdd„ ƒZedƒdd„ ƒZedƒdd„ ƒZedƒdd „ ƒZedƒd!d"„ ƒZedƒd#d$„ ƒZedƒd%d&„ ƒZedƒd'd(„ ƒZd)d*„ Zedƒd+d,„ ƒZedƒd-d.„ ƒZd/S )0Ú
SpawnTestsF©Úwith_envÚ	use_bytesc                C   sÐ   d| _ tj}|  tj|¡ |sd| j  }nttjƒ| _t	t
 ¡ ƒ| _| j| j| j< d| j| j f }t|ddd}| |¡ W d   ƒ n1 sHw   Y  tj|g}|rfdd„ |D ƒ}d	d
„ | j ¡ D ƒ| _|S )Né   zimport sys; sys.exit(%s)z4import sys, os; magic = os.environ[%r]; sys.exit(%s)r0  r›   r¥   c                 S   r•  r   r–  rÉ  r   r   r   r     r2  z*SpawnTests.create_args.<locals>.<listcomp>c                 S   s"   i | ]\}}t  |¡t  |¡“qS r   r–  )r   ÚkÚvr   r   r   Ú
<dictcomp>  s    ÿz*SpawnTests.create_args.<locals>.<dictcomp>)r  r   rU   r„   rV   r–  r   r;  r³  r.   r„  Zuuid4rž  r$   r%   r8   r–   rœ  )r0   r  r  r&   r˜   r'   r‘   r   r   r   Úcreate_argsý  s*   
ÿÿ
ÿzSpawnTests.create_argsÚspawnlc                 C   ó4   |   ¡ }tjtj|d g|¢R Ž }|  || j¡ d S rn   )r  r   r  ÚP_WAITr=   r  ©r0   r‘   r  r   r   r   Útest_spawnl  ó   zSpawnTests.test_spawnlÚspawnlec                 C   ó>   | j dd}tjtj|d g|¢| j‘R Ž }|  || j¡ d S ©NT)r  r   )r  r   r#  r  r³  r=   r  r   r   r   r   Útest_spawnle  ó    zSpawnTests.test_spawnleÚspawnlpc                 C   r  rn   )r  r   r(  r  r=   r  r   r   r   r   Útest_spawnlp%  r"  zSpawnTests.test_spawnlpÚspawnlpec                 C   r$  r%  )r  r   r*  r  r³  r=   r  r   r   r   r   Útest_spawnlpe+  r'  zSpawnTests.test_spawnlperþ  c                 C   sT   |   ¡ }t tj|d |¡}|  || j¡ t tjt|d ƒ|¡}|  || j¡ d S rn   )r  r   rþ  r  r=   r  r   r   r   r   r   Útest_spawnv1  s
   zSpawnTests.test_spawnvÚspawnvec                 C   ó6   | j dd}t tj|d || j¡}|  || j¡ d S r%  ©r  r   r-  r  r³  r=   r  r   r   r   r   Útest_spawnve;  ó   zSpawnTests.test_spawnveÚspawnvpc                 C   s.   |   ¡ }t tj|d |¡}|  || j¡ d S rn   )r  r   r2  r  r=   r  r   r   r   r   Útest_spawnvpA  s   zSpawnTests.test_spawnvpÚspawnvpec                 C   r.  r%  )r  r   r4  r  r³  r=   r  r   r   r   r   Útest_spawnvpeG  r1  zSpawnTests.test_spawnvpec                 C   s0   |   ¡ }t tj|d |¡}tj|| jd d S )Nr   r
  )r  r   rþ  rÿ  r   Zwait_processr  )r0   r‘   r{  r   r   r   Útest_nowaitM  s   zSpawnTests.test_nowaitc                 C   s8   | j ddd}t tj|d || j¡}|  || j¡ d S )NTr  r   r/  r   r   r   r   Útest_spawnve_bytesS  s   zSpawnTests.test_spawnve_bytesc                 C   s>   |   ¡ }|  ttjtj|d ¡ |  ttjtj|d d¡ d S ©Nr   r{  )r  rj   r»   r   r  rÿ  ©r0   r‘   r   r   r   Útest_spawnl_noargsZ  s   zSpawnTests.test_spawnl_noargsc                 C   sB   |   ¡ }|  ttjtj|d i ¡ |  ttjtj|d di ¡ d S r8  )r  rj   r»   r   r#  rÿ  r9  r   r   r   Útest_spawnle_noargs`  s    zSpawnTests.test_spawnle_noargsc                 C   sv   |   ¡ }|  ttjtj|d d¡ |  ttjtj|d g ¡ |  ttjtj|d d¡ |  ttjtj|d dg¡ d S ©Nr   r   r·  r{  )r  rj   r»   r   rþ  rÿ  r9  r   r   r   Útest_spawnv_noargsf  s
    zSpawnTests.test_spawnv_noargsc                 C   s~   |   ¡ }|  ttjtj|d di ¡ |  ttjtj|d g i ¡ |  ttjtj|d di ¡ |  ttjtj|d dgi ¡ d S r<  )r  rj   r»   r   r-  rÿ  r9  r   r   r   Útest_spawnve_noargsn  s
   "zSpawnTests.test_spawnve_noargsc                 C   sv  t jddg}tj ¡ }d|d< z|tj|d ||ƒ}W n	 ty$   Y nw |  |d¡ tj ¡ }d|d< z|tj|d ||ƒ}W n	 tyI   Y nw |  |d¡ tj ¡ }d	|d
< z|tj|d ||ƒ}W n	 tyn   Y nw |  |d¡ tj	}|  
tj|¡ t|ddd}| d¡ W d   ƒ n1 s–w   Y  t j|g}tj ¡ }d|d< |tj|d ||ƒ}|  |d¡ d S )Nr•   rà  rá  râ  r   é   rã  rä  rå  ræ  r0  r›   r¥   zPimport sys, os
if os.getenv("FRUIT") != "orange=lemon":
    raise AssertionErrorzorange=lemon)r8   r–   r   r;  rý  r  r»   r=   r   rU   r„   rV   r$   r%   )r0   Úspawnr‘   rç  r  r&   r'   r   r   r   Ú_test_invalid_envv  sF   
ÿ
ÿ
ÿÿ

zSpawnTests._test_invalid_envc                 C   rà  r+   )rA  r   r-  rW   r   r   r   Útest_spawnve_invalid_env¤  ru  z#SpawnTests.test_spawnve_invalid_envc                 C   rà  r+   )rA  r   r4  rW   r   r   r   Útest_spawnvpe_invalid_env¨  ru  z$SpawnTests.test_spawnvpe_invalid_envN)rP   rQ   rR   r  r    r!  r&  r)  r+  r,  r0  r3  r5  r6  r7  r:  r;  r=  r>  rA  rB  rC  r   r   r   r   r  ü  sF    




	








.
r  z>Skip due to platform/environment differences on *NIX buildbotsÚgetloginztest needs os.getloginc                   @   r¢  )Ú
LoginTestsc                 C   s   t  ¡ }|  t|ƒd¡ d S rn   )r   rD  r=  r:   )r0   Z	user_namer   r   r   Útest_getlogin²  ó   zLoginTests.test_getloginN)rP   rQ   rR   rF  r   r   r   r   rE  ¯  ó    rE  ÚgetpriorityÚsetpriorityz'needs os.getpriority and os.setpriorityc                   @   rW  )ÚProgramPriorityTestsz0Tests for os.getpriority() and os.setpriority().c                 C   s
  t  t jt  ¡ ¡}t  t jt  ¡ |d ¡ zIt  t jt  ¡ ¡}|dkr.|dkr.t d| ¡‚|  ||d ¡ W zt  t jt  ¡ |¡ W d S  ty^ } z|j	t	j
krS‚ W Y d }~d S d }~ww zt  t jt  ¡ |¡ W w  ty„ } z|j	t	j
krz‚ W Y d }~w d }~ww )Nrc   é   z?unable to reliably test setpriority at current nice level of %s)r   rI  ÚPRIO_PROCESSrû  rJ  r   ru  r=   rD   rE   ZEACCES)r0   r>  Znew_priorÆ  r   r   r   Útest_set_get_priority¼  s2   ÿÿ€ÿþÿ€ÿz*ProgramPriorityTests.test_set_get_priorityN)rP   rQ   rR   r  rN  r   r   r   r   rK  ·  s    rK  c                   @   sv   e Zd ZG dd„ dejƒZdd„ Zedd„ ƒZdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ ZeZdd„ Zdd„ ZdS )ÚSendfileTestServerc                   @   r—  )zSendfileTestServer.Handlerc                 C   s.   t j | |¡ g | _d| _d| _|  d¡ d S )NTFs   220 ready
)ÚasynchatÚ
async_chatÚ__init__Ú	in_bufferÚ
accumulateÚclosedÚpush)r0   Úconnr   r   r   rR  Ó  s
   z#SendfileTestServer.Handler.__init__c                 C   s$   |   d¡}| jr| j |¡ d S d S )Né   )ÚrecvrT  rS  r&  r·  r   r   r   Úhandle_readÚ  s   
ÿz&SendfileTestServer.Handler.handle_readc                 C   s   d  | j¡S )Nr¥  )r@   rS  rW   r   r   r   Úget_dataß  r¡  z#SendfileTestServer.Handler.get_datac                 C   s   |   ¡  d| _d S r#  )r\   rU  rW   r   r   r   Úhandle_closeâ  s   
z'SendfileTestServer.Handler.handle_closec                  C   ó   ‚ r+   r   rW   r   r   r   Úhandle_erroræ  ó   z'SendfileTestServer.Handler.handle_errorN)rP   rQ   rR   rR  rZ  r[  r\  r^  r   r   r   r   ÚHandlerÑ  s    r`  c                 C   sp   t j | ¡ tj | ¡ |  tjtj¡ |  	|¡ |  
d¡ | j ¡ d d… \| _| _d | _d| _t  ¡ | _d S )NrÀ   re   F)Ú	threadingÚThreadrR  ÚasyncoreÚ
dispatcherZcreate_socketÚsocketÚAF_INETÚSOCK_STREAMÚbindÚlistenÚgetsocknameÚhostÚportÚhandler_instanceÚ_activeÚLockÚ_active_lock)r0   Úaddressr   r   r   rR  é  s   

zSendfileTestServer.__init__c                 C   s   | j S r+   )rn  rW   r   r   r   rj  ö  s   zSendfileTestServer.runningc                 C   s.   | j rJ ‚t ¡ | _tj | ¡ | j ¡  d S r+   )rj  ra  ÚEventÚ_SendfileTestServer__flagrb  Ústartr|  rW   r   r   r   rt  ú  s   

zSendfileTestServer.startc                 C   s   | j sJ ‚d| _|  ¡  d S r  )rj  rn  r@   rW   r   r   r   Ústop   s   
zSendfileTestServer.stopc                 C   s2   t | jddƒst d¡ t | jddƒr|  ¡  d S )NrU  Fçü©ñÒMbP?)r   rm  rq  ry  ru  rW   r   r   r   r|    s   
ÿzSendfileTestServer.waitc                 C   sV   d| _ | j ¡  | j r%tjr%| j ¡  tjddd | j ¡  | j r%tjst 	¡  d S )NTrv  rc   )Útimeoutr±  )
rn  rs  rJ  rc  Z
socket_maprp  ÚacquireZloopÚreleaseZ	close_allrW   r   r   r   rÎ    s   


ýzSendfileTestServer.runc                 C   s   |   ¡ \}}|  |¡| _d S r+   )Úacceptr`  rm  )r0   rW  Úaddrr   r   r   Úhandle_accept  s   z SendfileTestServer.handle_acceptc                 C   s   |   ¡  d S r+   )r\   rW   r   r   r   Úhandle_connect  r¡  z!SendfileTestServer.handle_connectc                 C   s   dS rn   r   rW   r   r   r   Úwritable  rŽ  zSendfileTestServer.writablec                  C   r]  r+   r   rW   r   r   r   r^  !  r_  zSendfileTestServer.handle_errorN)rP   rQ   rR   rP  rQ  r`  rR  Úpropertyrj  rt  ru  r|  rÎ  r|  r}  rZ  r~  r^  r   r   r   r   rO  Ï  s    
	rO  Úsendfileztest needs os.sendfile()c                   @   s
  e Zd Zdd Zej d¡ oej d¡ oej d¡ Ze 	ed¡Z
e 	ejdk d¡Zed	d
„ ƒZe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e
dd„ ƒZe
dd „ ƒZe
ed!d"„ ƒƒZe
ed#d$„ ƒƒZe
e 	eed%ƒd&¡d'd(„ ƒƒZd)S )*ÚTestSendfiles    12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcdeé   ÚlinuxZsolarisZsunosz%requires headers and trailers supportr<  z(test is only meaningful on 32-bit buildsc                 C   s   t  ¡ | _ttj| jƒ d S r+   )r   Zthreading_setuprž  r(   r   rU   ÚDATAr  r   r   r   r  1  s   
zTestSendfile.setUpClassc                 C   s   t j| jŽ  t tj¡ d S r+   )r   Zthreading_cleanuprž  r   rV   rU   r  r   r   r   r”  6  s   zTestSendfile.tearDownClassc                 C   s~   t tjdfƒ| _| j ¡  t ¡ | _| j | jj| jj	f¡ | j 
d¡ | j d¡ | j ¡ | _ttjdƒ| _| j ¡ | _d S )Nr   rc   r‚  rƒ   )rO  r   ZHOSTÚserverrt  re  ÚclientÚconnectrk  rl  Ú
settimeoutrY  ry   Úsocknor$   r   rU   r1  rW   r   r   r   rX   ;  s   

zTestSendfile.setUpc                 C   s0   | j  ¡  | j ¡  | jjr| j ¡  d | _d S r+   )r1  r\   r†  r…  rj  ru  rW   r   r   r   rå   G  s
   



zTestSendfile.tearDownc              
   O   s\   	 z	t j|i |¤ŽW S  ty- } z|jtjkr‚ |jtjtjfv r(W Y d}~q ‚ d}~ww )zfA higher level wrapper representing how an application is
        supposed to use sendfile().
        TN)r   r€  rD   rE   Z
ECONNRESETÚEAGAINÚEBUSY)r0   r‘   r  rÆ  r   r   r   Úsendfile_wrapperN  s   €øzTestSendfile.sendfile_wrapperc                 C   sØ   d}d}d}|t | jƒk r8|  | j| j||¡}|dkrn||7 }||7 }|  ||k¡ |  ||¡ |t | jƒk s|  |t | jƒ¡ | j t	j
¡ | j ¡  | j ¡  | jj ¡ }|  t |ƒt | jƒ¡ |  || j¡ d S )Nr   rX  )r:   r„  rŒ  r‰  ry   r]   r=   r†  Úshutdownre  Ú	SHUT_RDWRr\   r…  r|  rm  r[  )r0   Ú
total_sentÚoffsetÚnbytesÚsentr…   r   r   r   Útest_send_whole_file_  s&   ù	

z!TestSendfile.test_send_whole_filec                 C   sê   d}t | jƒd }t | jƒ| }d}||k r8|  | j| j||¡}|dkr%n||7 }||7 }|  ||k¡ ||k s| j tj	¡ | j 
¡  | j ¡  | jj ¡ }| jt | jƒd d … }|  |t |ƒ¡ |  t |ƒt |ƒ¡ |  ||¡ d S )Nr   re   rX  )r:   r„  rŒ  r‰  ry   r]   r†  r  re  rŽ  r\   r…  r|  rm  r[  r=   )r0   r  r  Z	must_sendr‘  r’  r…   rI   r   r   r   Útest_send_at_certain_offsetu  s(   ú

z(TestSendfile.test_send_at_certain_offsetc              
   C   s¤   t | jƒd }zt | j| j|d¡}W n ty, } z|jtjkr"‚ W Y d }~nd }~ww |  	|d¡ | j
 tj¡ | j
 ¡  | j ¡  | jj ¡ }|  	|d¡ d S )NrX  r   r¥  )r:   r„  r   r€  r‰  ry   rD   rE   ÚEINVALr=   r†  r  re  rŽ  r\   r…  r|  rm  r[  )r0   r  r’  rÊ   r…   r   r   r   Útest_offset_overflowŒ  s   ÿ€þ

z!TestSendfile.test_offset_overflowc                 C   sT   |   t¡}t | j| jdd¡ W d   ƒ n1 sw   Y  |  |jjtj	¡ d S )Nr   rX  )
rj   rD   r   r€  r‰  ry   r=   r.  rE   r•  ©r0   rÜ  r   r   r   Útest_invalid_offset  s   ÿz TestSendfile.test_invalid_offsetc              	   C   s@   t j| j| jddd | jrt j| j| jdddddd d S d S )Nr   rX  )rÈ   rÆ   r  r±  r   )rÈ   rÆ   r  r±  ÚheadersÚtrailersr¬   )r   r€  r‰  ry   ÚSUPPORT_HEADERS_TRAILERSrW   r   r   r   Útest_keywords¢  s   ÿ
þÿzTestSendfile.test_keywordsc                 C   sö   d}d| j d d…  }tj| j| jddddgd}|  |d¡ ||7 }d}|t|ƒk rWtt|ƒ| dƒ}|  | j| j||¡}|dkrCn|  ||¡ ||7 }||7 }|t|ƒk s+|  	|t|ƒ¡ | j
 ¡  | j ¡  | jj ¡ }|  	t|ƒt|ƒ¡ d S )	Nr   s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyr   rX  s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxs   yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy©r™  i   )r„  r   r€  r‰  ry   ZassertLessEqualr:   ÚminrŒ  r=   r†  r\   r…  r|  rm  r[  Úhash)r0   r  Zexpected_datar’  r  r‘  r…   r   r   r   Útest_headers­  s0   ÿÿø


zTestSendfile.test_headersc                 C   s    t jd }d}|  t j|¡ t||ƒ t|dƒ.}tj| j| 	¡ ddddgd | j
 ¡  | j ¡  | jj ¡ }|  |d	¡ W d   ƒ d S 1 sIw   Y  d S )
Nrð  s   abcdefrƒ   r   rÀ   s   123456s   789©rš  s   abcde123456789)r   rU   r„   rV   r(   r$   r   r€  r‰  ry   r†  r\   r…  r|  rm  r[  r=   )r0   r©   Z	file_datara   r…   r   r   r   Útest_trailersÆ  s   

ÿ

"úzTestSendfile.test_trailersc                 C   ól   d| j j_|  t¡}tj| j| jdddd gd d W d   ƒ n1 s&w   Y  |  	|j
jtj¡ d S )NFr   ó   xé   rÔ  r  ©r…  rm  rT  rj   rD   r   r€  r‰  ry   r=   r.  rE   r•  r—  r   r   r   Útest_headers_overflow_32bitsÖ  ó   
ÿÿz)TestSendfile.test_headers_overflow_32bitsc                 C   r£  )NFr   r¤  r¥  rÔ  r¡  r¦  r—  r   r   r   Útest_trailers_overflow_32bitsß  r¨  z*TestSendfile.test_trailers_overflow_32bitsÚSF_NODISKIOztest needs os.SF_NODISKIOc              
   C   s\   zt j| j| jddt jd W d S  ty- } z|jtjtjfvr"‚ W Y d }~d S d }~ww )Nr   rX  )r¬   )	r   r€  r‰  ry   rª  rD   rE   r‹  rŠ  )r0   rÆ  r   r   r   Ú
test_flagsè  s   ÿÿ€ÿzTestSendfile.test_flagsN)rP   rQ   rR   r„  r8   r9   rŸ  r›  r   r   Zrequires_headers_trailersÚmaxsizeZrequires_32br•  r  r”  rX   rå   rŒ  r“  r”  r–  r˜  rœ  r   r¢  r§  r©  r   r   r«  r   r   r   r   r  %  sP    ÿþÿÿ



ÿr  c               	   C   s¶   t tdƒsdS zLttjddƒ+} zt |  ¡ dd¡ W n ty2   Y W d   ƒ W t tj¡ dS w W d   ƒ n1 s=w   Y  W t tj¡ dS W t tj¡ dS t tj¡ w )NÚsetxattrFr#   r   ó	   user.testr¥  T)	r   r   r$   r   rU   r­  ry   rD   rV   )r'   r   r   r   Úsupports_extended_attributesô  s&   
üýÿþøþr¯  z(no non-broken extended attribute supportre   rÁ   é'   c                   @   r—  )ÚExtendedAttributeTestsc                 K   sF  t j}|  t j|¡ t|ƒ |  t¡}|||dƒfi |¤Ž W d   ƒ n1 s)w   Y  |  |jj	t	j
¡ ||ƒ}	|  |	t¡ |||dƒdfi |¤Ž t|	ƒ}
|
 d¡ |  t||ƒƒ|
¡ |  ||dfi |¤Žd¡ |||dƒdtjfi |¤Ž |  ||dfi |¤Žd¡ |  t¡}|||dƒdtjfi |¤Ž W d   ƒ n1 s¦w   Y  |  |jj	t	j¡ |  t¡}|||dƒdtjfi |¤Ž W d   ƒ n1 sÒw   Y  |  |jj	t	j
¡ |||dƒdtjfi |¤Ž |
 d¡ |  t||ƒƒ|
¡ |||dƒfi |¤Ž |  t¡}|||dƒfi |¤Ž W d   ƒ n	1 s$w   Y  |  |jj	t	j
¡ |
 d¡ |  t||ƒƒ|
¡ |  |||dƒfi |¤Žd¡ |||dƒdfi |¤Ž |  |||dƒfi |¤Žd¡ |||dƒfi |¤Ž td	d
„ tdƒD ƒƒ}|D ]}|||dfi |¤Ž qƒ|  t||ƒƒt|	ƒt|ƒB ¡ d S )Nú	user.testr¥  r®  r¤  s   byez
user.test2s   foos   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac                 s   s    | ]}d   |¡V  qdS )zuser.test{}Nr¯  )r   rÉ   r   r   r   r±  5  ó   € z;ExtendedAttributeTests._check_xattrs_str.<locals>.<genexpr>r    r¤  )r   rU   r„   rV   r(   rj   rD   r=   r.  rE   ÚENODATAr-   r!  rJ  r^  r   ÚXATTR_REPLACEÚXATTR_CREATEÚEEXISTr'  r˜  rÄ   )r0   r   Úgetxattrr­  ÚremovexattrÚ	listxattrr  rX  rÜ  Z
init_xattrZxattrÚmanyÚthingr   r   r   Ú_check_xattrs_str
  sT   ÿ
ÿÿ
ÿ
$z(ExtendedAttributeTests._check_xattrs_strc                 O   sN   | j tg|¢R i |¤Ž t tj¡ | j tjg|¢R i |¤Ž t tj¡ d S r+   )r½  r.   r   rV   rU   r   rZ  rD  r   r   r   Ú_check_xattrs:  s   z$ExtendedAttributeTests._check_xattrsc                 C   s   |   tjtjtjtj¡ d S r+   ©r¾  r   r¸  r­  r¹  rº  rW   r   r   r   Útest_simpleA  s   ÿz"ExtendedAttributeTests.test_simplec                 C   s    | j tjtjtjtjdd d S )NFr…  r¿  rW   r   r   r   Ú
test_lpathE  s   
ÿz!ExtendedAttributeTests.test_lpathc                 C   s4   dd„ }dd„ }dd„ }dd„ }|   ||||¡ d S )	Nc                 W   óD   t | dƒ}tj| ¡ g|¢R Ž W  d   ƒ S 1 sw   Y  d S rb  )r$   r   r¸  ry   ©r>   r‘   r'   r   r   r   r¸  J  ó   $ÿz1ExtendedAttributeTests.test_fds.<locals>.getxattrc                 W   óH   t | ddƒ}tj| ¡ g|¢R Ž  W d   ƒ d S 1 sw   Y  d S ©Nrh  r   )r$   r   r­  ry   rÃ  r   r   r   r­  M  ó   "ÿz1ExtendedAttributeTests.test_fds.<locals>.setxattrc                 W   rÅ  rÆ  )r$   r   r¹  ry   rÃ  r   r   r   r¹  P  rÇ  z4ExtendedAttributeTests.test_fds.<locals>.removexattrc                 W   rÂ  rb  )r$   r   rº  ry   rÃ  r   r   r   rº  S  rÄ  z2ExtendedAttributeTests.test_fds.<locals>.listxattr)r¾  )r0   r¸  r­  r¹  rº  r   r   r   Útest_fdsI  s
   zExtendedAttributeTests.test_fdsN)rP   rQ   rR   r½  r¾  rÀ  rÁ  rÈ  r   r   r   r   r±    s    0r±  Úget_terminal_sizezrequires os.get_terminal_sizec                   @   rÛ  )ÚTermsizeTestsc              
   C   sn   zt  ¡ }W n  ty& } ztjdks|jtjtjfv r!|  d¡ ‚ d}~ww |  	|j
d¡ |  	|jd¡ dS )zÔCheck if get_terminal_size() returns a meaningful value.

        There's no easy portable way to actually check the size of the
        terminal, so let's check if it returns something sensible instead.
        r”   úfailed to query terminal sizeNr   )r   rÉ  rD   r8   r9   rE   r•  ÚENOTTYrh   ZassertGreaterEqualÚcolumnsÚlines)r0   r   rÊ   r   r   r   Útest_does_not_crash[  s   
€ûz!TermsizeTests.test_does_not_crashc              
   C   sÂ   zt jddgt jdd ¡ }W n tt jtfy!   |  d¡ Y nw t|d ƒt|d ƒf}z
t	 
tj ¡ ¡}W n  tyX } ztjdksN|jtjtjfv rS|  d	¡ ‚ d
}~ww |  ||¡ d
S )zÕCheck if stty returns the same results

        stty actually tests stdin, so get_terminal_size is invoked on
        stdin explicitly. If stty succeeded, then get_terminal_size()
        should work too.
        Zsttyr   T)rk  rË  zstty invocation failedrc   r   r”   rË  N)r   rx  ÚDEVNULLr  rC   ÚCalledProcessErrorr  rh   rë   r   rÉ  r8   Ú	__stdin__ry   rD   r9   rE   r•  rÌ  r=   )r0   r   rI   rø  rÊ   r   r   r   Útest_stty_matchm  s*   ÿý
ÿþ
€ûzTermsizeTests.test_stty_matchN)rP   rQ   rR   rÏ  rÓ  r   r   r   r   rÊ  Y  s    rÊ  Úmemfd_createzrequires os.memfd_createrÍ   r  c                   @   r¢  )ÚMemfdCreateTestsc                 C   s¬   t  dt j¡}|  |d¡ |  t j|¡ |  t  |¡¡ t|ddd}| 	d¡ |  
| ¡ d¡ W d   ƒ n1 s;w   Y  t  d¡}|  t j|¡ |  t  |¡¡ d S )NZHir   rh  F)Úclosefds   memfd_createrø   )r   rÔ  ÚMFD_CLOEXECr=  r„   r\   r›  r$  r$   r%   r=   Útell)r0   r~   ra   r  r   r   r   Útest_memfd_create  s   
þ
z"MemfdCreateTests.test_memfd_createN)rP   rQ   rR   rÙ  r   r   r   r   rÕ  Š  rH  rÕ  Úeventfdzrequires os.eventfdr8  c                   @   r)   )ÚEventfdTestsc                 C   sú   dd„ }d}d}t  |¡}|  |d¡ |  t j|¡ |  t  |¡¡ t  ||¡}|  |||ƒ¡ t  	||dƒ¡ t  ||¡}|  ||dƒ¡ t  	||dƒ¡ t  	||dƒ¡ t  ||¡}|  ||dƒ¡ t  
|d	¡ t  
|d
¡ t  |¡}|  |d¡ d S )Nc                 S   s   t  d| ¡S )z$Pack as native uint64_t
            z@Q)ÚstructÚpack)r&  r   r   r   rÝ  Ÿ  s   z/EventfdTests.test_eventfd_initval.<locals>.packrõ   r‘  r   r  é(   re   r  rÍ   )r   rÚ  r=  r„   r\   r›  r$  r{   r=   r%   Úeventfd_writeÚeventfd_read)r0   rÝ  r   Úinitvalr~   Úresr   r   r   Útest_eventfd_initvalž  s(   

z!EventfdTests.test_eventfd_initvalc                 C   s.  d}t jt jB t jB }t  ||¡}|  |d¡ |  t j|¡ t  |¡}|  	|d¡ t  |¡}|  	|d¡ |  
t¡ t  |¡ W d   ƒ n1 sIw   Y  |  
t¡ t  |d¡ W d   ƒ n1 sdw   Y  t  |d¡ t  |¡}|  	|d¡ |  
t¡ t  |¡ W d   ƒ d S 1 sw   Y  d S )Nre   r   rc   rõ   )r   ÚEFD_CLOEXECÚEFD_SEMAPHOREÚEFD_NONBLOCKrÚ  r=  r„   r\   rà  r=   rj   r¿  r{   rß  )r0   rá  r¬   r~   râ  r   r   r   Útest_eventfd_semaphore½  s*   

ÿÿ
"ÿz#EventfdTests.test_eventfd_semaphorec                 C   s  t jt jB }t  d|¡}|  |d¡ |  t j|¡ t |g|g|gd¡\}}}|  |||fg |gg f¡ t  	|d¡ t |g|g|gd¡\}}}|  |||f|g|gg f¡ |  t  
|¡d¡ t  	|d¡ t |g|g|gd¡\}}}|  |||f|gg g f¡ t  
|¡ d S )Nr   r   r  l   þÿÿÿ )r   rä  ræ  rÚ  r=  r„   r\   Úselectr=   rß  rà  )r0   r¬   r~   ÚrfdÚwfdZxfdr   r   r   Útest_eventfd_select×  s   z EventfdTests.test_eventfd_selectN)rP   rQ   rR   rã  rç  rë  r   r   r   r   rÛ  ›  s    rÛ  c                   @   rÛ  )ÚOSErrorTestsc                 C   s¬   G dd„ dt ƒ}g | _g | _tjd urtj}ntj}| j |¡ | j ||ƒ¡ tjd ur1tj}nt 	tj¡}| j |¡ | j t
|ƒ¡ | j t|ƒ¡ | j| j | _d S )Nc                   @   ó   e Zd ZdS )zOSErrorTests.setUp.<locals>.StrN©rP   rQ   rR   r   r   r   r   ÚStrð  ó    rï  )r.   Úbytes_filenamesÚunicode_filenamesr   r\  rU   r&  ZTESTFN_UNDECODABLEr   rZ  r‰   rŠ   rß  )r0   rï  ZdecodedÚencodedr   r   r   rX   ï  s   

zOSErrorTests.setUpc                 C   s@  | j tjf| j tjdf| j tjf| j tjtjf| j tjf| j tjf| j tj	fg}t
jdkrP| | jtjdf| jtjdf| jtjdf| jtjdf| jtjff¡ n| | j tjf| j tjdf| j tjdff¡ ttdƒrv| | j tjddf¡ ttdƒr†| | j tjddf¡ ttdƒr•| | j tjdf¡ ttd	ƒr¤| | j tjdf¡ ttd
ƒr³| | j tjdf¡ ttdƒrÁ| | j tjf¡ ttdƒrêt
jdkrà| | jtjdf¡ | | jtjdf¡ n
| | j tjdf¡ ttdƒr| | j tjf| j tjdf| j tjddf| j tjdff¡ ttdƒr| | j tjdf¡ ttdƒr,| | j tj f¡ |D ]o^}}}|D ]f}z2t!|t"t#fƒrI||g|¢R Ž  n|  $t%d¡ ||g|¢R Ž  W d   ƒ n	1 scw   Y  W n( t&y‡ } z|  '|j(|t"|ƒ¡ W Y d }~q5d }~w t)y‘   Y q5w |  *d +|¡¡ q5q.d S )Nr«   r”   s   dstr´   r}  r   Úlchownr  ÚchflagsÚlchflagsÚchrootr  rº  r²  s   userÚlchmodr  z	should bezNo exception thrown by {}),rß  r   rB   r  rt  r$   rœ   r7  r¨   rV   r8   r9   r“  rñ  rq   r§   rò  r  r   r&  r}  rô  r  rõ  rö  r÷  r  rº  r¸  r­  r¹  rø  r  r#  r.   rM   ZassertWarnsRegexÚDeprecationWarningrD   rÙ  r&   ÚUnicodeDecodeErrorr  r°  )r0   Zfuncsrß  ÚfuncZ	func_argsr   rÆ  r   r   r   Útest_oserror_filename  s†   




ù
	
û
ý








üÿ€"€ÿôÿz"OSErrorTests.test_oserror_filenameN)rP   rQ   rR   rX   rü  r   r   r   r   rì  î  s    rì  c                   @   r¢  )ÚCPUCountTestsc                 C   s:   t  ¡ }|d ur|  |t¡ |  |d¡ d S |  d¡ d S )Nr   z&Could not determine the number of CPUs)r   Ú	cpu_countr-   rë   ÚassertGreaterrh   )r0   Zcpusr   r   r   Útest_cpu_countL  s
   zCPUCountTests.test_cpu_countN)rP   rQ   rR   r   r   r   r   r   rý  K  r¨  rý  c                   @   sæ   e Zd Zdd„ Ze edu d¡dd„ ƒZe edu d¡dd„ ƒZe 	e
ed	ƒd
¡dd„ ƒZdd„ Zdd„ Ze 	e
edƒd¡dd„ ƒZdd„ Zdd„ Ze 	ejdkd¡dd„ ƒZe 	e
edƒd¡dd „ ƒZe 	e
ed!ƒd"¡d#d$„ ƒZdS )%ÚFDInheritanceTestsc                 C   sP   t  tt j¡}|  t j|¡ |  t  |¡d¡ t  |d¡ |  t  |¡d¡ d S ©NFT)	r   r$   r¯   rœ   r„   r\   r=   r$  r%  r¡   r   r   r   Útest_get_set_inheritableV  s
   z+FDInheritanceTests.test_get_set_inheritableNz
need fcntlc                 C   sn   t  tt j¡}|  t j|¡ |  t  |¡d¡ t |tj	¡}|tj
 M }t |tj|¡ |  t  |¡d¡ d S r  )r   r$   r¯   rœ   r„   r\   r=   r$  ÚfcntlÚF_GETFDÚ
FD_CLOEXECÚF_SETFD)r0   r~   r¬   r   r   r   Útest_get_inheritable_cloexec^  s   z/FDInheritanceTests.test_get_inheritable_cloexecc                 C   sf   t  tt j¡}|  t j|¡ |  t |tj¡tj	@ tj	¡ t  
|d¡ |  t |tj¡tj	@ d¡ d S )NTr   )r   r$   r¯   rœ   r„   r\   r=   r  r  r  r%  r¡   r   r   r   Útest_set_inheritable_cloexeck  s   ÿÿz/FDInheritanceTests.test_set_inheritable_cloexecÚO_PATHzneed os.O_PATHc                 C   ón   t  tt j¡}|  t j|¡ |  t  |¡d¡ t  |d¡ |  t  |¡d¡ t  |d¡ |  t  |¡d¡ d S r  )	r   r$   r¯   r
  r„   r\   r=   r$  r%  r¡   r   r   r   Útest_get_set_inheritable_o_pathv  s   z2FDInheritanceTests.test_get_set_inheritable_o_pathc                 C   sâ   t  ¡ }|  t¡}t |¡ W d   ƒ n1 sw   Y  |  |jjtj	¡ |  t¡}t 
|d¡ W d   ƒ n1 s=w   Y  |  |jjtj	¡ |  t¡}t 
|d¡ W d   ƒ n1 saw   Y  |  |jjtj	¡ d S ©NTF)r   rÿ  rj   rD   r   r$  r=   r.  rE   r/  r%  )r0   r~   r1  r   r   r   Útest_get_set_inheritable_badf‚  s   ÿÿÿz0FDInheritanceTests.test_get_set_inheritable_badfc                 C   s2   t  tt j¡}|  t j|¡ |  t  |¡d¡ d S r  )r   r$   r¯   rœ   r„   r\   r=   r$  r¡   r   r   r   rc  ‘  s   zFDInheritanceTests.test_openrà   zneed os.pipe()c                 C   óP   t  ¡ \}}|  t j|¡ |  t j|¡ |  t  |¡d¡ |  t  |¡d¡ d S r  )r   rà   r„   r\   r=   r$  )r0   ré  rê  r   r   r   Ú	test_pipe–  ó
   zFDInheritanceTests.test_pipec                 C   sJ   t  tt j¡}|  t j|¡ t  |¡}|  t j|¡ |  t  |¡d¡ d S r  )	r   r$   r¯   rœ   r„   r\   rg   r=   r$  ©r0   Úfd1r  r   r   r   Útest_dupž  s
   
zFDInheritanceTests.test_dupc                 C   s(   t  d¡}|  t j|¡ |  |d¡ d S ©Nrc   r   )r   rg   r„   r\   rÿ  r¡   r   r   r   Útest_dup_standard_stream¦  s   
z+FDInheritanceTests.test_dup_standard_streamr”   r  c                 C   sH   t  dt j¡}|  t j|¡ t  |¡}|  t j|¡ |  t  |¡¡ d S )NÚNUL)r   r$   rœ   r„   r\   rg   r›  r$  r  r   r   r   Útest_dup_nul«  s
   
zFDInheritanceTests.test_dup_nulr  zneed os.dup2()c                 C   s¤   t  tt j¡}|  t j|¡ t  tt j¡}|  t j|¡ |  t  ||¡|¡ |  t  	|¡¡ t  tt j¡}|  t j|¡ |  t j||dd|¡ |  
t  	|¡¡ d S )NF)Úinheritable)r   r$   r¯   rœ   r„   r\   r=   r  r]   r$  r›  )r0   r~   r  Zfd3r   r   r   r  ´  s   zFDInheritanceTests.test_dup2Úopenptyzneed os.openpty()c                 C   r  r  )r   r  r„   r\   r=   r$  )r0   Z	master_fdZslave_fdr   r   r   Útest_openptyÅ  r  zFDInheritanceTests.test_openpty)rP   rQ   rR   r  r   rì  r  r  r	  r   r   r   r  r  rc  r  r  r  r8   r9   r  r  r  r   r   r   r   r  U  s(    






r  c                   @   sH   e Zd Zddddejfdfddddd	eed
dƒfgZdd„ Zdd„ ZdS )ÚPathTConverterTests)r¨   Tr   N)rt  Fr   Nr^   FN)rõ  F©r   N)rö  Fr  Nr$   r  r\   c                 C   sî  t j}tjdkrd  }}n
t t j¡}t|ƒ}t t|ƒtjtjB ¡}|  	t j
t j¡ |  	tj|¡ t|ƒ}t|ƒ}| jD ]·\}}}	}
| j|d£ ztt|ƒ}W n ty`   Y W d   ƒ q=w ||||fD ].}|d u rnqg| j||d ||g|	¢R Ž }|
d ur†|
|ƒ W d   ƒ n1 sw   Y  qg|  td¡ ||g|	¢R Ž  W d   ƒ n1 s¯w   Y  |rÇ||g|	¢R Ž }|
d urÆ|
|ƒ n|  td¡ ||g|	¢R Ž  W d   ƒ n1 sàw   Y  W d   ƒ n1 sïw   Y  q=d S )Nrg  r   )r   r>   zto return str or byteszos.PathLike)r   rU   r   r   rZ  r   r$   rˆ   rZ   r„   rV   r\   Ú	functionsr  r   r  ÚassertRaisesRegexrp   )r0   Zstr_filenameZbytes_fspathÚbytes_filenamer~   Z
int_fspathZ
str_fspathr   Zallow_fdÚ
extra_argsZ
cleanup_fnrX  r>   r
  r   r   r   Útest_path_t_converterÚ  sd   

üÿ€ý€ÿþ€þý€è€ÿz)PathTConverterTests.test_path_t_converterc                 C   sÆ   d}|   t|d ¡ t tdƒ¡ W d   ƒ n1 sw   Y  |   t|d ¡ t tdƒ¡ W d   ƒ n1 s;w   Y  |   t|d ¡ t ttƒ ƒ¡ W d   ƒ d S 1 s\w   Y  d S )Nz-__fspath__\(\) to return str or bytes, not %srë   re   Úfloatg¸…ëQ¸@Úobject)r  rp   r   r¨   r   r$  )r0   rp  r   r   r   Ú&test_path_t_converter_and_custom_class  s   ÿÿ"ÿz:PathTConverterTests.test_path_t_converter_and_custom_class)	rP   rQ   rR   r   ÚF_OKr   r  r"  r%  r   r   r   r   r  Î  s    ú	,r  r(  r)  c                   @   r¢  )ÚBlockingTestsc                 C   r  r  )	r   r$   r¯   rœ   r„   r\   r=   r(  r*  r¡   r   r   r   r+    s   zBlockingTests.test_blockingN)rP   rQ   rR   r+  r   r   r   r   r'    rH  r'  c                   @   r¢  )ÚExportsTestsc                 C   s    |   dtj¡ |   dtj¡ d S )Nr$   r  )rÃ   r   Ú__all__rW   r   r   r   Útest_os_all!  s   zExportsTests.test_os_allN)rP   rQ   rR   r*  r   r   r   r   r(     r¨  r(  c                   @   r)   )ÚTestDirEntryc                 C   s0   t j tj¡| _|  tj| j¡ t  | j¡ d S r+   )r   r>   Úrealpathr   rU   r„   rD  rA   rW   r   r   r   rX   '  s   zTestDirEntry.setUpc                 C   s   |   ttj¡ d S r+   )rj   rp   r   ÚDirEntryrW   r   r   r   Útest_uninstantiable,  r  z TestDirEntry.test_uninstantiablec                 C   sj   t tj | jd¡dƒ}dd„ t | j¡D ƒ ¡ }|  |tj¡ |  |j	d¡ dd l
}|  t|j||¡ d S )NrŸ  ó   pythonc                 S   s   g | ]}|‘qS r   r   ©r   Úentryr   r   r   r   1  s    z0TestDirEntry.test_unpickable.<locals>.<listcomp>r   )r(   r   r>   r@   ÚscandirrÌ  r-   r-  r=   r   r  rj   rp   r  )r0   r&   r1  r  r   r   r   Útest_unpickable/  s   zTestDirEntry.test_unpickableN)rP   rQ   rR   rX   r.  r3  r   r   r   r   r+  &  s    r+  c                   @   s
  e Zd ZejZdd„ Z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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e ejejv d(¡d)d*„ ƒZd+d,„ Zd-d.„ Zd/d0„ Z d1d2„ Z!d3d4„ Z"d5d6„ Z#d7d8„ Z$d9d:„ Z%d;S )=ÚTestScandirc                 C   s>   t j tj¡| _t  | j¡| _|  tj| j¡ t  	| j¡ d S r+   )
r   r>   r,  r   rU   rZ  Ú
bytes_pathr„   rD  rA   rW   r   r   r   rX   ;  s   zTestScandir.setUprŸ  c                 C   s2   t |tƒr| jn| j}tj ||¡}t|dƒ |S )Nr/  )r#  rM   r5  r>   r   r@   r(   )r0   r   r>   r&   r   r   r   r(   A  s   
zTestScandir.create_filec                 C   s2   t dd„ t | j¡D ƒƒ}|  t| ¡ ƒ|¡ |S )Nc                 s   ó    | ]}|j |fV  qd S r+   r   r0  r   r   r   r±  H  s   € ÿz*TestScandir.get_entries.<locals>.<genexpr>)r–  r   r2  r>   r=   r˜  Úkeys)r0   ÚnamesÚentriesr   r   r   Úget_entriesG  s
   
ÿzTestScandir.get_entriesc                 C   s\   |r&t |ƒD ]}| d¡sq|dv rq|  t||ƒt||ƒ|||f¡ qd S |  ||¡ d S )NZst_)Úst_devÚst_inoÚst_nlink)rý   rŸ  r=   r   )r0   Zstat1Zstat2Zskip_fieldsr  r   r   r   Úassert_stat_equalM  s   
þû	zTestScandir.assert_stat_equalc                 C   s(   t  | j¡}|  tt|ƒ¡ | ¡  d S r+   )r   r2  r>   rj   rp   r|   r\   )r0   Úscandir_iterr   r   r   r.  Z  s   zTestScandir.test_uninstantiablec                 C   s<   |   d¡}t | j¡}dd l}|  t|j||¡ | ¡  d S )NrŸ  r   )	r(   r   r2  r>   r  rj   rp   r  r\   )r0   r&   r?  r  r   r   r   r3  _  s
   
zTestScandir.test_unpickablec                 C   s0  |   |tj¡ |  |j|¡ |  |jtj | j|¡¡ |  | ¡ tj|jddj	¡ t |j¡}|  | 
¡ t |j¡¡ |  | ¡ t |j¡¡ |  | ¡ tj |j¡¡ tj|jdd}|  |j
ddt |j¡¡ |  |jddt |j¡¡ |  | ¡ |tjdko†| ¡ |  |jdd|tjdk¡ d S )NFr…  rg  )r-   r   r-  r=   r   r>   r@   Úinoder¨   r<  Úis_dirÚS_ISDIRr  Úis_fileÚS_ISREGÚ
is_symlinkr³  r>  )r0   r1  r   rA  rC  rE  Z
entry_statZentry_lstatr   r   r   Úcheck_entryf  s>   
ÿ

ÿ

ÿ
ÿ
ÿ
ÿ
þþzTestScandir.check_entryc           	   
   C   s‚  t tdƒ}t ¡ }tj | jd¡}t |¡ |  d¡}|rEzt |tj | jd¡¡ W n t	yD } z|  
d| ¡ W Y d }~nd }~ww |ratj|tj | jd¡dd t |tj | jd	¡¡ ddg}|rl| d¡ |rs| d
¡ |  |¡}|d }|  |dddd¡ |d }|  |dddd¡ |r¡|d }|  |dddd¡ |r¿|d }|  |dddd¡ |d	 }|  |d	ddd¡ d S d S )Nr  rý   rŸ  zlink_file.txtr2  Úsymlink_dirT)rµ   úsymlink_file.txt)rG  rH  F)r   r   r   r  r>   r@   rA   r(   r  r  rh   r±   r&  r“  r:  rF  )	r0   r  r±   rH   r&   rÊ   r8  r9  r1  r   r   r   Útest_attributes‚  sH   


€ÿÿ


ûzTestScandir.test_attributesc                 C   sN   t |tƒr| jn| j}tt |¡ƒ}|  t|ƒd¡ |d }|  |j	|¡ |S r  )
r#  rM   r5  r>   r!  r   r2  r=   r:   r   )r0   r   r>   r9  r1  r   r   r   Ú	get_entry«  s   zTestScandir.get_entryc                 C   s   | j |d}|  tj |¡¡S )Nr   )r(   rJ  r   r>   Úbasename)r0   r   r&   r   r   r   Úcreate_file_entry´  r'  zTestScandir.create_file_entryc              	   C   sn   |   ¡ }t ¡ }z(t | j¡ tdd„ t ¡ D ƒƒ}|  t| 	¡ ƒtj 
|¡g¡ W t |¡ d S t |¡ w )Nc                 s   r6  r+   r   r0  r   r   r   r±  À  r³  z5TestScandir.test_current_directory.<locals>.<genexpr>)r(   r   r,   rB   r>   r–  r2  r=   r˜  r7  rK  )r0   r&   Zold_dirr9  r   r   r   Útest_current_directory¸  s   ÿz"TestScandir.test_current_directoryc                 C   s   |   ¡ }|  t|ƒd¡ d S )Nz<DirEntry 'file.txt'>)rL  r=   r²  ©r0   r1  r   r   r   Ú	test_reprÆ  rG  zTestScandir.test_reprc                 C   s*   |   ¡ }|  t |¡tj | jd¡¡ d S )NrŸ  )rL  r=   r   Úfspathr>   r@   rN  r   r   r   Útest_fspath_protocolÊ  s   "z TestScandir.test_fspath_protocolc                 C   sN   t  d¡}| j|d}t  |¡}|  |t¡ |  |t j t  | j¡|¡¡ d S )Nzbytesfile.txtr   )	r   rZ  rL  rP  r-   rM   r=   r>   r@   )r0   r   Zbytes_entryrP  r   r   r   Útest_fspath_protocol_bytesÎ  s   

ÿz&TestScandir.test_fspath_protocol_bytesc                 C   sÆ   t j | jd¡}t  |¡ |  d¡}t  |¡ t jdkr#|  | ¡ ¡ |  	| 
¡ ¡ |  	| ¡ ¡ t jdkrI|  t|j¡ | ¡  |jdd d S |  | ¡ d¡ |  t|j¡ | jt|jdd d S )Nrý   rg  Fr…  r   )r   r>   r@   rA   rJ  r7  r   r]   rA  r›  rC  rE  rj   rC   r@  r¨   rÿ  )r0   r>   r1  r   r   r   Útest_removed_dirÖ  s   




zTestScandir.test_removed_dirc                 C   s¬   |   ¡ }t |j¡ |  | ¡ ¡ tjdkr|  | ¡ ¡ |  | 	¡ ¡ tjdkr<|  
t|j¡ | ¡  |jdd d S |  | ¡ d¡ |  
t|j¡ | j
t|jdd d S )Nrg  Fr…  r   )rL  r   rV   r>   r›  rA  r   r]   rC  rE  rj   rC   r@  r¨   rÿ  rN  r   r   r   Útest_removed_fileì  s   

zTestScandir.test_removed_filec                 C   sÐ   t  ¡ s	|  d¡S |  d¡}t |tj | jd¡¡ |  ddg¡}|d }t 	|¡ |  
| ¡ d¡ |  | ¡ ¡ |  | ¡ ¡ |  |jdd¡ |  |jdd¡ |  | ¡ ¡ |  t|j¡ |jdd d S )Nzcannot create symbolic linkrŸ  zsymlink.txtr   Fr…  )r   r  rh   r(   r   r±   r>   r@   r:  rV   rÿ  r@  r›  rA  rC  r]   rE  rj   rC   r¨   )r0   r&   r9  r1  r   r   r   Útest_broken_symlinkÿ  s"   

ÿ
zTestScandir.test_broken_symlinkc              	   C   sp   |   d¡ t | j¡}tt |¡ƒ}|  t|ƒd|¡ |d }|  |jd¡ |  |jt tj 	| jd¡¡¡ d S ©NrŸ  rc   r   s   file.txt)
r(   r   rZ  r>   r!  r2  r=   r:   r   r@   )r0   Ú
path_bytesr9  r1  r   r   r   r¬    s   
ÿzTestScandir.test_bytesc              
   C   sÐ   |   d¡ ttfD ]\}|t | j¡ƒ}|  t¡ tt 	|¡ƒ}W d   ƒ n1 s*w   Y  |  
t|ƒd|¡ |d }|  
|jd¡ |  
|jt tj | jd¡¡¡ |  t|jƒt¡ |  t|jƒt¡ q	d S rV  )r(   r‰   rŠ   r   rZ  r>   ÚassertWarnsrù  r!  r2  r=   r:   r   r@   rÙ  r|   rM   )r0   r€  rW  r9  r1  r   r   r   Útest_bytes_like   s   
ÿÿõzTestScandir.test_bytes_likez.fd support for listdir required for this test.c              	   C   st  |   tjtj¡ |  d¡ dg}t ¡ r%t dtj 	| jd¡¡ | 
d¡ t | j¡…}t |¡}t|ƒ}W d   ƒ n1 s@w   Y  dd„ |D ƒ}|  t|ƒ|¡ |  |t |¡¡ |D ]H}|  |j|j¡ |  t |¡|j¡ |  | ¡ |jdk¡ tjtjv r§tj|j|d}|  | ¡ |¡ tj|j|dd}|  |jdd|¡ q_W d   ƒ d S 1 s³w   Y  d S )	NrŸ  r  c                 S   r
   r   r   r0  r   r   r   r   =  r   z'TestScandir.test_fd.<locals>.<listcomp>r†  F)r®   rf  r…  )rÃ   r   r2  rˆ  r(   r   r  r±   r>   r@   r&  rk  r!  r=   r˜  r  r   rP  rE  r¨   r‰  )r0   Zexpected_namesr~   r©  r9  r8  r1  rH  r   r   r   Útest_fd0  s2   


ÿ€ø"úzTestScandir.test_fdc                 C   s   |   ttjd¡ d S )Nr{  )rj   rC   r   r2  rW   r   r   r   Útest_empty_pathJ  rä  zTestScandir.test_empty_pathc                 C   sN   |   d¡ t | j¡}t|ƒ}|  t|ƒd|¡ t|ƒ}|  t|ƒd|¡ d S )NrŸ  rc   r   )r(   r   r2  r>   r!  r=   r:   )r0   rÞ  r9  Zentries2r   r   r   Útest_consume_iterator_twiceM  s   
z'TestScandir.test_consume_iterator_twicec                 C   s$   di g fD ]
}|   ttj|¡ qd S )NgX9´Èv¾ó?)rj   rp   r   r2  )r0   Úobjr   r   r   Útest_bad_path_typeX  s   ÿzTestScandir.test_bad_path_typec                 C   sh   |   d¡ |   d¡ t | j¡}t|ƒ | ¡  | ¡  |  ¡ 
 ~W d   ƒ d S 1 s-w   Y  d S ©NrŸ  ú	file2.txt)r(   r   r2  r>   r§  r\   Úcheck_no_resource_warning©r0   rÞ  r   r   r   Ú
test_close\  s   


"ÿzTestScandir.test_closec                 C   sx   |   d¡ |   d¡ t | j¡}t|ƒ W d   ƒ n1 sw   Y  |  ¡ 
 ~W d   ƒ d S 1 s5w   Y  d S r_  )r(   r   r2  r>   r§  ra  rb  r   r   r   Útest_context_managerg  s   


ÿ
"ÿz TestScandir.test_context_managerc                 C   sV   |   d¡ |   d¡ t | j¡}t|ƒ | ¡  W d   ƒ d S 1 s$w   Y  d S r_  )r(   r   r2  r>   r§  r\   rb  r   r   r   Útest_context_manager_closeo  s   


"þz&TestScandir.test_context_manager_closec              	   C   sª   |   d¡ |   d¡ |  t¡& t | j¡}t|ƒ dd  W d   ƒ n1 s)w   Y  W d   ƒ n1 s8w   Y  |  ¡ 
 ~W d   ƒ d S 1 sNw   Y  d S )NrŸ  r`  rc   r   )r(   rj   ÚZeroDivisionErrorr   r2  r>   r§  ra  rb  r   r   r   Útest_context_manager_exceptionv  s   


þ€ÿ
"ÿz*TestScandir.test_context_manager_exceptionc                 C   s    |   d¡ |   d¡ t | j¡}t|ƒ |  t¡ ~t ¡  W d   ƒ n1 s)w   Y  t | j¡}t	|ƒ |  
¡ 
 ~W d   ƒ d S 1 sIw   Y  d S r_  )r(   r   r2  r>   r§  rX  ÚResourceWarningr   Ú
gc_collectr!  ra  rb  r   r   r   Útest_resource_warning€  s   


þ
"ÿz!TestScandir.test_resource_warningN)rŸ  )&rP   rQ   rR   r   ra  rX   r(   r:  r>  r.  r3  rF  rI  rJ  rL  rM  rO  rQ  rR  rS  rT  rU  r¬  rY  r   r   r   r  rˆ  rZ  r[  r\  r^  rc  rd  re  rg  rj  r   r   r   r   r4  8  sB    
)
	ÿ

r4  c                   @   s^   e Zd Zeejƒ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 )Ú
TestPEP519c                 C   ó    dD ]}|   ||  |¡¡ qd S )N)r¤  s   goodbyes   some/path/and/file©r=   rP  )r0   Úbr   r   r   Útest_return_bytes•  ó   ÿzTestPEP519.test_return_bytesc                 C   rl  )N)ZhelloZgoodbyezsome/path/and/filerm  )r0   r   r   r   r   Útest_return_string™  rp  zTestPEP519.test_return_stringc                 C   sL   dD ]!}t |ƒ}|  ||  |¡¡ |  dt |¡¡ |  dt |¡¡ qd S )N)úpath/like/objectó   path/like/objectrs  rr  )r   r=   rP  r   rZ  rN   )r0   r  Zpathliker   r   r   Útest_fsencode_fsdecode  s   ûz!TestPEP519.test_fsencode_fsdecodec                 C   sB   |   d|  tdƒ¡¡ |  tttjƒ¡ |  ttdƒtjƒ¡ d S )Nz#feelthegilrí   )r=   rP  r   r]   Ú
issubclassr   ÚPathLiker#  rW   r   r   r   rª  ¥  s   zTestPEP519.test_pathlikec                 C   s4   t ddi ƒ}tt t|ƒ fD ]
}|  t| j|¡ qd S )NZblahr   )r|   rë   r   rj   rp   rP  )r0   ZvaporÚor   r   r   Útest_garbage_in_exception_outª  s   ÿz(TestPEP519.test_garbage_in_exception_outc                 C   s   |   t| j¡ d S r+   )rj   rp   rP  rW   r   r   r   Útest_argument_required¯  r  z!TestPEP519.test_argument_requiredc                 C   sR   |   t| jtdƒ¡ tddi ƒ}d|_|   t| j|ƒ ¡ |   t| jttƒ ƒ¡ d S )Nr‘  Zfoor   rc   )rj   rp   rP  r   r|   Ú
__fspath__rf  )r0   Úcr   r   r   Útest_bad_pathlike²  s   
ÿzTestPEP519.test_bad_pathlikec                 C   s8   G dd„ dt jƒ}|  tt|ƒ¡ |  ttt jƒ¡ d S )Nc                   @   rí  )z0TestPEP519.test_pathlike_subclasshook.<locals>.ANrî  r   r   r   r   ÚAÀ  rð  r}  )r   rv  r›  ru  r   r]   )r0   r}  r   r   r   Útest_pathlike_subclasshook½  s   z%TestPEP519.test_pathlike_subclasshookc                 C   s   |   tjt tj¡ d S r+   )r-   r   rv  rM   ÚtypesÚGenericAliasrW   r   r   r   Útest_pathlike_class_getitemÅ  ró  z&TestPEP519.test_pathlike_class_getitemN)rP   rQ   rR   r“  r   rP  ro  rq  rt  rª  rx  ry  r|  r~  r  r   r   r   r   rk    s    
rk  c                   @   r¢  )Ú
TimesTestsc                 C   sr   t  ¡ }|  |t j¡ dD ]}t||ƒ}|  |t¡ qt jdkr7|  |jd¡ |  |j	d¡ |  |j
d¡ d S d S )N)ÚuserÚsystemÚchildren_userÚchildren_systemÚelapsedrg  r   )r   rd  r-   Útimes_resultr   r#  r   r=   r…  r†  r‡  )r0   rd  Zfieldr&  r   r   r   Ú
test_timesÊ  s   

ýzTimesTests.test_timesN)rP   rQ   rR   r‰  r   r   r   r   r‚  É  r¨  r‚  Úforkc                   @   r¢  )Ú	ForkTestsc                 C   s    d}t d|ƒ t d|dd d S )Nz´if 1:
            import os
            from test import support
            pid = os.fork()
            if pid != 0:
                support.wait_process(pid, exitcode=0)
        r•   Zmalloc_debug)ZPYTHONMALLOCr   r—   r   r   r   Ú	test_forkÛ  s   
zForkTests.test_forkN)rP   rQ   rR   rŒ  r   r   r   r   r‹  Ù  s    r‹  Ú_fspathc                   @   s   e Zd ZdZeejƒZdS )ÚTestPEP519PurePythonz>Explicitly test the pure Python implementation of os.fspath().N)rP   rQ   rR   r  r“  r   r  rP  r   r   r   r   rŽ  ì  s    rŽ  Ú__main__)r"   r+   )Žrô  Ú
contextlibr…  rE   rÌ  r†  rH  r÷  r…  r   r  rè  r_  r€  re  r¨   rÜ  r   r8   Z	sysconfigr;   râ  ra  rq  r  r   r„  rÀ  Útestr   Ztest.supportr   r   r   r   r   r9   r   rÁ  Úsimplefilterrù  rP  rc  rÉ  ÚImportErrorr  r×  ÚpwdZgetpwallr  r  Z	_testcapir   r   r¬  Ztest.support.script_helperr   r   Ztest.support.os_helperr   r–  r   r   r   ÚversionrŸ  rí  ÚgetgidrF  r    r(   rì  rç   ZTestCaser*   rS   rè   rB  r”  ZBasicTestMappingProtocolr•  r  r   rC  rX  r_  ra  r~  r˜  r£  r©  r¶  Zget_config_varZOS_URANDOM_DONT_USE_FDrÂ  ÚcontextmanagerrÓ  rÔ  rî  rõ  r-  r;  rW  rg  r‘  rž  r­  r®  rÓ  rÜ  rè  rê  rî  rø  r  r  rE  rK  rd  rb  rO  r  r¯  Zrequires_linux_versionr±  rÊ  rÕ  rÛ  rì  rý  r  r  r'  r(  r+  r4  rk  r‚  r‹  rŽ  rP   Úmainr   r   r   r   Ú<module>   s”  

ýÿÿÿÿÿ
ÿE  Z e \  ) EGj;)	-ÿýÿÿM ÿh#w%CGs/< 0![H 4ÿV OÿQ0
Q]
yBÿ  Y:
ÿ