a
    äze| ã                	   @   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   ú"/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                   @   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 )Ú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_filec              	   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(  †  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   r@  Ú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   rN  r-   rZ   r˜   r   rH   rF  r@  rG  r0   )r(   ÚgroupsZgid_1Zgid_2rK  rL  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   rG  r@  rF  r0   )r(   Úuid_1Úuid_2rL  rK  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 rQ  )	rR  r   r˜   r   rH   rG  r\   rê  r@  )r(   rS  rT  rL  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   rB  r   r   r	   ÚtearDownClass  s    zChownFileTests.tearDownClassN)rC   rD   rE   ÚclassmethodrD  rM  r   r   r   r   rP  Úroot_in_posixr-   rR  rU  rV  rW  r   r   r   r	   rA  ä  s   


ÿ

ÿ
rA  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»   $  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   r>  ÚassertFalser±  ©r(   r[  r\  r   r   r	   Útest_remove_all'  s    


zRemoveDirsTests.test_remove_allc                 C   sŠ   t j tjd¡}t  |¡ t j |d¡}t  |¡ tt j |d¡ƒ t  |¡ |  t j 	|¡¡ |  
t j 	|¡¡ |  
t j 	tj¡¡ d S ©Nr[  r\  úfile.txt)r   r1   r3   r   rH   r4   r!   r>  r]  r±  rO   r^  r   r   r	   Útest_remove_partial1  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 r`  )r   r1   r3   r   rH   r4   r!   r\   r7   r>  rO   r±  r^  r   r   r	   Útest_remove_nothing<  s    

(z#RemoveDirsTests.test_remove_nothingN)rC   rD   rE   rK   r»   r_  rb  rc  r   r   r   r	   rZ     s
   
rZ  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_devnullJ  s
    
&zDevNullTests.test_devnullN)rC   rD   rE   rg  r   r   r   r	   rd  I  s   rd  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_lengthS  s
    z URandomTests.test_urandom_lengthc                 C   s0   t  d¡}|  |t¡ t  d¡}|  ||¡ d S ©Né   )r   ri  r%   r@   r  ©r(   Zdata1Zdata2r   r   r	   Útest_urandom_valueZ  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‹   Úoutr–  r   r   r	   Úget_urandom_subprocess`  s    ü
z#URandomTests.get_urandom_subprocessc                 C   s$   |   d¡}|   d¡}|  ||¡ d S rk  )rr  r  rm  r   r   r	   Útest_urandom_subprocessk  s    

z$URandomTests.test_urandom_subprocessN)rC   rD   rE   rj  rn  rr  rs  r   r   r   r	   rh  R  s   rh  Ú	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   rt  r7   r8   r®   r   r;  )rC  r=   r   r   r	   rD  s  s    zGetRandomTests.setUpClassc                 C   s*   t  d¡}|  |t¡ |  t|ƒd¡ d S rk  )r   rt  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   rt  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   rt  ÚGRND_NONBLOCKÚBlockingIOErrorrJ   r   r   r	   Útest_getrandom_nonblockŽ  s    z&GetRandomTests.test_getrandom_nonblockc                 C   s$   t  d¡}t  d¡}|  ||¡ d S rk  )r   rt  r  rm  r   r   r	   Útest_getrandom_value–  s    

z#GetRandomTests.test_getrandom_valueN)
rC   rD   rE   rX  rD  rw  ry  r{  r  r€  r   r   r   r	   ru  q  s   
ru  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‹   Úrcrq  Ú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„  rq  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_arglist$  s    z'ExecTests.test_execvpe_with_bad_arglistÚ_execvpez)No internal os._execvpe function to test.c           
      C   sÐ  t jd }|tu 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_execvpe)  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_strZ  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_env_  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_patht  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_setuid2  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_setgid9  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_seteuid@  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_setegidG  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_setreuidN  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_neg1W  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_setregid_  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_neg1h  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ì  ,  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   r  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  p  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ž  rp  Ú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ž  rp  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  r5  r,  r6  )r(   r  rK  ZNULLr7  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)r5  r,  r9  rJ   r   r   r	   Útest_CTRL_BREAK_EVENT(	  s    z$Win32KillTests.test_CTRL_BREAK_EVENTN)rC   rD   rE   r+  r.  r/  r5  r   Úskipr8  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   0	  s    
,zWin32ListdirTests.setUpc                 C   s   t  tj¡ d S r#   )r  r  r   rH   rJ   r   r   r	   r»   =	  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
   J	  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_path@	  s    þþz/Win32ListdirTests.test_listdir_no_extended_pathc                 C   sh   dt j tj¡ }|  tt  |¡ƒ| j¡ dt  	t j tj¡¡ }|  tt  |¡ƒdd„ | jD ƒ¡ dS )z&Test when the path starts with '\\?\'.ú\\?\ó   \\?\c                 S   s   g | ]}t  |¡‘qS r   r@  rA  r   r   r	   r
   Y	  r   z@Win32ListdirTests.test_listdir_extended_path.<locals>.<listcomp>N)
r   r1   rJ  r   rH   r0   rB  ré  r=  r!  r?  r   r   r	   Útest_listdir_extended_pathL	  s    þþz,Win32ListdirTests.test_listdir_extended_pathN)rC   rD   rE   rË  rK   r»   rC  rF  r   r   r   r	   r<  ,	  s
   r<  Úreadlinkzneeds os.readlink()c                   @   sz   e Zd ZdZej e¡Ze 	e¡Z
e 	e¡Zdd„ Zdd„ Zdd„ Zdd	„ Zejd
d„ ƒZejdd„ ƒZejdd„ ƒZdS )ÚReadlinkTestsZreadlinktestc                 C   sb   t j |¡}t j |¡}tjdkrRdd„ }||ƒr>|dd … }||ƒrR|dd … }|  ||¡ d S )Nr‡   c                 S   s   |   t| tƒrdnd¡S )NrE  rD  )Ú
startswithr÷   r@   )rð   r   r   r	   Ú<lambda>i	  s   ÿz/ReadlinkTests.assertPathEqual.<locals>.<lambda>rj   )r   r1   Únormcasera   r½   r0   )r(   ÚleftÚrightZ
has_prefixr   r   r	   ÚassertPathEqualc	  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   q	  s    zReadlinkTests.setUpc                 C   s0   t | jƒ}|  ttj| j¡ |  ttj|¡ d S r#   )r   rO  r\   r7   r   rG  )r(   rO  r   r   r	   Útest_not_symlinkw	  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   rG  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¡   rO  rQ  rw   r   rI   r   rN  rG  )r(   rQ  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¡   rP  rR  rw   r   rI   rG  r   rN  r%   r@   r?  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¡   rP  rR  rw   r   rI   rG  rN  r%   r@   r?  r   r   r	   Ú
test_bytes	  s
    zReadlinkTests.test_bytesN)rC   rD   rE   rQ  r   r1   rJ  rŸ   rO  r!  rR  rP  rN  rK   rS  rT  r   Úskip_unless_symlinkrU  rV  rW  r   r   r   r	   rH  \	  s   



rH  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^   t j | j¡sJ ‚t j | j¡s$J ‚t j | j¡r6J ‚t j | j¡rHJ ‚t j | j¡rZJ ‚d S r#   )r   r1   r±  Údirlink_targetrO  ÚdirlinkrQ  Úmissing_linkrJ   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±  rQ  ró  r[  r  rG   r\  rJ   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¡   rZ  r[  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¡   rO  rQ  rO   r1   r±  Úisfiler]  r^  rJ   r   r   r	   Útest_file_link¸	  s
    z Win32SymlinkTests.test_file_linkc                 C   sF   | j }tj |¡rt |¡ d}tj |¡r0J ‚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¡   )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#   )rb  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#   )rb  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#   )rb  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level1rf  rg  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 )Nrj  rk  )r   rG  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
   :
  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   rr  r	   Útest_appexeclink5
  s     

ÿ

z"Win32SymlinkTests.test_appexeclinkN)rC   rD   rE   rQ  r   r1   rJ  rŸ   rO  r[  r;   rZ  r\  rK   r»   r_  ra  rb  rc  rd  re  r^  ri  r   r   rG   r±  rm  rp  rz  r   r   r   r	   rY  ™	  s,   
#
þ
#rY  c                   @   sD   e Zd ZdZej ej e¡¡Z	dd„ Z
dd„ Zdd„ Zdd	„ Zd
S )ÚWin32JunctionTestsZjunctiontestc                 C   s(   t j | j¡sJ ‚t j | j¡r$J ‚d S r#   )r   r1   r±  Újunction_targetrG   ÚjunctionrJ   r   r   r	   rK   O
  s    zWin32JunctionTests.setUpc                 C   s   t j | j¡rt  | j¡ d S r#   )r   r1   rG   r}  rI   rJ   r   r   r	   r»   S
  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 )NrD  )Ú_winapiÚCreateJunctionr|  r}  rO   r   r1   rG   r±  r.  r  r˜   r:  r0   r]  r]  rK  rG  rJ   r   r   r	   Útest_create_junctionW
  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_junctiond
  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{  J
  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_handlesn
  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|jdks~J ‚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ˆ   rW   rU   )r   rH   rw   rI   rA  ÚtextwrapÚdedentr‚   r#  ra   r‰   r&   r   r˜   r6   r©  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‚  l
  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|¡ t j |¡s*J ‚dS )a¹  
        The symlink target should resolve relative to the link, not relative
        to the current directory.

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

        In issue13772, it was discovered that directory detection failed if
        the symlink target was not specified relative to the current
        directory, which was a defect in the implementation.
        r  Z	some_linkZsome_dirN)r   r1   r3   r¡   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@â )rJ  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½   rI  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_exitcode&  s
    z$PidTests.test_waitstatus_to_exitcoder‡   úwin32-specific testc                 C   s"   d}d|› d}| j ||d d S )Nl   :   z$import _winapi; _winapi.ExitProcess(r°  r±  r­  )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_windows6  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_processI  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_killD  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   r@  rq  r   r   r	   r
   f  r   z*SpawnTests.create_args.<locals>.<listcomp>c                 S   s"   i | ]\}}t  |¡t  |¡“qS r   r@  )r   ÚkÚvr   r   r	   Ú
<dictcomp>g  s   ÿz*SpawnTests.create_args.<locals>.<dictcomp>)r©  r   rH   rw   rI   rc  r   r  r  r&   r0  Zuuid4rk  r   r   ra   r‰   ri  )r(   r½  r¾  r   r‹   r    r„   r   r   r	   Úcreate_argsP  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_spawnll  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_spawnler  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_spawnlpx  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»  O  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ñ  &  s
    z#SendfileTestServer.Handler.__init__c                 C   s    |   d¡}| jr| j |¡ d S )Né   )Úrecvró  rò  rò  rv  r   r   r	   Úhandle_read-  s    
z&SendfileTestServer.Handler.handle_readc                 C   s   d  | j¡S )Nr   )r3   rò  rJ   r   r   r	   Úget_data2  s    z#SendfileTestServer.Handler.get_datac                 C   s   |   ¡  d| _d S rÖ  )rN   rô  rJ   r   r   r	   Úhandle_close5  s    z'SendfileTestServer.Handler.handle_closec                  C   s   ‚ d S r#   r   rJ   r   r   r	   Úhandle_error9  s    z'SendfileTestServer.Handler.handle_errorN)rC   rD   rE   rñ  rù  rú  rû  rü  r   r   r   r	   ÚHandler$  s
   rý  c                 C   sp   t j | ¡ tj | ¡ |  tjtj¡ |  	|¡ |  
d¡ | j ¡ d d… \| _| _d | _d| _t  ¡ | _d S )Nr¬   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ñ  <  s    

zSendfileTestServer.__init__c                 C   s   | j S r#   )r  rJ   r   r   r	   r  I  s    zSendfileTestServer.runningc                 C   s.   | j r
J ‚t ¡ | _tj | ¡ | j ¡  d S r#   )r  rþ  ÚEventÚ_SendfileTestServer__flagrÿ  Ústartr(  rJ   r   r   r	   r  M  s    

zSendfileTestServer.startc                 C   s   | j s
J ‚d| _|  ¡  d S r¾  )r  r  r3   rJ   r   r   r	   ÚstopS  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(  X  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   )Útimeoutrp  )
r  r  r  r   Z
socket_mapr  ÚacquireZloopÚreleaseZ	close_allrJ   r   r   r	   rš  `  s    

zSendfileTestServer.runc                 C   s   |   ¡ \}}|  |¡| _d S r#   )Úacceptrý  r
  )r(   rö  Úaddrr   r   r	   Úhandle_accepti  s    z SendfileTestServer.handle_acceptc                 C   s   |   ¡  d S r#   )rN   rJ   r   r   r	   Úhandle_connectm  s    z!SendfileTestServer.handle_connectc                 C   s   dS r`   r   rJ   r   r   r	   Úwritableq  s    zSendfileTestServer.writablec                  C   s   ‚ d S r#   r   rJ   r   r   r	   rü  t  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   ÚDATArB  r   r   r	   rD  „  s    
zTestSendfile.setUpClassc                 C   s   t j| jŽ  t  t j¡ d S r#   )r   Zthreading_cleanuprk  rI   rH   rB  r   r   r	   rW  ‰  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_sendr.  r/  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-  r/  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   r2  ©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-  rp  r   )r´   r²   r-  rp  Ú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©r6  i   )r!  r   r  r&  rl   ZassertLessEqualr-   Úminr)  r0   r#  rN   r"  r(  r
  rú  Úhash)r(   r,  Zexpected_datar/  r-  r.  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©r7  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   r2  r4  r   r   r	   Útest_headers_overflow_32bits)  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   r@  rA  r   r>  rB  r4  r   r   r	   Útest_trailers_overflow_32bits2  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   rE  r7   r8   r(  r'  )r(   r…  r   r   r	   Ú
test_flags;  s    ÿ
zTestSendfile.test_flagsN)rC   rD   rE   r!  ra   r½   rI  r8  r   r   Zrequires_headers_trailersÚmaxsizeZrequires_32brX  rD  rW  rK   r»   r)  r0  r1  r3  r5  r9  r=  r?  rC  rD  r   r   rF  r   r   r   r	   r  x  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   rH  rl   r7   rI   )r    r   r   r	   Úsupports_extended_attributesG  s    
þ&rJ  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   rI  re  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‘   r@  )r   rH   rw   rI   r!   r\   r7   r0   r  r8   ÚENODATAr%   rí  r  r
  r   ÚXATTR_REPLACEÚXATTR_CREATEÚEEXISTró  rB  r°   )r(   rr   ÚgetxattrrH  ÚremovexattrÚ	listxattrrÑ  r  r¨  Z
init_xattrZxattrÚmanyÚthingr   r   r	   Ú_check_xattrs_str]  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#   )rW  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#   ©rX  r   rR  rH  rS  rT  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  rY  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   rR  rl   ©r1   r„   r    r   r   r	   rR    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   rH  rl   r\  r   r   r	   rH     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   rS  rl   r\  r   r   r	   rS  £  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   rT  rl   r\  r   r   r	   rT  ¦  s    z2ExtendedAttributeTests.test_fds.<locals>.listxattr)rX  )r(   rR  rH  rS  rT  r   r   r	   Útest_fdsœ  s
    zExtendedAttributeTests.test_fdsN)rC   rD   rE   rW  rX  rZ  r[  r^  r   r   r   r	   rL  W  s
   0rL  Ú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   r_  r7   ra   r½   r8   r2  Ú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‡   ra  N)r‚   Úcheck_outputÚDEVNULLr×   r6   ÚCalledProcessErrorrê  rZ   rÁ   r   r_  ra   Ú	__stdin__rl   r7   r½   r8   r2  rb  r0   )r(   rt   r<   rÁ  r¶   r   r   r	   Útest_stty_matchÀ  s"    ÿÿÿ

zTermsizeTests.test_stty_matchN)rC   rD   rE   re  rj  r   r   r   r	   r`  ¬  s   r`  Ú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   rk  Ú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   rq  r   r   r   r	   rl  Ý  s   rl  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   rt  )r&   Úbytes_filenamesÚunicode_filenamesr   r  rH   rò  ZTESTFN_UNDECODABLEr   r!  r|   r}   r†  )r(   rt  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¤   r@  r   ÚlchownrÌ  ÚchflagsÚlchflagsÚchrootrØ  rT  rM  s   userÚlchmodrG  z	should bezNo exception thrown by {}),r†  r   r5   rè  r:  r   r   r  r˜   rI   ra   r½   r>  ru  rd   r—   rv  ré  r   rò  r@  rx  rÌ  ry  rz  r{  rØ  rT  rR  rH  rS  r|  rG  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	   rr  î  s   rr  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_countL  s
    zCPUCountTests.test_cpu_countN)rC   rD   rE   r„  r   r   r   r	   r  K  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_inheritableV  s
    z+FDInheritanceTests.test_get_set_inheritableNz
need fcntlc                 C   sn   t  tt j¡}|  t j|¡ |  t  |¡d¡ t |tj	¡}|tj
 M }t |tj|¡ |  t  |¡d¡ d S r†  )r   r   rŸ   r   rw   rN   r0   r×  ÚfcntlÚF_GETFDÚ
FD_CLOEXECZF_SETFD)r(   rq   rœ   r   r   r	   Útest_get_inheritable_cloexec^  s    z/FDInheritanceTests.test_get_inheritable_cloexecc                 C   sf   t  tt j¡}|  t j|¡ |  t |tj¡tj	@ tj	¡ t  
|d¡ |  t |tj¡tj	@ d¡ d S )NTr   )r   r   rŸ   r   rw   rN   r0   rˆ  r‰  rŠ  rØ  r’   r   r   r	   Útest_set_inheritable_cloexeck  s    ÿÿz/FDInheritanceTests.test_set_inheritable_cloexecÚO_PATHzneed os.O_PATHc                 C   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_pathv  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(   Úfd1rp  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   rp  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…  U  s&   






r…  c                   @   sH   e Zd Zddddejfdfddddd	eed
dƒfgZdd„ Zdd„ ZdS )ÚPathTConverterTests)r˜   Tr   N)r:  Fr   NrP   FN)ry  F©r   N)rz  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   '  s    zTestDirEntry.setUpc                 C   s   |   ttj¡ d S r#   )r\   rc   r   ÚDirEntryrJ   r   r   r	   Útest_uninstantiable,  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 )Nra  ó   pythonc                 S   s   g | ]}|‘qS r   r   ©r   Úentryr   r   r	   r
   1  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«  &  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   ;  s    zTestScandir.setUpra  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!   A  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}  H  s   ÿz*TestScandir.get_entries.<locals>.<genexpr>)rc  r   r²  r1   r0   rB  Úkeys)r(   ÚnamesÚentriesr   r   r	   Úget_entriesG  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Ó   rI  r0   rÖ   )r(   Zstat1Zstat2Zskip_fieldsrâ   r   r   r	   Úassert_stat_equalM  s    
þzTestScandir.assert_stat_equalc                 C   s(   t  | j¡}|  tt|ƒ¡ | ¡  d S r#   )r   r²  r1   r\   rc   ro   rN   )r(   Úscandir_iterr   r   r	   r®  Z  s    zTestScandir.test_uninstantiablec                 C   s<   |   d¡}t | j¡}dd l}|  t|j||¡ | ¡  d S )Nra  r   )	r!   r   r²  r1   rê   r\   rc   rì   rN   )r(   r   r¾  rê   r   r   r	   r³  _  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_entryf  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Ó   ra  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   rB  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 )Nra  )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 linkra  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 ©Nra  rU   r   s   file.txt)
r!   r   r!  r1   rí  r²  r0   r-   r   r3   )r(   Ú
path_bytesr¸  r±  r   r   r	   rW    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(   rC  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 )	Nra  rØ  c                 S   s   g | ]
}|j ‘qS r   r   r°  r   r   r	   r
   =  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   rB  ré  r   rÏ  rÄ  r˜   rW  )r(   Zexpected_namesrq   ru  r¸  r·  r±  r  r   r   r	   Útest_fd0  s*    

&zTestScandir.test_fdc                 C   s   |   ttjd¡ d S )NrI  )r\   r6   r   r²  rJ   r   r   r	   Útest_empty_pathJ  s    zTestScandir.test_empty_pathc                 C   sN   |   d¡ t | j¡}t|ƒ}|  t|ƒd|¡ t|ƒ}|  t|ƒd|¡ d S )Nra  rU   r   )r!   r   r²  r1   rí  r0   r-   )r(   rª  r¸  Zentries2r   r   r	   Útest_consume_iterator_twiceM  s    
z'TestScandir.test_consume_iterator_twicec                 C   s$   di g fD ]}|   ttj|¡ q
d S )NgX9´Èv¾ó?)r\   rc   r   r²  )r(   Úobjr   r   r	   Útest_bad_path_typeX  s    zTestScandir.test_bad_path_typec                 C   sf   |   d¡ |   d¡ t | j¡}t|ƒ | ¡  | ¡  |  ¡  ~W d   ƒ n1 sX0    Y  d S ©Nra  ú	file2.txt)r!   r   r²  r1   rs  rN   Úcheck_no_resource_warning©r(   rª  r   r   r	   Ú
test_close\  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_managerg  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_closeo  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 )Nra  rß  rU   r   )r!   r\   ÚZeroDivisionErrorr   r²  r1   rs  rà  rá  r   r   r	   Útest_context_manager_exceptionv  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)ra  )ra  )&rC   rD   rE   r   rà  rK   r!   r¹  r½  r®  r³  rÅ  rÈ  rÉ  rË  rÌ  rÎ  rÐ  rÑ  rÒ  rÓ  rÔ  rW  rØ  r   r   r   ré  rV  rÙ  rÚ  rÛ  rÝ  râ  rã  rä  ræ  ré  r   r   r   r	   r´  8  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)re  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	   rU  ¥  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>.ANrs  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ñ  rU  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›  Ú
contextlibrH  r8   rt  rI  r  rž  r1  r   rê   r  r,  r  r˜   r‚   ra   Z	sysconfigr.   r‰  rþ  rA  rü  r   r0  rŒ  Útestr   Ztest.supportr   r½   r   rˆ  ÚImportErrorrˆ  r~  ÚpwdÚgetpwallrR  rÜ   Z	_testcapir   r   rG  Ztest.support.script_helperr   r   r   rY  r   r   r   ÚversionrI  r¬  Úgetgidrõ  r   r!   ZTestCaser"   rF   r¾   r  ra  ZBasicTestMappingProtocolrb  rÌ  r   r  r  r&  r(  rA  rZ  rd  rh  ru  Zget_config_varZOS_URANDOM_DONT_USE_FDr«  r  Úcontextmanagerr’  r“  r­  r²  rß  rì  r  r  r<  rH  rX  rY  r{  r‚  r  r‘  r•  rŸ  r»  r;  ræ  rê  r  rÿ  rî  r  rJ  Zrequires_linux_versionrL  r`  rl  rr  r  r…  rœ  r§  r¨  r«  r´  rê  rÿ  r  r  rC   Úmainr   r   r   r	   Ú<module>   sd  




A a e \  ' EG^;)	-ÿýÿÿM ÿh#d%CGs/< 0![H 4ÿV OÿQ0
]
yBÿ  Y:
