a
    äzeÛW ã                   @   s¤  d Z ddlmZ ddlmZ e d¡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 ej e ¡ ejd ¡Ze ejdk d	¡Zd
d„ Ze eƒ 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ƒZ#e e$edƒd¡G dd„ deje#ƒƒZ%e e$edƒd¡G dd„ deje#ƒƒZ&e ejdkd¡G dd „ d ejƒƒZ'd!d"„ Z(e)d#kr e *¡  dS )$zTest posix functionsé    )Úsupport)Úassert_python_okÚposixN)Úcontextmanagerz-dummy-symlinkì        z(test is only meaningful on 32-bit buildsc               
   C   s`   t tdƒsdS zt d¡ W n> tyZ }  z&| jtjkrFW Y d } ~ dS W Y d } ~ n
d } ~ 0 0 dS )NÚsched_getschedulerFr   T)Úhasattrr   r   ÚOSErrorÚerrnoÚENOSYS)Úe© r   ú%/usr/lib/python3.9/test/test_posix.pyÚ_supports_sched   s    
$r   zrequires POSIX scheduler APIc                   @   sÄ  e Zd Zdd„ Zdd„ Zdd„ Ze ee	dƒd¡d	d
„ ƒZ
e ee	dƒd¡dd„ ƒZe ee	dƒd¡dd„ ƒZe ee	dƒd¡dd„ ƒZe ee	dƒd¡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ƒejv d1¡e eed2ƒd3¡d4d5„ ƒƒZe ee	d6ƒd7¡e eed2ƒd3¡d8d9„ ƒƒZe eed2ƒd3¡d:d;„ ƒZe ee	d<ƒd=¡d>d?„ ƒZe ee	d@ƒdA¡dBdC„ ƒZe ee	dDƒdE¡dFdG„ ƒZe ee	dDƒdE¡e ee	dHƒdI¡dJdK„ ƒƒZe ee	dDƒdE¡edLdM„ ƒƒZ e ee	dNƒdO¡dPdQ„ ƒZ!e ee	dRƒdS¡dTdU„ ƒZ"e ee	dRƒdS¡e ee	dVƒdW¡dXdY„ ƒƒZ#e ee	dRƒdS¡edZd[„ ƒƒZ$e ee	d\ƒd]¡d^d_„ ƒZ%e ee	d\ƒd]¡d`da„ ƒZ&e ee	dbƒdc¡ddde„ ƒZ'e ee	dbƒdc¡dfdg„ ƒZ(e ej)ejv dh¡didj„ ƒZ*e ej)ej+v dk¡dldm„ ƒZ,e ee	dnƒdo¡dpdq„ ƒZ-e ee	dnƒdo¡edrds„ ƒƒZ.e ee	dtƒdu¡dvdw„ ƒZ/e ee	dtƒdu¡edxdy„ ƒƒZ0e ee	dzƒd{¡d|d}„ ƒZ1e ee	d~ƒd¡d€d„ ƒZ2e ee	d‚ƒdƒ¡d„d…„ ƒZ3e eed†ƒd‡¡e4 5dˆd‰dŠ¡d‹dŒ„ ƒƒZ6e ee	dƒdŽ¡dd„ ƒZ7e ee	d‘ƒd’¡d“d”„ ƒZ8e ee	d•ƒd–¡d—d˜„ ƒZ9d™dš„ Z:e ee	d›ƒdœ¡ddž„ ƒZ;e ee	dŸƒoÜee<d ƒd¡¡d¢d£„ ƒZ=e ee	d¤ƒd¥¡d¦d§„ ƒZ>d¨d©„ Z?e ee	dªƒd«¡d¬d­„ ƒZ@e ee	d®ƒd¯¡d°d±„ ƒZAe ee	d²ƒd³¡d´dµ„ ƒZBe ee	d¶ƒd·¡d¸d¹„ ƒZCdºd»„ ZDd¼d½„ ZEd¾d¿„ ZFdÀdÁ„ ZGe e	jHejv dÂ¡dÃdÄ„ ƒZIe ee	dÅƒdÆ¡dÇdÈ„ ƒZJe ee	dÉƒdÊ¡dËdÌ„ ƒZKe ee	dÍƒdÎ¡dÏdÐ„ ƒZLe ee	dÑƒdÒ¡dÓdÔ„ ƒZMe eedÕƒdÖ¡e4 5dˆd‰d×¡dØdÙ„ ƒƒZNe4jOe eedÕƒdÖ¡e4 5dˆd‰d×¡dÚdÛ„ ƒƒƒZPe ee	dÜƒdÝ¡dÞdß„ ƒZQdàdá„ ZRe ee	dâƒdã¡dädå„ ƒZSe ee	dæƒdç¡dèdé„ ƒZTe ee	dæƒdç¡dêdë„ ƒZUdìdí„ ZVdîdï„ ZWe ee	dðƒdñ¡dòdó„ ƒZXe ee	dôƒdõ¡e eeYdöƒd÷¡e eedøƒdù¡dúdû„ ƒƒƒZZe eedüƒdý¡dþdÿ„ ƒZ[e ee\d ƒd¡e eedƒd¡dd„ ƒƒZ]e ee	dƒd¡Z^e ee	dƒd	¡Z_e^d
d„ ƒZ`e^e ee	dƒd¡dd„ ƒƒZaebdd„ ƒZce ee	dƒd¡dd„ ƒZde_dd„ ƒZee_dd„ ƒZfdd„ Zge eedƒd¡dd„ ƒZhd d!„ Zid"d#„ Zjd$d%„ Zke eed&ƒd'¡d(d)„ ƒZld0S (*  ÚPosixTesterc                 C   sD   t tjdƒ}| ¡  tjg| _t ¡ | _| j ¡  t 	ddt
¡ d S )Núw+Úignorez.* potential security risk .*)Úopenr   ÚTESTFNÚcloseÚteardown_filesZcheck_warningsÚ_warnings_managerÚ	__enter__ÚwarningsÚfilterwarningsÚRuntimeWarning©ÚselfÚfpr   r   r   ÚsetUp,   s    


ÿzPosixTester.setUpc                 C   s*   | j D ]}t |¡ q| j d d d ¡ d S ©N)r   r   Úunlinkr   Ú__exit__)r   Zteardown_filer   r   r   ÚtearDown6   s    
zPosixTester.tearDownc                 C   s>   g d¢}|D ],}t t|d ƒ}|d ur|ƒ  |  t|d¡ qd S )N)ÚctermidÚgetcwdÚgetcwdbÚunameÚtimesÚ
getloadavgÚgetegidÚgeteuidÚgetgidÚ	getgroupsÚgetpidÚgetpgrpÚgetppidÚgetuidÚsyncé   )Úgetattrr   ÚassertRaisesÚ	TypeError)r   ZNO_ARG_FUNCTIONSÚnameZ
posix_funcr   r   r   ÚtestNoArgFunctions;   s    zPosixTester.testNoArgFunctionsÚ	getresuidztest needs posix.getresuid()c                 C   s2   t  ¡ }|  t|ƒd¡ |D ]}|  |d¡ qd S ©Né   r   )r   r9   ÚassertEqualÚlenÚassertGreaterEqual)r   Zuser_idsÚvalr   r   r   Útest_getresuidJ   s    zPosixTester.test_getresuidÚ	getresgidztest needs posix.getresgid()c                 C   s2   t  ¡ }|  t|ƒd¡ |D ]}|  |d¡ qd S r:   )r   rA   r<   r=   r>   )r   Z	group_idsr?   r   r   r   Útest_getresgidR   s    zPosixTester.test_getresgidÚ	setresuidztest needs posix.setresuid()c                 C   s0   t  ¡ }|  t j|Ž ¡ |  t  ddd¡¡ d S ©Néÿÿÿÿ)r   r9   ÚassertIsNonerC   )r   Úcurrent_user_idsr   r   r   Útest_setresuidZ   s    zPosixTester.test_setresuidc                 C   s<   t  ¡ }d|vr8|d d ddf}| jtt jg|¢R Ž  d S ©Nr   r3   rE   )r   r9   r5   r	   rC   )r   rG   Znew_user_idsr   r   r   Útest_setresuid_exceptionb   s    z$PosixTester.test_setresuid_exceptionÚ	setresgidztest needs posix.setresgid()c                 C   s0   t  ¡ }|  t j|Ž ¡ |  t  ddd¡¡ d S rD   )r   rA   rF   rK   )r   Úcurrent_group_idsr   r   r   Útest_setresgidk   s    zPosixTester.test_setresgidc                 C   s<   t  ¡ }d|vr8|d d ddf}| jtt jg|¢R Ž  d S rI   )r   rA   r5   r	   rK   )r   rL   Znew_group_idsr   r   r   Útest_setresgid_exceptions   s    z$PosixTester.test_setresgid_exceptionÚ
initgroupsztest needs os.initgroups()c              
   C   sØ   |   ttj¡ |   ttjd ¡ |   ttjdd¡ |   ttjddtƒ ¡ t ¡ dkrÔzt t ¡ ¡j	}W n t
y‚   t d¡‚Y n0 zt |d¡ W n4 tyÈ } z|  |jtj¡ W Y d }~nd }~0 0 |  d¡ d S )Nr;   Úfoor   zneed a pwd entryé   z+Expected OSError to be raised by initgroups)r5   r6   r   rO   ÚobjectÚosr1   ÚpwdÚgetpwuidÚpw_nameÚKeyErrorÚunittestÚSkipTestr	   r<   r
   ÚEPERMÚfail)r   r7   r   r   r   r   Útest_initgroups|   s    &zPosixTester.test_initgroupsÚstatvfsztest needs posix.statvfs()c                 C   s   |   t tj¡¡ d S r    )Ú
assertTruer   r]   rS   Úcurdir©r   r   r   r   Útest_statvfs•   s    zPosixTester.test_statvfsÚfstatvfsztest needs posix.fstatvfs()c                 C   sN   t tjƒ}z4|  t | ¡ ¡¡ |  t | ¡ ¡¡ W | ¡  n
| ¡  0 d S r    )	r   r   r   r^   r   rb   Úfilenor]   r   r   r   r   r   Útest_fstatvfsš   s
    
zPosixTester.test_fstatvfsÚ	ftruncateztest needs posix.ftruncate()c                 C   sJ   t tjdƒ}z.| d¡ | ¡  t | ¡ d¡ W | ¡  n
| ¡  0 d S )Nr   Útestr   )	r   r   r   ÚwriteÚflushr   re   rc   r   r   r   r   r   Útest_ftruncate¤   s    
zPosixTester.test_ftruncateÚtruncateztest needs posix.truncate()c                 C   sP   t tjdƒ"}| d¡ | ¡  W d   ƒ n1 s40    Y  t tjd¡ d S )NÚwrf   r   )r   r   r   rg   rh   r   rj   r   r   r   r   Útest_truncate°   s    
&zPosixTester.test_truncateÚexecveNz/test needs execve() to support the fd parameterÚforkztest needs os.fork()c              	   C   s€   t  tjt j¡}z^t  ¡ }|dkrTt  t j tj¡d ¡ t	 
|tjddgt j¡ ntj|dd W t  |¡ nt  |¡ 0 d S )Nr   ú-cÚpass©Úexitcode)rS   r   ÚsysÚ
executableÚO_RDONLYrn   ÚchdirÚpathÚsplitr   rm   Úenvironr   Úwait_processr   )r   r   Úpidr   r   r   Útest_fexecve·   s    zPosixTester.test_fexecveÚwaitidztest needs posix.waitid()c                 C   sh   t  ¡ }|dkrDt  t j tj¡d ¡ t tjtjddgt j	¡ n t 
tj|tj¡}|  ||j¡ d S )Nr   ro   rp   )rS   rn   rv   rw   rx   rs   rt   r   rm   ry   r}   ÚP_PIDÚWEXITEDr<   Úsi_pid)r   r{   Úresr   r   r   Útest_waitidÆ   s    zPosixTester.test_waitidc                 C   s4  | j tdd t dd„ ¡ W d   ƒ n1 s20    Y  | j tdd tjdd W d   ƒ n1 sl0    Y  | j tdd tjdd	 W d   ƒ n1 s¦0    Y  | j tdd tjd
d W d   ƒ n1 sà0    Y  | j tdd tjd d W d   ƒ n1 s0    Y  | j tdd tjd d	 W d   ƒ n1 sX0    Y  | j tdd tjd d W d   ƒ n1 s”0    Y  | j tdd" tjd dd„ d W d   ƒ n1 sÖ0    Y  | j tdd" tjdd„ dd W d   ƒ n1 s0    Y  d}td|ƒ d S )NzPositional args not allowed)Úmsgc                   S   s   d S r    r   r   r   r   r   Ú<lambda>Ô   ó    z3PosixTester.test_register_at_fork.<locals>.<lambda>zArgs must be callableé   )ÚbeforeZthree)Úafter_in_childs   Five)Úafter_in_parentzArgs must not be NonezInvalid arg was allowedc                   S   s   dS )Nr;   r   r   r   r   r   r„   ã   r…   )r‡   r‰   c                   S   s   d S r    r   r   r   r   r   r„   æ   r…   Ú )r‡   rˆ   a·  if 1:
            import os

            r, w = os.pipe()
            fin_r, fin_w = os.pipe()

            os.register_at_fork(before=lambda: os.write(w, b'A'))
            os.register_at_fork(after_in_parent=lambda: os.write(w, b'C'))
            os.register_at_fork(after_in_child=lambda: os.write(w, b'E'))
            os.register_at_fork(before=lambda: os.write(w, b'B'),
                                after_in_parent=lambda: os.write(w, b'D'),
                                after_in_child=lambda: os.write(w, b'F'))

            pid = os.fork()
            if pid == 0:
                # At this point, after-forkers have already been executed
                os.close(w)
                # Wait for parent to tell us to exit
                os.read(fin_r, 1)
                os._exit(0)
            else:
                try:
                    os.close(w)
                    with open(r, "rb") as f:
                        data = f.read()
                        assert len(data) == 6, data
                        # Check before-fork callbacks
                        assert data[:2] == b'BA', data
                        # Check after-fork callbacks
                        assert sorted(data[2:]) == list(b'CDEF'), data
                        assert data.index(b'C') < data.index(b'D'), data
                        assert data.index(b'E') < data.index(b'F'), data
                finally:
                    os.write(fin_w, b'!')
            ro   )r5   r6   rS   Úregister_at_forkr   )r   Úcoder   r   r   Útest_register_at_forkÑ   s(    ,***,,,22#z!PosixTester.test_register_at_forkÚlockfztest needs posix.lockf()c              	   C   sr   t  tjt jt jB ¡}zJt  |d¡ t  |dt j¡ t	 
|t	jd¡ t	 
|t	jd¡ W t  |¡ nt  |¡ 0 d S )Nó   testr   é   )rS   r   r   r   ÚO_WRONLYÚO_CREATrg   ÚlseekÚSEEK_SETr   rŽ   ÚF_LOCKÚF_ULOCKr   ©r   Úfdr   r   r   Ú
test_lockf  s    zPosixTester.test_lockfÚpreadztest needs posix.pread()c              	   C   s|   t  tjt jt jB ¡}zTt  |d¡ t  |dt j¡ |  	dt
 |dd¡¡ |  	dt
 |d¡¡ W t  |¡ nt  |¡ 0 d S )Nr   r   s   esr†   r3   s   te)rS   r   r   r   ÚO_RDWRr’   rg   r“   r”   r<   r   rš   Úreadr   r—   r   r   r   Ú
test_pread  s    zPosixTester.test_preadÚpreadvztest needs posix.preadv()c              	   C   sz   t  tjt jt jB ¡}zRt  |d¡ dd„ dD ƒ}|  t 	||d¡d¡ |  g d¢t
|ƒ¡ W t  |¡ nt  |¡ 0 d S )Nó   test1tt2t3t5t6t6t8c                 S   s   g | ]}t |ƒ‘qS r   ©Ú	bytearray©Ú.0Úir   r   r   Ú
<listcomp>+  r…   z+PosixTester.test_preadv.<locals>.<listcomp>©é   r;   r†   r;   é
   ©s   t1tt2s   t3ts   5t)rS   r   r   r   r›   r’   rg   r<   r   rž   Úlistr   )r   r˜   Úbufr   r   r   Útest_preadv&  s    zPosixTester.test_preadvÚ	RWF_HIPRIztest needs posix.RWF_HIPRIc              
   C   sâ   t  tjt jt jB ¡}zºzLt  |d¡ dd„ dD ƒ}|  t 	||dt j
¡d¡ |  g d¢t|ƒ¡ W n^ ty€   |  d¡ Y nD tyÂ } z,|jtjtjhv r¬t d	¡‚n‚ W Y d }~n
d }~0 0 W t  |¡ nt  |¡ 0 d S )
NrŸ   c                 S   s   g | ]}t |ƒ‘qS r   r    r¢   r   r   r   r¥   7  r…   z1PosixTester.test_preadv_flags.<locals>.<listcomp>r¦   r;   r¨   r©   zpreadv2 not availablez0RWF_HIPRI is not supported by the current system)rS   r   r   r   r›   r’   rg   r<   r   rž   r­   rª   ÚNotImplementedErrorÚskipTestr	   r
   ÚEINVALÚENOTSUPrX   rY   r   )r   r˜   r«   Úinstr   r   r   Útest_preadv_flags1  s    zPosixTester.test_preadv_flagsc              	   C   s¦   t  tjt jt jB ¡}z~tdƒgd }|  t¡}t  	||d¡ W d   ƒ n1 sT0    Y  |  
|jjtj¡ |  
t|d ƒdd ¡ W t  |¡ nt  |¡ 0 d S ©Né   é €  r   ó    )rS   r   r   r   r›   r’   r¡   r5   r	   rž   r<   Ú	exceptionr
   r°   Úbytesr   ©r   r˜   r«   Úcmr   r   r   Útest_preadv_overflow_32bitsG  s    ,z'PosixTester.test_preadv_overflow_32bitsÚpwriteztest needs posix.pwrite()c              	   C   st   t  tjt jt jB ¡}zLt  |d¡ t  |dt j¡ t	 
|dd¡ |  dt	 |d¡¡ W t  |¡ nt  |¡ 0 d S )Nr   r   ó   xxr3   s   txxtr   )rS   r   r   r   r›   r’   rg   r“   r”   r   r½   r<   rœ   r   r—   r   r   r   Útest_pwriteT  s    zPosixTester.test_pwriteÚpwritevztest needs posix.pwritev()c              	   C   s”   t  tjt jt jB ¡}zlt  |d¡ t  |dt j¡ t  	|g d¢d¡}|  
|d¡ t  |dt j¡ |  
dt |d¡¡ W t  |¡ nt  |¡ 0 d S )Nr¾   r   ©s   test1s   tt2s   t3r†   r¨   s   xxtest1tt2t3éd   )rS   r   r   r   r›   r’   rg   r“   r”   rÀ   r<   r   rœ   r   ©r   r˜   Únr   r   r   Útest_pwritev_  s    zPosixTester.test_pwritevzos.RWF_SYNCztest needs os.RWF_SYNCc              	   C   s˜   t  tjt jt jB ¡}zpt  |d¡ t  |dt j¡ t  	|g d¢dt j
¡}|  |d¡ t  |dt j¡ |  dt |d¡¡ W t  |¡ nt  |¡ 0 d S )Nr¾   r   rÁ   r†   r¨   s
   xxtest1tt2rÂ   )rS   r   r   r   r›   r’   rg   r“   r”   rÀ   ÚRWF_SYNCr<   r   rœ   r   rÃ   r   r   r   Útest_pwritev_flagsm  s    zPosixTester.test_pwritev_flagsc              	   C   sŠ   t  tjt jt jB ¡}zb|  t¡(}t  |dd gd d¡ W d   ƒ n1 sP0    Y  |  	|j
jtj¡ W t  |¡ nt  |¡ 0 d S )Nó   xrµ   r¶   r   )rS   r   r   r   r›   r’   r5   r	   rÀ   r<   r¸   r
   r°   r   ©r   r˜   r»   r   r   r   Útest_pwritev_overflow_32bits|  s    6z(PosixTester.test_pwritev_overflow_32bitsÚposix_fallocatez"test needs posix.posix_fallocate()c              
   C   s”   t  tjt jt jB ¡}zlzt |dd¡ W nJ tyt } z2|j	t	j
kr^tj d¡r^t d¡‚n‚ W Y d }~n
d }~0 0 W t  |¡ nt  |¡ 0 d S )Nr   r¨   )ZsunosÚfreebsdÚnetbsdZopenbsdZgnukfreebsdz test may fail on ZFS filesystems)rS   r   r   r   r‘   r’   r   rË   r	   r
   r°   rs   ÚplatformÚ
startswithrX   rY   r   )r   r˜   r²   r   r   r   Útest_posix_fallocate‡  s    ÿz PosixTester.test_posix_fallocatec              
   C   sJ   zt  ddd¡ W n2 tyD } z|jtjkr0‚ W Y d }~n
d }~0 0 d S )NéÖÿÿÿr   r¨   )r   rË   r	   r
   ÚEBADF©r   r²   r   r   r   Útest_posix_fallocate_errno›  s
    z&PosixTester.test_posix_fallocate_errnoÚposix_fadvisez test needs posix.posix_fadvise()c              	   C   sB   t  tjt j¡}z t |ddtj¡ W t  |¡ nt  |¡ 0 d S ©Nr   )	rS   r   r   r   ru   r   rÕ   ÚPOSIX_FADV_WILLNEEDr   r—   r   r   r   Útest_posix_fadvise¤  s    zPosixTester.test_posix_fadvisec              
   C   sN   zt  dddt j¡ W n2 tyH } z|jtjkr4‚ W Y d }~n
d }~0 0 d S )NrÑ   r   )r   rÕ   r×   r	   r
   rÒ   rÓ   r   r   r   Útest_posix_fadvise_errno­  s
    z$PosixTester.test_posix_fadvise_errnoz!test needs fd support in os.utimec              	   C   sR  t   ¡ }t tjtj¡}z&t |¡ t |d ¡ |  t	tj|d¡ |  t	tj||d f¡ |  t	tj|d |f¡ t |t
|ƒt
|ƒf¡ t |||f¡ | jttj|||f||fd | jttj||dfdd | jttj|d|dfd t |t
|ƒt
|t
|ƒ d ƒf¡ tj|t
|ƒt
|t
|ƒ d ƒfd W t |¡ nt |¡ 0 d S )N©NN)Únsr   ç    eÍÍA)ÚtimerS   r   r   r   ru   r   Úutimer5   r6   ÚintÚ
ValueErrorr   )r   Únowr˜   r   r   r   Útest_utime_with_fd¶  s     
$(zPosixTester.test_utime_with_fdz.test needs follow_symlinks support in os.utimec                 C   s²   t   ¡ }tjtjd dd | jttjtjddd | jttjtj|d fdd | jttjtjd |fdd tjtjt|ƒt|ƒfdd tjtj||fdd tjtjdd d S )NF©Úfollow_symlinksrÚ   ©rÝ   r   rÞ   r   r   r5   r6   rß   ©r   rá   r   r   r   Útest_utime_nofollow_symlinksË  s    z(PosixTester.test_utime_nofollow_symlinksÚwritevztest needs posix.writev()c              	   C   s¢   t  tjt jt jB ¡}zzt  |d¡}|  |d¡ t  |dt j	¡ |  dt
 |d¡¡ zt
 |g ¡}W n tyv   Y n0 |  |d¡ W t  |¡ nt  |¡ 0 d S )NrÁ   r¨   r   ó
   test1tt2t3)rS   r   r   r   r›   r’   rè   r<   r“   r”   r   rœ   r	   r   )r   r˜   rÄ   Úsizer   r   r   Útest_writevÖ  s    zPosixTester.test_writevc              	   C   sˆ   t  tjt jt jB ¡}z`|  t¡&}t  |dd gd ¡ W d   ƒ n1 sN0    Y  |  	|j
jtj¡ W t  |¡ nt  |¡ 0 d S )NrÈ   rµ   r¶   )rS   r   r   r   r›   r’   r5   r	   rè   r<   r¸   r
   r°   r   rÉ   r   r   r   Útest_writev_overflow_32bitsì  s    4z'PosixTester.test_writev_overflow_32bitsÚreadvztest needs posix.readv()c              	   C   s¾   t  tjt jt jB ¡}z–t  |d¡ t  |dt j¡ dd„ dD ƒ}|  	t
 ||¡d¡ |  	g d¢dd„ |D ƒ¡ zt
 |g ¡}W n ty’   Y n0 |  	|d¡ W t  |¡ nt  |¡ 0 d S )	Nré   r   c                 S   s   g | ]}t |ƒ‘qS r   r    r¢   r   r   r   r¥   ý  r…   z*PosixTester.test_readv.<locals>.<listcomp>r¦   r¨   rÁ   c                 S   s   g | ]}t |ƒ‘qS r   )r¹   r¢   r   r   r   r¥   ÿ  r…   )rS   r   r   r   r›   r’   rg   r“   r”   r<   r   rí   r	   r   )r   r˜   r«   rê   r   r   r   Ú
test_readv÷  s    zPosixTester.test_readvc              	   C   s¤   t  tjt jt jB ¡}z|tdƒgd }|  t¡}t  	||¡ W d   ƒ n1 sR0    Y  |  
|jjtj¡ |  
t|d ƒdd ¡ W t  |¡ nt  |¡ 0 d S r´   )rS   r   r   r   r›   r’   r¡   r5   r	   rí   r<   r¸   r
   r°   r¹   r   rº   r   r   r   Útest_readv_overflow_32bits  s    *z&PosixTester.test_readv_overflow_32bitsÚdupztest needs posix.dup()c                 C   sJ   t tjƒ}z0t | ¡ ¡}|  |t¡ t 	|¡ W | 	¡  n
| 	¡  0 d S r    )
r   r   r   r   rð   rc   ÚassertIsInstancerß   rS   r   )r   r   r˜   r   r   r   Útest_dup  s    
zPosixTester.test_dupÚconfstrztest needs posix.confstr()c                 C   s.   |   ttjd¡ |  tt d¡ƒdkd¡ d S )NZ
CS_garbageÚCS_PATHr   T)r5   rà   r   ró   r<   r=   r`   r   r   r   Útest_confstr%  s    zPosixTester.test_confstrÚdup2ztest needs posix.dup2()c                 C   sT   t tjƒ}t tjƒ}z(t | ¡ | ¡ ¡ W | ¡  | ¡  n| ¡  | ¡  0 d S r    )r   r   r   r   rö   rc   r   )r   Úfp1Úfp2r   r   r   Ú	test_dup2+  s    


ÿzPosixTester.test_dup2Ú	O_CLOEXECzneeds os.O_CLOEXECr†   é   é   c                 C   s8   t  tjt jt jB ¡}|  t j|¡ |  t  	|¡¡ d S r    )
rS   r   r   r   ru   rú   Ú
addCleanupr   ÚassertFalseÚget_inheritabler—   r   r   r   Útest_oscloexec6  s    zPosixTester.test_oscloexecÚO_EXLOCKztest needs posix.O_EXLOCKc                 C   sž   t  tjt jt jB t jB ¡}|  tt jtjt jt jB t j	B ¡ t  
|¡ ttdƒršt  tjt jt jB t jB ¡}|  tt jtjt jt jB t j	B ¡ t  
|¡ d S )NÚO_SHLOCK)rS   r   r   r   r‘   r  r’   r5   r	   Ú
O_NONBLOCKr   r   r   r  r—   r   r   r   Útest_osexlock=  s    ÿÿ

ÿÿzPosixTester.test_osexlockr  ztest needs posix.O_SHLOCKc                 C   s¢   t  tjt jt jB t jB ¡}t  tjt jt jB t jB ¡}t  |¡ t  |¡ tt	dƒržt  tjt jt jB t jB ¡}|  
tt jtjt jt jB t jB ¡ t  |¡ d S )Nr  )rS   r   r   r   r‘   r  r’   r   r   r   r5   r	   ru   r  r  )r   Úfd1Úfd2r˜   r   r   r   Útest_osshlockM  s     ÿÿ


ÿÿzPosixTester.test_osshlockÚfstatztest needs posix.fstat()c                 C   sh   t tjƒ}zN|  t | ¡ ¡¡ |  t | ¡ ¡¡ |  t	dtjt
| ¡ ƒ¡ W | ¡  n
| ¡  0 d S ©Nz4should be string, bytes, os.PathLike or integer, not)r   r   r   r^   r   r  rc   ÚstatÚassertRaisesRegexr6   Úfloatr   r   r   r   r   Ú
test_fstat^  s    
þzPosixTester.test_fstatc              	   C   s”   |   t tj¡¡ |   t t tj¡¡¡ |  tdtjt	t tj¡ƒ¡ |  
tdtjd ¡ |  
tdtjttjƒ¡ |  
tdtjtt tj¡ƒ¡ d S r	  )r^   r   r
  r   r   rS   ÚfsencodeZassertWarnsRegexÚDeprecationWarningr¡   r  r6   rª   r`   r   r   r   Ú	test_statl  s$    þþþþzPosixTester.test_statÚmkfifozdon't have mkfifo()c              
   C   sx   t  t j¡ zt t jtjtjB ¡ W n2 tyX } z|  	d| ¡ W Y d }~n
d }~0 0 |  
t t t j¡j¡¡ d S )Núposix.mkfifo(): %s)r   r!   r   r   r  r
  ÚS_IRUSRÚS_IWUSRÚPermissionErrorr¯   r^   ÚS_ISFIFOÚst_mode)r   r   r   r   r   Útest_mkfifo}  s    $zPosixTester.test_mkfifoÚmknodÚS_IFIFOzdon't have mknod()/S_IFIFOc              
   C   sô   t  t j¡ tjtjB tjB }zt t j|d¡ W n> t	yp } z&|  
|jtjtjtjf¡ W Y d }~n$d }~0 0 |  t t t j¡j¡¡ t  t j¡ ztjt j|dd d W n> t	yî } z&|  
|jtjtjtjf¡ W Y d }~n
d }~0 0 d S )Nr   )rw   ÚmodeZdeviceÚdir_fd)r   r!   r   r
  r  r  r  r   r  r	   ÚassertInr
   rZ   r°   ÚEACCESr^   r  r  )r   r  r   r   r   r   Ú
test_mknod†  s    0ÿ
zPosixTester.test_mknodÚmakedevztest needs posix.makedev()c                 C   s`  t  tj¡}|j}|  |t¡ |  |d¡ t  |¡}|  |t¡ |  |d¡ |  	t  |¡|¡ |  
tt jt|ƒ¡ |  
tt j¡ |  
ttft jd¡ t  |¡}|  |t¡ |  |d¡ |  	t  |¡|¡ |  
tt jt|ƒ¡ |  
tt j¡ |  
ttft jd¡ |  	t  ||¡|¡ |  
tt jt|ƒ|¡ |  
tt j|t|ƒ¡ |  
tt j|¡ |  
tt j¡ d S )Nr   rE   )r   r
  r   r   Úst_devrñ   rß   r>   Úmajorr<   r5   r6   r  rà   ÚOverflowErrorÚminorr   )r   ÚstÚdevr"  r$  r   r   r   Útest_makedevž  s.    

zPosixTester.test_makedevc           	   	      s€  ‡ ‡‡fdd„}t  ¡ }t  ¡ }|ˆ ||ƒ |||ƒ |ˆ d|ƒ |||ƒ |ˆ |dƒ |||ƒ |dkr²d}|ˆ ||ƒ |||ƒ |ˆ ddƒ |||ƒ |ˆ ||ƒ |||ƒ nzt ¡ dv rÊt d¡‚nbˆ t|ˆ dd¡ |||ƒ ˆ t|ˆ dd¡ |||ƒ dt  	¡ vr,ˆ t|ˆ dd¡ |||ƒ t
tfD ]F}ˆ t|ˆ ||ƒ|¡ |||ƒ ˆ t|ˆ |||ƒ¡ |||ƒ q4dS )	z/Common code for chown, fchown and lchown tests.c                    s0   ˆd ur,ˆˆ ƒ}ˆ  |j| ¡ ˆ  |j|¡ d S r    )r<   Úst_uidÚst_gid)ÚuidÚgidr
  ©Úfirst_paramr   Ú	stat_funcr   r   Ú
check_stat½  s    z6PosixTester._test_all_chown_common.<locals>.check_statrE   r   l        )zHP-UXZSunOSz1Skipping because of non-standard chown() behaviorN)rS   r1   r,   rÎ   ÚsystemrX   rY   r5   r	   r-   Ústrr  r6   )	r   Z
chown_funcr-  r.  r/  r*  r+  Z	big_valueÚtr   r,  r   Ú_test_all_chown_common»  s>    








z"PosixTester._test_all_chown_commonÚchownztest needs os.chown()c                 C   sF   t  tj¡ |  ttjtjdd¡ t tj¡ |  	tjtjtj
¡ d S rD   )rS   r!   r   r   r5   r	   r   r4  Úcreate_empty_filer3  r
  r`   r   r   r   Ú
test_chownö  s    zPosixTester.test_chownÚfchownztest needs os.fchown()c                 C   sT   t  tj¡ ttjdƒ}z,| ¡ }|  tj|t	tdd ƒ¡ W | 
¡  n
| 
¡  0 d S )Nrk   r  )rS   r!   r   r   r   rc   r3  r   r7  r4   r   )r   Z	test_filer˜   r   r   r   Útest_fchown   s    

ÿzPosixTester.test_fchownÚlchownztest needs os.lchown()c                 C   s8   t  tj¡ t  ttj¡ |  tjtjt	tdd ƒ¡ d S )NÚlstat)
rS   r!   r   r   ÚsymlinkÚ_DUMMY_SYMLINKr3  r   r9  r4   r`   r   r   r   Útest_lchown  s
    
ÿzPosixTester.test_lchownrv   ztest needs posix.chdir()c                 C   s"   t  tj¡ |  tt jtj¡ d S r    )r   rv   rS   r_   r5   r	   r   r   r`   r   r   r   Ú
test_chdir  s    zPosixTester.test_chdirc                 C   s   |   tjt tj¡¡ d S r    )r  r   r   r   ÚlistdirrS   r_   r`   r   r   r   Útest_listdir  s    zPosixTester.test_listdirc                 C   s   |   tjt ¡ ¡ d S r    )r  r   r   r   r?  r`   r   r   r   Útest_listdir_default  s    z PosixTester.test_listdir_defaultc                 C   s   |   t tj¡t d¡¡ d S ©Nó   .)r  rS   r  r   r   r   r?  r`   r   r   r   Útest_listdir_bytes"  s    zPosixTester.test_listdir_bytesc              	   C   sx   t tfD ]j}|  t¡ t |dƒ¡}W d   ƒ n1 s:0    Y  |  t t	j
¡|¡ |D ]}|  t|ƒt¡ q\qd S rB  )r¡   Ú
memoryviewZassertWarnsr  r   r?  r  rS   r  r   r   ZassertIsÚtyper¹   )r   ÚclsÚnamesr7   r   r   r   Útest_listdir_bytes_like'  s    ,z#PosixTester.test_listdir_bytes_likez)test needs fd support for posix.listdir()c                 C   sd   t  t  ¡ t j¡}|  t j|¡ |  tt  d¡ƒtt  |¡ƒ¡ |  tt  d¡ƒtt  |¡ƒ¡ d S )NÚ.)	r   r   r%   ru   rý   r   r<   Úsortedr?  )r   Úfr   r   r   Útest_listdir_fd/  s    þþzPosixTester.test_listdir_fdÚaccessztest needs posix.access()c                 C   s   |   t tjtj¡¡ d S r    )r^   r   rN  r   r   rS   ÚR_OKr`   r   r   r   Útest_access>  s    zPosixTester.test_accessÚumaskztest needs posix.umask()c                 C   s$   t  d¡}|  |t¡ t  |¡ d S rÖ   )r   rQ  rñ   rß   )r   Zold_maskr   r   r   Ú
test_umaskB  s    
zPosixTester.test_umaskÚstrerrorztest needs posix.strerror()c                 C   s   |   t d¡¡ d S rÖ   )r^   r   rS  r`   r   r   r   Útest_strerrorH  s    zPosixTester.test_strerrorÚpipeztest needs posix.pipe()c                 C   s$   t  ¡ \}}t |¡ t |¡ d S r    )r   rU  rS   r   )r   ÚreaderÚwriterr   r   r   Ú	test_pipeM  s    
zPosixTester.test_pipeÚpipe2ztest needs os.pipe2()é   c                 C   sö   |   ttjd¡ |   ttjdd¡ t d¡\}}t |¡ t |¡ t tjtjB ¡\}}|  tj|¡ |  tj|¡ |  t 	|¡¡ |  t 	|¡¡ |  t 
|¡¡ |  t 
|¡¡ |   ttj|d¡ zt |dtj ¡ W n tyð   Y n0 d S )NZDEADBEEFr   r3   rÈ   )r5   r6   rS   rY  r   rú   r  rý   rþ   rÿ   Úget_blockingr	   rœ   rg   r   ZPIPE_MAX_SIZE)r   Úrrk   r   r   r   Ú
test_pipe2S  s"    

zPosixTester.test_pipe2c                 C   s8   dd l }|  ttj|jd ¡ |  ttj|jd ¡ d S ©Nr   r3   )Ú	_testcapir5   r#  rS   rY  ZINT_MAXZUINT_MAX)r   r_  r   r   r   Útest_pipe2_c_limitso  s    zPosixTester.test_pipe2_c_limitsrÞ   ztest needs posix.utime()c                 C   sŠ   t   ¡ }t tjd ¡ |  ttjtjd¡ |  ttjtj|d f¡ |  ttjtjd |f¡ t tjt|ƒt|ƒf¡ t tj||f¡ d S )NrÚ   rå   ræ   r   r   r   Ú
test_utimex  s    zPosixTester.test_utimec              
   K   s
  t  |¡}|  t|dƒ¡ |jtjB }z|||fi |¤Ž W n@ ty| } z(|jtjkrZ‚ d}|  	|¡ W Y d }~n
d }~0 0 zvt  |¡}|  
|jtjB |j¡ zt|dƒ}	W n4 tyâ }
 z|  
|
jtj¡ W Y d }
~
n
d }
~
0 0 W t ||j¡ nt ||j¡ 0 d S )NÚst_flagsú2chflag UF_IMMUTABLE not supported by underlying fsr   )rS   r
  r^   r   rb  ÚUF_IMMUTABLEr	   r
   Ú
EOPNOTSUPPr¯   r<   r   rZ   r   Úchflags)r   Zchflags_funcZtarget_fileÚkwargsr%  ÚflagsÚerrrƒ   Znew_str˜   r   r   r   r   Ú_test_chflags_regular_file‚  s$    
 
(z&PosixTester._test_chflags_regular_filerf  ztest needs os.chflags()c                 C   s   |   tjtj¡ d S r    )rj  r   rf  r   r   r`   r   r   r   Útest_chflagsš  s    zPosixTester.test_chflagsÚlchflagsztest needs os.lchflags()c                 C   s(   |   tjtj¡ | j tjtjdd d S ©NFrã   )rj  r   rl  r   r   rf  r`   r   r   r   Útest_lchflags_regular_filež  s    z&PosixTester.test_lchflags_regular_filec           
      C   s  t  tj¡}|  t|dƒ¡ t  tjt¡ | j 	t¡ t  
t¡}dd„ }tj|fD ]¼}|jtjB }z|t|ƒ W n@ ty° } z(|jtjkrŽ‚ d}|  |¡ W Y d }~n
d }~0 0 zLt  tj¡}t  
t¡}	|  |j|j¡ |  |jtjB |	j¡ W |t|jƒ qR|t|jƒ 0 qRd S )Nrb  c                 S   s   t j| |ddS rm  )r   rf  )rw   rh  r   r   r   Úchflags_nofollow­  s    z;PosixTester.test_lchflags_symlink.<locals>.chflags_nofollowrc  )rS   r
  r   r   r^   r   r;  r<  r   Úappendr:  r   rl  rb  rd  r	   r
   re  r¯   r<   )
r   Z	testfn_stZdummy_symlink_stro  Úfnrh  ri  rƒ   Znew_testfn_stZnew_dummy_symlink_str   r   r   Útest_lchflags_symlink£  s.    
 
ÿz!PosixTester.test_lchflags_symlinkc                 C   sL   t jdkrt}nt}tj ¡ D ](\}}|  t|ƒ|¡ |  t|ƒ|¡ qd S )NÚnt)	rS   r7   r1  r¹   r   ry   Úitemsr<   rF  )r   Z	item_typeÚkÚvr   r   r   Útest_environÄ  s    
zPosixTester.test_environc                 C   sL  |   t¡ t dd¡ W d   ƒ n1 s,0    Y  |   t¡ t dd¡ W d   ƒ n1 sb0    Y  |   t¡ t dd¡ W d   ƒ n1 s˜0    Y  |   t¡ t dd¡ W d   ƒ n1 sÎ0    Y  |   t¡ t d	d
¡ W d   ƒ n1 s0    Y  |   t¡ t dd¡ W d   ƒ n1 s>0    Y  d S )NzFRUIT VEGETABLEZcabbages   FRUIT VEGETABLEs   cabbageZFRUITzorange VEGETABLE=cabbages   FRUITs   orange VEGETABLE=cabbagezFRUIT=ORANGEZlemons   FRUIT=ORANGEs   lemon)r5   rà   rS   Úputenvr`   r   r   r   Útest_putenvÍ  s    ****,zPosixTester.test_putenvr%   ztest needs posix.getcwd()c              	      s   d}t  ¡ }t j tj¡d }zVzt  |¡ t  |¡ W n$   Y W t  |¡ t |¡ d S 0 W t  |¡ t |¡ nt  |¡ t |¡ 0 d S )Nz8getcwd-test-directory-0123456789abcdef-01234567890abcdefz.getcwdr   c              	      sŠ   zt  | ¡ W n   t d¡‚Y n0 t  | ¡ z>t  ¡  |dk rXˆ | |t| ƒ d ƒ W t  d¡ t  | ¡ nt  d¡ t  | ¡ 0 d S )Nz?mkdir cannot create directory sufficiently deep for getcwd testi  r3   z..)rS   ÚmkdirrX   rY   rv   r%   r=   Úrmdir)ÚdirnameZcurrent_path_length©Ú_create_and_do_getcwdr   r   r~  ê  s    

ÿ
zEPosixTester.test_getcwd_long_pathnames.<locals>._create_and_do_getcwd)	rS   r%   rw   Úabspathr   r   rz  rv   Úrmtree)r   r|  r_   Ú	base_pathr   r}  r   Útest_getcwd_long_pathnamesÛ  s"    


ë 
ÿ
z&PosixTester.test_getcwd_long_pathnamesÚgetgrouplistztest needs posix.getgrouplist()rU   ztest needs pwd.getpwuid()r1   ztest needs os.getuid()c                 C   s<   t  t ¡ ¡d }t  t ¡ ¡d }|  |t ||¡¡ d S )Nr   r;   )rT   rU   rS   r1   r  r   rƒ  )r   ÚuserÚgroupr   r   r   Útest_getgrouplistÿ  s    zPosixTester.test_getgrouplistr*   ztest needs os.getegid()c                 C   s  t  d¡$}| ¡  ¡ }| ¡ }W d   ƒ n1 s40    Y  ztdd„ | ¡ D ƒƒ}W n typ   tƒ }Y n0 |d us~|sˆt 	d¡‚t
jdkrÖdd l}| d¡p¦d}td	d„ | d
¡dd… D ƒƒdk rÖt 	d¡‚| t ¡ ¡}|  | pú|t ¡ hk¡ d S )Nzid -G 2>/dev/nullc                 s   s   | ]}t |ƒV  qd S r    ©rß   )r£   Úgr   r   r   Ú	<genexpr>  r…   z-PosixTester.test_getgroups.<locals>.<genexpr>zneed working 'id -G'Údarwinr   ZMACOSX_DEPLOYMENT_TARGETz10.0c                 s   s   | ]}t |ƒV  qd S r    r‡  )r£   rÄ   r   r   r   r‰    r…   rJ  r†   )r¨   rû   z$getgroups(2) is broken prior to 10.6)rS   Úpopenrœ   Ústripr   Úsetrx   rà   rX   rY   rs   rÎ   Ú	sysconfigZget_config_varÚtupleÚsymmetric_differencer   r-   r^   r*   )r   ZidgÚgroupsÚretZ
idg_groupsrŽ  ZdtZsymdiffr   r   r   Útest_getgroups  s     &

$
zPosixTester.test_getgroupsÚSIGCHLDz2CLD_XXXX be placed in si_code for a SIGCHLD signalÚwaitid_resultztest needs os.waitid_resultc                 C   s(   t j t j t j t j t j t j d S r    )rS   Ú
CLD_EXITEDÚ
CLD_KILLEDÚ
CLD_DUMPEDÚCLD_TRAPPEDÚCLD_STOPPEDÚCLD_CONTINUEDr`   r   r   r   Útest_cld_xxxx_constants#  s    z#PosixTester.test_cld_xxxx_constantsÚsched_yieldzdon't have scheduling supportÚsched_setaffinityz!don't have sched affinity supportc                 C   s   t  ¡  d S r    )r   r  r`   r   r   r   Útest_sched_yield2  s    zPosixTester.test_sched_yieldÚsched_get_priority_maxz!requires sched_get_priority_max()c                 C   sl   t j}t  |¡}t  |¡}|  |t¡ |  |t¡ |  ||¡ tjdkrh|  	t
t jd¡ |  	t
t jd¡ d S )NrŠ  iéÿÿÿ)r   ÚSCHED_RRÚsched_get_priority_minr   rñ   rß   r>   rs   rÎ   r5   r	   )r   ZpolÚloÚhir   r   r   Útest_sched_priority7  s    


zPosixTester.test_sched_priorityc              
   C   sÄ  dd„ t j ¡ D ƒ}t  d¡}|  ||¡ zt  t ¡ ¡}W n2 tyn } z|jtj	krZ‚ W Y d }~nd }~0 0 |  ||¡ |  
tt jd¡ |  
tt jd¡ t  d¡}|  |jt¡ tj d¡s*zt  d||¡ t  d|¡ W n6 ty } z|jtj	kr‚ W Y d }~n
d }~0 0 |  
tt jd|¡ |  
tt jd||¡ |  
tt jd|d ¡ |  
tt jdd¡ t  d ¡}|  
tt jd|¡ d}t  |¡}|  
tt jd|¡ t j| d}|  
tt jd|¡ d S )	Nc                 S   s   g | ]\}}|  d ¡r|‘qS )ZSCHED_©rÏ   )r£   r7   Zschedr   r   r   r¥   I  s   
ÿzDPosixTester.test_get_and_set_scheduler_and_param.<locals>.<listcomp>r   rE   ©rÌ   rÍ   é+   l   œÿÇ )Úsched_priority)r   Ú__dict__rt  r   r  rS   r0   r	   r
   rZ   r5   Úsched_getparamrñ   r©  rß   rs   rÎ   rÏ   Úsched_setschedulerÚsched_setparamr6   Úsched_paramr#  )r   Zpossible_schedulersZmineÚparentr   ZparamZlarger   r   r   Ú$test_get_and_set_scheduler_and_paramG  s>    



z0PosixTester.test_get_and_set_scheduler_and_paramÚsched_rr_get_intervalzno functionc              
   C   st   zt  d¡}W n< tyJ } z$|jtjkr,‚ |  d¡ W Y d }~n
d }~0 0 |  |t¡ |  |d¡ |  	|d¡ d S )Nr   z only works on SCHED_RR processesg        g      ð?)
r   r±  r	   r
   r°   r¯   rñ   r  r>   Ú
assertLess)r   Úintervalr   r   r   r   Útest_sched_rr_get_intervalp  s     z&PosixTester.test_sched_rr_get_intervalc                 C   st   t  d¡}|  |t¡ |  t|ƒd¡ tj d¡sB|  	t
t jd¡ |D ](}|  |t¡ |  |d¡ |  |d¡ qFd S )Nr   r3   rÌ   rE   r   )r   Úsched_getaffinityrñ   r  r>   r=   rs   rÎ   rÏ   r5   r	   rß   r²  )r   ÚmaskZcpur   r   r   Útest_sched_getaffinity  s    
z"PosixTester.test_sched_getaffinityc                 C   s´   t  d¡}t|ƒdkr| ¡  t  d|¡ |  t  d¡|¡ |  tt jdg ¡ |  tt jddg¡ |  tt jdt	t
dƒ¡ |  tt jddd> g¡ tj d¡s°|  tt jd|¡ d S )Nr   r3   iöÿÿÿZ0Xé€   rÌ   rE   )r   rµ  r=   Úpoprž  r<   r5   r	   rà   Úmaprß   r#  rs   rÎ   rÏ   )r   r¶  r   r   r   Útest_sched_setaffinityŒ  s    
z"PosixTester.test_sched_setaffinityc                 C   s   t j t j t j t j d S r    )r   Ú	RTLD_LAZYÚRTLD_NOWÚRTLD_GLOBALÚ
RTLD_LOCALr`   r   r   r   Útest_rtld_constantsœ  s    zPosixTester.test_rtld_constantsÚ	SEEK_HOLEz(test needs an OS that reports file holesc              
   C   sÞ   t tjdƒ¾}| d¡ | ¡  | ¡ }| ¡ }znt|ƒD ]4}|  |t	 
||t	j¡¡ |  |t	 
||t	j¡¡ q:|  tt	j
||t	j¡ |  tt	j
||t	j¡ W n tyº   t d¡‚Y n0 W d   ƒ n1 sÐ0    Y  d S )Nzr+bs   hellozOSError raised!)r   r   r   rg   rh   Útellrc   Úranger<   rS   r“   Ú	SEEK_DATAZassertLessEqualrÁ  r5   r	   rX   rY   )r   r   rê   Zfnor¤   r   r   r   Útest_fs_holes£  s    	
zPosixTester.test_fs_holesc                 C   sš   dD ]}t t|dƒ}|du rqdtjfD ]\}z|d|ƒ W q( ty‚ } z0|  d |¡t|ƒ¡ W Y d}~ qW Y d}~q(d}~0 0 q(|  d| ¡ qdS )zf
        Test functions that call path_error2(), providing two filenames in their exceptions.
        )ÚrenameÚreplaceÚlinkNZnoodly2Zdoesnotexistfilenamez'doesnotexistfilename' -> '{}'z#No valid path_error2() test for os.)	r4   rS   r   r   r	   r  Úformatr1  r[   )r   r7   ÚfunctionÚdstr   r   r   r   Útest_path_error2¾  s    &zPosixTester.test_path_error2c              	   C   sê   t j}|d }|  t j|¡ t  |¡ d }zT|  t¡$ t |tjtj	B ¡}W d   ƒ n1 s`0    Y  W |d ur”t 
|¡ n|d ur’t 
|¡ 0 |  tj |¡¡ |  ttj|¡ |  tj |¡¡ t|dƒ 
¡  |  ttj|¡ d S )Nú Úwb)r   r   rý   r!   r5   rà   rS   r   r‘   r’   r   rþ   rw   Úexistsrz  r
  ©r   rq  Zfn_with_NULr˜   r   r   r   Útest_path_with_null_characterÐ  s"    
4ÿz)PosixTester.test_path_with_null_characterc              	   C   sð   t  tj¡}|d }|  tj|¡ t |¡ d }zT|  t¡$ t  |t j	t j
B ¡}W d   ƒ n1 sf0    Y  W |d uršt  |¡ n|d ur˜t  |¡ 0 |  t j |¡¡ |  tt j|¡ |  t j |¡¡ t|dƒ ¡  |  tt j|¡ d S )Nr·   rÎ  )rS   r  r   r   rý   r!   r5   rà   r   r‘   r’   r   rþ   rw   rÏ  rz  r
  rÐ  r   r   r   Útest_path_with_null_byteâ  s"    
4ÿz$PosixTester.test_path_with_null_byteÚ
pidfd_openzpidfd_open unavailablec                 C   s–   |   t¡}t d¡ W d   ƒ n1 s*0    Y  |jjtjkrL|  d¡ t|jt	ƒrj|  d|j›¡ |  
|jjtj¡ t t t ¡ d¡¡ d S )NrE   z"system does not support pidfd_openzpidfd_open syscall blocked: r   )r5   r	   rS   rÓ  r¸   r
   r   r¯   Ú
isinstancer  r<   r°   r   r.   )r   r»   r   r   r   Útest_pidfd_openô  s    (
zPosixTester.test_pidfd_open)mÚ__name__Ú
__module__Ú__qualname__r   r#   r8   rX   Ú
skipUnlessr   r   r@   rB   rH   rJ   rM   rN   r\   ra   rd   ri   rl   r4   rS   Úsupports_fdr|   r‚   r   r™   r   r¬   r³   Úrequires_32br¼   r¿   rÅ   rÇ   rÊ   rÐ   rÔ   rØ   rÙ   rÞ   râ   Úsupports_follow_symlinksrç   rë   rì   rî   rï   rò   rõ   rù   r   Zrequires_linux_versionr   r  r  r  r  r  r
  r  r'  r3  r6  r8  r=  r>  r@  rA  rD  rI  r?  rM  rP  rR  rT  rX  r]  Zcpython_onlyr`  ra  rj  rk  rn  rr  rw  ry  r‚  rT   r†  r“  Úsignalrœ  Zrequires_sched_hZrequires_sched_affinityrŸ  r¥  Úrequires_schedr°  r´  r·  r»  rÀ  rÅ  rÌ  rÑ  rÒ  rÕ  r   r   r   r   r   *   sÈ  
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ


	
<






	ÿ
ÿ
ÿ
ÿ




	
ÿ
	ÿ
ÿ
	ÿ
ÿ
ÿ

ÿ

;
	


ÿ


ÿ


	


 	
#
ÿÿÿ(ÿr   c                   @   sÞ  e Zd ZdZedd„ ƒZe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e	dƒote	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e e	je	jv d¡dd„ ƒZe e	je	jv d¡dd„ ƒZe ee	dƒoe	je	jv oeedƒd¡dd „ ƒZe e	je	jv d!¡d"d#„ ƒZe ee	d$ƒo\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#e e	j$e	jv d.¡d/d0„ ƒZ%e e	j&e	jv d1¡d2d3„ ƒZ'd4S )5ÚTestPosixDirFdr   c                 c   s”   t  jd7  _tj› d| j› }tj› d| j› d}t |¡ |  tj|¡ tj	 
||¡}t |¡}|||fV  W d   ƒ n1 s†0    Y  d S )Nr3   Ú_Úbase)rß  Úcountr   r   r   rz  rý   r{  rS   rw   ÚjoinZopen_dir_fd)r   r7   Úbase_dirÚfullnamer  r   r   r   Úprepare  s    
zTestPosixDirFd.preparec                 c   sV   |   ¡ :\}}}t |¡ |  tj|¡ |||fV  W d   ƒ n1 sH0    Y  d S r    )ræ  r   r5  rý   r   r!   ©r   r  r7   rå  r   r   r   Úprepare_file  s    
zTestPosixDirFd.prepare_filez)test needs dir_fd support for os.access()c                 C   sJ   |   ¡ .\}}}|  tj|tj|d¡ W d   ƒ n1 s<0    Y  d S ©N©r  )rè  r^   r   rN  rS   rO  rç  r   r   r   Útest_access_dir_fd  s    z!TestPosixDirFd.test_access_dir_fdz'test needs dir_fd support in os.chmod()c                 C   s~   |   ¡ b\}}}t |tj¡ tj|tjtjB |d t |¡}|  |jtj@ tjtjB ¡ W d   ƒ n1 sp0    Y  d S ré  )	rè  r   Úchmodr
  r  r  r<   r  ÚS_IRWXU)r   r  r7   rå  Úsr   r   r   Útest_chmod_dir_fd  s    

ÿz TestPosixDirFd.test_chmod_dir_fdr4  z'test needs dir_fd support in os.chown()c                 C   sL   |   ¡ 0\}}}tj|t ¡ t ¡ |d W d   ƒ n1 s>0    Y  d S ré  )rè  r   r4  rS   r1   r,   rç  r   r   r   Útest_chown_dir_fd%  s    z TestPosixDirFd.test_chown_dir_fdz&test needs dir_fd support in os.stat()c              	   C   sú   |   ¡ Þ\}}}t|dƒ}| d¡ W d   ƒ n1 s:0    Y  |  tj|¡ t |¡}tj||d}|  ||¡ tj|d d}|  ||¡ | jt	dtj|t 
¡ d | jt	dtj|t|ƒd | jttj|dd W d   ƒ n1 sì0    Y  d S )Nrk   z	testline
rê  zshould be integer or None, notl      Fµx:^V )ræ  r   rg   rý   r   r!   r
  r<   r  r6   r%   r  r5   r#  )r   r  r7   rå  ÚoutfileÚs1Ús2r   r   r   Útest_stat_dir_fd+  s$    (
ÿÿÿzTestPosixDirFd.test_stat_dir_fdz'test needs dir_fd support in os.utime()c              	   C   sŽ  |   ¡ n\}}}t ¡ }tj|d |d tj||d | jttj|||d | jttj|d|d | jttj||d f|d | jttj|d |f|d | jttj||df|d tj|t|ƒt|ƒf|d tj|||f|d tj|t|ƒt|t|ƒ d ƒf|d tj||t|ƒt|t|ƒ d ƒfd tjtjv rjztj|d|d W n t	yh   Y n0 W d   ƒ n1 s€0    Y  d S )Nrê  rÚ   ÚxrÜ   )r  r(   F)rä   r  )
rè  rÝ   r   rÞ   r5   r6   rß   rS   rÜ  rà   )r   r  r7   rå  rá   r   r   r   Útest_utime_dir_fd?  s@    ÿÿÿÿÿÿÿz TestPosixDirFd.test_utime_dir_fdz&test needs dir_fd support in os.link()c                 C   sØ   |   ¡ ¼\}}}|  ¡ Ž\}}}ztj||||d W n2 tyh } z|  d| ¡ W Y d }~n
d }~0 0 |  tj|¡ |  t 	|¡d t 	|¡d ¡ W d   ƒ n1 s¬0    Y  W d   ƒ n1 sÊ0    Y  d S )N©Ú
src_dir_fdÚ
dst_dir_fdzposix.link(): %sr3   )
rè  ræ  r   rÈ  r  r¯   rý   r!   r<   r
  )r   r  r7   rå  Údir_fd2ZlinknameZfulllinknamer   r   r   r   Útest_link_dir_fd^  s    ÿ$ÿzTestPosixDirFd.test_link_dir_fdz'test needs dir_fd support in os.mkdir()c                 C   sX   |   ¡ <\}}}tj||d |  tj|¡ t |¡ W d   ƒ n1 sJ0    Y  d S ré  )ræ  r   rz  rý   r{  r
  rç  r   r   r   Útest_mkdir_dir_fdk  s    z TestPosixDirFd.test_mkdir_dir_fdr  r  zAtest requires both stat.S_IFIFO and dir_fd support for os.mknod()c                 C   sÀ   |   ¡ ¤\}}}tjtjB tjB }ztj||d|d W n> tyv } z&|  |j	t	j
t	jt	jf¡ W Y d }~n0d }~0 0 |  tj|¡ |  t t |¡j¡¡ W d   ƒ n1 s²0    Y  d S )Nr   rê  )ræ  r
  r  r  r  r   r  r	   r  r
   rZ   r°   r  rý   r!   r^   r  r  )r   r  r7   rå  r  r   r   r   r   Útest_mknod_dir_fdr  s    0z TestPosixDirFd.test_mknod_dir_fdz&test needs dir_fd support in os.open()c              
   C   sº   |   ¡ ž\}}}t|dƒ}| d¡ W d   ƒ n1 s:0    Y  |  tj|¡ tj|tj|d}z&t |d¡}|  d|¡ W t 	|¡ nt 	|¡ 0 W d   ƒ n1 s¬0    Y  d S )NrÎ  s	   testline
rê  é	   )
ræ  r   rg   rý   r   r!   ru   rœ   r<   r   )r   r  r7   rå  rñ  r˜   r   r   r   r   Útest_open_dir_fd…  s    (zTestPosixDirFd.test_open_dir_fdÚreadlinkz*test needs dir_fd support in os.readlink()c                 C   sb   |   ¡ F\}}}t d|¡ |  tj|¡ |  tj||dd¡ W d   ƒ n1 sT0    Y  d S ©Nr;  rê  )ræ  rS   r;  rý   r   r!   r<   r   rç  r   r   r   Útest_readlink_dir_fd’  s    z#TestPosixDirFd.test_readlink_dir_fdz(test needs dir_fd support in os.rename()c              	   C   sˆ   |   ¡ l\}}}|  ¡ >\}}}tj||||d t |¡ t ||¡ W d   ƒ n1 s\0    Y  W d   ƒ n1 sz0    Y  d S )Nr÷  )rè  ræ  r   rÆ  r
  )r   r  r7   rå  rú  Zname2Z	fullname2r   r   r   Útest_rename_dir_fdš  s    ÿÿ
z!TestPosixDirFd.test_rename_dir_fdz)test needs dir_fd support in os.symlink()c                 C   sb   |   ¡ F\}}}tjd||d |  tj|¡ |  t |¡d¡ W d   ƒ n1 sT0    Y  d S r  )ræ  r   r;  rý   r!   r<   r   rç  r   r   r   Útest_symlink_dir_fd£  s    z"TestPosixDirFd.test_symlink_dir_fdz(test needs dir_fd support in os.unlink()c                 C   s†   |   ¡ j\}}}t |¡ t |¡ z"tj||d |  ttj|¡ W n   |  tj|¡ ‚ Y n0 W d   ƒ n1 sx0    Y  d S ré  )	ræ  r   r5  r   r
  r!   r5   r	   rý   rç  r   r   r   Útest_unlink_dir_fdª  s    

z!TestPosixDirFd.test_unlink_dir_fdz(test needs dir_fd support in os.mkfifo()c                 C   s¨   |   ¡ Œ\}}}ztj|tjtjB |d W n2 ty^ } z|  d| ¡ W Y d }~n
d }~0 0 |  tj	|¡ |  
t t |¡j¡¡ W d   ƒ n1 sš0    Y  d S )Nrê  r  )ræ  r   r  r
  r  r  r  r¯   rý   r!   r^   r  r  )r   r  r7   rå  r   r   r   r   Útest_mkfifo_dir_fd¶  s    $z!TestPosixDirFd.test_mkfifo_dir_fdN)(rÖ  r×  rØ  râ  r   ræ  rè  rX   rÙ  rS   rN  Úsupports_dir_fdrë  rì  rï  r   r4  rð  r
  rô  rÞ   rö  rÈ  rû  rz  rü  r  rý  r   rÿ  r   r  rÆ  r  r;  r  r!   r  r  r  r   r   r   r   rß    sT   



ÿ





ÿý

ÿ



rß  c                   @   sP   e Zd Zdd„ Zdd„ Ze eedƒd¡dd„ ƒZ	e eed	ƒd
¡dd„ ƒZ
dS )ÚPosixGroupsTesterc                 C   sL   t  ¡ dkrt d¡‚tt dƒs*t d¡‚tjdkr>t d¡‚t  ¡ | _d S )Nr   znot enough privilegesr-   zneed posix.getgroupsrŠ  zgetgroups(2) is broken on OSX)	r   r1   rX   rY   r   rs   rÎ   r-   Úsaved_groupsr`   r   r   r   r   Ã  s    




zPosixGroupsTester.setUpc                 C   sH   t tdƒrt | j¡ n,t tdƒrDt t ¡ ¡j}t || jd ¡ d S )NÚ	setgroupsrO   r   )	r   r   r
  r	  rT   rU   r1   rV   rO   ©r   r7   r   r   r   r#   Ì  s
    

zPosixGroupsTester.tearDownrO   ztest needs posix.initgroups()c                 C   sD   t | jpdgƒd }t t ¡ ¡j}t ||¡ |  |t 	¡ ¡ d S r^  )
Úmaxr	  rT   rU   r   r1   rV   rO   r  r-   )r   rˆ  r7   r   r   r   r\   Ó  s    z!PosixGroupsTester.test_initgroupsr
  ztest needs posix.setgroups()c                 C   s6   dgt tdƒƒfD ]}t |¡ |  |t ¡ ¡ qd S )Nr   é   )rª   rÃ  r   r
  ZassertListEqualr-   )r   r‘  r   r   r   Útest_setgroupsÝ  s    
z PosixGroupsTester.test_setgroupsN)rÖ  r×  rØ  r   r#   rX   rÙ  r   r   r\   r  r   r   r   r   r  Á  s   	ÿ
ÿr  c                   @   s,  e Zd ZejddddfZdZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z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ee ej d(¡d)¡d*d+„ ƒƒZee ej d(¡d)¡d,d-„ ƒƒZ d.d/„ Z!d0d1„ Z"d2d3„ Z#d4d5„ Z$d6d7„ Z%dS )8Ú_PosixSpawnMixinú-Iú-Sro   rp   Nc                 G   s   t jddg|¢R S )Nr  r  )rs   rt   ©r   Úargsr   r   r   Úpython_argsê  s    z_PosixSpawnMixin.python_argsc                 C   sŽ   t j}|  t j|¡ d|›d}|  d|¡}|  |d |tj¡}t j|dd t	|ƒ$}|  
| ¡ t|ƒ¡ W d   ƒ n1 s€0    Y  d S )Nú2if 1:
            import os
            with open(zO, "w") as pidfile:
                pidfile.write(str(os.getpid()))
            ro   r   rq   )r   r   rý   r!   r  Ú
spawn_funcrS   ry   rz   r   r<   rœ   r1  )r   ZpidfileÚscriptr  r{   rL  r   r   r   Útest_returns_pidò  s    þ
z!_PosixSpawnMixin.test_returns_pidc              
   C   s~   d}z|   ||gtj¡}W n6 ttfyP } z|  |j|¡ W Y d }~n2d }~0 0 t |d¡\}}|  ||¡ |  |d¡ d S )NÚno_such_executabler   )	r  rS   ry   ÚFileNotFoundErrorr  r<   ÚfilenameÚwaitpidÚassertNotEqual)r   r  r{   ÚexcZpid2Ústatusr   r   r   Útest_no_such_executable   s    þ$z(_PosixSpawnMixin.test_no_such_executablec                 C   s–   t j}|  t j|¡ d|›d}|  d|¡}|  |d |i tj¥ddi¥¡}t j|dd t	|ƒ }|  
| ¡ d¡ W d   ƒ n1 sˆ0    Y  d S )Nr  zL, "w") as envfile:
                envfile.write(os.environ['foo'])
        ro   r   rP   Zbarrq   )r   r   rý   r!   r  r  rS   ry   rz   r   r<   rœ   )r   Zenvfiler  r  r{   rL  r   r   r   Útest_specify_environment  s    þÿ
z)_PosixSpawnMixin.test_specify_environmentc                 C   s.   | j | jd | jtjd d}tj|dd d S ©Nr   ©Úfile_actionsrq   ©r  ÚNOOP_PROGRAMrS   ry   r   rz   ©r   r{   r   r   r   Útest_none_file_actions  s    üz'_PosixSpawnMixin.test_none_file_actionsc                 C   s.   | j | jd | jtjg d}tj|dd d S r"  r%  r'  r   r   r   Útest_empty_file_actions'  s    üz(_PosixSpawnMixin.test_empty_file_actionsc                 C   s0   | j tjtjddgtjdd}tj|dd d S )Nro   rp   F©Zresetidsr   rq   ©r  rs   rt   rS   ry   r   rz   r'  r   r   r   Útest_resetids_explicit_default0  s    
üz/_PosixSpawnMixin.test_resetids_explicit_defaultc                 C   s0   | j tjtjddgtjdd}tj|dd d S )Nro   rp   Tr*  r   rq   r+  r'  r   r   r   Útest_resetids9  s    
üz_PosixSpawnMixin.test_resetidsc                 C   sL   |   t¡. | jtjtjddgtjd d W d   ƒ n1 s>0    Y  d S )Nro   rp   r*  ©r5   r6   r  rs   rt   rS   ry   r`   r   r   r   Útest_resetids_wrong_typeB  s
    
þz)_PosixSpawnMixin.test_resetids_wrong_typec                 C   s4   | j tjtjddgtjt ¡ d}tj|dd d S )Nro   rp   ©Z	setpgroupr   rq   )r  rs   rt   rS   ry   r/   r   rz   r'  r   r   r   Útest_setpgroupH  s    
üz_PosixSpawnMixin.test_setpgroupc                 C   sL   |   t¡. | jtjtjddgtjdd W d   ƒ n1 s>0    Y  d S )Nro   rp   Z023r0  r.  r`   r   r   r   Útest_setpgroup_wrong_typeQ  s
    
þz*_PosixSpawnMixin.test_setpgroup_wrong_typeÚpthread_sigmaskzneed signal.pthread_sigmask()c                 C   s>   t  d¡}| jtjtjd|gtjtjgd}t	j
|dd d S )NúI            import signal
            signal.raise_signal(signal.SIGUSR1)ro   ©Z
setsigmaskr   rq   )ÚtextwrapÚdedentr  rs   rt   rS   ry   rÝ  ÚSIGUSR1r   rz   )r   rŒ   r{   r   r   r   Útest_setsigmaskW  s    

üz _PosixSpawnMixin.test_setsigmaskc                 C   sê   |   t¡. | jtjtjddgtjdd W d   ƒ n1 s>0    Y  |   t¡0 | jtjtjddgtjdgd W d   ƒ n1 sˆ0    Y  |   t¡: | jtjtjddgtjtj	tj	d gd W d   ƒ n1 sÜ0    Y  d S )Nro   rp   é"   r5  Újr3   ©
r5   r6   r  rs   rt   rS   ry   rà   rÝ  ÚNSIGr`   r   r   r   Útest_setsigmask_wrong_typef  s"    
þ$
þ$
ÿþz+_PosixSpawnMixin.test_setsigmask_wrong_typec           	   
   C   s  t  ¡ \}}|  t j|¡ z¶t  |d¡ t d|› d¡}z"| jtj	tj	d|gt j
dd}W nf ty } z|  d|›¡ W Y d }~n<d }~0  tyÂ } z|  d|›¡ W Y d }~n
d }~0 0 W t  |¡ nt  |¡ 0 tj|dd	 t  |d
¡}t|ƒ}t  t  ¡ ¡}|  ||¡ d S )NTz0
                import os
                fd = z`
                sid = os.getsid(0)
                os.write(fd, str(sid).encode())
            ro   )Úsetsidzsetsid is not supported: zsetsid failed with: r   rq   rÂ   )rS   rU  rý   r   Úset_inheritabler6  r7  r  rs   rt   ry   r®   r¯   r  r   rz   rœ   rß   Úgetsidr.   r  )	r   ZrfdZwfdrŒ   r{   r  ÚoutputZ	child_sidZ
parent_sidr   r   r   Útest_setsidu  s,    þ

þ
$(z_PosixSpawnMixin.test_setsidc              
   C   sv   t   t jt j¡}t d¡}z4| jtjtjd|gtj	t jgd}W t   t j|¡ nt   t j|¡ 0 t
j|t j d d S )Nr4  ro   ©Ú	setsigdefrq   )rÝ  r8  ÚSIG_IGNr6  r7  r  rs   rt   rS   ry   r   rz   )r   Zoriginal_handlerrŒ   r{   r   r   r   Útest_setsigdef”  s    

ü z_PosixSpawnMixin.test_setsigdefc                 C   sê   |   t¡. | jtjtjddgtjdd W d   ƒ n1 s>0    Y  |   t¡0 | jtjtjddgtjdgd W d   ƒ n1 sˆ0    Y  |   t¡: | jtjtjddgtjtj	tj	d gd W d   ƒ n1 sÜ0    Y  d S )Nro   rp   r:  rD  r;  r3   r<  r`   r   r   r   Útest_setsigdef_wrong_type§  s    
þ$
þ$
þz*_PosixSpawnMixin.test_setsigdef_wrong_typer§  zbpo-34685: test can fail on BSDc                 C   sf   t  d¡}t  |¡}t d|› d|› d¡}| jtjtjd|gt jd t  	|¡fd}t
j|dd d S ©Nr   zF            import os, sys
            if os.sched_getscheduler(0) != zV:
                sys.exit(101)
            if os.sched_getparam(0).sched_priority != z:
                sys.exit(102)ro   )Z	schedulerrq   ©rS   r   r¢  r6  r7  r  rs   rt   ry   r®  r   rz   ©r   ZpolicyÚpriorityrŒ   r{   r   r   r   Útest_setscheduler_only_paramµ  s    

þü

üz-_PosixSpawnMixin.test_setscheduler_only_paramc                 C   sf   t  d¡}t  |¡}t d|› d|› d¡}| jtjtjd|gt j|t  	|¡fd}t
j|dd d S rI  rJ  rK  r   r   r   Útest_setscheduler_with_policyÉ  s    

þü

üz._PosixSpawnMixin.test_setscheduler_with_policyc                 C   s\   t jdt j t¡t jdft jdft jddfg}| j| j	d | j	t j
|d}tj|dd d S )Nr;   r   r3   r   r#  rq   )rS   ÚPOSIX_SPAWN_OPENrw   ÚrealpathÚ__file__ru   ÚPOSIX_SPAWN_CLOSEÚPOSIX_SPAWN_DUP2r  r&  ry   r   rz   )r   r$  r{   r   r   r   Útest_multiple_file_actionsÝ  s    
ýýz+_PosixSpawnMixin.test_multiple_file_actionsc              
   C   sX  | j }|  t¡* | j|d |tjd gd W d   ƒ n1 s@0    Y  |  t¡* | j|d |tjdgd W d   ƒ n1 s„0    Y  |  t¡* | j|d |tjdgd W d   ƒ n1 sÈ0    Y  |  t¡* | j|d |tjdgd W d   ƒ n1 s0    Y  |  t¡. | j|d |tjtjfgd W d   ƒ n1 sX0    Y  |  t¡2 | j|d |tjtjddfgd W d   ƒ n1 s¦0    Y  |  t¡0 | j|d |tjtjd fgd W d   ƒ n1 sò0    Y  |  t¡< | j|d |tjtjdt	d	 tj
dfgd W d   ƒ n1 sJ0    Y  d S )
Nr   r#  r   r    )i90  r3   r†   r;   rÍ  )r&  r5   r6   r  rS   ry   rR  rà   rO  rQ  ru   r  r   r   r   Útest_bad_file_actionsé  sH    ÿ$ÿ$ÿ$ÿ&ÿ&ÿ&
ÿ&þÿz&_PosixSpawnMixin.test_bad_file_actionsc                 C   s®   t j}|  t j|¡ d}tjd|tjtjB tjB t	j
t	jB fg}|  d|¡}| j|d |tj|d}t j|dd t|ƒ }|  | ¡ d¡ W d   ƒ n1 s 0    Y  d S )NúOif 1:
            import sys
            sys.stdout.write("hello")
            r3   ro   r   r#  rq   Úhello)r   r   rý   r!   rS   rO  r‘   r’   ÚO_TRUNCr
  r  r  r  r  ry   rz   r   r<   rœ   )r   rñ  r  r$  r  r{   rL  r   r   r   Útest_open_file  s    
þÿÿ
z_PosixSpawnMixin.test_open_filec                 C   sœ   t j}|  t j|¡ d|›d}|  d|¡}| j|d |tjtjdfgd}t j	|dd t
|ƒ&}|  | ¡ dtj ¡ W d   ƒ n1 sŽ0    Y  d S )Nz„if 1:
            import os
            try:
                os.fstat(0)
            except OSError as e:
                with open(z_, 'w') as closefile:
                    closefile.write('is closed %d' % e.errno)
            ro   r   r#  rq   zis closed %d)r   r   rý   r!   r  r  rS   ry   rR  rz   r   r<   rœ   r
   rÒ   )r   Z	closefiler  r  r{   rL  r   r   r   Útest_close_file  s    û
ÿ
z _PosixSpawnMixin.test_close_filec                 C   sÂ   t j}|  t j|¡ d}t|dƒT}tj| ¡ dfg}|  d|¡}| j	|d |tj
|d}t j|dd W d   ƒ n1 s|0    Y  t|ƒ }|  | ¡ d¡ W d   ƒ n1 s´0    Y  d S )	NrV  rÎ  r3   ro   r   r#  rq   rW  )r   r   rý   r!   r   rS   rS  rc   r  r  ry   rz   r<   rœ   )r   Zdupfiler  Z	childfiler$  r  r{   rL  r   r   r   rù   -  s    ÿÿ,
z_PosixSpawnMixin.test_dup2)&rÖ  r×  rØ  rs   rt   r&  r  r  r  r   r!  r(  r)  r,  r-  r/  r1  r2  rX   rÙ  r   rÝ  r9  r>  rC  rG  rH  rÞ  ZskipIfrÎ   rÏ   rM  rN  rT  rU  rY  rZ  rù   r   r   r   r   r  å  sN   					ÿ
ÿ
ÿÿr  Úposix_spawnztest needs os.posix_spawnc                   @   s   e Zd ZeeddƒZdS )ÚTestPosixSpawnr[  N)rÖ  r×  rØ  r4   r   r  r   r   r   r   r\  @  s   r\  Úposix_spawnpztest needs os.posix_spawnpc                   @   s&   e Zd ZeeddƒZejdd„ ƒZdS )ÚTestPosixSpawnPr]  Nc                 C   s    t  ¡ }|  tj|¡ d}tj ||¡}t t	j
|¡ ztj |tjd f¡}W n tyf   |}Y n0 |ddddf}t d|f ¡}d|f}t|d|iŽ d S )Nzposix_spawnp_test_program.exeÚPATHr  r  ro   rp   zË
            import os
            from test import support

            args = %a
            pid = os.posix_spawnp(args[0], args, os.environ)

            support.wait_process(pid, exitcode=0)
        )ÚtempfileÚmkdtemprý   r   r€  rS   rw   rã  r;  rs   rt   Úpathsepry   rW   r6  r7  r   )r   Útemp_dirZprogramZprogram_fullpathrw   Z
spawn_argsrŒ   r  r   r   r   Útest_posix_spawnpI  s    
øz!TestPosixSpawnP.test_posix_spawnp)	rÖ  r×  rØ  r4   r   r  r   Zskip_unless_symlinkrd  r   r   r   r   r^  E  s   r^  rŠ  ztest weak linking on macOSc                   @   sœ   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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 )&ÚTestPosixWeaklinkingc                    sR   dd l }dd l}| ¡ ‰ ‡ fdd„ˆ D ƒ| _tdd„ | ¡ d  d¡D ƒƒ| _d S )Nr   c                    s"   h | ]}|  d ¡rˆ | r|’qS )ZHAVE_r¦  )r£   Znm©Zconfig_varsr   r   Ú	<setcomp>v  r…   z-TestPosixWeaklinking.setUp.<locals>.<setcomp>c                 s   s   | ]}t |ƒV  qd S r    r‡  )r£   Úpartr   r   r   r‰  w  r…   z-TestPosixWeaklinking.setUp.<locals>.<genexpr>rJ  )rŽ  rÎ   Zget_config_varsÚ	availabler  Úmac_verrx   )r   rŽ  rÎ   r   rf  r   r   q  s
    zTestPosixWeaklinking.setUpc                 C   s   || j vrt |› d¡‚d S )Nz not weak-linked)ri  rX   rY   r  r   r   r   Ú_verify_availabley  s    
z&TestPosixWeaklinking._verify_availablec                 C   sb   |   d¡ | jdkr:|  ttdƒd¡ |  ttdƒd¡ n$|  ttdƒd¡ |  ttdƒd¡ d S )	NZHAVE_PWRITEV)r¨   r  rÀ   zos.pwritev is not availablerž   zos.readv is not availablezos.pwritev is availablezos.readv is available)rk  rj  r^   r   rS   rþ   r`   r   r   r   rÅ   }  s    

z!TestPosixWeaklinking.test_pwritevc                 C   sp   |   d¡ | jdkr$|  dtj¡ nH|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  d S )NZHAVE_FSTATAT©r¨   r¨   údir_fd unavailableÚfiler   rê  )
rk  rj  r  r   Ú_have_functionsÚassertNotInr  r®   rS   r
  r`   r   r   r   r  ‡  s    

zTestPosixWeaklinking.test_statc                 C   sð   |   d¡ | jdkr$|  dtj¡ nÈ|  dtj¡ |  td¡" tj	dtj
dd W d   ƒ n1 sf0    Y  |  td¡" tj	dtj
dd	 W d   ƒ n1 s¤0    Y  |  td
¡" tj	dtj
dd W d   ƒ n1 sâ0    Y  d S )NZHAVE_FACCESSATrl  rm  rn  r   rê  zfollow_symlinks unavailableFrã   zeffective_ids unavailableT)Zeffective_ids)rk  rj  r  r   ro  rp  r  r®   rS   rN  rO  r`   r   r   r   rP  ’  s    

00z TestPosixWeaklinking.test_accessc                 C   s€   |   d¡ | jdkr$|  dtj¡ nX|  dtj¡ |  dtj¡ |  td¡  tj	dddd W d   ƒ n1 sr0    Y  d S )	NZHAVE_FCHMODATrl  ZHAVE_LCHMODrm  rn  i¤  r   rê  )
rk  rj  r  r   ro  rp  r  r®   rS   rì  r`   r   r   r   Ú
test_chmod£  s    

zTestPosixWeaklinking.test_chmodc                 C   s‚   |   d¡ | jdkr$|  dtj¡ nZ|  dtj¡ |  dtj¡ |  td¡" tj	ddddd W d   ƒ n1 st0    Y  d S )NZHAVE_FCHOWNATrl  ZHAVE_LCHOWNrm  rn  r   rê  )
rk  rj  r  r   ro  rp  r  r®   rS   r4  r`   r   r   r   r6  ¯  s    

zTestPosixWeaklinking.test_chownc              	   C   sü  |   d¡ | jdkr&|  dtj¡ nÒ|  dtj¡ |  td¡  tj	dddd W d   ƒ n1 sf0    Y  |  td¡  tj	dddd	 W d   ƒ n1 s¢0    Y  |  td¡" tj	ddddd
 W d   ƒ n1 sà0    Y  t
 ¡ ô}tj |d¡}tj |d¡}tj |d¡}t|dƒ}| d¡ W d   ƒ n1 sJ0    Y  t d|¡ |  t¡  tj	||dd W d   ƒ n1 s’0    Y  |  t¡  tj	||dd W d   ƒ n1 sÎ0    Y  W d   ƒ n1 sî0    Y  d S )NZHAVE_LINKATrl  zsrc_dir_fd unavailableÚsourceÚtargetr   ©rø  zdst_dir_fd unavailable©rù  r÷  rÈ  rk   ÚdataTrã   F)rk  rj  r  r   ro  rp  r  r®   rS   rÈ  r   rc  rw   rã  r   rg   r;  r5   ÚFileExistsError)r   r  Z	link_pathZtarget_pathÚsource_pathr   r   r   r   Ú	test_link»  s*    

..0
*0zTestPosixWeaklinking.test_linkc                 C   s¢   |   d¡ | jdkr$|  dtj¡ nz|  dtj¡ |  td¡ t 	d¡ W d   ƒ n1 s^0    Y  |  td¡ t 
d¡ W d   ƒ n1 s”0    Y  d S )NZHAVE_FDOPENDIRrl  zClistdir: path should be string, bytes, os.PathLike or None, not intr   zCscandir: path should be string, bytes, os.PathLike or None, not int)rk  rj  r  r   ro  rp  r  r6   rS   r?  Úscandirr`   r   r   r   Útest_listdir_scandirâ  s    

(z)TestPosixWeaklinking.test_listdir_scandirc                 C   sp   |   d¡ | jdkr$|  dtj¡ nH|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  d S )NZHAVE_MKDIRATrl  rm  Údirr   rê  )
rk  rj  r  r   ro  rp  r  r®   rS   rz  r`   r   r   r   Ú
test_mkdirð  s    

zTestPosixWeaklinking.test_mkdirc                 C   sp   |   d¡ | jdkr$|  dtj¡ nH|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  d S )NZHAVE_MKFIFOAT©rQ   r   rm  rw   r   rê  )
rk  rj  r  r   ro  rp  r  r®   rS   r  r`   r   r   r   r  û  s    

z TestPosixWeaklinking.test_mkfifoc                 C   sp   |   d¡ | jdkr$|  dtj¡ nH|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  d S )NZHAVE_MKNODATr~  rm  rw   r   rê  )
rk  rj  r  r   ro  rp  r  r®   rS   r  r`   r   r   r   r    s    

zTestPosixWeaklinking.test_mknodc                 C   s*  |   d¡ | jdkr&|  dtj¡ n |  dtj¡ |  td¡  tj	dddd W d   ƒ n1 sf0    Y  |  td¡  tj	dddd W d   ƒ n1 s¢0    Y  |  td¡  tj
dddd W d   ƒ n1 sÞ0    Y  |  td¡  tj
dddd W d   ƒ n1 s0    Y  d S )	NZHAVE_RENAMEATrl  z%src_dir_fd and dst_dir_fd unavailableÚaÚbr   rt  ru  )rk  rj  r  r   ro  rp  r  r®   rS   rÆ  rÇ  r`   r   r   r   Útest_rename_replace  s    

...z(TestPosixWeaklinking.test_rename_replacec                 C   sª   |   d¡ | jdkr$|  dtj¡ n‚|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  |  td¡ tj
ddd W d   ƒ n1 sœ0    Y  d S )NZHAVE_UNLINKATrl  rm  rw   r   rê  )rk  rj  r  r   ro  rp  r  r®   rS   r!   r{  r`   r   r   r   Útest_unlink_rmdir%  s    

,z&TestPosixWeaklinking.test_unlink_rmdirc                 C   st   |   d¡ | jdkr$|  dtj¡ nL|  dtj¡ |  td¡" tj	dtj
dd W d   ƒ n1 sf0    Y  d S )NZHAVE_OPENATrl  rm  rw   r   rê  )rk  rj  r  r   ro  rp  r  r®   rS   r   ru   r`   r   r   r   Ú	test_open3  s    

zTestPosixWeaklinking.test_openc                 C   sp   |   d¡ | jdkr$|  dtj¡ nH|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  d S )NZHAVE_READLINKATrl  rm  rw   r   rê  )
rk  rj  r  r   ro  rp  r  r®   rS   r   r`   r   r   r   Útest_readlink>  s    

z"TestPosixWeaklinking.test_readlinkc                 C   sr   |   d¡ | jdkr$|  dtj¡ nJ|  dtj¡ |  td¡  tj	dddd W d   ƒ n1 sd0    Y  d S )NZHAVE_SYMLINKATrl  rm  r  r€  r   rê  )
rk  rj  r  r   ro  rp  r  r®   rS   r;  r`   r   r   r   Útest_symlinkI  s    

z!TestPosixWeaklinking.test_symlinkc                 C   s–   |   d¡ |   d¡ | jdkr<|  dtj¡ |  dtj¡ nV|  dtj¡ |  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sˆ0    Y  d S )NZHAVE_FUTIMENSZHAVE_UTIMENSAT)r¨   rQ   rm  rw   r   rê  )
rk  rj  r  r   ro  rp  r  r®   rS   rÞ   r`   r   r   r   ra  T  s    


zTestPosixWeaklinking.test_utimeN)rÖ  r×  rØ  r   rk  rÅ   r  rP  rq  r6  ry  r{  r}  r  r  r  r‚  rƒ  r„  r…  ra  r   r   r   r   re  j  s$   
're  c                   C   s   t  ¡  d S r    )r   Úreap_childrenr   r   r   r   ÚtearDownModulec  s    r‡  Ú__main__)+Ú__doc__rf   r   Ztest.support.script_helperr   Úimport_moduler   r
   rs   rÝ  rÝ   rS   rÎ   rT   r
  r`  rX   r   r6  Ú
contextlibr   rw   rã  Ú
gettempdirr   r<  rÙ  ÚmaxsizerÛ  r   rÞ  ZTestCaser   rß  r  r  r   r\  r^  re  r‡  rÖ  Úmainr   r   r   r   Ú<module>   sd   
ÿÿ
         ` A$  ]$ y
