o
    ±ó®g&\ ã                   @   s¨  	 d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ e 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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ƒ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 dS )#é    )Úsupport)Úimport_helper)Ú	os_helper)Úwarnings_helper)Úassert_python_okÚposixNz-dummy-symlinkì        z(test is only meaningful on 32-bit buildsc               
   C   s`   t tdƒsdS zt d¡ W dS  ty/ }  z| jtjkr$W Y d } ~ dS W Y d } ~ dS d } ~ ww )NÚsched_getschedulerFr   T)Úhasattrr   r	   ÚOSErrorÚerrnoÚENOSYS)Úe© r   úE/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/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Ÿƒone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ý¡e eedþƒ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jaej]v d¡d	d
„ ƒZbe ej<ej]v d¡dd„ ƒZce ej)ej]v d¡dd„ ƒZde ejeej]v d¡dd„ ƒZfe ejgej]v d¡dd„ ƒZhe eedŸƒoKejiej]v oKee<d ƒd¡dd„ ƒZje ejkej]v d¡dd„ ƒZle eedƒotejmej]v d¡dd „ ƒZne ejoej]v d!¡d"d#„ ƒZpe eeqd$ƒd%¡e eed&ƒd'¡d(d)„ ƒƒZre ejsej]v d*¡d+d,„ ƒZte ejuej]v d-¡d.d/„ ƒZve ejwej]v d0¡d1d2„ ƒZxe ee	d3ƒd4¡Zye ee	d5ƒd6¡Zzeyd7d8„ ƒZ{eye ee	d9ƒd:¡d;d<„ ƒƒZ|e}d=d>„ ƒZ~e ee	d?ƒd@¡dAdB„ ƒZezdCdD„ ƒZ€ezdEdF„ ƒZdGdH„ Z‚e eedIƒdJ¡dKdL„ ƒZƒdMdN„ Z„dOdP„ Z…dQdR„ Z†e eedSƒdT¡dUdV„ ƒZ‡d0S (W  ÚPosixTesterc                 C   s\   t tjdƒ W d   ƒ n1 sw   Y  tjg| _t ¡ | _| j ¡  t 	ddt
¡ d S )NÚwbÚignorez.* potential security risk .*)Úopenr   ÚTESTFNÚteardown_filesr   Zcheck_warningsÚ_warnings_managerÚ	__enter__ÚwarningsÚfilterwarningsÚRuntimeWarning©Úselfr   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   ÚtearDown8   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   ó2   t  ¡ }|  t|ƒd¡ |D ]}|  |d¡ qd S ©Né   r   )r   r9   ÚassertEqualÚlenÚassertGreaterEqual)r   Zuser_idsÚvalr   r   r   Útest_getresuidL   ó
   ÿzPosixTester.test_getresuidÚ	getresgidztest needs posix.getresgid()c                 C   r:   r;   )r   rC   r=   r>   r?   )r   Z	group_idsr@   r   r   r   Útest_getresgidT   rB   zPosixTester.test_getresgidÚ	setresuidztest needs posix.setresuid()c                 C   ó0   t  ¡ }|  t j|Ž ¡ |  t  ddd¡¡ d S ©Néÿÿÿÿ)r   r9   ÚassertIsNonerE   )r   Úcurrent_user_idsr   r   r   Útest_setresuid\   ó   zPosixTester.test_setresuidc                 C   ó@   t  ¡ }d|vr|d d ddf}| jtt jg|¢R Ž  d S d S ©Nr   r3   rH   )r   r9   r5   r   rE   )r   rJ   Znew_user_idsr   r   r   Útest_setresuid_exceptiond   ó
   þz$PosixTester.test_setresuid_exceptionÚ	setresgidztest needs posix.setresgid()c                 C   rF   rG   )r   rC   rI   rQ   )r   Úcurrent_group_idsr   r   r   Útest_setresgidm   rL   zPosixTester.test_setresgidc                 C   rM   rN   )r   rC   r5   r   rQ   )r   rR   Znew_group_idsr   r   r   Útest_setresgid_exceptionu   rP   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rkz
t t ¡ ¡j	}W n t
y?   t d¡‚w zt |d¡ W n tyc } z|  |jtj¡ W Y d }~d S d }~ww |  d¡ d S d S )Nr<   Úfoor   zneed a pwd entryé   z+Expected OSError to be raised by initgroups)r5   r6   r   rU   Ú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   rc   rY   Úcurdirr   r   r   r   Útest_statvfs—   ó   zPosixTester.test_statvfsÚfstatvfsztest needs posix.fstatvfs()c                 C   sL   t tjƒ}z|  t | ¡ ¡¡ |  t | ¡ ¡¡ W | ¡  d S | ¡  w r    )	r   r   r   rd   r   rh   Úfilenorc   Úclose©r   Úfpr   r   r   Útest_fstatvfsœ   s
   
zPosixTester.test_fstatvfsÚ	ftruncateztest needs posix.ftruncate()c                 C   sH   t tjdƒ}z| d¡ | ¡  t | ¡ d¡ W | ¡  d S | ¡  w )Núw+Útestr   )	r   r   r   ÚwriteÚflushr   rn   ri   rj   rk   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 sw   Y  t tjd¡ d S )NÚwrp   r   )r   r   r   rq   rr   r   rt   rk   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¡}z8t  ¡ }|dkr*t  t j tj¡d ¡ t	 
|tjddgt j¡ ntj|dd W t  |¡ d S W t  |¡ d S t  |¡ w )Nr   ú-cÚpass©Úexitcode)rY   r   ÚsysÚ
executableÚO_RDONLYrx   ÚchdirÚpathÚsplitr   rw   Úenvironr   Úwait_processrj   )r   rl   Úpidr   r   r   Útest_fexecve¹   s   üzPosixTester.test_fexecveÚwaitidztest needs posix.waitid()c                 C   sj   t  ¡ }|dkr#t  t j tj¡d ¡ t tjtjddgt j	¡ d S t 
tj|tj¡}|  ||j¡ d S )Nr   ry   rz   )rY   rx   r€   r   r‚   r}   r~   r   rw   rƒ   r‡   ÚP_PIDÚWEXITEDr=   Zsi_pid)r   r…   Úresr   r   r   Útest_waitidÈ   s   zPosixTester.test_waitidc                 C   s,  | j tdd t dd„ ¡ W d   ƒ n1 sw   Y  | j tdd tjdd W d   ƒ n1 s6w   Y  | j tdd tjdd	 W d   ƒ n1 sSw   Y  | j tdd tjd
d W d   ƒ n1 spw   Y  | j tdd tjd d W d   ƒ n1 sw   Y  | j tdd tjd d	 W d   ƒ n1 sªw   Y  | j tdd tjd d W d   ƒ n1 sÇw   Y  | j tdd tjd dd„ d W d   ƒ n1 sçw   Y  | j tdd tjdd„ dd W d   ƒ n	1 sw   Y  d}td|ƒ d S )NzPositional args not allowed)Úmsgc                   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   r   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'!')
            ry   )r5   r6   rY   Úregister_at_forkr   )r   Úcoder   r   r   Útest_register_at_forkÓ   s:   ÿÿÿÿÿÿÿþþ#z!PosixTester.test_register_at_forkÚlockfztest needs posix.lockf()c              	   C   sp   t  tjt jt jB ¡}z&t  |d¡ t  |dt j¡ t	 
|t	jd¡ t	 
|t	jd¡ W t  |¡ d S t  |¡ w )Nó   testr   é   )rY   r   r   r   ÚO_WRONLYÚO_CREATrq   ÚlseekÚSEEK_SETr   r˜   ÚF_LOCKÚF_ULOCKrj   ©r   Úfdr   r   r   Ú
test_lockf  s   zPosixTester.test_lockfÚpreadztest needs posix.pread()c              	   C   sz   t  tjt jt jB ¡}z+t  |d¡ t  |dt j¡ |  	dt
 |dd¡¡ |  	dt
 |d¡¡ W t  |¡ d S t  |¡ w )Nr™   r   s   esr   r3   s   te)rY   r   r   r   ÚO_RDWRrœ   rq   r   rž   r=   r   r¤   Úreadrj   r¡   r   r   r   Ú
test_pread  s   zPosixTester.test_preadÚpreadvztest needs posix.preadv()c              	   C   sx   t  tjt jt jB ¡}z*t  |d¡ dd„ dD ƒ}|  t 	||d¡d¡ |  g d¢t
|ƒ¡ W t  |¡ d S t  |¡ w )Nó   test1tt2t3t5t6t6t8c                 S   ó   g | ]}t |ƒ‘qS r   ©Ú	bytearray©Ú.0Úir   r   r   Ú
<listcomp>-  ó    z+PosixTester.test_preadv.<locals>.<listcomp>©é   r<   r   r<   é
   ©s   t1tt2s   t3ts   5t)rY   r   r   r   r¥   rœ   rq   r=   r   r¨   Úlistrj   )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_z&t  |d¡ dd„ dD ƒ}|  t 	||dt j
¡d¡ |  g d¢t|ƒ¡ W n( ty@   |  d¡ Y n# tyZ } z|jtjtjhv rUt d	¡‚‚ d }~ww W t  |¡ d S W t  |¡ d S t  |¡ w )
Nr©   c                 S   rª   r   r«   r­   r   r   r   r°   9  r±   z1PosixTester.test_preadv_flags.<locals>.<listcomp>r²   r<   r´   rµ   zpreadv2 not availablez0RWF_HIPRI is not supported by the current system)rY   r   r   r   r¥   rœ   rq   r=   r   r¨   r¹   r¶   ÚNotImplementedErrorÚskipTestr   r   ÚEINVALÚENOTSUPr^   r_   rj   )r   r¢   r·   Úinstr   r   r   Útest_preadv_flags3  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 s*w   Y  |  
|jjtj¡ |  
t|d ƒdd ¡ W t  |¡ d S t  |¡ w ©Né   é €  r   ó    )rY   r   r   r   r¥   rœ   r¬   r5   r   r¨   r=   Ú	exceptionr   r¼   Úbytesrj   ©r   r¢   r·   Úcmr   r   r   Útest_preadv_overflow_32bitsI  s   ÿz'PosixTester.test_preadv_overflow_32bitsÚpwriteztest needs posix.pwrite()c              	   C   sr   t  tjt jt jB ¡}z't  |d¡ t  |dt j¡ t	 
|dd¡ |  dt	 |d¡¡ W t  |¡ d S t  |¡ w )Nr™   r   ó   xxr3   s   txxtrš   )rY   r   r   r   r¥   rœ   rq   r   rž   r   rÉ   r=   r¦   rj   r¡   r   r   r   Útest_pwriteV  s   zPosixTester.test_pwriteÚpwritevztest needs posix.pwritev()c              	   C   s’   t  tjt jt jB ¡}z7t  |d¡ t  |dt j¡ t  	|g d¢d¡}|  
|d¡ t  |dt j¡ |  
dt |d¡¡ W t  |¡ d S t  |¡ w )NrÊ   r   ©s   test1s   tt2s   t3r   r´   s   xxtest1tt2t3éd   )rY   r   r   r   r¥   rœ   rq   r   rž   rÌ   r=   r   r¦   rj   ©r   r¢   Únr   r   r   Útest_pwriteva  s   zPosixTester.test_pwritevzos.RWF_SYNCztest needs os.RWF_SYNCc              	   C   s–   t  tjt jt jB ¡}z9t  |d¡ t  |dt j¡ t  	|g d¢dt j
¡}|  |d¡ t  |dt j¡ |  dt |d¡¡ W t  |¡ d S t  |¡ w )NrÊ   r   rÍ   r   r´   s
   xxtest1tt2rÎ   )rY   r   r   r   r¥   rœ   rq   r   rž   rÌ   ZRWF_SYNCr=   r   r¦   rj   rÏ   r   r   r   Útest_pwritev_flagso  s   zPosixTester.test_pwritev_flagsc              	   C   sˆ   t  tjt jt jB ¡}z2|  t¡}t  |dd gd d¡ W d   ƒ n1 s(w   Y  |  	|j
jtj¡ W t  |¡ d S t  |¡ w )Nó   xrÁ   rÂ   r   )rY   r   r   r   r¥   rœ   r5   r   rÌ   r=   rÄ   r   r¼   rj   ©r   r¢   rÇ   r   r   r   Útest_pwritev_overflow_32bits~  s   ÿz(PosixTester.test_pwritev_overflow_32bitsÚposix_fallocatez"test needs posix.posix_fallocate()c              
   C   s„   t  tjt jt jB ¡}z0z	t |dd¡ W n ty3 } z|j	t	j
kr.tj d¡r.t d¡‚‚ d }~ww W t  |¡ d S t  |¡ w )Nr   r´   )ZsunosÚfreebsdÚnetbsdZopenbsdZgnukfreebsdz test may fail on ZFS filesystems)rY   r   r   r   r›   rœ   r   rÖ   r   r   r¼   r}   ÚplatformÚ
startswithr^   r_   rj   )r   r¢   r¾   r   r   r   Útest_posix_fallocate‰  s   ÿ
€÷ÿz PosixTester.test_posix_fallocatec              
   C   sJ   z
t  ddd¡ W d S  ty$ } z|jtjkr‚ W Y d }~d S d }~ww )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   s@   t  tjt j¡}zt |ddtj¡ W t  |¡ d S t  |¡ w ©Nr   )	rY   r   r   r   r   r   rà   ÚPOSIX_FADV_WILLNEEDrj   r¡   r   r   r   Útest_posix_fadvise¦  s   zPosixTester.test_posix_fadvisec              
   C   sN   zt  dddt j¡ W d S  ty& } z|jtjkr‚ W Y d }~d S d }~ww )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   sN  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 |¡ d S t |¡ w )N©NN)Únsr   ç    eÍÍA)ÚtimerY   r   r   r   r   r   Úutimer5   r6   ÚintÚ
ValueErrorrj   )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 ¡}zFt  |d¡}|  |d¡ t  |dt j	¡ |  dt
 |d¡¡ zt
 |g ¡}W n	 ty;   Y nw |  |d¡ W t  |¡ d S W t  |¡ d S t  |¡ w )NrÍ   r´   r   ó
   test1tt2t3)rY   r   r   r   r¥   rœ   ró   r=   r   rž   r   r¦   r   rj   )r   r¢   rÐ   Úsizer   r   r   Útest_writevÜ  s   ýüzPosixTester.test_writevc              	   C   s†   t  tjt jt jB ¡}z1|  t¡}t  |dd gd ¡ W d   ƒ n1 s'w   Y  |  	|j
jtj¡ W t  |¡ d S t  |¡ w )NrÓ   rÁ   rÂ   )rY   r   r   r   r¥   rœ   r5   r   ró   r=   rÄ   r   r¼   rj   rÔ   r   r   r   Útest_writev_overflow_32bitsò  s   ÿz'PosixTester.test_writev_overflow_32bitsÚreadvztest needs posix.readv()c              	   C   sÌ   t  tjt jt jB ¡}zTt  |d¡ t  |dt j¡ dd„ dD ƒ}|  	t
 ||¡d¡ |  	g d¢dd„ |D ƒ¡ zt
 |g ¡}W n	 tyI   Y nw |  	|d¡ W t  |¡ d S W t  |¡ d S t  |¡ w )	Nrô   r   c                 S   rª   r   r«   r­   r   r   r   r°     r±   z*PosixTester.test_readv.<locals>.<listcomp>r²   r´   rÍ   c                 S   rª   r   )rÅ   r­   r   r   r   r°     r±   )rY   r   r   r   r¥   rœ   rq   r   rž   r=   r   rø   r   rj   )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 s)w   Y  |  
|jjtj¡ |  
t|d ƒdd ¡ W t  |¡ d S t  |¡ w rÀ   )rY   r   r   r   r¥   rœ   r¬   r5   r   rø   r=   rÄ   r   r¼   rÅ   rj   rÆ   r   r   r   Útest_readv_overflow_32bits  s   ÿz&PosixTester.test_readv_overflow_32bitsÚdupztest needs posix.dup()c                 C   sH   t tjƒ}zt | ¡ ¡}|  |t¡ t 	|¡ W | 	¡  d S | 	¡  w r    )
r   r   r   r   rû   ri   ÚassertIsInstancerê   rY   rj   )r   rl   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   sR   t tjƒ}t tjƒ}zt | ¡ | ¡ ¡ W | ¡  | ¡  d S | ¡  | ¡  w r    )r   r   r   r   r  ri   rj   )r   Úfp1Úfp2r   r   r   Ú	test_dup21  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    )
rY   r   r   r   r   r  Ú
addCleanuprj   ÚassertFalseÚget_inheritabler¡   r   r   r   Útest_oscloexec<  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ƒrOt  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 d S )NÚO_SHLOCK)rY   r   r   r   r›   r  rœ   r5   r   Ú
O_NONBLOCKrj   r
   r   r  r¡   r   r   r   Útest_osexlockC  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ƒrQt  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 d S )Nr  )rY   r   r   r   r›   r  rœ   rj   r
   r   r5   r   r   r  r  )r   Úfd1Úfd2r¢   r   r   r   Útest_osshlockS  s"   ÿÿ


ÿÿûzPosixTester.test_osshlockÚfstatztest needs posix.fstat()c                 C   sf   t tjƒ}z(|  t | ¡ ¡¡ |  t | ¡ ¡¡ |  t	dtjt
| ¡ ƒ¡ W | ¡  d S | ¡  w ©Nz4should be string, bytes, os.PathLike or integer, not)r   r   r   rd   r   r  ri   ÚstatÚassertRaisesRegexr6   Úfloatrj   rk   r   r   r   Ú
test_fstatd  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  )rd   r   r  r   r   rY   ÚfsencodeZassertWarnsRegexÚDeprecationWarningr¬   r  r6   r¶   r   r   r   r   Ú	test_statr  s$   þþþþzPosixTester.test_statÚmkfifozdon't have mkfifo()c              
   C   s¢   t jdkrtj dtj¡}ntj}t |¡ |  tj|¡ zt	 
|tjtjB ¡ W n tyB } z|  d| ¡ W Y d }~nd }~ww |  t t	 |¡j¡¡ d S )NÚvxworksz/fifos/úposix.mkfifo(): %s)r}   rÙ   rY   r   Újoinr   r   r!   r  r   r  r  ÚS_IRUSRÚS_IWUSRÚPermissionErrorr»   rd   ÚS_ISFIFOÚst_mode)r   Z	fifo_pathr   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	y8 } z|  
|jtjtjtjf¡ W Y d }~nd }~ww |  t t t j¡j¡¡ t  t j¡ ztjt j|dd d W d S  t	yy } z|  
|jtjtjtjf¡ W Y d }~d S d }~ww )Nr   )r   ÚmodeZdeviceÚdir_fd)r   r!   r   r  r'  r   r!  r   r&  r   ÚassertInr   r`   r¼   ÚEACCESrd   r#  r$  )r   r(  r   r   r   r   Ú
test_mknod‘  s$   &€ýÿ(€ÿ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   rH   )r   r  r   r   Úst_devrü   rê   r?   Úmajorr=   r5   r6   r  rë   ÚOverflowErrorÚminorr-  )r   ÚstÚdevr/  r1  r   r   r   Útest_makedev©  s.   

zPosixTester.test_makedevc           
   	      s¢  	 ‡ ‡‡fdd„}t  ¡ }t  ¡ }|ˆ ||ƒ |||ƒ |ˆ d|ƒ |||ƒ |ˆ |dƒ |||ƒ tjdkr<|dv }n|dk}|rmtjdkrIdnd}|ˆ ||ƒ |||ƒ |ˆ ddƒ |||ƒ |ˆ ||ƒ |||ƒ n;t ¡ d	v rxt d
¡‚ˆ t	|ˆ dd¡ |||ƒ ˆ t	|ˆ dd¡ |||ƒ dt  
¡ vr¨ˆ t	|ˆ dd¡ |||ƒ ttfD ]"}	ˆ t|ˆ |	|ƒ|¡ |||ƒ ˆ t|ˆ ||	|ƒ¡ |||ƒ q¬d S )Nc                    s4   ˆd urˆˆ ƒ}ˆ  |j| ¡ ˆ  |j|¡ d S 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_statrH   r  )r   r3   r   l        rÂ   )zHP-UXZSunOSz1Skipping because of non-standard chown() behavior)rY   r1   r,   r}   rÙ   Úsystemr^   r_   r5   r   r-   Ústrr  r6   )
r   Z
chown_funcr:  r;  r<  r7  r8  Zis_rootZ	big_valueÚtr   r9  r   Ú_test_all_chown_commonÆ  sH   











ü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 rG   )rY   r!   r   r   r5   r   r   rA  Úcreate_empty_filer@  r  r   r   r   r   Ú
test_chown
  s   zPosixTester.test_chownÚfchownztest needs os.fchown()c                 C   sR   t  tj¡ ttjdƒ}z| ¡ }|  tj|t	tdd ƒ¡ W | 
¡  d S | 
¡  w )Nru   r  )rY   r!   r   r   r   ri   r@  r   rD  r4   rj   )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)
rY   r!   r   r   ÚsymlinkÚ_DUMMY_SYMLINKr@  r   rF  r4   r   r   r   r   Útest_lchown!  s
   
ÿzPosixTester.test_lchownr€   ztest needs posix.chdir()c                 C   s"   t  tj¡ |  tt jtj¡ d S r    )r   r€   rY   re   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   ÚlistdirrY   re   r   r   r   r   Útest_listdir.  s   zPosixTester.test_listdirc                 C   s   |   tjt ¡ ¡ d S r    )r*  r   r   r   rL  r   r   r   r   Útest_listdir_default1  rg   z PosixTester.test_listdir_defaultc                 C   s   |   t tj¡t d¡¡ d S ©Nó   .)r*  rY   r  r   r   r   rL  r   r   r   r   Útest_listdir_bytes6  s   zPosixTester.test_listdir_bytesc              	   C   sx   t tfD ]5}|  t¡ t |dƒ¡}W d   ƒ n1 sw   Y  |  t t	j
¡|¡ |D ]
}|  t|ƒt¡ q.qd S rO  )r¬   Ú
memoryviewZassertWarnsr  r   rL  r*  rY   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%   r   r  rj   r=   ÚsortedrL  ©r   Úfr   r   r   Útest_listdir_fdC  s   þþzPosixTester.test_listdir_fdÚaccessztest needs posix.access()c                 C   s   |   t tjtj¡¡ d S r    )rd   r   r\  r   r   rY   ÚR_OKr   r   r   r   Útest_accessR  s   zPosixTester.test_accessÚumaskztest needs posix.umask()c                 C   s$   t  d¡}|  |t¡ t  |¡ d S rá   )r   r_  rü   rê   )r   Zold_maskr   r   r   Ú
test_umaskV  s   
zPosixTester.test_umaskÚstrerrorztest needs posix.strerror()c                 C   s   |   t d¡¡ d S rá   )rd   r   ra  r   r   r   r   Útest_strerror\  s   zPosixTester.test_strerrorÚpipeztest needs posix.pipe()c                 C   s$   t  ¡ \}}t |¡ t |¡ d S r    )r   rc  rY   rj   )r   ÚreaderÚwriterr   r   r   Ú	test_pipea  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 d S  tyz   Y d S w )NZDEADBEEFr   r3   rÓ   )r5   r6   rY   rg  rj   r  r  r  r	  r
  Úget_blockingr   r¦   rq   r   ZPIPE_MAX_SIZE)r   Úrru   r   r   r   Ú
test_pipe2g  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   r0  rY   rg  ZINT_MAXZUINT_MAX)r   rm  r   r   r   Útest_pipe2_c_limitsƒ  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_utimeŒ  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r-‚ d}|  	|¡ W Y d }~nd }~ww zFt  |¡}|  
|jtjB |j¡ zt|dƒ}	W n tyq }
 z|  
|
jtj¡ W Y d }
~
nd }
~
ww W t ||j¡ d S W t ||j¡ d S t ||j¡ w )NÚst_flagsú2chflag UF_IMMUTABLE not supported by underlying fsro   )rY   r  rd   r
   rp  ÚUF_IMMUTABLEr   r   Ú
EOPNOTSUPPr»   r=   r   r`   r   Úchflags)r   Zchflags_funcZtarget_fileÚkwargsr2  ÚflagsÚerrrŒ   Znew_str¢   r   r   r   r   Ú_test_chflags_regular_file™  s2   
€ü
€ÿÿþ"z&PosixTester._test_chflags_regular_filert  ztest needs os.chflags()c                 C   s   |   tjtj¡ d S r    )rx  r   rt  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î   )rx  r   rz  r   r   rt  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yX } z|jtjkrG‚ d}|  |¡ W Y d }~nd }~ww z&t  tj¡}t  
t¡}	|  |j|j¡ |  |jtjB |	j¡ W |t|jƒ q)|t|jƒ w d S )Nrp  c                 S   s   t j| |ddS r{  )r   rt  )r   rv  r   r   r   Úchflags_nofollowÅ  s   z;PosixTester.test_lchflags_symlink.<locals>.chflags_nofollowrq  )rY   r  r   r   rd   r
   rH  rI  r   ÚappendrG  r   rz  rp  rr  r   r   rs  r»   r=   )
r   Z	testfn_stZdummy_symlink_str}  Úfnrv  rw  rŒ   Znew_testfn_stZnew_dummy_symlink_str   r   r   Útest_lchflags_symlink»  s4   
€ü
ÿî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)	rY   r7   r>  rÅ   r   rƒ   Úitemsr=   rS  )r   Z	item_typeÚkÚvr   r   r   Útest_environÜ  s   
þzPosixTester.test_environc                 C   sJ  |   t¡ t dd¡ W d   ƒ n1 sw   Y  |   t¡ t dd¡ W d   ƒ n1 s1w   Y  |   t¡ t dd¡ W d   ƒ n1 sLw   Y  |   t¡ t dd¡ W d   ƒ n1 sgw   Y  |   t¡ t d	d
¡ W d   ƒ n1 s‚w   Y  |   t¡ t dd¡ W d   ƒ d S 1 sžw   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ë   rY   Ú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 }z+zt  |¡ t  |¡ W n   Y W t  |¡ t |¡ d S W t  |¡ t |¡ d S t  |¡ t |¡ w )Nz8getcwd-test-directory-0123456789abcdef-01234567890abcdefz.getcwdr   c              	      sœ   zt  | ¡ W n   t d¡‚t  | ¡ z-t  ¡  |dk r6ˆ | |t| ƒ d ƒ W t  d¡ t  | ¡ d S W t  d¡ t  | ¡ d S t  d¡ t  | ¡ w )Nz?mkdir cannot create directory sufficiently deep for getcwd testi  r3   z..)rY   Úmkdirr^   r_   r€   r%   r>   Úrmdir)ÚdirnameZcurrent_path_length©Ú_create_and_do_getcwdr   r   rŒ    s    


ü

ÿzEPosixTester.test_getcwd_long_pathnames.<locals>._create_and_do_getcwd)r   )	rY   r%   r   Úabspathr   r   rˆ  r€   Úrmtree)r   rŠ  re   Ú	base_pathr   r‹  r   Útest_getcwd_long_pathnamesó  s   

æ

ÿz&PosixTester.test_getcwd_long_pathnamesÚgetgrouplistztest needs posix.getgrouplist()r[   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<   )rZ   r[   rY   r1   r*  r   r‘  )r   ÚuserÚgroupr   r   r   Útest_getgrouplist  s   zPosixTester.test_getgrouplistr*   ztest needs os.getegid()Úpopenztest needs os.popen()c                 C   s  t  d¡}| ¡  ¡ }| ¡ }W d   ƒ n1 sw   Y  ztdd„ | ¡ D ƒƒ}W n ty8   tƒ }Y nw |d us?|sDt 	d¡‚t
jdkrkdd l}| d¡pSd}td	d„ | d
¡dd… D ƒƒdk rkt 	d¡‚| t ¡ ¡}|  | p}|t ¡ hk¡ d S )Nzid -G 2>/dev/nullc                 s   ó    | ]}t |ƒV  qd S r    ©rê   )r®   Úgr   r   r   Ú	<genexpr>(  ó   € z-PosixTester.test_getgroups.<locals>.<genexpr>zneed working 'id -G'Údarwinr   ZMACOSX_DEPLOYMENT_TARGETz10.3c                 s   r–  r    r—  )r®   rÐ   r   r   r   r™  2  rš  rW  r   )r´   r  z$getgroups(2) is broken prior to 10.6)rY   r•  r¦   Ústriprj   Úsetr‚   rë   r^   r_   r}   rÙ   Ú	sysconfigZget_config_varÚtupleÚsymmetric_differencer   r-   rd   r*   )r   ZidgÚgroupsZretZ
idg_groupsrž  ZdtZsymdiffr   r   r   Útest_getgroups   s$   
þ
ÿ

$
zPosixTester.test_getgroupsz)test needs dir_fd support for os.access()c              	   C   sJ   t  t  ¡ t j¡}z|  t jtjtj	|d¡ W t  
|¡ d S t  
|¡ w ©N©r)  )r   r   r%   r   rd   r\  r   r   rY   r]  rj   rY  r   r   r   Útest_access_dir_fd>  s   zPosixTester.test_access_dir_fdz'test needs dir_fd support in os.chmod()c              	   C   s„   t  tjtj¡ t t ¡ tj	¡}z*tjtjtjtj
B |d t tj¡}|  |d tj@ tjtj
B ¡ W t |¡ d S t |¡ w )Nr¤  r   )rY   Úchmodr   r   r  r   r   r   r%   r   r!  r=   ÚS_IRWXUrj   )r   rZ  Úsr   r   r   Útest_chmod_dir_fdF  s    zPosixTester.test_chmod_dir_fdz'test needs dir_fd support in os.chown()c              	   C   sd   t  t j¡ t  t j¡ t t ¡ tj¡}ztjt jt	 
¡ t	 ¡ |d W t |¡ d S t |¡ w r£  )r   r!   r   rB  r   r   r%   r   rA  rY   r1   r,   rj   rY  r   r   r   Útest_chown_dir_fdS  s   zPosixTester.test_chown_dir_fdz&test needs dir_fd support in os.stat()c              	   C   s  t  t j¡ tt jdƒ}| d¡ W d   ƒ n1 sw   Y  t t ¡ tj¡}zQt t j¡}tjt j|d}|  	||¡ tjt jd d}|  	||¡ | j
tdtjt jt ¡ d | j
tdtjt jt|ƒd | jttjt jdd W t |¡ d S t |¡ w )Nru   ú	testline
r¤  zshould be integer or None, notl      Fµx:^V )r   r!   r   r   rq   r   r%   r   r  r=   r  r6   r  r5   r0  rj   )r   ÚoutfilerZ  Ús1Ús2r   r   r   Útest_stat_dir_fd_  s*   ÿÿÿ
ÿzPosixTester.test_stat_dir_fdz'test needs dir_fd support in os.utime()c              	   C   s¼  t  t  ¡ t j¡}zÎt ¡ }t jtjd |d t jtj|d | jt	t jtj||d | jt	t jtjd|d | jt	t jtj|d f|d | jt	t jtjd |f|d | jt	t jtj|df|d t jtjt
|ƒt
|ƒf|d t jtj||f|d t jtjt
|ƒt
|t
|ƒ d ƒf|d t jtj|t
|ƒt
|t
|ƒ d ƒfd tjtjv rÀzt jtjd|d W n ty¿   Y nw W t  |¡ d S W t  |¡ d S W t  |¡ d S t  |¡ w )Nr¤  rå   Úxrç   )r)  r(   F)rï   r)  )r   r   r%   r   rè   ré   r   r   r5   r6   rê   rY   Úsupports_follow_symlinksrë   rj   )r   rZ  rì   r   r   r   Útest_utime_dir_fdu  sT   ÿÿÿÿÿÿ
ÿ

ÿþü	ùýzPosixTester.test_utime_dir_fdz&test needs dir_fd support in os.link()c              
   C   sê   t  t  ¡ t j¡}z]zt jtjtjd ||d W n ty2 } z|  d| ¡ W Y d }~n)d }~ww |  	t  
tj¡d t  
tjd ¡d ¡ W t  |¡ t tjd ¡ d S W t  |¡ t tjd ¡ d S t  |¡ t tjd ¡ w )NÚlink©Ú
src_dir_fdÚ
dst_dir_fdzposix.link(): %sr3   )r   r   r%   r   r³  r   r   r"  r»   r=   r  rj   r!   ©r   rZ  r   r   r   r   Útest_link_dir_fd™  s&   
ÿ€ÿÿ
ù

ÿzPosixTester.test_link_dir_fdz'test needs dir_fd support in os.mkdir()c              
   C   st   t  t  ¡ t j¡}z"t jtjd |d t  tjd ¡ W t  |¡ t 	tjd ¡ d S t  |¡ t 	tjd ¡ w )NÚdirr¤  )
r   r   r%   r   rˆ  r   r   r  rj   rŽ  rY  r   r   r   Útest_mkdir_dir_fd©  s   

ÿzPosixTester.test_mkdir_dir_fdzAtest requires both stat.S_IFIFO and dir_fd support for os.mknod()c              
   C   sÐ   t  t j¡ tjtjB tjB }t t 	¡ tj
¡}zIztjt j|d|d W n tyD } z|  |jtjtjtjf¡ W Y d }~nd }~ww |  t t t j¡j¡¡ W t |¡ d S W t |¡ d S t |¡ w )Nr   r¤  )r   r!   r   r  r'  r   r!  r   r   r%   r   r&  r   r*  r   r`   r¼   r+  rd   r#  r$  rj   )r   r(  rZ  r   r   r   r   Útest_mknod_dir_fd³  s   &€ýüzPosixTester.test_mknod_dir_fdz&test needs dir_fd support in os.open()c              	   C   sº   t  t j¡ tt jdƒ}| d¡ W d   ƒ n1 sw   Y  t t ¡ tj¡}tjt jtj|d}zt |d¡j	dd}|  
d|¡ W t |¡ t |¡ d S t |¡ t |¡ w )Nru   r«  r¤  é	   úutf-8©Úencoding)r   r!   r   r   rq   r   r%   r   r¦   Údecoder=   rj   )r   r¬  ÚaÚbrŠ   r   r   r   Útest_open_dir_fdÈ  s   ÿ

ÿzPosixTester.test_open_dir_fdÚreadlinkz*test needs dir_fd support in os.readlink()c              
   C   sŒ   t  tjtjd ¡ t t ¡ tj¡}z$|  t 	tjd ¡tj	tjd |d¡ W t 
tjd ¡ t |¡ d S t 
tjd ¡ t |¡ w ©Nr³  r¤  )rY   rH  r   r   r   r   r%   r   r=   rÄ  r!   rj   rY  r   r   r   Útest_readlink_dir_fdÖ  s   ÿÿz PosixTester.test_readlink_dir_fdz(test needs dir_fd support in os.rename()c              	   C   s”   t  t j¡ t  t jd ¡ t t ¡ tj¡}z,ztjt jd t j||d W n   t t jd t j¡ ‚ t 	t j¡ W t 
|¡ d S t 
|¡ w )NZrenr´  )r   r!   r   rB  r   r   r%   r   Úrenamer  rj   rY  r   r   r   Útest_rename_dir_fdâ  s   zPosixTester.test_rename_dir_fdÚSIGCHLDz2CLD_XXXX be placed in si_code for a SIGCHLD signalZwaitid_resultztest needs os.waitid_resultc                 C   s(   t j t j t j t j t j t j d S r    )rY   Ú
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_constantsz)test needs dir_fd support in os.symlink()c              
   C   s‚   t  t  ¡ t j¡}z)t jtjtjd |d |  t  tjd ¡tj¡ W t  	|¡ t 
tjd ¡ d S t  	|¡ t 
tjd ¡ w rÅ  )r   r   r%   r   rH  r   r   r=   rÄ  rj   r!   rY  r   r   r   Útest_symlink_dir_fdû  s   ÿÿ

ÿzPosixTester.test_symlink_dir_fdz(test needs dir_fd support in os.unlink()c              	   C   s˜   t  t  ¡ t j¡}t tjd ¡ t  tjd ¡ z,zt jtjd |d W n   t tjd ¡ ‚ |  	t
t jtjd ¡ W t  |¡ d S t  |¡ w )NÚdelr¤  r³  )r   r   r%   r   r   rB  r   r  r!   r5   r   rj   rY  r   r   r   Útest_unlink_dir_fd  s   zPosixTester.test_unlink_dir_fdz(test needs dir_fd support in os.mkfifo()c              
   C   s¨   t  t j¡ t t ¡ tj¡}z>ztjt jtj	tj
B |d W n ty8 } z|  d| ¡ W Y d }~nd }~ww |  t t t j¡j¡¡ W t |¡ d S t |¡ w )Nr¤  r  )r   r!   r   r   r   r%   r   r  r  r   r!  r"  r»   rd   r#  r$  rj   r·  r   r   r   Útest_mkfifo_dir_fd  s   
ÿ€ÿzPosixTester.test_mkfifo_dir_fdÚ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_yield)  s   zPosixTester.test_sched_yieldÚsched_get_priority_maxz!requires sched_get_priority_max()c                 C   sp   t j}t  |¡}t  |¡}|  |t¡ |  |t¡ |  ||¡ tjdkr6|  	t
t jd¡ |  	t
t jd¡ d S d S )Nr›  iéÿÿÿ)r   ÚSCHED_RRÚsched_get_priority_minrØ  rü   rê   r?   r}   rÙ   r5   r   )r   ZpolÚloÚhir   r   r   Útest_sched_priority.  s   


þzPosixTester.test_sched_priorityc              
   C   s¾  dd„ t j ¡ D ƒ}t  d¡}|  ||¡ z	t  t ¡ ¡}W n ty7 } z|jtj	kr-‚ W Y d }~nd }~ww |  ||¡ |  
tt jd¡ |  
tt jd¡ t  d¡}|  |jt¡ tj d¡s’zt  d||¡ t  d|¡ W n tyˆ } z|jtj	kr~‚ W Y d }~nd }~ww |  
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°   @  s    
ÿzDPosixTester.test_get_and_set_scheduler_and_param.<locals>.<listcomp>r   rH   ©r×   rØ   é+   l   œÿÇ )Úsched_priority)r   Ú__dict__r‚  r	   r*  rY   r0   r   r   r`   r5   Zsched_getparamrü   rá  rê   r}   rÙ   rÚ   Zsched_setschedulerZsched_setparamr6   Úsched_paramr0  )r   Zpossible_schedulersZmineÚparentr   ZparamZlarger   r   r   Ú$test_get_and_set_scheduler_and_param>  sJ   
ÿ€ÿ
ÿ€ÿ

z0PosixTester.test_get_and_set_scheduler_and_paramÚsched_rr_get_intervalzno functionc              
   C   st   zt  d¡}W n ty% } z|jtjkr‚ |  d¡ W Y d }~nd }~ww |  |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_intervalg  s   €ûz&PosixTester.test_sched_rr_get_intervalc                 C   sh   t  d¡}|  |t¡ |  t|ƒd¡ |  tt jd¡ |D ]}|  |t¡ |  |d¡ |  	|d¡ qd S )Nr   r3   rH   r   )
r   Úsched_getaffinityrü   r  r?   r>   r5   r   rê   rç  )r   ÚmaskZcpur   r   r   Útest_sched_getaffinityv  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t jd|¡ d S )Nr   r3   iöÿÿÿZ0Xé€   rH   )r   rê  r>   ÚpoprÖ  r=   r5   r   rë   Úmaprê   r0  )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¡ | ¡  | ¡ }| ¡ }z7t|ƒD ]}|  |t	 
||t	j¡¡ |  |t	 
||t	j¡¡ q|  tt	j
||t	j¡ |  tt	j
||t	j¡ W n ty[   t d¡‚w W d   ƒ d S 1 sgw   Y  d S )Nzr+bs   hellozOSError raised!)r   r   r   rq   rr   Útellri   Úranger=   rY   r   Ú	SEEK_DATAZassertLessEqualrö  r5   r   r^   r_   )r   rl   rõ   Zfnor¯   r   r   r   Útest_fs_holes–  s    	

ûÿ"özPosixTester.test_fs_holesc                 C   sŽ   	 dD ]A}t t|d ƒ}|d u rqdtjfD ]'}z|d|ƒ W q ty< } z|  d |¡t|ƒ¡ W Y d }~ qd }~ww |  d| ¡ qd S )N)rÇ  Úreplacer³  Znoodly2Zdoesnotexistfilenamez'doesnotexistfilename' -> '{}'z#No valid path_error2() test for os.)	r4   rY   r   r   r   r*  Úformatr>  ra   )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 }z*|  t¡ t |tjtj	B ¡}W d   ƒ n1 s0w   Y  W |d ur?t 
|¡ n|d urJt 
|¡ w w |  tj |¡¡ |  ttj|¡ |  tj |¡¡ t|dƒ 
¡  |  ttj|¡ d S )Nú r   )r   r   r  r!   r5   rë   rY   r   r›   rœ   rj   r	  r   Úexistsrˆ  r  ©r   r  Zfn_with_NULr¢   r   r   r   Útest_path_with_null_characterÃ  s*   
ÿ€
€ÿÿz)PosixTester.test_path_with_null_characterc              	   C   sò   t  tj¡}|d }|  tj|¡ t |¡ d }z*|  t¡ t  |t j	t j
B ¡}W d   ƒ n1 s3w   Y  W |d urBt  |¡ n|d urMt  |¡ w w |  t j |¡¡ |  tt j|¡ |  t j |¡¡ t|dƒ ¡  |  tt j|¡ d S )NrÃ   r   )rY   r  r   r   r  r!   r5   rë   r   r›   rœ   rj   r	  r   r  rˆ  r  r  r   r   r   Útest_path_with_null_byteÕ  s*   
ÿ€
€ÿÿz$PosixTester.test_path_with_null_byteÚ
pidfd_openzpidfd_open unavailablec                 C   s–   |   t¡}t d¡ W d   ƒ n1 sw   Y  |jjtjkr&|  d¡ t|jt	ƒr5|  d|j›¡ |  
|jjtj¡ t t t ¡ d¡¡ d S )NrH   z"system does not support pidfd_openzpidfd_open syscall blocked: r   )r5   r   rY   r  rÄ   r   r   r»   Ú
isinstancer"  r=   r¼   rj   r.   )r   rÇ   r   r   r   Útest_pidfd_openç  s   ÿ
zPosixTester.test_pidfd_open)ˆÚ__name__Ú
__module__Ú__qualname__r   r#   r8   r^   Ú
skipUnlessr
   r   rA   rD   rK   rO   rS   rT   rb   rf   rm   rs   rv   r4   rY   Úsupports_fdr†   r‹   r—   r£   r§   r¸   r¿   Úrequires_32brÈ   rË   rÑ   rÒ   rÕ   rÛ   rß   rã   rä   ré   rí   r±  rò   rö   r÷   rù   rú   rý   r   r  r   Zrequires_linux_versionr  r  r  r  r  r%  r  r,  r4  r@  rC  rE  rJ  rK  rM  rN  rQ  rV  rL  r[  r^  r`  rb  rf  rk  Zcpython_onlyrn  ro  rx  ry  r|  r€  r…  r‡  r  rZ   r”  r¢  r\  Úsupports_dir_fdr¥  r¦  r©  rA  rª  r¯  r²  r³  r¸  rˆ  rº  r&  r»  r   rÃ  rÄ  rÆ  rÇ  rÈ  ÚsignalrÐ  rH  rÑ  r!   rÓ  r  rÔ  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   
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ


	
<






	ÿ
ÿ
ÿ
ÿ



	
ÿ
	ÿ
ÿ
	ÿ
ÿ
ÿ

ÿ

D
	


ÿ


ÿ





 	
#ÿ
#	
ÿýÿ
ÿÿÿ(
ÿ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   r^   r_   r
   r}   rÙ   r-   Úsaved_groupsr   r   r   r   r   ô  s   




zPosixGroupsTester.setUpc                 C   sN   t tdƒrt | j¡ d S t tdƒr%t t ¡ ¡j}t || jd ¡ d S d S )NÚ	setgroupsrU   r   )	r
   r   r  r  rZ   r[   r1   r\   rU   ©r   r7   r   r   r   r#   ý  s   

þzPosixGroupsTester.tearDownrU   ztest needs posix.initgroups()c                 C   sD   t | jpdgƒd }t t ¡ ¡j}t ||¡ |  |t 	¡ ¡ d S rl  )
Úmaxr  rZ   r[   r   r1   r\   rU   r*  r-   )r   r˜  r7   r   r   r   rb     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#   r^   r  r
   r   rb   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ú-Sry   rz   Nc                 G   s   t jddg|¢R S )Nr  r  )r}   r~   ©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
|dd}|  | ¡ t|ƒ¡ W d   ƒ d S 1 sCw   Y  d S )Nú2if 1:
            import os
            with open(zO, "w") as pidfile:
                pidfile.write(str(os.getpid()))
            ry   r   r{   r½  r¾  )r   r   r  r!   r  Ú
spawn_funcrY   rƒ   r   r„   r   r=   r¦   r>  )r   ZpidfileÚscriptr  r…   rZ  r   r   r   Útest_returns_pid#  s   þ"ÿz!_PosixSpawnMixin.test_returns_pidc              
   C   s€   d}z|   ||gtj¡}W n ttfy) } z|  |j|¡ W Y d }~d S d }~ww t |d¡\}}|  ||¡ |  |d¡ d S )NÚno_such_executabler   )	r  rY   rƒ   ÚFileNotFoundErrorr"  r=   ÚfilenameÚwaitpidÚassertNotEqual)r   r"  r…   ÚexcZpid2Ústatusr   r   r   Útest_no_such_executable1  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d	}|  | ¡ d¡ W d   ƒ d S 1 sGw   Y  d S )
Nr  z^, "w", encoding="utf-8") as envfile:
                envfile.write(os.environ['foo'])
        ry   r   rV   Zbarr{   r½  r¾  )r   r   r  r!   r  r  rY   rƒ   r   r„   r   r=   r¦   )r   Zenvfiler   r  r…   rZ  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_actionsr{   ©r  ÚNOOP_PROGRAMrY   rƒ   r   r„   ©r   r…   r   r   r   Útest_none_file_actionsO  ó   üz'_PosixSpawnMixin.test_none_file_actionsc                 C   s.   | j | jd | jtjg d}tj|dd d S r+  r.  r0  r   r   r   Útest_empty_file_actionsX  r2  z(_PosixSpawnMixin.test_empty_file_actionsc                 C   ó0   | j tjtjddgtjdd}tj|dd d S )Nry   rz   F©Zresetidsr   r{   ©r  r}   r~   rY   rƒ   r   r„   r0  r   r   r   Útest_resetids_explicit_defaulta  ó   
üz/_PosixSpawnMixin.test_resetids_explicit_defaultc                 C   r4  )Nry   rz   Tr5  r   r{   r6  r0  r   r   r   Útest_resetidsj  r8  z_PosixSpawnMixin.test_resetidsc                 C   sN   |   t¡ | jtjtjddgtjd d W d   ƒ d S 1 s w   Y  d S )Nry   rz   r5  ©r5   r6   r  r}   r~   rY   rƒ   r   r   r   r   Útest_resetids_wrong_types  ó   
þ"ÿ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 )Nry   rz   ©Z	setpgroupr   r{   )r  r}   r~   rY   rƒ   r/   r   r„   r0  r   r   r   Útest_setpgroupy  s   
üz_PosixSpawnMixin.test_setpgroupc                 C   sN   |   t¡ | jtjtjddgtjdd W d   ƒ d S 1 s w   Y  d S )Nry   rz   Z023r=  r:  r   r   r   r   Útest_setpgroup_wrong_type‚  r<  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)ry   ©Z
setsigmaskr   r{   )ÚtextwrapÚdedentr  r}   r~   rY   rƒ   r  ÚSIGUSR1r   r„   )r   r–   r…   r   r   r   Útest_setsigmaskˆ  s   

üz _PosixSpawnMixin.test_setsigmaskc                 C   óì   |   t¡ | jtjtjddgtjdd W d   ƒ n1 sw   Y  |   t¡ | jtjtjddgtjdgd W d   ƒ n1 sDw   Y  |   t¡ | jtjtjddgtjtj	tj	d gd W d   ƒ d S 1 sow   Y  d S )Nry   rz   é"   rB  Újr3   ©
r5   r6   r  r}   r~   rY   rƒ   rë   r  ÚNSIGr   r   r   r   Útest_setsigmask_wrong_type—  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 n3 tyH } z|  d|›¡ W Y d }~nd }~w tya } z|  d|›¡ W Y d }~nd }~ww W t  |¡ nt  |¡ w 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())
            ry   )Úsetsidzsetsid is not supported: zsetsid failed with: r   r{   rÎ   )rY   rc  r  rj   Úset_inheritablerC  rD  r  r}   r~   rƒ   rº   r»   r"  r   r„   r¦   rê   Úgetsidr.   r&  )	r   ZrfdZwfdr–   r…   r'  ÚoutputZ	child_sidZ
parent_sidr   r   r   Útest_setsid¦  s4   
þ

þ€€ÿ€z_PosixSpawnMixin.test_setsidc              
   C   sv   t   t jt j¡}t d¡}z| jtjtjd|gtj	t jgd}W t   t j|¡ nt   t j|¡ w t
j|t j d d S )NrA  ry   ©Ú	setsigdefr{   )r  rE  ÚSIG_IGNrC  rD  r  r}   r~   rY   rƒ   r   r„   )r   Zoriginal_handlerr–   r…   r   r   r   Útest_setsigdefÅ  s   

ü z_PosixSpawnMixin.test_setsigdefc                 C   rG  )Nry   rz   rH  rR  rI  r3   rJ  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)ry   )Z	schedulerr{   ©rY   r	   rÚ  rC  rD  r  r}   r~   rƒ   rã  r   r„   ©r   ZpolicyZpriorityr–   r…   r   r   r   Útest_setscheduler_only_paramæ  ó   

þ
ü
ü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 rW  rX  rY  r   r   r   Útest_setscheduler_with_policyú  r[  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,  r{   )rY   ÚPOSIX_SPAWN_OPENr   ÚrealpathÚ__file__r   ÚPOSIX_SPAWN_CLOSEÚPOSIX_SPAWN_DUP2r  r/  rƒ   r   r„   )r   r-  r…   r   r   r   Útest_multiple_file_actions  s   
ýýz+_PosixSpawnMixin.test_multiple_file_actionsc              
   C   sR  | j }|  t¡ | j|d |tjd gd W d   ƒ n1 s w   Y  |  t¡ | j|d |tjdgd W d   ƒ n1 sBw   Y  |  t¡ | j|d |tjdgd W d   ƒ n1 sdw   Y  |  t¡ | j|d |tjdgd W d   ƒ n1 s†w   Y  |  t¡ | j|d |tjtjfgd W d   ƒ n1 sªw   Y  |  t¡ | j|d |tjtjddfgd W d   ƒ n1 sÐw   Y  |  t¡ | j|d |tjtjd fgd W d   ƒ n1 sõw   Y  |  t¡ | j|d |tjtjdt	d	 tj
dfgd W d   ƒ d S 1 s"w   Y  d S )
Nr   r,  r   r    )i90  r3   r   r<   r   )r/  r5   r6   r  rY   rƒ   r`  rë   r]  r_  r   r  r   r   r   Útest_bad_file_actions  sX   ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿþÿ$ÿ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d}|  | ¡ d	¡ W d   ƒ d S 1 sSw   Y  d S )
NúOif 1:
            import sys
            sys.stdout.write("hello")
            r3   ry   r   r,  r{   r½  r¾  Úhello)r   r   r  r!   rY   r]  r›   rœ   ÚO_TRUNCr  r   r!  r  r  rƒ   r   r„   r   r=   r¦   )r   r¬  r   r-  r  r…   rZ  r   r   r   Útest_open_file7  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d}|  | ¡ d	tj ¡ W d   ƒ d S 1 sJw   Y  d S )
Nz„if 1:
            import os
            try:
                os.fstat(0)
            except OSError as e:
                with open(zq, 'w', encoding='utf-8') as closefile:
                    closefile.write('is closed %d' % e.errno)
            ry   r   r,  r{   r½  r¾  zis closed %d)r   r   r  r!   r  r  rY   rƒ   r`  r   r„   r   r=   r¦   r   rÝ   )r   Z	closefiler   r  r…   rZ  r   r   r   Útest_close_fileK  s   û
ÿ"ÿz _PosixSpawnMixin.test_close_filec                 C   sÈ   t j}|  t j|¡ d}t|dƒ*}tj| ¡ dfg}|  d|¡}| j	|d |tj
|d}tj|dd W d   ƒ n1 s>w   Y  t|dd	}|  | ¡ d
¡ W d   ƒ d S 1 s]w   Y  d S )Nrd  r   r3   ry   r   r,  r{   r½  r¾  re  )r   r   r  r!   r   rY   ra  ri   r  r  rƒ   r   r„   r=   r¦   )r   Zdupfiler   Z	childfiler-  r  r…   rZ  r   r   r   r  ^  s   ÿÿù"ÿz_PosixSpawnMixin.test_dup2)&r  r	  r
  r}   r~   r/  r  r  r!  r)  r*  r1  r3  r7  r9  r;  r>  r?  r^   r  r
   r  rF  rL  rQ  rU  rV  r  ZskipIfrÙ   rÚ   rZ  r\  rb  rc  rg  rh  r  r   r   r   r   r    sP    					ÿ
ÿ
ÿÿr  Úposix_spawnztest needs os.posix_spawnc                   @   s   e Zd ZeeddƒZdS )ÚTestPosixSpawnri  N)r  r	  r
  r4   r   r  r   r   r   r   rj  q  s    rj  Úposix_spawnpztest needs os.posix_spawnpc                   @   s&   e Zd ZeeddƒZejdd„ ƒZdS )ÚTestPosixSpawnPrk  Nc                 C   s    t  ¡ }|  tj|¡ d}tj ||¡}t t	j
|¡ ztj |tjd f¡}W n ty3   |}Y nw |ddddf}t d|f ¡}d|f}t|d|iŽ d S )Nzposix_spawnp_test_program.exeÚPATHr  r  ry   rz   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Ž  rY   r   r  rH  r}   r~   Úpathseprƒ   r]   rC  rD  r   )r   Útemp_dirZprogramZprogram_fullpathr   Z
spawn_argsr–   r  r   r   r   Útest_posix_spawnpz  s    ÿøz!TestPosixSpawnP.test_posix_spawnp)	r  r	  r
  r4   r   r  r   Zskip_unless_symlinkrr  r   r   r   r   rl  v  s    rl  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!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>§  s   " z-TestPosixWeaklinking.setUp.<locals>.<setcomp>c                 s   r–  r    r—  )r®   Úpartr   r   r   r™  ¨  rš  z-TestPosixWeaklinking.setUp.<locals>.<genexpr>rW  )rž  rÙ   Zget_config_varsÚ	availablerŸ  Úmac_verr‚   )r   rž  rÙ   r   rt  r   r   ¢  s
   &zTestPosixWeaklinking.setUpc                 C   s   || j vrt |› d¡‚d S )Nz not weak-linked)rw  r^   r_   r  r   r   r   Ú_verify_availableª  s   
ÿz&TestPosixWeaklinking._verify_availablec                 C   sd   |   d¡ | jdkr|  ttdƒd¡ |  ttdƒd¡ d S |  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)ry  rx  rd   r
   rY   r	  r   r   r   r   rÑ   ®  s   

z!TestPosixWeaklinking.test_pwritevc                 C   ót   |   d¡ | jdkr|  dtj¡ d S |  dtj¡ |  td¡ tj	ddd W d   ƒ d S 1 s3w   Y  d S )NZHAVE_FSTATAT©r´   r´   údir_fd unavailableÚfiler   r¤  )
ry  rx  r*  r   Ú_have_functionsÚassertNotInr  rº   rY   r  r   r   r   r   r  ¸  ó   

"ÿzTestPosixWeaklinking.test_statc                 C   sô   |   d¡ | jdkr|  dtj¡ d S |  dtj¡ |  td¡ tj	dtj
dd W d   ƒ n1 s4w   Y  |  td¡ tj	dtj
dd	 W d   ƒ n1 sSw   Y  |  td
¡ tj	dtj
dd W d   ƒ d S 1 ssw   Y  d S )NZHAVE_FACCESSATr{  r|  r}  r   r¤  zfollow_symlinks unavailableFrî   zeffective_ids unavailableT)Zeffective_ids)ry  rx  r*  r   r~  r  r  rº   rY   r\  r]  r   r   r   r   r^  Ã  s   

ÿÿ"ÿz TestPosixWeaklinking.test_accessc                 C   s„   |   d¡ | jdkr|  dtj¡ d S |  dtj¡ |  dtj¡ |  td¡ tj	dddd W d   ƒ d S 1 s;w   Y  d S )	NZHAVE_FCHMODATr{  ZHAVE_LCHMODr|  r}  i¤  r   r¤  )
ry  rx  r*  r   r~  r  r  rº   rY   r¦  r   r   r   r   Ú
test_chmodÔ  s   

"ÿzTestPosixWeaklinking.test_chmodc                 C   s†   |   d¡ | jdkr|  dtj¡ d S |  dtj¡ |  dtj¡ |  td¡ tj	ddddd W d   ƒ d S 1 s<w   Y  d S )NZHAVE_FCHOWNATr{  ZHAVE_LCHOWNr|  r}  r   r¤  )
ry  rx  r*  r   r~  r  r  rº   rY   rA  r   r   r   r   rC  à  s   

"ÿzTestPosixWeaklinking.test_chownc              	   C   s  |   d¡ | jdkr|  dtj¡ d S |  dtj¡ |  td¡ tj	dddd W d   ƒ n1 s3w   Y  |  td¡ tj	dddd	 W d   ƒ n1 sQw   Y  |  td¡ tj	ddddd
 W d   ƒ n1 spw   Y  t
 ¡ €}tj |d¡}tj |d¡}tj |d¡}t|dƒ}| d¡ W d   ƒ n1 s¤w   Y  t d|¡ |  t¡ tj	||dd W d   ƒ n1 sÇw   Y  |  t¡ tj	||dd W d   ƒ n1 säw   Y  W d   ƒ d S W d   ƒ d S 1 süw   Y  d S )NZHAVE_LINKATr{  zsrc_dir_fd unavailableÚsourceÚtargetr   ©rµ  zdst_dir_fd unavailable©r¶  r´  r³  ru   ÚdataTrî   F)ry  rx  r*  r   r~  r  r  rº   rY   r³  r   rq  r   r  r   rq   rH  r5   ÚFileExistsError)r   r  Z	link_pathZtarget_pathÚsource_pathrl   r   r   r   Ú	test_linkì  s<   

ÿÿÿ
ÿÿÿï"ïzTestPosixWeaklinking.test_linkc                 C   s¦   |   d¡ | jdkr|  dtj¡ d S |  dtj¡ |  td¡ t 	d¡ W d   ƒ n1 s0w   Y  |  td¡ t 
d¡ W d   ƒ d S 1 sLw   Y  d S )NZHAVE_FDOPENDIRr{  zClistdir: path should be string, bytes, os.PathLike or None, not intr   zCscandir: path should be string, bytes, os.PathLike or None, not int)ry  rx  r*  r   r~  r  r  r6   rY   rL  Úscandirr   r   r   r   Útest_listdir_scandir  s   

ÿ"ÿz)TestPosixWeaklinking.test_listdir_scandirc                 C   rz  )NZHAVE_MKDIRATr{  r|  r¹  r   r¤  )
ry  rx  r*  r   r~  r  r  rº   rY   rˆ  r   r   r   r   Ú
test_mkdir!  r€  zTestPosixWeaklinking.test_mkdirc                 C   s*  |   d¡ | jdkr|  dtj¡ d S |  dtj¡ |  td¡ tj	dddd W d   ƒ n1 s3w   Y  |  td¡ tj	dddd W d   ƒ n1 sQw   Y  |  td¡ tj
dddd W d   ƒ n1 sow   Y  |  td¡ tj
dddd W d   ƒ d S 1 sŽw   Y  d S )	NZHAVE_RENAMEATr{  z%src_dir_fd and dst_dir_fd unavailablerÁ  rÂ  r   r„  r…  )ry  rx  r*  r   r~  r  r  rº   rY   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¡ d S |  dtj¡ |  td¡ tj	ddd W d   ƒ n1 s2w   Y  |  td¡ tj
ddd W d   ƒ d S 1 sPw   Y  d S )NZHAVE_UNLINKATr{  r|  r   r   r¤  )ry  rx  r*  r   r~  r  r  rº   rY   r!   r‰  r   r   r   r   Útest_unlink_rmdir@  s   

ÿ"ÿz&TestPosixWeaklinking.test_unlink_rmdirc                 C   sx   |   d¡ | jdkr|  dtj¡ d S |  dtj¡ |  td¡ tj	dtj
dd W d   ƒ d S 1 s5w   Y  d S )NZHAVE_OPENATr{  r|  r   r   r¤  )ry  rx  r*  r   r~  r  r  rº   rY   r   r   r   r   r   r   Ú	test_openN  s   

"ÿzTestPosixWeaklinking.test_openc                 C   rz  )NZHAVE_READLINKATr{  r|  r   r   r¤  )
ry  rx  r*  r   r~  r  r  rº   rY   rÄ  r   r   r   r   Útest_readlinkY  r€  z"TestPosixWeaklinking.test_readlinkc                 C   sv   |   d¡ | jdkr|  dtj¡ d S |  dtj¡ |  td¡ tj	dddd W d   ƒ d S 1 s4w   Y  d S )NZHAVE_SYMLINKATr{  r|  rÁ  rÂ  r   r¤  )
ry  rx  r*  r   r~  r  r  rº   rY   rH  r   r   r   r   Útest_symlinkd  s   

"ÿz!TestPosixWeaklinking.test_symlinkc                 C   sš   |   d¡ |   d¡ | jdkr|  dtj¡ |  dtj¡ d S |  dtj¡ |  dtj¡ |  td¡ tj	ddd W d   ƒ d S 1 sFw   Y  d S )NZHAVE_FUTIMENSZHAVE_UTIMENSAT)r´   rW   r|  r   r   r¤  )
ry  rx  r*  r   r~  r  r  rº   rY   ré   r   r   r   r   ro  o  s   


"ÿzTestPosixWeaklinking.test_utimeN)r  r	  r
  r   ry  rÑ   r  r^  r  rC  r‰  r‹  rŒ  r  rŽ  r  r  r‘  ro  r   r   r   r   rs  ›  s"    
'rs  c                   C   s,   zt  ttttt¡ W t  ¡  d S t  ¡  w r    )r   Zrun_unittestr   r  rj  rl  rs  Úreap_childrenr   r   r   r   Ú	test_main~  s   ûr“  Ú__main__)*rp   r   Ztest.supportr   r   r   Ztest.support.script_helperr   Úimport_moduler   r   r}   r  rè   rY   rÙ   rZ   r  rn  r^   r   rC  r   r  Ú
gettempdirr   rI  r  Úmaxsizer  r   r  ZTestCaser   r  r  r
   rj  rl  rs  r“  r  r   r   r   r   Ú<module>   sl    
ÿÿ
           Q$  ]$ c
ÿ