a
    ññ"hí} ã                	   @   sd  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! zd dl"Z"W n e#y(   dZ"Y n0 zd dl$Z$W n e#yN   dZ$Y n0 zd dl%Z%W n e#yt   dZ%Y n0 zd dl&Z&dd„ e& '¡ D ƒZ(W n e#e)fy°   g Z(Y n0 zd dl*m+Z+m,Z, W n e#yä   ej- Z+Z,Y n0 d dl.m/Z/ d d	lm0Z0m1Z1 d
Z2e3edƒre 4¡ d kZ2e3edƒrDej5j6rDej5j6 7d¡Z8nd
Z8ej  7d¡o`e 9¡ d kZ:dd„ Z;d¬dd„Z<G dd„ dej=ƒZ>G dd„ dej=ƒZ?G dd„ dej=ƒZ@G dd„ dej=ƒZAd dlmBZB G dd„ deBjCƒZDG dd „ d ej=ƒZEe Fe3ed!ƒd"¡G d#d$„ d$eEƒƒZGG d%d&„ d&eEƒZHe Fe3ed!ƒd"¡G d'd(„ d(eGƒƒZIG d)d*„ d*ej=ƒZJe Fe3ed+ƒd,¡G d-d.„ d.ej=ƒƒZKG d/d0„ d0ej=ƒZLG d1d2„ d2ej=ƒZMG d3d4„ d4ej=ƒZNe Fe3ed5ƒd6¡G d7d8„ d8ej=ƒƒZOe Pd9¡d:kpüe Pd;¡d:kpüe Pd<¡d:kZQe ReQd=¡e Rej d>kd?¡G d@dA„ dAej=ƒƒƒZSejTd­dBdC„ƒZUe Fe3edDƒdE¡G dFdG„ dGej=ƒƒZVe Fej dHkdI¡G dJdK„ dKej=ƒƒZWG dLdM„ dMej=ƒZXG dNdO„ dOej=ƒZYe Rej dHkdP¡G dQdR„ dRej=ƒƒZZe Rej dHkdP¡G dSdT„ dTej=ƒƒZ[e Fej dHkdI¡G dUdV„ dVej=ƒƒZ\e Fej dHkdI¡G dWdX„ dXej=ƒƒZ]e Fe3edYƒdZ¡G d[d\„ d\ej=ƒƒZ^e Fej dHkdI¡ej_G d]d^„ d^ej=ƒƒƒZ`e Fej dHkdI¡G d_d`„ d`ej=ƒƒZae Fej dHkdI¡G dadb„ dbej=ƒƒZbej_G dcdd„ ddej=ƒƒZcG dedf„ dfej=ƒZdG dgdh„ dhej=ƒZeG didj„ djej=ƒZfG dkdl„ dlej=ƒZge hdm¡e Fe3ednƒdo¡G dpdq„ dqej=ƒƒƒZie Fe3edrƒove3edsƒdt¡G dudv„ dvej=ƒƒZjG dwdx„ dxejkejlƒZme Fe3edyƒdz¡G d{d|„ d|ej=ƒƒZnd}d~„ Zoe Feoƒ d¡e pd€dd‚¡G dƒd„„ d„ej=ƒƒƒZqe Fe3ed…ƒd†¡G d‡dˆ„ dˆej=ƒƒZre Fe3ed‰ƒdŠ¡e pd‹dŒ¡G ddŽ„ dŽej=ƒƒƒZsG dd„ dej=ƒZtG d‘d’„ d’ej=ƒZuG d“d”„ d”ej=ƒZvG d•d–„ d–ej=ƒZwe Fe3ed—ƒd˜¡G d™dš„ dšej=ƒƒZxG d›dœ„ dœej=ƒZyG ddž„ džej=ƒZzG dŸd „ d ej=ƒZ{G d¡d¢„ d¢ej=ƒZ|G d£d¤„ d¤ej=ƒZ}e;d¥ƒG d¦d§„ d§ej=ƒƒZ~e3ed¨ƒrNG d©dª„ dªe|ƒZe€d«kr`e ¡  dS )®é    N)Úsupport)Úsocket_helper)Úwin32_is_iotc                 C   s   g | ]
}|j ‘qS © )Úpw_uid)Ú.0Úur   r   ú4/opt/python-3.9.21/usr/lib/python3.9/test/test_os.pyÚ
<listcomp>3   ó    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_funcP   s    r   ó   contentc                 C   s:   t | ddƒ}| |¡ W d   ƒ n1 s,0    Y  d S )NÚxbr   )ÚopenÚwrite)ÚfilenameZcontentÚfpr   r   r	   Úcreate_fileT   s    r!   c                   @   s$   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_getcwdZ   s    zMiscTests.test_getcwdc           
      C   s~  d}d}d}|d|t |ƒ   }t ¡ >}t |¡}|}t ¡ }|  ||¡ |t |ƒt tjj	ƒ  }|dkrvq t |ƒ|kr–|dkr–|d |… }tj 
||¡}zt |¡ t |¡ W n\ tyÔ   Y q Y nF ty }	 z,|	jtjkrW Y d }	~	q n‚ W Y d }	~	n
d }	~	0 0 |}q>tjr:tdt |ƒ› ƒ W d   ƒ n1 sP0    Y  W d   ƒ n1 sp0    Y  d S )NiÐ  éÈ   Zpython_test_dir_Úar   z!Tested current directory length: )ÚlenÚtempfileÚTemporaryDirectoryr   Z
change_cwdr   r$   ÚassertEqualÚpathÚsepÚjoinÚmkdirÚchdirÚFileNotFoundErrorÚOSErrorÚerrnoZENAMETOOLONGÚverboseÚprint)
r(   Zmin_lenZdirlenÚdirnameZtmpdirr1   Úexpectedr)   ZneedÚexcr   r   r	   Útest_getcwd_long_path^   s6    

zMiscTests.test_getcwd_long_pathc                 C   s.   t  ¡ }|  |t¡ |  t  |¡t  ¡ ¡ d S r#   )r   Úgetcwdbr%   Úbytesr0   Úfsdecoder$   r'   r   r   r	   Útest_getcwdb“   s    zMiscTests.test_getcwdbN)Ú__name__Ú
__module__Ú__qualname__r*   r>   rB   r   r   r   r	   r"   Y   s   5r"   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d,S )-Ú	FileTestsc                 C   s   t j tj¡rt  tj¡ d S r#   )r   r1   Úlexistsr   ÚTESTFNÚunlink©r(   r   r   r	   ÚsetUp›   s    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   rH   ÚO_CREATÚO_RDWRÚcloseÚ
assertTrueÚaccessÚW_OK©r(   Úfr   r   r	   Útest_access    s    
zFileTests.test_accessc              	   C   s¨   t  tjt jt jB ¡}t  |¡}zTd}||d krht  |¡ |d7 }|dkrV|  d¡ |t  |¡ }}q&W t  |¡ nt  |¡ 0 t  	||d ¡ |  
tt j|d¡ d S )Nr   é   é
   z%couldn't allocate two consecutive fdsé   ó   a)r   r   r   rH   rL   rM   ÚduprN   ÚskipTestÚ
closerangeÚassertRaisesr7   r   )r(   Ú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   rH   ÚsysÚgetrefcountr\   Ú	TypeErrorr   Úrenamer0   )r(   r1   ÚoldÚnewr   r   r	   Útest_renameº   s
    

zFileTests.test_renamec                 C   s€   t tjdƒ`}| d¡ | ¡  | ¡ }t |dd¡ t |d¡}|  	t
|ƒt¡ |  	|d¡ W d   ƒ n1 sr0    Y  d S )Núw+bó   spamr   é   )r   r   rH   r   ÚflushÚfilenor   ÚlseekÚreadr0   Útyper@   )r(   ÚfobjÚfdÚsr   r   r	   Ú	test_readÂ   s    
zFileTests.test_readzneeds INT_MAX < PY_SSIZE_T_MAXrV   rU   F)ÚsizeZmemuseÚdry_runc                 C   sh   |   tjtj¡ ttjdƒ ttjdƒ }t | ¡ |¡}W d   ƒ n1 sN0    Y  |  	|d¡ d S )Ns   testÚrb)
Ú
addCleanupr   rI   rH   r!   r   r   rn   rl   r0   )r(   rt   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   ƒ n1 s˜0    Y  d S )NÚbeanss   bacon
s   eggs
s   spam
rv   )s   bacons   eggsri   )r   r   r   rH   rL   ÚO_WRONLYr\   rc   r   Ú	bytearrayÚ
memoryviewrN   r0   rn   Ú
splitlines)r(   rq   rp   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_CONSOLEr0   )r(   Ú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†   ra   Ú
executable©r(   Úcoder   r   r	   Útest_write_windows_consoleó   s    z$FileTests.test_write_windows_consolec                 G   s.   t  tjt j¡}t j|g|¢R Ž }| ¡  d S r#   )r   r   r   rH   ÚO_RDONLYÚfdopenrN   )r(   r„   rq   rS   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   rH   rL   rM   rN   r   ©r(   rq   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¡ W d   ƒ n1 sŽ0    Y  d S )Nz.2ó   1ó   2r   Ú1)r   rH   rw   rI   r!   r   Úreplacer\   r6   Ústatr   r0   rn   )r(   ÚTESTFN2rS   r   r   r	   Útest_replace  s    

zFileTests.test_replacec                 C   s"   t jtt jdd d}t  |¡ d S )Néÿ  )r1   ÚflagsÚmodeÚdir_fd)r   r   Ú__file__r   rN   rR   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 n ttfy8   Y n0 d S )NÚsymlinkÚtargetF)ÚsrcÚdstÚtarget_is_directoryrž   )r   Zget_attributer   rH   ÚNotImplementedErrorr7   )r(   r¡   r   r   r	   Útest_symlink_keywords  s    ÿ
zFileTests.test_symlink_keywordsÚcopy_file_rangeztest needs os.copy_file_range()c                 C   s<   |   t¡ t ddd¡ W d   ƒ n1 s.0    Y  d S )Nr   rU   iöÿÿÿ)r\   Ú
ValueErrorr   r¨   rJ   r   r   r	   Ú#test_copy_file_range_invalid_values%  s    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
yÄ } z$|jtjkr¦‚ |  |¡ W Y d }~n`d }~0 0 |  |tddƒ¡ t|dƒ(}|  | ¡ |d |… ¡ W d   ƒ n1 s0    Y  d S )Nz.3ó
   0123456789rv   rh   é   r   é   )r   rH   r!   rw   rI   r   rN   rl   r   r¨   r7   r8   ÚENOSYSrZ   ÚassertInÚranger0   rn   )	r(   r™   rx   Ú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
yÖ } z$|jtjkr¸‚ |  |¡ W Y d }~nŒd }~0 0 |  |
td	|d
 ƒ¡ t|dƒ}| ¡ }W d   ƒ n1 s0    Y  |  |d |… d| ¡ |  ||d … ||||
 … ¡ d S )Nz.4r«   r­   é   r¬   rv   rh   )Z
offset_srcZ
offset_dstr   rU   ó    )r   rH   r!   rw   rI   r   rN   rl   r   r¨   r7   r8   r®   rZ   r¯   r°   rn   r0   )r(   ZTESTFN4rx   Zbytes_to_copyZin_skipZout_seekr±   r²   r³   r´   rµ   r¶   rn   r   r   r	   Útest_copy_file_range_offsetL  s<    


þ
 (ÿz%FileTests.test_copy_file_range_offsetN) rC   rD   rE   rK   ÚtearDownrT   r_   r   Úcpython_onlyrg   rs   r   r   r   r   Z
bigmemtestry   r   r†   ra   ÚplatformrŒ   r   r“   rš   r    r§   r   r   rª   r·   rº   r   r   r   r	   rF   š   s<   


ÿÿ
	

!rF   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   rH   Úfnamerw   rI   r!   rJ   r   r   r	   rK   {  s    zStatAttributeTests.setUpc           
   	   C   sæ  t  |¡}|  |tj d¡ |  |jd¡ t|ƒ}ttƒD ]d}|d d… dkr:| ¡ }| d¡rjdd„ }ndd„ }|  |t||ƒƒ|tt|ƒ ¡ |  	||¡ q:d 
¡ D ]8}tt||ƒd ƒ}t||d	 ƒd
 }| j||dd q¨z|d  |  d¡ W n ty   Y n0 zd|_|  d¡ W n ty6   Y n0 zd|_|  d¡ W n ttfyd   Y n0 zd|_|  d¡ W n tyŽ   Y n0 zt  d¡}	|  d¡ W n ty¼   Y n0 zt  d¡}	W n tyà   Y n0 d S )Nr¸   ZST_ZTIMEc                 S   s   t | ƒS r#   )Úint©Úxr   r   r	   Útrunc  r   z7StatAttributeTests.check_stat_attributes.<locals>.truncc                 S   s   | S r#   r   rÂ   r   r   r	   rÄ     r   zst_atime st_mtime st_ctimei † Z_nsi'  rW   ©Údeltar+   úNo exception raisedrU   ©rV   ©r   rU   rW   r¸   rj   r¬   r­   é   é   é	   rV   é   é   é   é   )r   r˜   r0   ÚST_SIZEÚst_sizeÚdirÚlowerÚendswithÚgetattrr¯   ÚsplitrÁ   ÚassertAlmostEqualÚfailÚ
IndexErrorÚst_modeÚAttributeErrorÚst_rdevrc   ÚparrotÚstat_result)
r(   rÀ   ÚresultÚmembersr   ÚattrrÄ   ZfloatyZnanosecondyÚresult2r   r   r	   Úcheck_stat_attributes€  s^    


ÿ
z(StatAttributeTests.check_stat_attributesc                 C   s   |   | j¡ d S r#   )rä   rÀ   rJ   r   r   r	   Útest_stat_attributesÁ  s    z'StatAttributeTests.test_stat_attributesc                 C   sF   z| j  t ¡ ¡}W n" ty6   |  d| j  ¡ Y n0 |  |¡ d S )Nz#cannot encode %a for the filesystem)rÀ   Úencodera   ÚgetfilesystemencodingÚUnicodeEncodeErrorrZ   rä   )r(   rÀ   r   r   r	   Útest_stat_attributes_bytesÄ  s
    z-StatAttributeTests.test_stat_attributes_bytesc                 C   sf   t  | j¡}ttjd ƒD ]F}t ||¡}|  d|¡ |dk rJ|  d|¡ t |¡}|  	||¡ qd S )NrU   s   stat_resultrj   s   cos
stat_result
)
r   r˜   rÀ   r°   ÚpickleÚHIGHEST_PROTOCOLÚdumpsr¯   Úloadsr0   ©r(   rà   ÚprotoÚpZ	unpickledr   r   r	   Útest_stat_result_pickleË  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y–   Y n0 zd|_|  d¡ W n ty¾   Y n0 zt  d¡}|  d¡ W n tyê   Y n0 zt  d¡}W n ty   Y n0 d S )	Nr¸   )
ZbsizeZfrsizeZblocksZbfreeZbavailÚfilesZffreeZfavailÚflagZnamemaxZf_rV   rU   rÇ   rÈ   rÉ   )r   rò   rÀ   r0   Úf_bfreeÚ	enumeraterÖ   rO   Ú
isinstanceÚf_fsidrÁ   r-   rÙ   rÜ   rÞ   Ústatvfs_resultrc   )r(   rà   rá   ÚvalueÚmemberrã   r   r   r	   Útest_statvfs_attributesÕ  s4    
z*StatAttributeTests.test_statvfs_attributesúneed os.statvfs()c                 C   sf   t  | j¡}ttjd ƒD ]F}t ||¡}|  d|¡ |dk rJ|  d|¡ t |¡}|  	||¡ qd S )NrU   s   statvfs_resultrj   s   cos
statvfs_result
)
r   rò   rÀ   r°   rê   rë   rì   r¯   rí   r0   rî   r   r   r	   Útest_statvfs_result_pickle  s    
z-StatAttributeTests.test_statvfs_result_pickler‡   úWin32 specific testsc              
   C   s\   zt  d¡ W nH ty*   |  d¡ Y n. tyV } z|  d¡ W Y d }~n
d }~0 0 d S )Nzc:\pagefile.syszc:\pagefile.sys does not existzCould not stat pagefile.sys)r   r˜   r6   rZ   r7   rÙ   ©r(   r¶   r   r   r	   Útest_1686475  s    zStatAttributeTests.test_1686475Úpipezrequires os.pipe()c              	   C   s   t  ¡ \}}z"t  |¡ W t  |¡ t  |¡ nt  |¡ t  |¡ 0 |  t¡}t  |¡ W d   ƒ n1 sp0    Y  |  |jjtj	¡ d S r#   )
r   r  r˜   rN   r\   r7   r0   Ú	exceptionr8   ÚEBADF)r(   r   ÚwÚctxr   r   r	   Ú
test_15261  s    
ÿ
(zStatAttributeTests.test_15261c                 C   sF   |   t|dƒ¡ |   t|jtƒ¡ |   d|j  ko:dkn  ¡ d S )NÚst_file_attributesr   ì   ÿÿ )rO   r   r÷   r  rÁ   )r(   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À   r
  r0   r  ÚFILE_ATTRIBUTE_DIRECTORYr   rH   r4   rw   Úrmdir)r(   rà   r;   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   r1   r3   ÚenvironrÀ   rw   r   rI   r!   r‚   Ú
check_callr˜   ÚassertNotEqualrÒ   )r(   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   r1   Ú
splitdriver$   r˜   r0   rÛ   ÚS_IFBLK)r(   rÀ   rà   r   r   r	   Útest_stat_block_deviceU  s    
z)StatAttributeTests.test_stat_block_deviceN)rC   rD   rE   rK   rä   rå   ré   rñ   r   r   r   r   rü   rþ   ra   r½   r  r  r
  r  r  r  r   r   r   r	   r¾   z  s2   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   rH   r;   r   r1   r3   rÀ   rw   Úrmtreer4   r!   rJ   r   r   r	   rK   _  s
    zUtimeTests.setUpc                 C   s4   t  |¡}|j|d kp2|j|d kp2|j|d kS )NrÊ   rË   rÌ   )r   r˜   Úst_atimeÚst_mtimeÚst_ctime)r(   r   Ústr   r   r	   Úsupport_subsecondg  s    
ÿþzUtimeTests.support_subsecondNc                 C   s¸   |s
| j }|  |¡}|r"d}d}nd}d}||||fƒ t |¡}|rt| 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À   r  r   r˜   rØ   r  r  r0   Úst_atime_nsÚst_mtime_ns)r(   Úset_timer   r  Úatime_nsÚmtime_nsr  r   r   r	   Ú_test_utimeo  s"    

zUtimeTests._test_utimec                 C   s   dd„ }|   |¡ d S )Nc                 S   s   t j| |d d S ©N©Úns©r   Úutime©r   r)  r   r   r	   r#    s    z'UtimeTests.test_utime.<locals>.set_time©r&  ©r(   r#  r   r   r	   Ú
test_utimeŽ  s    zUtimeTests.test_utimec                 C   s   | d d S )Nr   g•Ö&è.>r   r(  r   r   r	   Ú	ns_to_sec”  s    zUtimeTests.ns_to_secc                    s   ‡ fdd„}ˆ   |¡ d S )Nc                    s0   |\}}ˆ   |¡}ˆ   |¡}t | ||f¡ d S r#   ©r0  r   r+  ©r   r)  r$  r%  ZatimeÚmtimerJ   r   r	   r#    s    

z2UtimeTests.test_utime_by_indexed.<locals>.set_timer-  r.  r   rJ   r	   Útest_utime_by_indexed›  s    z UtimeTests.test_utime_by_indexedc                    s   ‡ fdd„}ˆ   |¡ d S )Nc                    s2   |\}}ˆ   |¡}ˆ   |¡}tj| ||fd d S )N)Útimesr1  r2  rJ   r   r	   r#  §  s    

z0UtimeTests.test_utime_by_times.<locals>.set_timer-  r.  r   rJ   r	   Útest_utime_by_times¦  s    zUtimeTests.test_utime_by_timesz9follow_symlinks support for utime required for this test.c                 C   s   dd„ }|   |¡ d S )Nc                 S   s   t j| |dd d S )NF)r)  Úfollow_symlinksr*  r,  r   r   r	   r#  ³  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   s   dd„ }|   |¡ d S )Nc                 S   sB   t | ddƒ"}tj| ¡ |d W d   ƒ n1 s40    Y  d S )NÚwbr   r(  )r   r   r+  rl   )r   r)  r    r   r   r	   r#  ¼  s    z*UtimeTests.test_utime_fd.<locals>.set_timer-  r.  r   r   r	   Útest_utime_fd¹  s    zUtimeTests.test_utime_fdz0dir_fd support for utime required for this test.c                 C   s   dd„ }|   |¡ d S )Nc                 S   sN   t j | ¡\}}t |¡ }t j|||d W d   ƒ n1 s@0    Y  d S )N)rž   r)  )r   r1   r×   r   Úopen_dir_fdr+  )r   r)  r;   r   Údirfdr   r   r	   r#  Æ  s    z.UtimeTests.test_utime_dir_fd.<locals>.set_timer-  r.  r   r   r	   Útest_utime_dir_fdÃ  s    zUtimeTests.test_utime_dir_fdc                 C   s   dd„ }| j || jd d S )Nc                 S   s   t j| |d d S r'  r*  r,  r   r   r	   r#  Î  s    z1UtimeTests.test_utime_directory.<locals>.set_time©r   )r&  r;   r.  r   r   r	   Útest_utime_directoryÍ  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À   r  r   r˜   r  rØ   )r(   r#  ÚcurrentrÆ   r  r@  r   r   r	   Ú_test_utime_currentÓ  s    
ÿ
ÿzUtimeTests._test_utime_currentc                    s   ‡ fdd„}ˆ   |¡ d S )Nc                    s   t  ˆ j¡ d S r#   ©r   r+  rÀ   r>  rJ   r   r	   r#  ê  s    z/UtimeTests.test_utime_current.<locals>.set_time©rC  r.  r   rJ   r	   Útest_utime_currenté  s    zUtimeTests.test_utime_currentc                    s   ‡ fdd„}ˆ   |¡ d S )Nc                    s   t  ˆ jd ¡ d S r#   rD  r>  rJ   r   r	   r#  ð  s    z3UtimeTests.test_utime_current_old.<locals>.set_timerE  r.  r   rJ   r	   Útest_utime_current_oldï  s    z!UtimeTests.test_utime_current_oldc                 C   sl   t jdkrhtj tj |¡¡d d }dd l}|jj}| 	dd¡}| 
|d dd d d |t|ƒ¡}|rh|jS d S )Nr‡   r   ú\Ú r‘   )ra   r½   r   r1   r  ÚabspathÚctypesÚwindllÚkernel32Zcreate_unicode_bufferZGetVolumeInformationWr-   rú   )r(   r1   ÚrootrK  rM  Ú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 NTFSr  )	rQ  r;   rZ   r   r+  rÀ   r0   r˜   r  )r(   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 s20    Y  |   t¡" t | jddg¡ W d   ƒ n1 sn0    Y  |   t¡ t | jd¡ W d   ƒ n1 s¦0    Y  |   t¡ t | jd¡ W d   ƒ n1 sÞ0    Y  |   t¡$ tj| jddgd W d   ƒ n1 s0    Y  |   t¡  tj| jdd W d   ƒ n1 sZ0    Y  |   t¡  tj| jdd W d   ƒ n1 s–0    Y  tjtjvrì|   t¡" tj| jddd W d   ƒ n1 sâ0    Y  tjtjvrft	| jdd	ƒL}|   t¡  t | 
¡ d¡ W d   ƒ n1 s<0    Y  W d   ƒ n1 s\0    Y  tjtjvr²|   t¡" tj| jdd	d
 W d   ƒ n1 s¨0    Y  d S )N)r¬   r¬   r(  r¬   )r¬   )r¬   r¬   r¬   F©r7  r9  r   ©rž   )r\   r©   r   r+  rÀ   rc   Úsupports_follow_symlinksr¦   Úsupports_fdr   rl   Úsupports_dir_fd)r(   r    r   r   r	   Útest_utime_invalid_arguments  s0    00,,4002Pz'UtimeTests.test_utime_invalid_argumentsc                 C   sÒ   dd„ }|   t¡( tj| j|dƒdfd W d   ƒ n1 s@0    Y  |   t¡( tj| j|dƒdfd W d   ƒ n1 s‚0    Y  |   t¡( tj| j|dƒdfd W d   ƒ n1 sÄ0    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__.  s    zJUtimeTests.test_issue31577.<locals>.get_bad_int.<locals>.BadInt.__divmod__N)rC   rD   rE   r[  r   rY  r   r	   ÚBadInt-  s   r\  r   )rZ  r\  r   rY  r	   Úget_bad_int,  s    z/UtimeTests.test_issue31577.<locals>.get_bad_inté*   rU   r(  r   )rU   rW   r¸   )r\   rc   r   r+  rÀ   )r(   r]  r   r   r	   Útest_issue31577(  s    66zUtimeTests.test_issue31577)N)rC   rD   rE   rK   r  r&  r/  Ústaticmethodr0  r4  r6  r   r   r   r+  rU  r8  rV  r:  rW  r=  r?  rC  rF  rG  rQ  rR  rX  r   r¼   r_  r   r   r   r	   r  ^  s:   

	ÿ
ÿ
ÿ

r  )Úmapping_testsc                   @   s  e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Ze	 
eoBej e¡d¡dd„ ƒZe	 
eobej e¡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-d.„ Z!d/d0„ Z"d1d2„ Z#d3d4„ Z$d5d6„ Z%dS )7Ú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©r(   Úkeyrú   r   r   r	   rK   ?  s
    zEnvironTests.setUpc                 C   s:   t j ¡  t j | j¡ t jr6t j ¡  t j | j¡ d S r#   )r   r  ÚclearÚupdaterd  re  rf  rg  rJ   r   r   r	   r»   F  s
    

zEnvironTests.tearDownc                 C   s   ddddœS )NZVALUE1ZVALUE2ZVALUE3)ZKEY1ZKEY2ZKEY3r   rJ   r   r   r	   rh  M  s    zEnvironTests._referencec                 C   s   t j ¡  t jS r#   )r   r  rl  rJ   r   r   r	   Ú_empty_mappingP  s    
zEnvironTests._empty_mappingzrequires a shellc                 C   sb   t j ¡  t jjdd t  dt ¡(}| ¡  ¡ }|  |d¡ W d   ƒ n1 sT0    Y  d S )NZWorld)ZHELLOz%s -c 'echo $HELLO')	r   r  rl  rm  Úpopenr   rn   Ústripr0   )r(   ro  rú   r   r   r	   Útest_update2U  s
    
zEnvironTests.test_update2c                 C   sx   t  dt ¡V}t|ƒ}|  t|ƒd¡ |  t|ƒd¡ |  t|ƒd¡ |  tt|¡ W d   ƒ n1 sj0    Y  d S )Nz %s -c 'echo "line1
line2
line3"'zline1
zline2
zline3
)r   ro  r   Úiterr0   Únextr\   ÚStopIteration)r(   ro  Ú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  ri  r0   ro   r&   )r(   rk  Úvalr   r   r	   Útest_keyvalue_typesk  s    z EnvironTests.test_keyvalue_typesc                 C   s.   |   ¡  ¡ D ]\}}|  tj |¡|¡ qd S r#   )rh  ri  r0   r   r  Úgetrj  r   r   r	   Ú
test_itemsp  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   rk  rú   r   r   r	   Ú	<genexpr>x  s   ÿz-EnvironTests.test___repr__.<locals>.<genexpr>N)r   r  r0   Úreprr|  r3   ri  )r(   Úenvr   r   r	   Útest___repr__u  s    þzEnvironTests.test___repr__c                 C   sZ  t j t j¡}g d¢}dt j |¡i}t j}z8t|ƒt _|  |t  ¡ ¡ |  |t jd d¡ W |t _n|t _0 |  |t  i ¡¡ |  dt  ddi¡¡ |  |t  |¡¡ t j	rVz:t
jdd dd	d
œ}W d   ƒ n1 sÞ0    Y  W n tyü   Y n0 |  tt j|¡ |  t  ddi¡dg¡ |  t  ddi¡dg¡ |  t  ddi¡dg¡ d S )N)z/montyz/pythonrI  z/flying/circusÚPATH©r  ©rI  rI  T)Úrecordr–   r•   )r  ó   PATHr…  ó   abcÚabc)r   Údefpathr×   Úpathsepr3   r  rc  ÚassertSequenceEqualÚget_exec_pathre  ÚwarningsÚcatch_warningsÚBytesWarningr\   r©   )r(   Zdefpath_listZ	test_pathZtest_envZsaved_environZ	mixed_envr   r   r	   Útest_get_exec_path|  s8    
,ÿÿÿzEnvironTests.test_get_exec_pathz#os.environb required for this test.c                 C   s¸   d}z|  t ¡ d¡}W n* tyB   dt ¡ f }|  |¡ Y n0 |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   bytesr@   )
ræ   ra   rç   rè   rZ   r   r  r0   rf  Údecode)r(   rú   Zvalue_bytesr@  Z	value_strr   r   r	   Útest_environb¥  s$    
ÿÿ

zEnvironTests.test_environbc                 C   sÆ   d}d}d|›d}t  ¡ –}| |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   ƒ n1 s¸0    Y  d S )NZPYTHONTESTVARZ	testvaluez%import os; print(repr(os.environ.get(z)))rˆ   T)ÚcheckÚstdoutÚtext)r   ZEnvironmentVarGuardÚpopr   Úputenvr‚   Úrunra   r‰   ÚPIPEr0   r–  Úrstripr~  Úunsetenv)r(   r   rú   r‹   r  Úprocr   r   r	   Útest_putenv_unsetenv¼  s    
ÿ
ÿz!EnvironTests.test_putenv_unsetenvrV   r­   c                 C   s~   dD ].}|   ttftj|d¡ |   ttftj|¡ qtjdkrzdd }|   ttj|d¡ |   ttjd|¡ |   ttj|¡ d S )N)rI  z=namezna=mezname=zname zna merú   r‡   rÃ   é €  r–   ÚX)r\   r7   r©   r   r™  r  ra   r½   )r(   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<0    Y  |  |jjd |¡ |  |jj	¡ |  t¡}tj|= W d   ƒ n1 s0    Y  |  |jjd |¡ |  |jj	¡ d S )NZ
missingkeyr   )
ÚassertNotInr   r  r\   ÚKeyErrorÚassertIsr  r„   rO   Ú__suppress_context__)r(   ÚmissingÚcmr   r   r	   Útest_key_typeß  s    (&zEnvironTests.test_key_typec                 C   sT   t |ƒ}d}t|ƒ dtj|< z&t|ƒ |  tj| d¡ W tj|= n
tj|= 0 d S )NZ__new_key__Ztest_environ_iteration)rr  rs  r   r  r0   )r(   Z
collectionÚiteratorZnew_keyr   r   r	   Ú_test_environ_iterationí  s    
z$EnvironTests._test_environ_iterationc                 C   s   |   tj¡ d S r#   )r«  r   r  rJ   r   r   r	   Ú(test_iter_error_when_changing_os_environü  s    z5EnvironTests.test_iter_error_when_changing_os_environc                 C   s   |   tj ¡ ¡ d S r#   )r«  r   r  ri  rJ   r   r   r	   Ú.test_iter_error_when_changing_os_environ_itemsÿ  s    z;EnvironTests.test_iter_error_when_changing_os_environ_itemsc                 C   s   |   tj ¡ ¡ d S r#   )r«  r   r  ÚvaluesrJ   r   r   r	   Ú/test_iter_error_when_changing_os_environ_values  s    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 sL0    Y  |  ||¡ d S )Nz -c 'echo $ú')r   r   r1   Úexistsro  rn   rp  r0   )r(   Úvarr<   ro  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Ú3rI  )r   r  rc  rm  ÚassertDictEqualr0   ri  r¥  ÚNotImplementedÚ__or__r³  ©r(   Úoverridden_keyr¶  Únew_vars_dictr<   Ú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  rc  rm  r0   r³  )r(   r¿  rÀ  r<   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@0    Y  |  t¡& ddi}t  j|O  _W d   ƒ n1 s€0    Y  |  |t j¡ d S )NrU   r·  )r   r  Úcopyr\   rc   r0   )r(   Zos_environ_copyZdict_with_bad_keyZdict_with_bad_valr   r   r	   Útest_ior_operator_invalid_dicts0  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Ä  )r(   r¿  rÂ  r<   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  rc  rm  r»  r0   ri  r¥  r¼  Ú__ror__r³  r¾  r   r   r	   Útest_ror_operatorL  s    

zEnvironTests.test_ror_operator)&rC   rD   rE   Ú__doc__Z	type2testrK   r»   rh  rn  r   r   r   r   r1   r±  rq  rv  rx  rz  r€  r  re  r”  rŸ  r   Zrequires_mac_verr¢  r©  r«  r¬  r­  r¯  r³  rÃ  rÅ  rÇ  rÈ  rÊ  r   r   r   r	   rb  ;  sH   ÿ
ÿ
)ÿ


	rb  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 ©Nr7  Úfollowlinks)r˜  r   Úwalk)r(   ÚtopÚkwargsr   r   r	   rÏ  e  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 ]H}t|ddd"}| d| d ¡ W d   ƒ n1 s<0    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 n40 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Ã   úutf-8©ÚencodingzI'm z" and proud of it.  Blame test_os.
ÚbrokenTZtmp5)rÚ  rÛ  rÜ  r×  r   rU   )r   r1   r3   rw   r   r  rH   Ú	walk_pathÚ	sub1_pathÚ
sub11_pathÚ	link_pathÚmakedirsr   r   Úcan_symlinkr¡   rJ  Ú	sub2_treeÚchmodÚlistdirÚPermissionErrorr˜   ÚS_IRWXUrI   r  )r(   r3   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_pathr1   rS   r   r   r	   rK   j  sT    








6
ÿ

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 )Nrj   r   rU   rÒ  r¸   rW   éÿÿÿÿrÔ  rÕ  rÓ  rÖ  )	ÚlistrÏ  rá  r0   r-   Úsortrâ  rã  rç  ©r(   Ú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Ò  rW   r   rÔ  rÕ  rU   rì  )rá  rÏ  ÚappendÚremover0   r-   rî  rç  )r(   rá  rð  rN  Údirsró   r   r   r	   Útest_walk_pruneÀ  s    zWalkTests.test_walk_prunec                 C   s   |   t| jƒ¡ d S r#   )rõ  r   rá  rJ   r   r   r	   Útest_file_like_pathÓ  s    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©Útopdownrj   r¸   rU   r   rÒ  rW   rì  rÔ  rÕ  rÓ  rÖ  )	rí  rÏ  rá  r0   r-   rî  rã  râ  rç  rï  r   r   r	   Útest_walk_bottom_upÖ  s$    
ÿ

ÿÿÿzWalkTests.test_walk_bottom_upc                 C   sh   t  ¡ s|  d¡ | j| jdd}|D ]2\}}}|| jkr&|  |g ¡ |  |dg¡  qdq&|  d¡ d S )Nzneed symlink supportTrS  rÙ  z+Didn't follow symlink with followlinks=True)r   ræ  rZ   rÏ  rá  rä  r0   rÙ   )r(   Úwalk_itrN  rô  ró   r   r   r	   Útest_walk_symlinkë  s    

zWalkTests.test_walk_symlinkc              
   C   sÜ   g }| j | j|jd}t|ƒ\}}}|  |g ¡ d}tj ||¡}tj ||d ¡}t ||¡ zhdd„ |D ƒ}	|  	|¡ |  
||	¡ |  
||	¡ |D ]"}
|
|kr–|  tj ||
¡|	¡ q–W t ||¡ nt ||¡ 0 d S )N)ÚonerrorrÒ  z.newc                 S   s   g | ]\}}}|‘qS r   r   )r   r   ÚdrS   r   r   r	   r
     r   z/WalkTests.test_walk_bad_dir.<locals>.<listcomp>)rÏ  rá  rò  rs  r0   r   r1   r3   rd   rO   r£  r¯   )r(   Úerrorsrú  rN  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 ]>}||rldgng g f}|D ]}ˆ t|ƒ|¡ qxt j 	|¡}q\‡ ‡fdd„tdƒD ƒ}ˆ }t|d ƒD ]D}|||k rØdgng g f}|D ]}ˆ t|ƒ|¡ qät j |d¡}qÄd S )	Né   Zdeeprý  c                    s   g | ]}ˆj ˆ d d‘qS )Fr÷  ©rÏ  ©r   Új©Úbaser(   r   r	   r
     r   z7WalkTests.test_walk_many_open_files.<locals>.<listcomp>r‘   rU   c                    s   g | ]}ˆj ˆ d d‘qS )Tr÷  r  r  r  r   r	   r
     r   )
r   r1   r3   r   rH   rå  r°   r0   rs  r;   )r(   Údepthrð   Zitersrµ   r<   ru  r   r  r	   Útest_walk_many_open_files  s"    
z#WalkTests.test_walk_many_open_files)N)rC   rD   rE   rË  rÏ  rK   rñ  rõ  rö  rù  rû  r  r
  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   s0   | j |fi |¤ŽD ]\}}}}|||fV  qd S r#   )r  )r(   rÐ  rÑ  rN  rô  ró   Zroot_fdr   r   r	   rÏ  (  s    zFwalkTests.walkc                 O   s   t j|i |¤ŽS r#   )r   r  ©r(   r„   rÑ  r   r   r	   r  ,  s    zFwalkTests.fwalkc           
      C   sÂ   |  ¡ }|  ¡ }tjdddD ]ž\}}|j||d |j||d i }tjf i |¤ŽD ]\}}}t|ƒt|ƒf||< qV| jf i |¤ŽD ]4\}}}}	|  ||¡ |  	|| t|ƒt|ƒf¡ q†qdS )z.
        compare with walk() results.
        ©TFrW   ©Úrepeat)rø  rÎ  )rø  r7  N)
rÆ  Ú	itertoolsÚproductrm  r   rÏ  Úsetr  r¯   r0   )
r(   Úwalk_kwargsÚfwalk_kwargsrø  r7  r<   rN  rô  ró   Úrootfdr   r   r	   Ú_compare_to_walk/  s    zFwalkTests._compare_to_walkc                 C   s   dt ji}|  ||¡ d S )NrÐ  )r   rH   r  )r(   rÑ  r   r   r	   Útest_compare_to_walkA  s    
zFwalkTests.test_compare_to_walkc              	   C   sT   zBt  dt j¡}dtji}| ¡ }||d< |  ||¡ W t  |¡ nt  |¡ 0 d S )NÚ.rÐ  rž   )r   r   r   r   rH   rÆ  r  rN   )r(   rq   r  r  r   r   r	   Útest_dir_fdE  s    
zFwalkTests.test_dir_fdc                 C   s|   t jdddD ]h\}}tj|d f}| j|d|iŽD ]B\}}}}t |¡ t |¡ |  t	t 
|¡ƒt	|ƒt	|ƒB ¡ q2qd S )Nr  rW   r  r7  )r  r  r   rH   r  r   Úfstatr˜   r0   r  ré  )r(   rø  r7  r„   rN  rô  ró   r  r   r   r	   Útest_yields_correct_dir_fdO  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 )NrU   é   )	r   rY   rN   r°   r  r   rH   rw   r0   )r(   Zminfdrµ   rÃ   Znewfdr   r   r	   Útest_fd_leak[  s    


zFwalkTests.test_fd_leakN)rC   rD   rE   rË  rÏ  r  r  r  r  r  r  r
  r   r   r   r	   r  $  s   
r  c                   @   s   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 ]p\}}}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Ï  ÚfsencoderA   rí  Úmap)	r(   rÐ  rÑ  ÚbrootÚbdirsÚbfilesrN  rô  ró   r   r   r	   rÏ  n  s    "
zBytesWalkTests.walkN)rC   rD   rE   rË  rÏ  r   r   r   r	   r  l  s   r  c                   @   s   e Zd ZdZddd„ZdS )ÚBytesFwalkTestsr   r  c                 o   s˜   t jt  |¡g|¢R i |¤ŽD ]t\}}}}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!  rA   rí  r"  )r(   rÐ  r„   rÑ  r#  r$  r%  ÚtopfdrN  rô  ró   r   r   r	   r  |  s    *
zBytesFwalkTests.fwalkN)r  )rC   rD   rE   rË  r  r   r   r   r	   r&  y  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   s   t  tj¡ d S r#   ©r   r4   r   rH   rJ   r   r   r	   rK   ‡  s    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 ©Nrÿ  r  Zdir3Zdir4Zdir5Zdir6)	r   rH   r   r1   r3   rå  r\   r7   Úcurdir)r(   r  r1   r   r   r	   Útest_makedirŠ  s    


ÿzMakedirTests.test_makedirc                 C   sº   t  d¡œ t j}tj |d¡}tj |d¡}t |d¡ |  tj |¡¡ |  tj 	|¡¡ tj
dkr˜|  t |¡jd@ d¡ |  t |¡jd@ d¡ W d   ƒ n1 s¬0    Y  d S )NrW   rÿ  r  im  Úntr›   iý  )r   Z
temp_umaskrH   r   r1   r3   rå  rO   r±  Úisdirr   r0   r˜   rÛ   )r(   r  Úparentr1   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 )
Nrÿ  r›   é   F©Úexist_okiþ  T)r   r3  ú/)
r   r1   r3   r   rH   Úumaskrå  r\   r7   rJ  )r(   r1   r   Úold_maskr   r   r	   Ú test_exist_ok_existing_directory¥  s    

z-MakedirTests.test_exist_ok_existing_directoryc              	   C   s   t j tjd¡}tj}d}t  d¡}zÊt t  	tj¡j
¡}zt  tj||B ¡ W n tyl   t d¡‚Y n0 t  	tj¡j
|@ |krŽt d¡‚t  |||B ¡ t j||dd t  |t t  	|¡j
¡| @ ¡ t j|||B dd W t  |¡ nt  |¡ 0 d S )Nrÿ  r›   r1  zCannot set S_ISGID for dir.z No support for S_ISGID dir mode.Tr2  )r   r1   r3   r   rH   r˜   ÚS_ISGIDr5  ÚS_IMODEÚlstatrÛ   rè  rê  r   ÚSkipTestrå  )r(   r1   r8  r   r6  Zexisting_testfn_moder   r   r	   Útest_exist_ok_s_isgid_directory³  s&    
ÿ
 z,MakedirTests.test_exist_ok_s_isgid_directoryc                 C   s   t j}tj t jd¡}t|dƒ}| d¡ W d   ƒ n1 s@0    Y  |  ttj	|¡ | jttj	|dd | jttj	|dd t 
|¡ d S )Nrÿ  r  r‡  Fr2  T)r   rH   r   r1   r3   r   r   r\   r7   rå  ró  )r(   r  r1   rS   r   r   r	   Ú#test_exist_ok_existing_regular_fileÎ  s    (z0MakedirTests.test_exist_ok_existing_regular_filer-  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   rH   r   r1   rJ  r3   r4   r‚   Úcheck_outputr  r0   rp  )r(   r  r1   Úoutr   r   r	   Útest_win32_mkdir_700Ø  s    
þz!MakedirTests.test_win32_mkdir_700c              	   C   sL   t j tjdddddd¡}t j |¡s>|tjkr>t j |¡}qt  |¡ d S r*  )r   r1   r3   r   rH   r±  r;   Ú
removedirs©r(   r1   r   r   r	   r»   ä  s    ÿzMakedirTests.tearDownN)rC   rD   rE   rK   r,  r0  r7  r<  r=  r   r   r   r   r@  r»   r   r   r   r	   r(  †  s   

r(  Ú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oHeeƒd	kd
¡dd„ ƒZe e ojeeƒd	kd¡dd„ ƒZedd„ ƒZdS )ÚChownFileTestsc                 C   s   t  tj¡ d S r#   r)  ©Úclsr   r   r	   Ú
setUpClassó  s    zChownFileTests.setUpClassc                 C   s”   t  tj¡}|j}|j}ddt d¡t 	dd¡fD ]0}|  
tt jtj||¡ |  
tt jtj||¡ q2|  t  tj||¡¡ |  t  tjdd¡¡ d S )Ng      ð¿y       €      ð¿rì  éþÿÿÿrW   )r   r˜   r   rH   Úst_uidÚst_gidÚdecimalZDecimalÚ	fractionsZFractionr\   rc   rC  ÚassertIsNone)r(   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 )NrW   ztest needs at least 2 groups)r   rQ  r-   rZ   r˜   r   rH   rI  rC  rJ  r0   )r(   ÚgroupsZgid_1Zgid_2rN  rO  r   r   r	   Útest_chown_gid  s    
zChownFileTests.test_chown_gidrU   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 ©NrW   )	Ú	all_usersr   r˜   r   rH   rJ  rC  rI  r0   )r(   Úuid_1Úuid_2rO  rN  r   r   r	   Útest_chown_with_root  s    z#ChownFileTests.test_chown_with_rootz2test needs non-root account and more than one userc                 C   sl   t d d… \}}t tj¡j}|  t¡0 t tj||¡ t tj||¡ W d   ƒ n1 s^0    Y  d S rT  )	rU  r   r˜   r   rH   rJ  r\   rê  rC  )r(   rV  rW  rO  r   r   r	   Útest_chown_without_permission  s
    z,ChownFileTests.test_chown_without_permissionc                 C   s   t  tj¡ d S r#   )r   r  r   rH   rE  r   r   r	   ÚtearDownClass'  s    zChownFileTests.tearDownClassN)rC   rD   rE   ÚclassmethodrG  rP  r   r   r   r   rS  Úroot_in_posixr-   rU  rX  rY  rZ  r   r   r   r	   rD  ð  s   


ÿ

ÿ
rD  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚRemoveDirsTestsc                 C   s   t  tj¡ d S r#   )r   rå  r   rH   rJ   r   r   r	   rK   -  s    zRemoveDirsTests.setUpc                 C   s   t  t j¡ d S r#   )r   r  rH   rJ   r   r   r	   r»   0  s    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   r1   r3   r   rH   r4   rA  ÚassertFalser±  ©r(   r^  r_  r   r   r	   Útest_remove_all3  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   r1   r3   r   rH   r4   r!   rA  r`  r±  rO   ra  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 sn0    Y  |  
t j |¡¡ |  
t j |¡¡ |  
t j tj¡¡ d S rc  )r   r1   r3   r   rH   r4   r!   r\   r7   rA  rO   r±  ra  r   r   r	   Útest_remove_nothingH  s    

(z#RemoveDirsTests.test_remove_nothingN)rC   rD   rE   rK   r»   rb  re  rf  r   r   r   r	   r]  ,  s
   
r]  c                   @   s   e Zd Zdd„ ZdS )ÚDevNullTestsc                 C   s€   t tjddƒ"}| d¡ | ¡  W d   ƒ n1 s60    Y  t tjdƒ }|  | ¡ d¡ W d   ƒ n1 sr0    Y  d S )Nr9  r   ó   hellorv   r   )r   r   Údevnullr   rN   r0   rn   rR   r   r   r	   Útest_devnullV  s
    
&zDevNullTests.test_devnullN)rC   rD   rE   rj  r   r   r   r	   rg  U  s   rg  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   rU   rV   r‘   iè  )r0   r-   r   ÚurandomrJ   r   r   r	   Útest_urandom_length_  s
    z URandomTests.test_urandom_lengthc                 C   s0   t  d¡}|  |t¡ t  d¡}|  ||¡ d S ©Né   )r   rl  r%   r@   r  ©r(   Zdata1Zdata2r   r   r	   Útest_urandom_valuef  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ˆ   rU   )r3   r   r0   r-   )r(   Úcountr‹   r?  r–  r   r   r	   Úget_urandom_subprocessl  s    ü
z#URandomTests.get_urandom_subprocessc                 C   s$   |   d¡}|   d¡}|  ||¡ d S rn  )rt  r  rp  r   r   r	   Útest_urandom_subprocessw  s    

z$URandomTests.test_urandom_subprocessN)rC   rD   rE   rm  rq  rt  ru  r   r   r   r	   rk  ^  s   rk  Ú	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   sR   zt  d¡ W n> tyL } z&|jtjkr6t d¡‚n‚ W Y d }~n
d }~0 0 d S )NrU   z%getrandom() syscall fails with ENOSYS)r   rv  r7   r8   r®   r   r;  )rF  r=   r   r   r	   rG    s    zGetRandomTests.setUpClassc                 C   s*   t  d¡}|  |t¡ |  t|ƒd¡ d S rn  )r   rv  r%   r@   r0   r-   ©r(   rx   r   r   r	   Útest_getrandom_type‹  s    
z"GetRandomTests.test_getrandom_typec                 C   s   t  d¡}|  |d¡ d S )Nr   r   )r   rv  r0   )r(   Úemptyr   r   r	   Útest_getrandom0  s    
zGetRandomTests.test_getrandom0c                 C   s   |   ttdƒ¡ d S )NÚGRND_RANDOM)rO   r   r   rJ   r   r   r	   Útest_getrandom_random”  s    z$GetRandomTests.test_getrandom_randomc                 C   s*   zt  dt j¡ W n ty$   Y n0 d S ©NrU   )r   rv  ÚGRND_NONBLOCKÚBlockingIOErrorrJ   r   r   r	   Útest_getrandom_nonblockš  s    z&GetRandomTests.test_getrandom_nonblockc                 C   s$   t  d¡}t  d¡}|  ||¡ d S rn  )r   rv  r  rp  r   r   r	   Útest_getrandom_value¢  s    

z#GetRandomTests.test_getrandom_valueN)
rC   rD   rE   r[  rG  ry  r{  r}  r  r‚  r   r   r   r	   rw  }  s   
rw  ZHAVE_GETENTROPYrU   ZHAVE_GETRANDOMZHAVE_GETRANDOM_SYSCALLz*os.random() does not use a file descriptorZvxworksz$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_failure´  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   )r(   r‹   Úrcr?  Úerrr   r   r	   Útest_urandom_fd_closedË  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))
            )rH   r…  rË   r   rj   )
rw   r   rI   rH   r!   r|  r   r0   r-   r  )r(   r‹   r†  r?  r‡  Zout2Zerr2r   r   r	   Útest_urandom_fd_reopenedÙ  s    èz'URandomFDTests.test_urandom_fd_reopenedN)	rC   rD   rE   r   r   Úresourcer„  rˆ  r‰  r   r   r   r	   rƒ  ¯  s   

rƒ  c                 #   s~   g ‰ ‡ fdd„}‡ fdd„}zHt j}t j}t j}|t _|t _| durJ| t _ˆ V  W |t _|t _|t _n|t _|t _|t _0 dS )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ƒ‚d S )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ƒ‚d S )NÚexecvezexecve called)rò  r7   r8   Ú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-)r\   r7   r   ÚexecvperJ   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ƒ  rI  )r\   r©   r   r‹  rJ   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˜  rI  )r\   r©   r   r–  rJ   r   r   r	   Útest_execvpe_with_bad_arglist0  s    z'ExecTests.test_execvpe_with_bad_arglistÚ_execvpez)No internal os._execvpe function to test.c           
      C   sÐ  t jd }|tu r8d}t j t  |¡|¡}|}g d¢}n4d}g d¢}t j ||¡}t jdkrht  |¡}n|}ddi}tƒ J}|  t	t j
||¡ |  t|ƒd	¡ |  |d
 d||ff¡ W d   ƒ n1 sÊ0    Y  t|dP}| jtt j
|||d |  t|ƒd	¡ |  |d
 d|||ff¡ W d   ƒ n1 s60    Y  tƒ t}| ¡ }	|tu rd||	d< n||	d< | jtt j
|||	d |  t|ƒd	¡ |  |d
 d|||	ff¡ W d   ƒ n1 sÂ0    Y  d S )NZabsolutepaths
   executable)s   prognameÚarg1Úarg2r‰   )Zprognamerœ  r  r-  Zspamrz   rU   r   r‹  )rˆ  r‚  r‘  r…  r  )r   r2   r@   r1   r3   r!  r   r”  r\   rŒ  r›  r0   r-   r7   rŠ  rÆ  )
r(   Z	test_typeZprogram_pathZprogramÚfullpathZnative_fullpathZ	argumentsr  r  Zenv_pathr   r   r	   Ú_test_internal_execvpe5  sN    


ÿ6
ÿ
ÿ$


ÿ
ÿz ExecTests._test_internal_execvpec                 C   s"   |   t¡ tjdkr|   t¡ d S )Nr-  )rŸ  r&   r   r   r@   rJ   r   r   r	   Útest_internal_execvpe_strf  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 sP0    Y  tj ¡ }d|d< |  t¡" t |d ||¡ W d   ƒ n1 sž0    Y  tj ¡ }d|d	< |  t¡" t |d ||¡ W d   ƒ n1 sì0    Y  d S )
Nrˆ   ÚpassÚcabbageúFRUIT VEGETABLEr   úorange VEGETABLE=cabbageÚFRUITÚlemonúFRUIT=ORANGE)ra   r‰   r   r  rÆ  r\   r©   r‘  )r(   r„   Únewenvr   r   r	   Útest_execve_invalid_envk  s    
0
0
z!ExecTests.test_execve_invalid_envr‡   zWin32-specific testc              
   C   sb   zt  ddgi ¡ W n> tyR } z&|  |jd u p:|jdk¡ W Y d }~nd }~0 0 |  d¡ d S )NrI  Úargr   zNo OSError raised)r   r‘  r7   rO   ÚwinerrorrÙ   r   r   r   r	   Útest_execve_with_empty_path€  s
    0z%ExecTests.test_execve_with_empty_pathN)rC   rD   rE   r   ÚskipIfÚUSING_LINUXTHREADSr—  r™  rš  r   r   r   rŸ  r   r©  ra   r½   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   sv   zt  tj¡ W nP ty&   d}Y nL ty` } z$d}|  dtj|f ¡ W Y d }~nd }~0 0 |  dtj ¡ d S )NFTz.file %s must not exist; os.stat failed with %szfile %s must not exist)r   r˜   r   rH   r6   r7   rÙ   )r(   r±  r=   r   r   r	   rK     s    ÿzWin32ErrorTests.setUpc                 C   s   |   ttjtjtjd ¡ d S )Nz.bak)r\   r7   r   rd   r   rH   rJ   r   r   r	   rg   ™  s    zWin32ErrorTests.test_renamec                 C   s   |   ttjtj¡ d S r#   )r\   r7   r   ró  r   rH   rJ   r   r   r	   Útest_removeœ  s    zWin32ErrorTests.test_removec                 C   s   |   ttjtj¡ d S r#   )r\   r7   r   r5   r   rH   rJ   r   r   r	   Ú
test_chdirŸ  s    zWin32ErrorTests.test_chdirc                 C   sR   |   tjtj¡ ttjdƒ"}|  ttjtj¡ W d   ƒ n1 sD0    Y  d S )NrÃ   )	rw   r   rI   rH   r   r\   r7   r   r4   rR   r   r   r	   Ú
test_mkdir¢  s    zWin32ErrorTests.test_mkdirc                 C   s   |   ttjtjd ¡ d S r#   )r\   r7   r   r+  r   rH   rJ   r   r   r	   r/  ¨  s    zWin32ErrorTests.test_utimec                 C   s   |   ttjtjd¡ d S r`   )r\   r7   r   rè  r   rH   rJ   r   r   r	   Ú
test_chmod«  s    zWin32ErrorTests.test_chmodN)
rC   rD   rE   rK   rg   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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d;d<„ Ze 	e
ed=ƒd>¡d?d@„ ƒZdAS )BÚTestInvalidFD)	ÚfchdirrY   rŽ   Ú	fdatasyncr  ÚfstatvfsÚfsyncÚ	tcgetpgrpÚttynamec                    s   ‡ fdd„}|S )Nc                    s   t tˆ ƒr|  ttˆ ƒ¡ d S r#   )r   r   r•  rÖ   rJ   ©rS   r   r	   Úhelperµ  s    
z(TestInvalidFD.get_single.<locals>.helperr   )rS   r¼  r   r»  r	   Ú
get_single´  s    zTestInvalidFD.get_singleZtest_c              
   G   s`   z|t  ¡ g|¢R Ž  W n4 tyL } z|  |jtj¡ W Y d }~nd }~0 0 |  d| ¡ d S )Nz5%r didn't raise an OSError with a bad file descriptor)r   Úmake_bad_fdr7   r0   r8   r  rÙ   )r(   rS   r„   r¶   r   r   r	   r•  ¼  s    &ÿzTestInvalidFD.checkÚisattyztest needs os.isatty()c                 C   s   |   t t ¡ ¡d¡ d S ©NF)r0   r   r¿  r   r¾  rJ   r   r   r	   Útest_isattyÅ  s    zTestInvalidFD.test_isattyr[   ztest needs os.closerange()c              	   C   sr   t  ¡ }tdƒD ].}zt || ¡ W n ty8   Y q0  q@q|dk rRt d¡‚|  t 	||| d ¡d ¡ d S )NrV   rW   z5Unable to acquire a range of invalid file descriptorsrU   )
r   r¾  r°   r   r  r7   r   r;  r0   r[   )r(   rq   rµ   r   r   r	   r_   É  s    ÿzTestInvalidFD.test_closerangeÚdup2ztest needs os.dup2()c                 C   s   |   tjd¡ d S )Né   )r•  r   rÂ  rJ   r   r   r	   Ú	test_dup2Ù  s    zTestInvalidFD.test_dup2Úfchmodztest needs os.fchmod()c                 C   s   |   tjd¡ d S r`   )r•  r   rÅ  rJ   r   r   r	   Útest_fchmodÝ  s    zTestInvalidFD.test_fchmodÚfchownztest needs os.fchown()c                 C   s   |   tjdd¡ d S )Nrì  )r•  r   rÇ  rJ   r   r   r	   Útest_fchowná  s    zTestInvalidFD.test_fchownÚ	fpathconfztest needs os.fpathconf()c                 C   s    |   tjd¡ |   tjd¡ d S )NÚPC_NAME_MAX)r•  r   ÚpathconfrÉ  rJ   r   r   r	   Útest_fpathconfå  s    zTestInvalidFD.test_fpathconfÚ	ftruncateztest needs os.ftruncate()c                 C   s    |   tjd¡ |   tjd¡ d S r`   )r•  r   ÚtruncaterÍ  rJ   r   r   r	   Útest_ftruncateê  s    zTestInvalidFD.test_ftruncaterm   ztest needs os.lseek()c                 C   s   |   tjdd¡ d S r`   )r•  r   rm   rJ   r   r   r	   Ú
test_lseekï  s    zTestInvalidFD.test_lseekrn   ztest needs os.read()c                 C   s   |   tjd¡ d S r~  )r•  r   rn   rJ   r   r   r	   rs   ó  s    zTestInvalidFD.test_readÚreadvztest needs os.readv()c                 C   s   t dƒ}|  tj|g¡ d S )NrV   )r|   r•  r   rÑ  )r(   rO  r   r   r	   Ú
test_readv÷  s    zTestInvalidFD.test_readvÚ	tcsetpgrpztest needs os.tcsetpgrp()c                 C   s   |   tjd¡ d S r`   )r•  r   rÓ  rJ   r   r   r	   Útest_tcsetpgrptü  s    zTestInvalidFD.test_tcsetpgrptr   ztest needs os.write()c                 C   s   |   tjd¡ d S )Nó    )r•  r   r   rJ   r   r   r	   r      s    zTestInvalidFD.test_writeÚwritevztest needs os.writev()c                 C   s   |   tjdg¡ d S )Nr†  )r•  r   rÖ  rJ   r   r   r	   Útest_writev  s    zTestInvalidFD.test_writevc                 C   s   |   tj¡ |   tjd¡ d S ©NT)r•  r   Úget_inheritableÚset_inheritablerJ   r   r   r	   Útest_inheritable  s    zTestInvalidFD.test_inheritableÚget_blockingú-needs os.get_blocking() and os.set_blocking()c                 C   s   |   tj¡ |   tjd¡ d S rØ  )r•  r   rÜ  Úset_blockingrJ   r   r   r	   Útest_blocking  s    zTestInvalidFD.test_blockingN)rC   rD   rE   Zsinglesr½  rS   Úlocalsr•  r   r   r   r   rÁ  r_   rÄ  rÆ  rÈ  rÌ  rÏ  rÐ  rs   rÒ  rÔ  r   r×  rÛ  rß  r   r   r   r	   r´  ¯  sH   	












ÿ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   rH   Úfile1r   r1   r3   Úfile2rJ   r   r   r	   rK     s    zLinkTests.setUpc                 C   s,   | j | jfD ]}tj |¡rt |¡ qd S r#   )râ  rã  r   r1   r±  rI   )r(   Úfiler   r   r	   r»     s    zLinkTests.tearDownc              
   C   sÀ   t |ƒ zt ||¡ W n2 tyJ } z|  d| ¡ W Y d }~n
d }~0 0 t|dƒV}t|dƒ,}|  tj | 	¡ | 	¡ ¡¡ W d   ƒ n1 s”0    Y  W d   ƒ n1 s²0    Y  d S )Núos.link(): %sr   )
r!   r   rØ  rê  rZ   r   rO   r1   Úsameopenfilerl   )r(   râ  rã  r¶   r  Úf2r   r   r	   Ú
_test_link  s    $zLinkTests._test_linkc                 C   s   |   | j| j¡ d S r#   )rè  râ  rã  rJ   r   r   r	   Ú	test_link'  s    zLinkTests.test_linkc                 C   s(   |   t| jt ¡ ƒt| jt ¡ ƒ¡ d S r#   )rè  r@   râ  ra   rç   rã  rJ   r   r   r	   Útest_link_bytes*  s    ÿzLinkTests.test_link_bytesc                 C   sZ   zt  d¡ W n ty*   t d¡‚Y n0 |  jd7  _| jd | _|  | j| j¡ d S )Nõ   Ã±z#Unable to encode for this platform.r¹  )r   r!  ÚUnicodeErrorr   r;  râ  rã  rè  rJ   r   r   r	   Útest_unicode_name.  s    zLinkTests.test_unicode_nameN)	rC   rD   rE   rK   r»   rè  ré  rê  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   Úgetuidr\   r7   rð  rc   ÚOverflowErrorÚUID_OVERFLOWrJ   r   r   r	   Útest_setuid>  s    zPosixUidGidTests.test_setuidÚsetgidztest needs os.setgid()c                 C   sF   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_GROUPr\   r7   rö  rc   ró  ÚGID_OVERFLOWrJ   r   r   r	   Útest_setgidE  s    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ò  r\   r7   rú  rc   Úsetegidró  rô  rJ   r   r   r	   Útest_seteuidL  s    zPosixUidGidTests.test_seteuidrû  ztest needs os.setegid()c                 C   sF   t  ¡ dkr ts |  tt jd¡ |  tt jd¡ |  tt j| j¡ d S rñ  )	r   rò  r÷  r\   r7   rû  rc   ró  rø  rJ   r   r   r	   Útest_setegidS  s    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ò  r\   r7   rþ  rc   ró  rô  rJ   r   r   r	   Útest_setreuidZ  s    zPosixUidGidTests.test_setreuidc                 C   s   t  tjddg¡ d S )Nrˆ   z,import os,sys;os.setreuid(-1,-1);sys.exit(0)©r‚   r  ra   r‰   rJ   r   r   r	   Útest_setreuid_neg1c  s    þ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ò  r÷  r\   r7   r  rc   ró  rø  rJ   r   r   r	   Útest_setregidk  s    zPosixUidGidTests.test_setregidc                 C   s   t  tjddg¡ d S )Nrˆ   z,import os,sys;os.setregid(-1,-1);sys.exit(0)r   rJ   r   r   r	   Útest_setregid_neg1t  s    þz#PosixUidGidTests.test_setregid_neg1N)rC   rD   rE   rô  rø  r   r   r   r   rõ  rù  rü  rý  rÿ  r  r  r  r   r   r   r	   rî  8  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r`|t jƒ t jrp|t jƒ ˆ s~|  	d¡ t
ƒ | _t | j¡ zLˆ D ]B}t  tj | j|¡¡ t |¡}|| jv rÎtdƒ‚| j |¡ q˜W n   t | j¡ ‚ Y n0 d S )Nc                    s2   zt  | ¡} W n ty"   Y d S 0 ˆ  | ¡ d S r#   )r   r!  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_NONASCIIrH   r   r!  ZbdirZTESTFN_UNICODErZ   r  Ú	unicodefnr4   Zcreate_empty_filer1   r3   rA   r©   ÚaddÚshutilr  )r(   r	  r  r   r  r	   rK   ~  s6    







zPep383Tests.setUpc                 C   s   t  | j¡ d S r#   )r  r  rÓ   rJ   r   r   r	   r»   £  s    zPep383Tests.tearDownc              	   C   sv   | j }tt | j¡ƒ}|  ||¡ t ¡ }z:t tj¡ |  tt ¡ ƒtt tj¡ƒ¡ W t |¡ nt |¡ 0 d S r#   )	r  r  r   ré  rÓ   r0   r$   r5   r2   )r(   r<   ÚfoundZcurrent_directoryr   r   r	   Útest_listdir¦  s    "zPep383Tests.test_listdirc                 C   s.   | j D ]"}ttj | j|¡dƒ}| ¡  qd S ©Nrv   )r  r   r   r1   r3   rÓ   rN   )r(   r  rS   r   r   r	   Ú	test_open²  s    
zPep383Tests.test_openrò   rý   c                 C   s*   | j D ]}tj | j|¡}t |¡ qd S r#   )r  r   r1   r3   rÓ   rò   )r(   r  Úfullnamer   r   r	   Útest_statvfs·  s    
zPep383Tests.test_statvfsc                 C   s&   | j D ]}t tj | j|¡¡ qd S r#   )r  r   r˜   r1   r3   rÓ   )r(   r  r   r   r	   Ú	test_statÀ  s    
zPep383Tests.test_statN)rC   rD   rE   rK   r»   r  r  r   r   r   r   r  r  r   r   r   r	   r  |  s   %ÿ
r  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   sv  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 rJ| ¡ d u rJ| t|ƒ¡}
|| |j ¡ ¡|
| |
¡d d d ƒ}|  |dd¡ |
jr6|   ||
j !¡ ¡ qTt" #d	¡ |d
7 }qÀ|  $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çš™™™™™¹?rU   z1Did not receive communication from the subprocess))rK  r  ÚmsvcrtrL  rM  ÚPeekNamedPipeÚBOOLÚrestypeÚHANDLEÚPOINTERZc_charÚDWORDÚargtypesr‚   ÚPopenra   r‰   r|  r›  rw   r–  rN   r  r  ÚpollZcreate_string_bufferr-   Zget_osfhandlerl   Zsizeofr  rú   r0   r“  rA  ÚsleeprÙ   r   ÚkillÚpidÚwait)r(   ÚsigrK  r  r  r  r@  rž  rs  ÚmaxrO  Zrsltr   r   r	   Ú_killÆ  sP    




û
ýÿùÿ


zWin32KillTests._killc                 C   s   |   tj¡ d S r#   )r-  ÚsignalÚSIGTERMrJ   r   r   r	   Útest_kill_sigtermü  s    z Win32KillTests.test_kill_sigtermc                 C   s   |   d¡ d S )Nr‘   )r-  rJ   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 rŠ| ¡ d u rŠ|d dkrvq¤t d¡ |d7 }qTt |jtj¡ |  d	¡ t |j|¡ t d
¡ | ¡ sät |jtj¡ |  d |¡¡ d S )Nz
test_os_%srì  rU   r   zwin_console_handler.pyr  r  r  z'Subprocess didn't finish initializationg      à?zsubprocess did not stop on {})ÚuuidZuuid1Úmmapr‚   r%  ra   r‰   r   r1   r3   r;   rŸ   ZCREATE_NEW_PROCESS_GROUPr&  rA  r'  r(  r)  r.  ÚSIGINTrÙ   r|  )r(   Úeventr   ZtagnameÚmrž  rs  r,  r   r   r	   Ú_kill_with_event	  s0    ÿþý



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   r  ÚCTRL_C_EVENT)rK  r  r"  Zc_intrL  rM  ÚSetConsoleCtrlHandlerr  r$  r   r7  r.  r8  )r(   r  rK  ZNULLr9  r   r   r	   Útest_CTRL_C_EVENT!	  s    

ÿ
z Win32KillTests.test_CTRL_C_EVENTc                 C   s   |   tjd¡ d S )NÚCTRL_BREAK_EVENT)r7  r.  r;  rJ   r   r   r	   Útest_CTRL_BREAK_EVENT4	  s    z$Win32KillTests.test_CTRL_BREAK_EVENTN)rC   rD   rE   r-  r0  r1  r7  r   Úskipr:  r<  r   r   r   r	   r  Ä  s   6
r  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 ]Š}d| }tj tj|¡}d| }tj tj|¡}t |¡ t|ddd}| 	d| ¡ W d   ƒ n1 s~0    Y  | j  
||g¡ q| j  ¡  d S )NrW   zSUB%dzFILE%dr  rÝ  rÞ  z'I'm %s and proud of it. Blame test_os.
)Úcreated_pathsr°   r   r1   r3   r   rH   rå  r   r   Úextendrî  )r(   rµ   Zdir_nameZdir_pathÚ	file_nameZ	file_pathrS   r   r   r	   rK   <	  s    
,zWin32ListdirTests.setUpc                 C   s   t  tj¡ d S r#   )r  r  r   rH   rJ   r   r   r	   r»   I	  s    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   s   g | ]}t  |¡‘qS r   ©r   r!  ©r   r1   r   r   r	   r
   V	  r   zCWin32ListdirTests.test_listdir_no_extended_path.<locals>.<listcomp>N)r0   Úsortedr   ré  r   rH   r?  r!  rJ   r   r   r	   Útest_listdir_no_extended_pathL	  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   s   g | ]}t  |¡‘qS r   rB  rC  r   r   r	   r
   e	  r   z@Win32ListdirTests.test_listdir_extended_path.<locals>.<listcomp>N)
r   r1   rJ  r   rH   r0   rD  ré  r?  r!  rB  r   r   r	   Útest_listdir_extended_pathX	  s    þþz,Win32ListdirTests.test_listdir_extended_pathN)rC   rD   rE   rË  rK   r»   rE  rH  r   r   r   r	   r>  8	  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rRdd„ }||ƒr>|dd … }||ƒrR|dd … }|  ||¡ d S )Nr‡   c                 S   s   |   t| tƒrdnd¡S )NrG  rF  )Ú
startswithr÷   r@   )rð   r   r   r	   Ú<lambda>u	  s   ÿz/ReadlinkTests.assertPathEqual.<locals>.<lambda>rj   )r   r1   Únormcasera   r½   r0   )r(   ÚleftÚrightZ
has_prefixr   r   r	   ÚassertPathEqualo	  s    
zReadlinkTests.assertPathEqualc                 C   sT   |   tj | j¡¡ |   tj | j¡¡ |  tj | j¡¡ |  tj | j¡¡ d S r#   )	rO   r   r1   r±  Úfilelink_targetÚfilelinkb_targetr`  ÚfilelinkÚ	filelinkbrJ   r   r   r	   rK   }	  s    zReadlinkTests.setUpc                 C   s0   t | jƒ}|  ttj| j¡ |  ttj|¡ d S r#   )r   rQ  r\   r7   r   rI  )r(   rQ  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)r\   r6   r   rI  r   rJ   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¡   rQ  rS  rw   r   rI   r   rP  rI  )r(   rS  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¡   rR  rT  rw   r   rI   rI  r   rP  r%   r@   rB  r   r   r	   Útest_pathlike_bytes”	  s
    z!ReadlinkTests.test_pathlike_bytesc                 C   sJ   t  | j| j¡ |  tj| j¡ t  | j¡}|  || j¡ |  	|t
¡ d S r#   )r   r¡   rR  rT  rw   r   rI   rI  rP  r%   r@   rB  r   r   r	   Ú
test_bytesœ	  s
    zReadlinkTests.test_bytesN)rC   rD   rE   rS  r   r1   rJ  rŸ   rQ  r!  rT  rR  rP  rK   rU  rV  r   Úskip_unless_symlinkrW  rX  rY  r   r   r   r	   rJ  h	  s   



rJ  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¡o–ej d¡d¡dd„ ƒZdd„ Zdd „ Zd!S )"ÚWin32SymlinkTestsZfilelinktestZdirlinktestzmissing linkc                 C   s   d S r#   r   rJ   r   r   r	   rK   ®	  s    zWin32SymlinkTests.setUpc                 C   sR   t j | j¡rt  | j¡ t j | j¡r4t  | j¡ t j | j¡rNt  | j¡ d S r#   )	r   r1   r±  rS  ró  Údirlinkr  rG   Úmissing_linkrJ   r   r   r	   r»   µ	  s    zWin32SymlinkTests.tearDownc                 C   s`   t  | j| j¡ |  t j | j¡¡ |  t j | j¡¡ |  t j | j¡¡ |  	| j| j¡ d S r#   )
r   r¡   Údirlink_targetr\  rO   r1   r±  r.  ÚislinkÚ
check_statrJ   r   r   r	   Útest_directory_link½	  s
    z%Win32SymlinkTests.test_directory_linkc                 C   s`   t  | j| j¡ |  t j | j¡¡ |  t j | j¡¡ |  t j | j¡¡ |  	| j| j¡ d S r#   )
r   r¡   rQ  rS  rO   r1   r±  Úisfiler_  r`  rJ   r   r   r	   Útest_file_linkÄ	  s
    z Win32SymlinkTests.test_file_linkc                 C   s6   | j }tj |¡rt |¡ d}d}t |||¡ dS )z2Create a "directory" link to a non-existent targetz"c:\\target does not exist.29r3c740TN)r]  r   r1   rG   ró  r¡   )r(   Zlinknamer¢   Ztarget_is_dirr   r   r	   Ú_create_missing_dir_linkË	  s    
z*Win32SymlinkTests._create_missing_dir_linkc                 C   s   |   ¡  t | j¡ d S r#   )rd  r   ró  r]  rJ   r   r   r	   Ú,test_remove_directory_link_to_missing_targetÕ	  s    z>Win32SymlinkTests.test_remove_directory_link_to_missing_targetc                 C   s    |   ¡  |  tj | j¡¡ d S r#   )rd  r`  r   r1   r.  r]  rJ   r   r   r	   Ú.test_isdir_on_directory_link_to_missing_targetÜ	  s    z@Win32SymlinkTests.test_isdir_on_directory_link_to_missing_targetc                 C   s   |   ¡  t | j¡ d S r#   )rd  r   r  r]  rJ   r   r   r	   Ú.test_rmdir_on_directory_link_to_missing_targetà	  s    z@Win32SymlinkTests.test_rmdir_on_directory_link_to_missing_targetc                 C   sn   |   t |¡t |¡¡ |  t |¡t |¡¡ t |¡}|   t |¡t |¡¡ |  t |¡t |¡¡ d S r#   )r0   r   r˜   r  r:  r!  )r(   rØ  r¢   Z
bytes_linkr   r   r	   r`  ä	  s
    
zWin32SymlinkTests.check_statc              	   C   sJ  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  |¡ nt  |¡ 0 d S )NÚlevel2Úlevel3râ  rØ  )r   r1   rJ  r   rH   r3   rw   r  r4   r!   r$   r5   r¡   Úrelpathr¯   ré  r0   r˜   )r(   Zlevel1rh  ri  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 )Nrl  rm  )r   rI  rO   r1   Úsamefile)r(   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 ] \}}zt  ||¡ W n tyn   Y n$0 zt  |¡ W n ty   Y n0 zt  t  |¡t  |¡¡ W n tyÀ   Y qD0 zt  |¡ W qD tyâ   Y qD0 qDd S )NZXXXXXXXXXXXXXXXXXXXXXXXXXXXrV   rH  é´   )r   r1   r3   r¡   r6   ró  r7   r!  )r(   Zsegmentr1   Z
test_casesr£   Údestr   r   r	   Útest_buffer_overflow
  s.    
úz&Win32SymlinkTests.test_buffer_overflowc                    s²   t j d¡‰ t j ˆ ¡s"|  d¡ ‡ fdd„t t  ˆ ¡d¡D ƒ}|D ]\}tj	r`t
ƒ  t
d|ƒ t  |¡}|  |t  |¡¡ |  t |j¡¡ |  |jtj¡  q®qF|  d¡ d S )Nz$%LOCALAPPDATA%\Microsoft\WindowsAppsz%test requires a WindowsApps directoryc                    s   g | ]}t j ˆ |¡‘qS r   )r   r1   r3   ©r   r,   ©rN  r   r	   r
   F
  s   ÿz6Win32SymlinkTests.test_appexeclink.<locals>.<listcomp>z*.exezTesting withz$test requires an app execution alias)r   r1   Ú
expandvarsr.  rZ   ÚfnmatchÚfilterré  r   r9   r:   r:  r0   r˜   r`  ÚS_ISLNKrÛ   Úst_reparse_tagZIO_REPARSE_TAG_APPEXECLINK)r(   ÚaliasesÚaliasr  r   rt  r	   Útest_appexeclinkA
  s     

ÿ

z"Win32SymlinkTests.test_appexeclinkN)rC   rD   rE   rS  r   r1   rJ  rŸ   rQ  r\  r;   r^  r]  rK   r»   ra  rc  rd  re  rf  rg  r`  rk  r   r   rG   r±  ro  rr  r|  r   r   r   r	   r[  ¥	  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   d S r#   r   rJ   r   r   r	   rK   [
  s    zWin32JunctionTests.setUpc                 C   s   t j | j¡rt  | j¡ d S r#   )r   r1   rG   ÚjunctionrI   rJ   r   r   r	   r»   _
  s    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 )NrF  )Ú_winapiÚCreateJunctionÚjunction_targetr~  rO   r   r1   rG   r±  r.  r  r˜   r:  r0   r`  r_  rM  rI  rJ   r   r   r	   Útest_create_junctionc
  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~  rO   r   r1   r±  rG   rI   r`  rJ   r   r   r	   Útest_unlink_removes_junctionp
  s
    z/Win32JunctionTests.test_unlink_removes_junctionN)rC   rD   rE   r~  r   r1   r;   rJ  rŸ   r  rK   r»   r‚  rƒ  r   r   r   r	   r}  V
  s   r}  c                   @   s   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 ]R}	|D ]H}
z| |
¡ W n tyÌ   Y n0 zt |
¡ W q¨ tyî   Y q¨0 q¨q | 	|| |¡¡}|  d|¡ |j| }|  d|¡ d S )Nr-  rK  r   zKernel32.dllT)Zuse_last_errorrU   z\\?\C:z\\?\NULz	\\?\CONINrV   )r   Úimport_moduleZctypes.wintypesZWinDLLr  r!  ZGetCurrentProcessr   r  ZGetProcessHandleCountZLPDWORDr$  r#  Zbyrefr0   rú   rŸ   r°   Ú_getfinalpathnameÚ	Exceptionr   r˜   )r(   r-  rK  ZkernelZhprocZhandle_countrP  Zbefore_countÚ	filenamesÚ_r   Zhandle_deltar   r   r	   Útest_getfinalpathname_handlesz
  sB    

ÿ
ü

z*Win32NtTests.test_getfinalpathname_handlesc                 C   sÖ   t j}|  t j|¡ t ¡ d }t d¡}t t	j
d||t|ƒg¡~}t ¡ |k rˆzt |¡ W qF ty„ } zW Y d }~qFd }~0 0 qFz| d¡ W n tjy²   | ¡  Y n0 W d   ƒ n1 sÈ0    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ˆ   rU   )r   rH   rw   rI   rA  ÚtextwrapÚdedentr‚   r%  ra   r‰   r&   r   r˜   r6   r*  ÚTimeoutExpiredÚ	terminate)r(   r   ÚdeadlineZcommandrž  r¶   r   r   r	   Útest_stat_unlink_raceª
  s    
z"Win32NtTests.test_stat_unlink_raceN)rC   rD   rE   rŠ  r  r   r   r   r	   r„  x
  s   0r„  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚNonLocalSymlinkTestsc                 C   s   t  d¡ dS )zM
        Create this structure:

        base
         \___ some_dir
        zbase/some_dirN)r   rå  rJ   r   r   r	   rK   ×
  s    zNonLocalSymlinkTests.setUpc                 C   s   t  d¡ d S )Nr  )r  r  rJ   r   r   r	   r»   à
  s    zNonLocalSymlinkTests.tearDownc                 C   s   t j dd¡}t  d|¡ 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   r1   r3   r¡   )r(   r£   r   r   r	   Útest_directory_link_nonlocalã
  s    z1NonLocalSymlinkTests.test_directory_link_nonlocalN)rC   rD   rE   rK   r»   r’  r   r   r   r	   r‘  Ô
  s   	r‘  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚFSEncodingTestsc                 C   s(   |   t d¡d¡ |   t d¡d¡ d S )Ns   abcÿu   abcÅ)r0   r   r!  rA   rJ   r   r   r	   Útest_nopõ
  s    zFSEncodingTests.test_nopc              	   C   sF   dD ]<}zt  |¡}W n ty,   Y qY n0 |  t  |¡|¡ qd S )N)u	   unicodeÅu   latinÃ©Úascii)r   r!  rè   r0   rA   )r(   r  r  r   r   r	   Útest_identityù
  s    
zFSEncodingTests.test_identityN)rC   rD   rE   r”  r–  r   r   r   r	   r“  ô
  s   r“  c                   @   sV   e Zd Zdd„ Ze e d¡oDeƒ  oDe	j
 d¡pDeedƒoDeedƒd¡dd	„ ƒZd
S )ÚDeviceEncodingTestsc                 C   s   |   t d¡¡ d S )Ni@â )rM  r   Údevice_encodingrJ   r   r   r	   Útest_bad_fd  s    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 r`   )r   r˜  ZassertIsNotNonerO   ÚcodecsÚlookup)r(   rß  r   r   r	   Útest_device_encoding
  s    

z(DeviceEncodingTests.test_device_encodingN)rC   rD   rE   r™  r   r   r   r¿  r   ra   r½   rK  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‚   r%  ra   r‰   r›  Úcommunicater0   rÁ   r   Úgetpid)r(   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rV||ƒ t |d¡\}}|  t |¡|¡ |  ||¡ d S )Nr‡   ú"rˆ   r   )	ra   r½   r‰   r   ÚspawnvÚP_NOWAITÚwaitpidr0   Úwaitstatus_to_exitcode)r(   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®  rJ   r   r   r	   Útest_waitpid/  s    zPidTests.test_waitpidc                 C   sV   d}d|› d}| j ||d |  t¡ t d¡ W d   ƒ n1 sH0    Y  d S )Né   zimport sys; sys.exit(ú)©r«  g        )r®  r\   rc   r   rª  )r(   r«  r‹   r   r   r	   Útest_waitstatus_to_exitcode2  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¯  )r(   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^0    Y  |  t¡ t d¡ W d   ƒ n1 s’0    Y  d S )Nr	  r   rU   r¬   rË   rì  )r0   r   rª  r\   r©   ró  )r(   Zmax_exitcoder«  r   r   r	   Ú#test_waitstatus_to_exitcode_windowsB  s    ÿ0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   r(  )r)  ©Úsignumr   r	   Úkill_processU  s    z?PidTests.test_waitstatus_to_exitcode_kill.<locals>.kill_process)r«  r¬  )r   ZLONG_TIMEOUTr.  r¸  r®  )r(   r‹   r»  r   r¹  r	   Ú test_waitstatus_to_exitcode_killP  s    z)PidTests.test_waitstatus_to_exitcode_kill)N)rC   rD   rE   r   r   r   r   r¥  r®  r°  r´  ra   r½   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  }n8ttjƒ| _t	t
 ¡ ƒ| _| j| j| j< d| j| j f }t|dƒ}| |¡ W d   ƒ n1 sŒ0    Y  tj|g}|rÈdd„ |D ƒ}dd„ | j ¡ D ƒ| _|S )	Né   zimport sys; sys.exit(%s)z4import sys, os; magic = os.environ[%r]; sys.exit(%s)r  c                 S   s   g | ]}t  |¡‘qS r   rB  rs  r   r   r	   r
   r  r   z*SpawnTests.create_args.<locals>.<listcomp>c                 S   s"   i | ]\}}t  |¡t  |¡“qS r   rB  )r   ÚkÚvr   r   r	   Ú
<dictcomp>s  s   ÿz*SpawnTests.create_args.<locals>.<dictcomp>)r«  r   rH   rw   rI   rc  r   r  r  r&   r2  Zuuid4rk  r   r   ra   r‰   ri  )r(   r¿  rÀ  r   r‹   r    r„   r   r   r	   Úcreate_args\  s(    
ÿ(
ÿzSpawnTests.create_argsÚspawnlc                 C   s4   |   ¡ }tjtj|d g|¢R Ž }|  || j¡ d S r`   )rÅ  r   rÆ  ÚP_WAITr0   r«  ©r(   r„   r«  r   r   r	   Útest_spawnlx  s    zSpawnTests.test_spawnlÚspawnlec                 C   s>   | j dd}tjtj|d g|¢| j‘R Ž }|  || j¡ d S ©NT)r¿  r   )rÅ  r   rÊ  rÇ  r  r0   r«  rÈ  r   r   r	   Útest_spawnle~  s     zSpawnTests.test_spawnleÚspawnlpc                 C   s4   |   ¡ }tjtj|d g|¢R Ž }|  || j¡ d S r`   )rÅ  r   rÍ  rÇ  r0   r«  rÈ  r   r   r	   Útest_spawnlp„  s    zSpawnTests.test_spawnlpÚspawnlpec                 C   s>   | j dd}tjtj|d g|¢| j‘R Ž }|  || j¡ d S rË  )rÅ  r   rÏ  rÇ  r  r0   r«  rÈ  r   r   r	   Útest_spawnlpeŠ  s     zSpawnTests.test_spawnlper§  c                 C   sT   |   ¡ }t tj|d |¡}|  || j¡ t tjt|d ƒ|¡}|  || j¡ d S r`   )rÅ  r   r§  rÇ  r0   r«  r   rÈ  r   r   r	   Útest_spawnv  s
    zSpawnTests.test_spawnvÚspawnvec                 C   s6   | j dd}t tj|d || j¡}|  || j¡ d S rË  ©rÅ  r   rÒ  rÇ  r  r0   r«  rÈ  r   r   r	   Útest_spawnveš  s    zSpawnTests.test_spawnveÚspawnvpc                 C   s.   |   ¡ }t tj|d |¡}|  || j¡ d S r`   )rÅ  r   rÕ  rÇ  r0   r«  rÈ  r   r   r	   Útest_spawnvp   s    zSpawnTests.test_spawnvpÚspawnvpec                 C   s6   | j dd}t tj|d || j¡}|  || j¡ d S rË  )rÅ  r   r×  rÇ  r  r0   r«  rÈ  r   r   r	   Útest_spawnvpe¦  s    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«  )r(   r„   r)  r   r   r	   Útest_nowait¬  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_bytes²  s    zSpawnTests.test_spawnve_bytesc                 C   s>   |   ¡ }|  ttjtj|d ¡ |  ttjtj|d d¡ d S ©Nr   rI  )rÅ  r\   r©   r   rÆ  r¨  ©r(   r„   r   r   r	   Útest_spawnl_noargs¹  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 rÛ  )rÅ  r\   r©   r   rÊ  r¨  rÜ  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ƒ  rI  )rÅ  r\   r©   r   r§  r¨  rÜ  r   r   r	   Útest_spawnv_noargsÅ  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Å  r\   r©   r   rÒ  r¨  rÜ  r   r   r	   Útest_spawnve_noargsÍ  s
    zSpawnTests.test_spawnve_noargsc                 C   st  t jddg}tj ¡ }d|d< z|tj|d ||ƒ}W n tyH   Y n0 |  |d¡ tj ¡ }d|d< z|tj|d ||ƒ}W n ty’   Y n0 |  |d¡ tj ¡ }d	|d
< z|tj|d ||ƒ}W n tyÜ   Y n0 |  |d¡ tj	}|  
tj|¡ t|dƒ}| d¡ W d   ƒ n1 s*0    Y  t j|g}tj ¡ }d|d< |tj|d ||ƒ}|  |d¡ d S )Nrˆ   r¡  r¢  r£  r   é   r¤  r¥  r¦  r§  r  zPimport sys, os
if os.getenv("FRUIT") != "orange=lemon":
    raise AssertionErrorzorange=lemon)ra   r‰   r   r  rÆ  rÇ  r©   r0   r   rH   rw   rI   r   r   )r(   Úspawnr„   r¨  r«  r   r    r   r   r	   Ú_test_invalid_envÕ  s>    


*

zSpawnTests._test_invalid_envc                 C   s   |   tj¡ d S r#   )rä  r   rÒ  rJ   r   r   r	   Útest_spawnve_invalid_env  s    z#SpawnTests.test_spawnve_invalid_envc                 C   s   |   tj¡ d S r#   )rä  r   r×  rJ   r   r   r	   Útest_spawnvpe_invalid_env  s    z$SpawnTests.test_spawnvpe_invalid_envN)rC   rD   rE   rÅ  r   rÉ  rÌ  rÎ  rÐ  rÑ  rÔ  rÖ  rØ  rÙ  rÚ  rÝ  rÞ  rà  rá  rä  rå  ræ  r   r   r   r	   r½  [  sD   




	








.
r½  z>Skip due to platform/environment differences on *NIX buildbotsÚgetloginztest needs os.getloginc                   @   s   e Zd Zdd„ ZdS )Ú
LoginTestsc                 C   s   t  ¡ }|  t|ƒd¡ d S r`   )r   rç  r  r-   )r(   Z	user_namer   r   r	   Útest_getlogin  s    zLoginTests.test_getloginN)rC   rD   rE   ré  r   r   r   r	   rè    s   rè  ÚgetpriorityÚsetpriorityz'needs os.getpriority and os.setpriorityc                   @   s   e Zd ZdZdd„ ZdS )ÚProgramPriorityTestsz0Tests for os.getpriority() and os.setpriority().c                 C   s  t  t jt  ¡ ¡}t  t jt  ¡ |d ¡ z’t  t jt  ¡ ¡}|dkr^|dkr^t d| ¡‚n|  ||d ¡ W zt  t jt  ¡ |¡ W n2 tyº } z|j	t	j
kr¦‚ W Y d }~n
d }~0 0 nPzt  t jt  ¡ |¡ W n4 ty
 } z|j	t	j
krö‚ W Y d }~n
d }~0 0 0 d S )NrU   é   z?unable to reliably test setpriority at current nice level of %s)r   rê  ÚPRIO_PROCESSr¤  rë  r   r;  r0   r7   r8   ZEACCES)r(   r  Znew_prior‡  r   r   r	   Útest_set_get_priority  s&    ÿüz*ProgramPriorityTests.test_set_get_priorityN)rC   rD   rE   rË  rï  r   r   r   r	   rì    s   rì  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                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )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)r(   Úconnr   r   r	   ró  2  s
    z#SendfileTestServer.Handler.__init__c                 C   s    |   d¡}| jr| j |¡ d S )Né   )Úrecvrõ  rô  rò  rx  r   r   r	   Úhandle_read9  s    
z&SendfileTestServer.Handler.handle_readc                 C   s   d  | j¡S )Nr   )r3   rô  rJ   r   r   r	   Úget_data>  s    z#SendfileTestServer.Handler.get_datac                 C   s   |   ¡  d| _d S rØ  )rN   rö  rJ   r   r   r	   Úhandle_closeA  s    z'SendfileTestServer.Handler.handle_closec                  C   s   ‚ d S r#   r   rJ   r   r   r	   Úhandle_errorE  s    z'SendfileTestServer.Handler.handle_errorN)rC   rD   rE   ró  rû  rü  rý  rþ  r   r   r   r	   ÚHandler0  s
   rÿ  c                 C   sp   t j | ¡ tj | ¡ |  tjtj¡ |  	|¡ |  
d¡ | j ¡ d d… \| _| _d | _d| _t  ¡ | _d S )Nr¬   rW   F)Ú	threadingÚThreadró  ÚasyncoreÚ
dispatcherZcreate_socketÚsocketÚAF_INETÚSOCK_STREAMÚbindÚlistenÚgetsocknameÚhostÚportÚhandler_instanceÚ_activeÚLockÚ_active_lock)r(   Úaddressr   r   r	   ró  H  s    

zSendfileTestServer.__init__c                 C   s   | j S r#   )r  rJ   r   r   r	   r  U  s    zSendfileTestServer.runningc                 C   s$   t  ¡ | _t j | ¡ | j ¡  d S r#   )r   ÚEventÚ_SendfileTestServer__flagr  Ústartr*  rJ   r   r   r	   r  Y  s    
zSendfileTestServer.startc                 C   s   d| _ |  ¡  d S rÀ  )r  r3   rJ   r   r   r	   Ústop_  s    zSendfileTestServer.stopc                 C   s&   t | jddƒst d¡ q |  ¡  d S )Nrö  Fçü©ñÒMbP?)rÖ   r  rA  r'  r  rJ   r   r   r	   r*  d  s    zSendfileTestServer.waitc                 C   sL   d| _ | j ¡  | j r@tjr@| j ¡  tjddd | j ¡  qt 	¡  d S )NTr  rU   )Útimeoutrs  )
r  r  r  r  Z
socket_mapr  ÚacquireZloopÚreleaseZ	close_allrJ   r   r   r	   rš  l  s    

zSendfileTestServer.runc                 C   s   |   ¡ \}}|  |¡| _d S r#   )Úacceptrÿ  r  )r(   rø  Úaddrr   r   r	   Úhandle_acceptu  s    z SendfileTestServer.handle_acceptc                 C   s   |   ¡  d S r#   )rN   rJ   r   r   r	   Úhandle_connecty  s    z!SendfileTestServer.handle_connectc                 C   s   dS r`   r   rJ   r   r   r	   Úwritable}  s    zSendfileTestServer.writablec                  C   s   ‚ d S r#   r   rJ   r   r   r	   rþ  €  s    zSendfileTestServer.handle_errorN)rC   rD   rE   rñ  rò  rÿ  ró  Úpropertyr  r  r  r*  rš  r  r  rû  r  rþ  r   r   r   r	   rð  .  s   
	rð  Úsendfileztest needs os.sendfile()c                   @   s
  e Zd Zdd Zej d¡ o8ej d¡ o8e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_setuprk  r!   rH   ÚDATArE  r   r   r	   rG    s    
zTestSendfile.setUpClassc                 C   s   t j| jŽ  t  t j¡ d S r#   )r   Zthreading_cleanuprk  rI   rH   rE  r   r   r	   rZ  •  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   rU   r!  rv   )rð  r   ZHOSTÚserverr  r  ÚclientÚconnectr
  r  Ú
settimeoutrú  rl   Úsocknor   r   rH   rä  rJ   r   r   r	   rK   š  s    

zTestSendfile.setUpc                 C   s0   | j  ¡  | j ¡  | jjr&| j ¡  d | _d S r#   )rä  rN   r%  r$  r  r  rJ   r   r   r	   r»   ¦  s
    


zTestSendfile.tearDownc              
   O   sp   zt j|i |¤ŽW S  tyh } z>|jtjkr2‚ n"|jtjtjfv rRW Y d}~q n‚ W Y d}~q d}~0 0 q dS )zfA higher level wrapper representing how an application is
        supposed to use sendfile().
        N)r   r  r7   r8   Z
ECONNRESETÚEAGAINÚEBUSY)r(   r„   rÑ  r‡  r   r   r	   Úsendfile_wrapper­  s    zTestSendfile.sendfile_wrapperc                 C   sÌ   d}d}d}|t | jƒk rd|  | j| j||¡}|dkr8qd||7 }||7 }|  ||k¡ |  ||¡ q|  |t | jƒ¡ | j t	j
¡ | j ¡  | j ¡  | jj ¡ }|  t |ƒt | jƒ¡ |  || j¡ d S )Nr   rù  )r-   r#  r+  r(  rl   rO   r0   r%  Úshutdownr  Ú	SHUT_RDWRrN   r$  r*  r  rü  )r(   Ú
total_sentÚoffsetÚnbytesÚsentrx   r   r   r	   Útest_send_whole_file¾  s$    

z!TestSendfile.test_send_whole_filec                 C   sä   d}t | jƒd }t | jƒ| }d}||k rj|  | j| j||¡}|dkrJqj||7 }||7 }|  ||k¡ q$| j tj	¡ | j 
¡  | j ¡  | jj ¡ }| jt | jƒd d … }|  |t |ƒ¡ |  t |ƒt |ƒ¡ |  ||¡ d S )Nr   rW   rù  )r-   r#  r+  r(  rl   rO   r%  r,  r  r-  rN   r$  r*  r  rü  r0   )r(   r.  r/  Z	must_sendr0  r1  rx   r<   r   r   r	   Útest_send_at_certain_offsetÔ  s&    

z(TestSendfile.test_send_at_certain_offsetc              
   C   s¤   t | jƒd }zt | j| j|d¡}W n2 tyX } z|jtjkrD‚ W Y d }~nd }~0 0 |  	|d¡ | j
 tj¡ | j
 ¡  | j ¡  | jj ¡ }|  	|d¡ d S )Nrù  r   r   )r-   r#  r   r  r(  rl   r7   r8   ÚEINVALr0   r%  r,  r  r-  rN   r$  r*  r  rü  )r(   r/  r1  r¶   rx   r   r   r	   Útest_offset_overflowë  s    

z!TestSendfile.test_offset_overflowc                 C   sT   |   t¡$}t | j| jdd¡ W d   ƒ n1 s40    Y  |  |jjtj	¡ d S )Nrì  rù  )
r\   r7   r   r  r(  rl   r0   r  r8   r4  ©r(   r¨  r   r   r	   Útest_invalid_offsetü  s    2z TestSendfile.test_invalid_offsetc              	   C   s<   t j| j| jddd | jr8t j| j| jdddddd d S )Nr   rù  )r´   r²   r/  rs  r   )r´   r²   r/  rs  ÚheadersÚtrailersrœ   )r   r  r(  rl   ÚSUPPORT_HEADERS_TRAILERSrJ   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 r¤tt|ƒ| dƒ}|  | j| j||¡}|dkr†q¤|  ||¡ ||7 }||7 }qJ|  	|t|ƒ¡ | j
 ¡  | j ¡  | jj ¡ }|  	t|ƒt|ƒ¡ d S )	Nr   s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyrì  rù  s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxs   yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy©r8  i   )r#  r   r  r(  rl   ZassertLessEqualr-   Úminr+  r0   r%  rN   r$  r*  r  rü  Úhash)r(   r.  Zexpected_datar1  r/  r0  rx   r   r   r	   Útest_headers  s.    ÿÿ


zTestSendfile.test_headersc                 C   sž   t jd }d}|  t j|¡ t||ƒ t|dƒZ}tj| j| 	¡ ddddgd | j
 ¡  | j ¡  | jj ¡ }|  |d	¡ W d   ƒ n1 s0    Y  d S )
Nr¹  s   abcdefrv   r   r¬   s   123456s   789©r9  s   abcde123456789)r   rH   rw   rI   r!   r   r   r  r(  rl   r%  rN   r$  r*  r  rü  r0   )r(   r™   Z	file_datarS   rx   r   r   r	   Útest_trailers%  s    

ÿ

zTestSendfile.test_trailersc                 C   sl   d| j j_|  t¡2}tj| j| jdddd gd d W d   ƒ n1 sL0    Y  |  	|j
jtj¡ d S )NFr   ó   xé   r   r<  ©r$  r  rõ  r\   r7   r   r  r(  rl   r0   r  r8   r4  r6  r   r   r	   Útest_headers_overflow_32bits5  s    
ÿ$z)TestSendfile.test_headers_overflow_32bitsc                 C   sl   d| j j_|  t¡2}tj| j| jdddd gd d W d   ƒ n1 sL0    Y  |  	|j
jtj¡ d S )NFr   rB  rC  r   r@  rD  r6  r   r   r	   Útest_trailers_overflow_32bits>  s    
ÿ$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 n8 tyV } z |jtjtjfvrB‚ W Y d }~n
d }~0 0 d S )Nr   rù  )rœ   )	r   r  r(  rl   rG  r7   r8   r*  r)  )r(   r‡  r   r   r	   Ú
test_flagsG  s    ÿ
zTestSendfile.test_flagsN)rC   rD   rE   r#  ra   r½   rK  r:  r   r   Zrequires_headers_trailersÚmaxsizeZrequires_32br[  rG  rZ  rK   r»   r+  r2  r3  r5  r7  r;  r?  rA  rE  rF  r   r   rH  r   r   r   r	   r   „  sN   ÿþÿÿ



ÿr   c               	   C   s¦   t tdƒsdS z„ttjddƒV} zt |  ¡ dd¡ W n. tyd   Y W d   ƒ W t tj¡ dS 0 W d   ƒ n1 sz0    Y  W t tj¡ nt tj¡ 0 dS )NÚsetxattrFr   r   ó	   user.testr   T)	r   r   r   r   rH   rJ  rl   r7   rI   )r    r   r   r	   Úsupports_extended_attributesS  s    
þ&rL  z(no non-broken extended attribute supportrW   r­   é'   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚExtendedAttributeTestsc                 K   sJ  t j}|  t j|¡ t|ƒ |  t¡&}|||dƒfi |¤Ž W d   ƒ n1 sR0    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 sN0    Y  |  |jj	t	j¡ |  t¡,}|||dƒdtjfi |¤Ž W d   ƒ n1 s¨0    Y  |  |jj	t	j
¡ |||dƒdtjfi |¤Ž |
 d¡ |  t||ƒƒ|
¡ |||dƒfi |¤Ž |  t¡&}|||dƒfi |¤Ž W d   ƒ n1 sL0    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   rK  rh  s   byez
user.test2s   foos   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac                 s   s   | ]}d   |¡V  qdS )zuser.test{}Nr{  )r   rµ   r   r   r	   r}  ”  r   z;ExtendedAttributeTests._check_xattrs_str.<locals>.<genexpr>r‘   rB  )r   rH   rw   rI   r!   r\   r7   r0   r  r8   ÚENODATAr%   rí  r  r  r   ÚXATTR_REPLACEÚXATTR_CREATEÚEEXISTró  rD  r°   )r(   rr   ÚgetxattrrJ  ÚremovexattrÚ	listxattrrÑ  r  r¨  Z
init_xattrZxattrÚmanyÚthingr   r   r	   Ú_check_xattrs_stri  sL    4
<<
6
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#   )rY  r&   r   rI   rH   r   r!  r  r   r   r	   Ú_check_xattrs™  s    z$ExtendedAttributeTests._check_xattrsc                 C   s   |   tjtjtjtj¡ d S r#   ©rZ  r   rT  rJ  rU  rV  rJ   r   r   r	   Útest_simple   s    ÿz"ExtendedAttributeTests.test_simplec                 C   s    | j tjtjtjtjdd d S )NFrS  r[  rJ   r   r   r	   Ú
test_lpath¤  s    ÿz!ExtendedAttributeTests.test_lpathc                 C   s4   dd„ }dd„ }dd„ }dd„ }|   ||||¡ d S )	Nc                 W   sD   t | dƒ&}tj| ¡ g|¢R Ž W  d   ƒ S 1 s60    Y  d S r  )r   r   rT  rl   ©r1   r„   r    r   r   r	   rT  ©  s    z1ExtendedAttributeTests.test_fds.<locals>.getxattrc                 W   sF   t | ddƒ&}tj| ¡ g|¢R Ž  W d   ƒ n1 s80    Y  d S ©Nr9  r   )r   r   rJ  rl   r^  r   r   r	   rJ  ¬  s    z1ExtendedAttributeTests.test_fds.<locals>.setxattrc                 W   sF   t | ddƒ&}tj| ¡ g|¢R Ž  W d   ƒ n1 s80    Y  d S r_  )r   r   rU  rl   r^  r   r   r	   rU  ¯  s    z4ExtendedAttributeTests.test_fds.<locals>.removexattrc                 W   sD   t | dƒ&}tj| ¡ g|¢R Ž W  d   ƒ S 1 s60    Y  d S r  )r   r   rV  rl   r^  r   r   r	   rV  ²  s    z2ExtendedAttributeTests.test_fds.<locals>.listxattr)rZ  )r(   rT  rJ  rU  rV  r   r   r	   Útest_fds¨  s
    zExtendedAttributeTests.test_fdsN)rC   rD   rE   rY  rZ  r\  r]  r`  r   r   r   r	   rN  c  s
   0rN  Úget_terminal_sizezrequires os.get_terminal_sizec                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTermsizeTestsc              
   C   sz   zt  ¡ }W nL tyX } z4tjdks8|jtjtjfv rB|  d¡ ‚ W Y d}~n
d}~0 0 |  	|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   ra  r7   ra   r½   r8   r4  ÚENOTTYrZ   ZassertGreaterEqualÚcolumnsÚlines)r(   rt   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yB   |  d¡ Y n0 t|d ƒt|d ƒf}zt	 
tj ¡ ¡}W nL ty¼ } z4tjdksœ|jtjtjfv r¦|  d	¡ ‚ W Y d
}~n
d
}~0 0 |  ||¡ 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sttyrt   T)r  r—  zstty invocation failedrU   r   r‡   rc  N)r‚   r>  ÚDEVNULLr×   r6   ÚCalledProcessErrorrê  rZ   rÁ   r   ra  ra   Ú	__stdin__rl   r7   r½   r8   r4  rd  r0   )r(   rt   r<   rÁ  r¶   r   r   r	   Útest_stty_matchÌ  s"    ÿÿÿ

zTermsizeTests.test_stty_matchN)rC   rD   rE   rg  rk  r   r   r   r	   rb  ¸  s   rb  Úmemfd_createzrequires os.memfd_creater¸   rÁ  c                   @   s   e Zd Zdd„ ZdS )ÚMemfdCreateTestsc                 C   s¬   t  dt j¡}|  |d¡ |  t j|¡ |  t  |¡¡ t|ddd*}| 	d¡ |  
| ¡ d¡ W d   ƒ n1 sv0    Y  t  d¡}|  t j|¡ |  t  |¡¡ d S )NZHirì  r9  F)Úclosefds   memfd_createrÎ   )r   rl  ÚMFD_CLOEXECr  rw   rN   r`  rÙ  r   r   r0   Útell)r(   rq   rS   Úfd2r   r   r	   Útest_memfd_createì  s    
.
z"MemfdCreateTests.test_memfd_createN)rC   rD   rE   rr  r   r   r   r	   rm  é  s   rm  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú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rbtj}nt 	tj¡}| j |¡ | j t
|ƒ¡ | j t|ƒ¡ | j| j | _d S )Nc                   @   s   e Zd ZdS )zOSErrorTests.setUp.<locals>.StrN©rC   rD   rE   r   r   r   r	   ÚStrü  s   ru  )r&   Úbytes_filenamesÚunicode_filenamesr   r
  rH   rò  ZTESTFN_UNDECODABLEr   r!  r|   r}   rˆ  )r(   ru  ZdecodedÚencodedr   r   r	   rK   û  s    

zOSErrorTests.setUpc                 C   sJ  | 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r | | 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ƒrì| | 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	ƒrN| | j tjdf¡ ttd
ƒrn| | 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ƒrH| | j tjdf¡ ttdƒrf| | j tj f¡ |D ]Ú^}}}|D ]È}zdt!|t"t#fƒr ||g|¢R Ž  n>|  $t%d¡  ||g|¢R Ž  W d   ƒ n1 sÔ0    Y  W nL t&y } z |  '|j(|t"|ƒ¡ W Y d }~n,d }~0  t)y,   Y n0 |  *d +|¡¡ qxqjd S )Nr›   r‡   s   dstr¤   rC  r   ÚlchownrÎ  ÚchflagsÚlchflagsÚchrootrØ  rV  rO  s   userÚlchmodrI  z	should bezNo exception thrown by {}),rˆ  r   r5   rè  r:  r   r   r  r˜   rI   ra   r½   r@  rv  rd   r—   rw  ré  r   rò  rC  ry  rÎ  rz  r{  r|  rØ  rV  rT  rJ  rU  r}  rI  r÷   r&   r@   ZassertWarnsRegexÚDeprecationWarningr7   r¥  r   ÚUnicodeDecodeErrorrÙ   r|  )r(   Zfuncsrˆ  ÚfuncZ	func_argsr   r‡  r   r   r	   Útest_oserror_filename  sz    




ù	

û
ý

ü4(z"OSErrorTests.test_oserror_filenameN)rC   rD   rE   rK   r  r   r   r   r	   rs  ú  s   rs  c                   @   s   e Zd Zdd„ ZdS )ÚCPUCountTestsc                 C   s8   t  ¡ }|d ur*|  |t¡ |  |d¡ n
|  d¡ d S )Nr   z&Could not determine the number of CPUs)r   Ú	cpu_countr%   rÁ   ÚassertGreaterrZ   )r(   Zcpusr   r   r	   Útest_cpu_countX  s
    zCPUCountTests.test_cpu_countN)rC   rD   rE   r…  r   r   r   r	   r‚  W  s   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   rw   rN   r0   rÙ  rÚ  r’   r   r   r	   Útest_get_set_inheritableb  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   rw   rN   r0   rÙ  ÚfcntlÚF_GETFDÚ
FD_CLOEXECZF_SETFD)r(   rq   rœ   r   r   r	   Útest_get_inheritable_cloexecj  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   rw   rN   r0   r‰  rŠ  r‹  rÚ  r’   r   r   r	   Útest_set_inheritable_cloexecw  s    ÿÿz/FDInheritanceTests.test_set_inheritable_cloexecÚO_PATHzneed os.O_PATHc                 C   sn   t  tt j¡}|  t j|¡ |  t  |¡d¡ t  |d¡ |  t  |¡d¡ t  |d¡ |  t  |¡d¡ d S r‡  )	r   r   rŸ   rŽ  rw   rN   r0   rÙ  rÚ  r’   r   r   r	   Útest_get_set_inheritable_o_path‚  s    z2FDInheritanceTests.test_get_set_inheritable_o_pathc                 C   sâ   t  ¡ }|  t¡}t |¡ W d   ƒ n1 s20    Y  |  |jjtj	¡ |  t¡}t 
|d¡ W d   ƒ n1 sz0    Y  |  |jjtj	¡ |  t¡}t 
|d¡ W d   ƒ n1 sÂ0    Y  |  |jjtj	¡ d S ©NTF)r   r¾  r\   r7   r   rÙ  r0   r  r8   r  rÚ  )r(   rq   r  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   rw   rN   r0   rÙ  r’   r   r   r	   r    s    zFDInheritanceTests.test_openr  zneed os.pipe()c                 C   sP   t  ¡ \}}|  t j|¡ |  t j|¡ |  t  |¡d¡ |  t  |¡d¡ d S rÀ  )r   r  rw   rN   r0   rÙ  )r(   ZrfdZwfdr   r   r	   Ú	test_pipe¢  s
    zFDInheritanceTests.test_pipec                 C   sJ   t  tt j¡}|  t j|¡ t  |¡}|  t j|¡ |  t  |¡d¡ d S rÀ  )	r   r   rŸ   r   rw   rN   rY   r0   rÙ  ©r(   Úfd1rq  r   r   r	   Útest_dupª  s
    
zFDInheritanceTests.test_dupc                 C   s(   t  d¡}|  t j|¡ |  |d¡ d S ©NrU   r   )r   rY   rw   rN   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   rw   rN   rY   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   rw   rN   r0   rÂ  rO   rÙ  r`  )r(   rq   rq  Zfd3r   r   r	   rÄ  À  s    zFDInheritanceTests.test_dup2Úopenptyzneed os.openpty()c                 C   sP   t  ¡ \}}|  t j|¡ |  t j|¡ |  t  |¡d¡ |  t  |¡d¡ d S rÀ  )r   r›  rw   rN   r0   rÙ  )r(   Z	master_fdZslave_fdr   r   r	   Útest_openptyÑ  s
    zFDInheritanceTests.test_openpty)rC   rD   rE   rˆ  r   r­  r‰  rŒ  r  r   r   r   r  r‘  r  r’  r•  r—  ra   r½   r™  rÄ  rœ  r   r   r   r	   r†  a  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)r:  Fr   NrP   FN)rz  F©r   N)r{  Frž  Nr   rž  rN   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V ztt|ƒ}W n" tyÈ   Y W d   ƒ qzY n0 ||||fD ]`}|d u räqÖ| j||d2 ||g|	¢R Ž }|
d ur|
|ƒ W d   ƒ qÖ1 s,0    Y  qÖ|  td¡  ||g|	¢R Ž  W d   ƒ n1 sl0    Y  |r ||g|	¢R Ž }|
d urÞ|
|ƒ n>|  td¡  ||g|	¢R Ž  W d   ƒ n1 sÔ0    Y  W d   ƒ qz1 sô0    Y  qzd S )Nr-  r   )r   r1   zto return str or byteszos.PathLike)r   rH   r   r   r!  r   r   r{   rL   rw   rI   rN   Ú	functionsZsubTestrÖ   rÜ   ÚassertRaisesRegexrc   )r(   Zstr_filenameZbytes_fspathÚbytes_filenamerq   Z
int_fspathZ
str_fspathr   Zallow_fdÚ
extra_argsZ
cleanup_fnr  r1   rà   r   r   r	   Útest_path_t_converteræ  sL    

ÿ
*ÿ0

þz)PathTConverterTests.test_path_t_converterc                 C   sÄ   d}|   t|d ¡ t tdƒ¡ W d   ƒ n1 s80    Y  |   t|d ¡ t tdƒ¡ W d   ƒ n1 sv0    Y  |   t|d ¡  t ttƒ ƒ¡ W d   ƒ n1 s¶0    Y  d S )Nz-__fspath__\(\) to return str or bytes, not %srÁ   rW   Úfloatg¸…ëQ¸@Úobject)r   rc   r   r˜   r   r¥  )r(   r@  r   r   r	   Ú&test_path_t_converter_and_custom_class  s    ,,z:PathTConverterTests.test_path_t_converter_and_custom_class)	rC   rD   rE   r   ÚF_OKrÖ   rŸ  r£  r¦  r   r   r   r	   r  Ú  s   ú	,r  rÜ  rÝ  c                   @   s   e Zd Zdd„ ZdS )ÚBlockingTestsc                 C   sn   t  tt j¡}|  t j|¡ |  t  |¡d¡ t  |d¡ |  t  |¡d¡ t  |d¡ |  t  |¡d¡ d S r  )	r   r   rŸ   r   rw   rN   r0   rÜ  rÞ  r’   r   r   r	   rß    s    zBlockingTests.test_blockingN)rC   rD   rE   rß  r   r   r   r	   r¨    s   r¨  c                   @   s   e Zd Zdd„ ZdS )ÚExportsTestsc                 C   s    |   dtj¡ |   dtj¡ d S )Nr   rÏ  )r¯   r   Ú__all__rJ   r   r   r	   Útest_os_all-  s    zExportsTests.test_os_allN)rC   rD   rE   r«  r   r   r   r	   r©  ,  s   r©  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestDirEntryc                 C   s0   t j tj¡| _|  tj| j¡ t  | j¡ d S r#   )r   r1   Úrealpathr   rH   rw   r  r4   rJ   r   r   r	   rK   3  s    zTestDirEntry.setUpc                 C   s   |   ttj¡ d S r#   )r\   rc   r   ÚDirEntryrJ   r   r   r	   Útest_uninstantiable8  s    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 )Nrd  ó   pythonc                 S   s   g | ]}|‘qS r   r   ©r   Úentryr   r   r	   r
   =  r   z0TestDirEntry.test_unpickable.<locals>.<listcomp>r   )r!   r   r1   r3   Úscandirr˜  r%   r®  r0   r   rê   r\   rc   rì   )r(   r   r²  rê   r   r   r	   Útest_unpickable;  s    zTestDirEntry.test_unpickableN)rC   rD   rE   rK   r¯  r´  r   r   r   r	   r¬  2  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   r1   r­  r   rH   r!  Ú
bytes_pathrw   r  r4   rJ   r   r   r	   rK   G  s    zTestScandir.setUprd  c                 C   s2   t |tƒr| jn| j}tj ||¡}t|dƒ |S )Nr°  )r÷   r@   r¶  r1   r   r3   r!   )r(   r   r1   r   r   r   r	   r!   M  s    
zTestScandir.create_filec                 C   s2   t dd„ t | j¡D ƒƒ}|  t| ¡ ƒ|¡ |S )Nc                 s   s   | ]}|j |fV  qd S r#   r   r±  r   r   r	   r}  T  s   ÿz*TestScandir.get_entries.<locals>.<genexpr>)rc  r   r³  r1   r0   rD  Úkeys)r(   ÚnamesÚentriesr   r   r	   Úget_entriesS  s
    
ÿzTestScandir.get_entriesc                 C   sZ   |rJt |ƒD ]:}| d¡sq|dv r&q|  t||ƒt||ƒ|||f¡ qn|  ||¡ d S )NZst_)Úst_devÚst_inoÚst_nlink)rÓ   rK  r0   rÖ   )r(   Zstat1Zstat2Zskip_fieldsrâ   r   r   r	   Úassert_stat_equalY  s    
þzTestScandir.assert_stat_equalc                 C   s(   t  | j¡}|  tt|ƒ¡ | ¡  d S r#   )r   r³  r1   r\   rc   ro   rN   )r(   Úscandir_iterr   r   r	   r¯  f  s    zTestScandir.test_uninstantiablec                 C   s<   |   d¡}t | j¡}dd l}|  t|j||¡ | ¡  d S )Nrd  r   )	r!   r   r³  r1   rê   r\   rc   rì   rN   )r(   r   r¿  rê   r   r   r	   r´  k  s
    
zTestScandir.test_unpickablec                 C   s2  |   |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 )NFrS  r-  )r%   r   r®  r0   r   r1   r3   Úinoder˜   r¼  Úis_dirÚS_ISDIRrÛ   Úis_fileÚS_ISREGÚ
is_symlinkr_  r¾  )r(   r²  r   rÁ  rÃ  rÅ  Z
entry_statZentry_lstatr   r   r	   Úcheck_entryr  s>    
ÿ

ÿ

ÿ
ÿ
ÿ
ÿ
þþzTestScandir.check_entryc           	   
   C   s‚  t tdƒ}t ¡ }tj | jd¡}t |¡ |  d¡}|rŠzt |tj | jd¡¡ W n2 t	yˆ } z|  
d| ¡ W Y d }~n
d }~0 0 |rÂtj|tj | jd¡dd t |tj | jd	¡¡ ddg}|rØ| d¡ |ræ| d
¡ |  |¡}|d }|  |dddd¡ |d }|  |dddd¡ |rD|d }|  |dddd¡ |r~|d }|  |dddd¡ |d	 }|  |d	ddd¡ d S )NrØ  rÓ   rd  zlink_file.txtrå  Úsymlink_dirT)r¥   úsymlink_file.txt)rÇ  rÈ  F)r   r   r   ræ  r1   r3   r4   r!   rØ  rê  rZ   r¡   rò  r@  rº  rÆ  )	r(   rØ  r¡   r;   r   r¶   r¸  r¹  r²  r   r   r	   Útest_attributesŽ  sB    


$ÿ


zTestScandir.test_attributesc                 C   sN   t |tƒr| jn| j}tt |¡ƒ}|  t|ƒd¡ |d }|  |j	|¡ |S r–  )
r÷   r@   r¶  r1   rí  r   r³  r0   r-   r   )r(   r   r1   r¹  r²  r   r   r	   Ú	get_entry·  s    zTestScandir.get_entryc                 C   s   | j |d}|  tj |¡¡S )Nr   )r!   rÊ  r   r1   Úbasename)r(   r   r   r   r   r	   Úcreate_file_entryÀ  s    zTestScandir.create_file_entryc              	   C   sp   |   ¡ }t ¡ }zNt | j¡ tdd„ t ¡ D ƒƒ}|  t| 	¡ ƒtj 
|¡g¡ W t |¡ nt |¡ 0 d S )Nc                 s   s   | ]}|j |fV  qd S r#   r   r±  r   r   r	   r}  Ì  r   z5TestScandir.test_current_directory.<locals>.<genexpr>)r!   r   r$   r5   r1   rc  r³  r0   rD  r·  rË  )r(   r   Zold_dirr¹  r   r   r	   Útest_current_directoryÄ  s    ÿz"TestScandir.test_current_directoryc                 C   s   |   ¡ }|  t|ƒd¡ d S )Nz<DirEntry 'file.txt'>)rÌ  r0   r~  ©r(   r²  r   r   r	   Ú	test_reprÒ  s    zTestScandir.test_reprc                 C   s*   |   ¡ }|  t |¡tj | jd¡¡ d S )Nrd  )rÌ  r0   r   Úfspathr1   r3   rÎ  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   r!  rÌ  rÐ  r%   r@   r0   r1   r3   )r(   r¡  Zbytes_entryrÐ  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rF|  | ¡ ¡ |  	| 
¡ ¡ |  	| ¡ ¡ t jdkr|  t|j¡ | ¡  |jdd n0|  | ¡ d¡ |  t|j¡ | jt|jdd d S )NrÓ   r-  FrS  r   )r   r1   r3   r4   rÊ  r  r   rO   rÁ  r`  rÃ  rÅ  r\   r6   rÀ  r˜   r„  )r(   r1   r²  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rv|  
t|j¡ | ¡  |jdd n0|  | ¡ d¡ |  
t|j¡ | j
t|jdd d S )Nr-  FrS  r   )rÌ  r   rI   r1   r`  rÁ  r   rO   rÃ  rÅ  r\   r6   rÀ  r˜   r„  rÎ  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 linkrd  zsymlink.txtr   FrS  )r   ræ  rZ   r!   r   r¡   r1   r3   rº  rI   r„  rÀ  r`  rÁ  rÃ  rO   rÅ  r\   r6   r˜   )r(   r   r¹  r²  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 ©Nrd  rU   r   s   file.txt)
r!   r   r!  r1   rí  r³  r0   r-   r   r3   )r(   Ú
path_bytesr¹  r²  r   r   r	   rY     s    
ÿzTestScandir.test_bytesc              
   C   sÐ   |   d¡ ttfD ]¸}|t | j¡ƒ}|  t¡ tt 	|¡ƒ}W d   ƒ n1 sT0    Y  |  
t|ƒd|¡ |d }|  
|jd¡ |  
|jt tj | jd¡¡¡ |  t|jƒt¡ |  t|jƒt¡ qd S rÖ  )r!   r|   r}   r   r!  r1   ÚassertWarnsr~  rí  r³  r0   r-   r   r3   r¥  ro   r@   )r(   rF  r×  r¹  r²  r   r   r	   Útest_bytes_like,  s    
,ÿzTestScandir.test_bytes_likez.fd support for listdir required for this test.c              	   C   sv  |   tjtj¡ |  d¡ dg}t ¡ rJt dtj 	| jd¡¡ | 
d¡ t | j¡}t |¡}t|ƒ}W d   ƒ n1 s‚0    Y  dd„ |D ƒ}|  t|ƒ|¡ |  |t |¡¡ |D ]}|  |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   ƒ n1 sh0    Y  d S )	Nrd  rØ  c                 S   s   g | ]
}|j ‘qS r   r   r±  r   r   r	   r
   I  r   z'TestScandir.test_fd.<locals>.<listcomp>rT  F)rž   r7  rS  )r¯   r   r³  rV  r!   r   ræ  r¡   r1   r3   rò  r;  rí  r0   rD  ré  r   rÐ  rÅ  r˜   rW  )r(   Zexpected_namesrq   ru  r¹  r¸  r²  r  r   r   r	   Útest_fd<  s*    

&zTestScandir.test_fdc                 C   s   |   ttjd¡ d S )NrI  )r\   r6   r   r³  rJ   r   r   r	   Útest_empty_pathV  s    zTestScandir.test_empty_pathc                 C   sN   |   d¡ t | j¡}t|ƒ}|  t|ƒd|¡ t|ƒ}|  t|ƒd|¡ d S )Nrd  rU   r   )r!   r   r³  r1   rí  r0   r-   )r(   rª  r¹  Zentries2r   r   r	   Útest_consume_iterator_twiceY  s    
z'TestScandir.test_consume_iterator_twicec                 C   s$   di g fD ]}|   ttj|¡ q
d S )NgX9´Èv¾ó?)r\   rc   r   r³  )r(   Úobjr   r   r	   Útest_bad_path_typed  s    zTestScandir.test_bad_path_typec                 C   sf   |   d¡ |   d¡ t | j¡}t|ƒ | ¡  | ¡  |  ¡  ~W d   ƒ n1 sX0    Y  d S ©Nrd  ú	file2.txt)r!   r   r³  r1   rs  rN   Úcheck_no_resource_warning©r(   rª  r   r   r	   Ú
test_closeh  s    


zTestScandir.test_closec                 C   sv   |   d¡ |   d¡ t | j¡}t|ƒ W d   ƒ n1 s>0    Y  |  ¡  ~W d   ƒ n1 sh0    Y  d S rß  )r!   r   r³  r1   rs  rá  râ  r   r   r	   Útest_context_managers  s    

&
z TestScandir.test_context_managerc                 C   sT   |   d¡ |   d¡ t | j¡ }t|ƒ | ¡  W d   ƒ n1 sF0    Y  d S rß  )r!   r   r³  r1   rs  rN   râ  r   r   r	   Útest_context_manager_close{  s
    

z&TestScandir.test_context_manager_closec              	   C   s¨   |   d¡ |   d¡ |  t¡L t | j¡ }t|ƒ dd  W d   ƒ n1 sR0    Y  W d   ƒ n1 sp0    Y  |  ¡  ~W d   ƒ n1 sš0    Y  d S )Nrd  rà  rU   r   )r!   r\   ÚZeroDivisionErrorr   r³  r1   rs  rá  râ  r   r   r	   Útest_context_manager_exception‚  s    

D
z*TestScandir.test_context_manager_exceptionc                 C   sž   |   d¡ |   d¡ t | j¡}t|ƒ |  t¡ ~t ¡  W d   ƒ n1 sR0    Y  t | j¡}t	|ƒ |  
¡  ~W d   ƒ n1 s0    Y  d S rß  )r!   r   r³  r1   rs  rØ  ÚResourceWarningr   Ú
gc_collectrí  rá  râ  r   r   r	   Útest_resource_warningŒ  s    

&
z!TestScandir.test_resource_warningN)rd  )rd  )&rC   rD   rE   r   rá  rK   r!   rº  r¾  r¯  r´  rÆ  rÉ  rÊ  rÌ  rÍ  rÏ  rÑ  rÒ  rÓ  rÔ  rÕ  rY  rÙ  r   r   r   ré  rV  rÚ  rÛ  rÜ  rÞ  rã  rä  rå  rç  rê  r   r   r   r	   rµ  D  s@   
)	
ÿ

rµ  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   s    dD ]}|   ||  |¡¡ qd S )N)rh  s   goodbyes   some/path/and/file©r0   rÐ  )r(   Úbr   r   r	   Útest_return_bytes¡  s    zTestPEP519.test_return_bytesc                 C   s    dD ]}|   ||  |¡¡ qd S )N)ZhelloZgoodbyezsome/path/and/filerì  )r(   rr   r   r   r	   Útest_return_string¥  s    zTestPEP519.test_return_stringc                 C   sL   dD ]B}t |ƒ}|  ||  |¡¡ |  dt |¡¡ |  dt |¡¡ qd S )N)úpath/like/objectó   path/like/objectrñ  rð  )r   r0   rÐ  r   r!  rA   )r(   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Ã   )r0   rÐ  r   rO   Ú
issubclassr   ÚPathLiker÷   rJ   r   r   r	   rW  ±  s    zTestPEP519.test_pathlikec                 C   s4   t ddi ƒ}tt t|ƒ fD ]}|  t| j|¡ qd S )NZblahr   )ro   rÁ   r   r\   rc   rÐ  )r(   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#   )r\   rc   rÐ  rJ   r   r   r	   Útest_argument_required»  s    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   rU   )r\   rc   rÐ  r   ro   Ú
__fspath__ræ  )r(   Ú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                   @   s   e Zd ZdS )z0TestPEP519.test_pathlike_subclasshook.<locals>.ANrt  r   r   r   r	   ÚAÌ  s   rû  )r   rô  r`  ró  r   rO   )r(   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   rô  r@   ÚtypesÚGenericAliasrJ   r   r   r	   Útest_pathlike_class_getitemÑ  s    z&TestPEP519.test_pathlike_class_getitemN)rC   rD   rE   r`  r   rÐ  rî  rï  rò  rW  rö  r÷  rú  rü  rÿ  r   r   r   r	   rë  ›  s   
rë  c                   @   s   e Zd Zdd„ ZdS )Ú
TimesTestsc                 C   sn   t  ¡ }|  |t j¡ dD ]}t||ƒ}|  |t¡ qt jdkrj|  |jd¡ |  |j	d¡ |  |j
d¡ d S )N)ÚuserÚsystemÚchildren_userÚchildren_systemÚelapsedr-  r   )r   r5  r%   Útimes_resultrÖ   r¤  r   r0   r  r  r  )r(   r5  Zfieldrú   r   r   r	   Ú
test_timesÖ  s    

zTimesTests.test_timesN)rC   rD   rE   r  r   r   r   r	   r   Õ  s   r   Úforkc                   @   s   e Zd Zdd„ ZdS )Ú	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)rC   rD   rE   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)rC   rD   rE   rË  r`  r   r  rÐ  r   r   r   r	   r  ø  s   r  Ú__main__)r   )N)‚rñ  r  r  Ú
contextlibrK  r8   rv  rL  r  r   r3  r   rê   r  r.  r  r˜   r‚   ra   Z	sysconfigr.   r‹  r   rA  rý  r   r2  rŒ  Útestr   Ztest.supportr   r½   r   rŠ  ÚImportErrorr‰  r  ÚpwdÚgetpwallrU  rÜ   Z	_testcapir   r   rI  Ztest.support.script_helperr   r   r   r\  r   r   r   ÚversionrK  r®  Úgetgidr÷  r   r!   ZTestCaser"   rF   r¾   r  ra  ZBasicTestMappingProtocolrb  rÌ  r   r  r  r&  r(  rD  r]  rg  rk  rw  Zget_config_varZOS_URANDOM_DONT_USE_FDr­  rƒ  Úcontextmanagerr”  r•  r¯  r´  rá  rî  r  r  r>  rJ  rZ  r[  r}  r„  r‘  r“  r—  r¡  r½  r=  rè  rì  r  r  rð  r   rL  Zrequires_linux_versionrN  rb  rm  rs  r‚  r†  r  r¨  r©  r¬  rµ  rë  r   r	  r  rC   Úmainr   r   r   r	   Ú<module>   sd  




A a e \  ' EGj;)	-ÿýÿÿM ÿh#d%CGs/< 0![H 4ÿV OÿQ0
]
yBÿ  Y:
