o
    HXîhI] ã                   @   sÊ  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ e 	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 dS )'zTest posix functionsé    )Úsupport)Úimport_helper)Ú	os_helper)Úwarnings_helper)Ú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 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   ú9/opt/python-3.10.19/usr/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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   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   ÚtearDown9   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   r:   ÚassertEqualÚlenÚassertGreaterEqual)r   Zuser_idsÚvalr   r   r   Útest_getresuidM   ó
   ÿzPosixTester.test_getresuidÚ	getresgidztest needs posix.getresgid()c                 C   r;   r<   )r   rD   r>   r?   r@   )r   Z	group_idsrA   r   r   r   Útest_getresgidU   rC   zPosixTester.test_getresgidÚ	setresuidztest needs posix.setresuid()c                 C   ó0   t  ¡ }|  t j|Ž ¡ |  t  ddd¡¡ d S ©Néÿÿÿÿ)r   r:   ÚassertIsNonerF   )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   r4   rI   )r   r:   r6   r   rF   )r   rK   Znew_user_idsr   r   r   Útest_setresuid_exceptione   ó
   þz$PosixTester.test_setresuid_exceptionÚ	setresgidztest needs posix.setresgid()c                 C   rG   rH   )r   rD   rJ   rR   )r   Úcurrent_group_idsr   r   r   Útest_setresgidn   rM   zPosixTester.test_setresgidc                 C   rN   rO   )r   rD   r6   r   rR   )r   rS   Znew_group_idsr   r   r   Útest_setresgid_exceptionv   rQ   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)r6   r7   r   rV   ÚobjectÚosr2   ÚpwdÚgetpwuidÚpw_nameÚKeyErrorÚunittestÚSkipTestr   r>   r   ÚEPERMÚfail)r   r8   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   rd   rZ   Ú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   re   r   ri   Úfilenord   Ú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   ro   rj   rk   rl   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Úwrq   r   )r   r   r   rr   rs   r   ru   rl   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)rZ   r   ÚsysÚ
executableÚO_RDONLYry   ÚchdirÚpathÚsplitr   rx   Úenvironr   Úwait_processrk   )r   rm   Ú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   rz   r{   )rZ   ry   r   r‚   rƒ   r~   r   r   rx   r„   rˆ   ÚP_PIDÚWEXITEDr>   Ú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'!')
            rz   )r6   r7   rZ   Ú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   é   )rZ   r   r   r   ÚO_WRONLYÚO_CREATrr   ÚlseekÚSEEK_SETr   rš   ÚF_LOCKÚF_ULOCKrk   ©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’   r4   s   te)rZ   r   r   r   ÚO_RDWRrž   rr   rŸ   r    r>   r   r¦   Úreadrk   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)rZ   r   r   r   r§   rž   rr   r>   r   rª   Úlistrk   )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²   :  r³   z1PosixTester.test_preadv_flags.<locals>.<listcomp>r´   r=   r¶   r·   zpreadv2 not availablez0RWF_HIPRI is not supported by the current system)rZ   r   r   r   r§   rž   rr   r>   r   rª   r»   r¸   ÚNotImplementedErrorÚskipTestr   r   ÚEINVALÚENOTSUPr_   r`   rk   )r   r¤   r¹   Úinstr   r   r   Útest_preadv_flags4  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   ó    )rZ   r   r   r   r§   rž   r®   r6   r   rª   r>   Ú	exceptionr   r¾   Úbytesrk   ©r   r¤   r¹   Úcmr   r   r   Útest_preadv_overflow_32bitsJ  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   ó   xxr4   s   txxtrœ   )rZ   r   r   r   r§   rž   rr   rŸ   r    r   rË   r>   r¨   rk   r£   r   r   r   Útest_pwriteW  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   )rZ   r   r   r   r§   rž   rr   rŸ   r    rÎ   r>   r   r¨   rk   ©r   r¤   Únr   r   r   Útest_pwritevb  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Ð   )rZ   r   r   r   r§   rž   rr   rŸ   r    rÎ   ÚRWF_SYNCr>   r   r¨   rk   rÑ   r   r   r   Útest_pwritev_flagsp  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   )rZ   r   r   r   r§   rž   r6   r   rÎ   r>   rÆ   r   r¾   rk   ©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)rZ   r   r   r   r   rž   r   rÙ   r   r   r¾   r~   ÚplatformÚ
startswithr_   r`   rk   )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   )	rZ   r   r   r   r€   r   rã   ÚPOSIX_FADV_WILLNEEDrk   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)ÚtimerZ   r   r   r   r€   r   Úutimer6   r7   ÚintÚ
ValueErrorrk   )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   r6   r7   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)rZ   r   r   r   r§   rž   rö   r>   rŸ   r    r   r¨   r   rk   )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Ä   )rZ   r   r   r   r§   rž   r6   r   rö   r>   rÆ   r   r¾   rk   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³   )rZ   r   r   r   r§   rž   rr   rŸ   r    r>   r   rû   r   rk   )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Â   )rZ   r   r   r   r§   rž   r®   r6   r   rû   r>   rÆ   r   r¾   rÇ   rk   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þ   rj   ÚassertIsInstancerí   rZ   rk   )r   rm   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)r6   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  rj   rk   )r   Úfp1Úfp2r   r   r   Ú	test_dup22  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!   )
rZ   r   r   r   r€   r  Ú
addCleanuprk   Ú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)rZ   r   r   r   r   r  rž   r6   r   Ú
O_NONBLOCKrk   r   r   r  r£   r   r   r   Útest_osexlockD  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  )rZ   r   r   r   r   r  rž   rk   r   r   r6   r   r€   r  r  )r   Úfd1Úfd2r¤   r   r   r   Útest_osshlockT  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   re   r   r  rj   ÚstatÚassertRaisesRegexr7   Úfloatrk   rl   r   r   r   Ú
test_fstate  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  )re   r   r  r   r   rZ   ÚfsencodeZassertWarnsRegexÚDeprecationWarningr®   r  r7   r¸   r   r   r   r   Ú	test_stats  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Ü   rZ   r‚   Újoinr   r   r"   r  r   r  r  ÚS_IRUSRÚS_IWUSRÚPermissionErrorr½   re   Ú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   ra   r¾   ÚEACCESre   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   rI   )r   r  r   r   Úst_devrÿ   rí   r@   Úmajorr>   r6   r7   r  rî   ÚOverflowErrorÚminorr0  )r   ÚstÚdevr2  r4  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}|rltjdkrHdnd}|ˆ ||ƒ |||ƒ |ˆ ddƒ |||ƒ |ˆ ||ƒ |||ƒ n;t ¡ d	v rwt d
¡‚ˆ t	|ˆ dd¡ |||ƒ ˆ t	|ˆ dd¡ |||ƒ dt  
¡ vr§ˆ t	|ˆ dd¡ |||ƒ ttfD ]"}	ˆ t|ˆ |	|ƒ|¡ |||ƒ ˆ t|ˆ ||	|ƒ¡ |||ƒ q«dS )z/Common code for chown, fchown and lchown tests.c                    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_statrI   r   )r   r4   r   l        rÄ   )zHP-UXZSunOSz1Skipping because of non-standard chown() behaviorN)rZ   r2   r-   r~   rÜ   Úsystemr_   r`   r6   r   r.   Ústrr  r7   )
r   Z
chown_funcr=  r>  r?  r:  r;  Zis_rootZ	big_valueÚtr   r<  r   Ú_test_all_chown_commonÇ  sF   











ü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 rH   )rZ   r"   r   r   r6   r   r   rD  Úcreate_empty_filerC  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 )Nrv   r  )rZ   r"   r   r   r   rj   rC  r   rG  r5   rk   )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)
rZ   r"   r   r   ÚsymlinkÚ_DUMMY_SYMLINKrC  r   rI  r5   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   rZ   rf   r6   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   ÚlistdirrZ   rf   r   r   r   r   Útest_listdir/  s   zPosixTester.test_listdirc                 C   s   |   tjt ¡ ¡ d S r!   )r-  r   r   r   rO  r   r   r   r   Útest_listdir_default2  rh   z PosixTester.test_listdir_defaultc                 C   s   |   t tj¡t d¡¡ d S ©Nó   .)r-  rZ   r  r   r   r   rO  r   r   r   r   Útest_listdir_bytes7  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 rR  )r®   Ú
memoryviewZassertWarnsr  r   rO  r-  rZ   r  r   r   ZassertIsÚtyperÇ   )r   ÚclsÚnamesr8   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  rk   r>   ÚsortedrO  )r   Úfr   r   r   Útest_listdir_fdD  s   þþzPosixTester.test_listdir_fdÚaccessztest needs posix.access()c                 C   s   |   t tjtj¡¡ d S r!   )re   r   r^  r   r   rZ   ÚR_OKr   r   r   r   Útest_accessS  s   zPosixTester.test_accessÚumaskztest needs posix.umask()c                 C   s$   t  d¡}|  |t¡ t  |¡ d S rä   )r   ra  rÿ   rí   )r   Zold_maskr   r   r   Ú
test_umaskW  s   
zPosixTester.test_umaskÚstrerrorztest needs posix.strerror()c                 C   s   |   t d¡¡ d S rä   )re   r   rc  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   re  rZ   rk   )r   ÚreaderÚwriterr   r   r   Ú	test_pipeb  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   r4   rÖ   )r6   r7   rZ   ri  rk   r  r  r  r  r  Úget_blockingr   r¨   rr   r   ZPIPE_MAX_SIZE)r   Úrrv   r   r   r   Ú
test_pipe2h  s$   

ÿzPosixTester.test_pipe2c                 C   s8   dd l }|  ttj|jd ¡ |  ttj|jd ¡ d S ©Nr   r4   )Ú	_testcapir6   r3  rZ   ri  ZINT_MAXZUINT_MAX)r   ro  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 fsrp   )rZ   r  re   r   rr  ÚUF_IMMUTABLEr   r   Ú
EOPNOTSUPPr½   r>   r   ra   r   Úchflags)r   Zchflags_funcZtarget_fileÚkwargsr5  ÚflagsÚerrrŽ   Znew_str¤   r   r   r   r   Ú_test_chflags_regular_fileš  s2   
€ü
€ÿÿþ"z&PosixTester._test_chflags_regular_filerv  ztest needs os.chflags()c                 C   s   |   tjtj¡ d S r!   )rz  r   rv  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ñ   )rz  r   r|  r   r   rv  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 )Nrr  c                 S   s   t j| |ddS r}  )r   rv  )r‚   rx  r   r   r   Úchflags_nofollowÆ  s   z;PosixTester.test_lchflags_symlink.<locals>.chflags_nofollowrs  )rZ   r  r   r   re   r   rK  rL  r   ÚappendrJ  r   r|  rr  rt  r   r   ru  r½   r>   )
r   Z	testfn_stZdummy_symlink_str  Úfnrx  ry  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)	rZ   r8   rA  rÇ   r   r„   Úitemsr>   rV  )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)r6   rî   rZ   Ú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.getcwd)	rZ   r&   r‚   Úabspathr   r   Úmkdirr   Úrmtree)r   Údirnamerf   Ú	base_pathr   )Z_create_and_do_getcwdr   Útest_getcwd_long_pathnamesô  s   

æ

ÿz&PosixTester.test_getcwd_long_pathnamesÚgetgrouplistztest needs posix.getgrouplist()r\   ztest needs pwd.getpwuid()r2   ztest needs os.getuid()c                 C   s<   t  t ¡ ¡d }t  t ¡ ¡d }|  |t ||¡¡ d S )Nr   r=   )r[   r\   rZ   r2   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˜  3  r™  rZ  r’   )r¶   r	  z$getgroups(2) is broken prior to 10.6)rZ   r”  r¨   Ústriprk   Úsetrƒ   rî   r_   r`   r~   rÜ   Ú	sysconfigZget_config_varÚtupleÚsymmetric_differencer   r.   re   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!   )rZ   Ú
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   ó   t  ¡  d S r!   )r   r¬  r   r   r   r   Útest_sched_yieldL  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Ü   r6   r   )r   ZpolÚloÚhir   r   r   Útest_sched_priorityQ  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°   r8   Zschedr   r   r   r²   c  s    
ÿzDPosixTester.test_get_and_set_scheduler_and_param.<locals>.<listcomp>r   rI   ©rÚ   rÛ   é+   l   œÿÇ )Úsched_priority)r   Ú__dict__r„  r
   r-  rZ   r1   r   r   ra   r6   Úsched_getparamrÿ   r¹  rí   r~   rÜ   rÝ   Úsched_setschedulerÚsched_setparamr7   Úsched_paramr3  )r   Zpossible_schedulersZmineÚparentr   ZparamZlarger   r   r   Ú$test_get_and_set_scheduler_and_parama  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_intervalŠ  s   €ûz&PosixTester.test_sched_rr_get_intervalc                 C   st   t  d¡}|  |t¡ |  t|ƒd¡ tj d¡s!|  	t
t jd¡ |D ]}|  |t¡ |  |d¡ |  |d¡ q#d S )Nr   r4   rÚ   rI   r	   )r   Úsched_getaffinityrÿ   rœ  r@   r?   r~   rÜ   rÝ   r6   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¡sZ|  tt jd|¡ d S d S )Nr   r4   iöÿÿÿZ0Xé€   rÚ   rI   )r   rÅ  r?   Úpopr­  r>   r6   r   rî   Úmaprí   r3  r~   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¡ | ¡  | ¡ }| ¡ }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   rr   rs   Útellrj   Úranger>   rZ   rŸ   Ú	SEEK_DATAZassertLessEqualrÑ  r6   r   r_   r`   )r   rm   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}~ nd}~ww |  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.)	r5   rZ   r   r   r   r-  ÚformatrA  rb   )r   r8   Ú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"   r6   rî   rZ   r   r   rž   rk   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   )rZ   r  r   r   r  r"   r6   rî   r   r   rž   rk   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 )NrI   z"system does not support pidfd_openzpidfd_open syscall blocked: r   )r6   r   rZ   râ  rÆ   r   r   r½   Ú
isinstancer%  r>   r¾   rk   r/   )r   rÉ   r   r   r   Útest_pidfd_open  s   ÿ
zPosixTester.test_pidfd_open)mÚ__name__Ú
__module__Ú__qualname__r    r$   r9   r_   Ú
skipUnlessr   r   rB   rE   rL   rP   rT   rU   rc   rg   rn   rt   rw   r5   rZ   Ú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/  r7  rC  rF  rH  rM  rN  rP  rQ  rT  rY  rO  r]  r`  rb  rd  rh  rm  Zcpython_onlyrp  rq  rz  r{  r~  r‚  r‡  r‰  r  r[   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Ì   
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ


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

	ÿ
ÿ
ÿ
ÿ



	
ÿ
	ÿ
ÿ
	ÿ
ÿ
ÿ

ÿ

D
	


ÿ


ÿ





 	
#ÿÿÿ(ÿ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ƒ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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   ƒ d S 1 sEw   Y  d S )Nr4   Ú_Úbase)rî  Úcountr   r   r   r‹  r  ÚrmdirrZ   r‚   r"  Zopen_dir_fd)r   r8   Úbase_dirÚfullnamer,  r   r   r   Úprepare  s   €
"ÿzTestPosixDirFd.preparec                 c   sZ    |   ¡ \}}}t |¡ |  tj|¡ |||fV  W d   ƒ d S 1 s&w   Y  d S r!   )rõ  r   rE  r  r   r"   ©r   r,  r8   rô  r   r   r   Úprepare_file*  s   €
"ýzTestPosixDirFd.prepare_filez)test needs dir_fd support for os.access()c                 C   sL   |   ¡ \}}}|  tj|tj|d¡ W d   ƒ d S 1 sw   Y  d S ©N©r,  )r÷  re   r   r^  rZ   r_  rö  r   r   r   Útest_access_dir_fd1  s   "ÿz!TestPosixDirFd.test_access_dir_fdz'test needs dir_fd support in os.chmod()c                 C   s€   |   ¡ 2\}}}t |tj¡ tj|tjtjB |d t |¡}|  |jtj@ tjtjB ¡ W d   ƒ d S 1 s9w   Y  d S rø  )	r÷  r   Úchmodr  r#  r$  r>   r'  ÚS_IRWXU)r   r,  r8   rô  Úsr   r   r   Útest_chmod_dir_fd6  s   

ÿ"üz TestPosixDirFd.test_chmod_dir_fdrD  z'test needs dir_fd support in os.chown()c                 C   sN   |   ¡ \}}}tj|t ¡ t ¡ |d W d   ƒ d S 1 s w   Y  d S rø  )r÷  r   rD  rZ   r2   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ü   |   ¡ p\}}}t|dƒ}| d¡ W d   ƒ n1 sw   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   ƒ d S 1 sww   Y  d S )Nrv   z	testline
rù  zshould be integer or None, notl      Fµx:^V )rõ  r   rr   r  r   r"   r  r>   r  r7   r&   r  r6   r3  )r   r,  r8   rô  ÚoutfileÚs1Ús2r   r   r   Útest_stat_dir_fdE  s(   ÿ
ÿÿÿ"ñzTestPosixDirFd.test_stat_dir_fdz'test needs dir_fd support in os.utime()c              	   C   s¨  |   ¡ Æ\}}}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 r²z
tj|d|d W n t	y±   Y nw W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 sÍw   Y  d S )Nrù  rè   Úxrê   )r,  r)   F)rò   r,  )
r÷  rë   r   rì   r6   r7   rí   rZ   rë  rî   )r   r,  r8   rô  rï   r   r   r   Útest_utime_dir_fdY  sN   ÿÿÿÿÿÿÿþýêè"åz TestPosixDirFd.test_utime_dir_fdz&test needs dir_fd support in os.link()c                 C   sê   |   ¡ g\}}}|  ¡ G\}}}ztj||||d W n ty4 } z|  d| ¡ W Y d }~nd }~ww |  tj|¡ |  t 	|¡d t 	|¡d ¡ W d   ƒ n1 sVw   Y  W d   ƒ d S W d   ƒ d S 1 snw   Y  d S )N©Ú
src_dir_fdÚ
dst_dir_fdzposix.link(): %sr4   )
r÷  rõ  r   rØ  r%  r½   r  r"   r>   r  )r   r,  r8   rô  Údir_fd2ZlinknameZfulllinknamer   r   r   r   Útest_link_dir_fdx  s   ÿ€ÿÿPøzTestPosixDirFd.test_link_dir_fdz'test needs dir_fd support in os.mkdir()c                 C   sZ   |   ¡ \}}}tj||d |  tj|¡ t |¡ W d   ƒ d S 1 s&w   Y  d S rø  )rõ  r   r‹  r  rò  r  rö  r   r   r   Útest_mkdir_dir_fd…  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y; } z|  |j	t	j
t	jt	jf¡ W Y d }~n d }~ww |  tj|¡ |  t t |¡j¡¡ W d   ƒ d S W d   ƒ d S 1 sbw   Y  d S )Nr   rù  )rõ  r  r*  r#  r$  r   r)  r   r-  r   ra   r¾   r.  r  r"   re   r&  r'  )r   r,  r8   rô  r+  r   r   r   r   Útest_mknod_dir_fdŒ  s   &€ýö"ùz TestPosixDirFd.test_mknod_dir_fdz&test needs dir_fd support in os.open()c              
   C   s¼   |   ¡ P\}}}t|dƒ}| d¡ W d   ƒ n1 sw   Y  |  tj|¡ tj|tj|d}zt |d¡}|  d|¡ W t 	|¡ nt 	|¡ w W d   ƒ d S 1 sWw   Y  d S )Nr   s	   testline
rù  é	   )
rõ  r   rr   r  r   r"   r€   r¨   r>   rk   )r   r,  r8   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   sd   |   ¡ $\}}}t d|¡ |  tj|¡ |  tj||dd¡ W d   ƒ d S 1 s+w   Y  d S ©NrK  rù  )rõ  rZ   rK  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š   |   ¡ ?\}}}|  ¡ \}}}tj||||d t |¡ t ||¡ W d   ƒ n1 s.w   Y  W d   ƒ d S W d   ƒ d S 1 sFw   Y  d S )Nr  )r÷  rõ  r   rÖ  r  )r   r,  r8   rô  r	  Zname2Z	fullname2r   r   r   Útest_rename_dir_fd´  s   ÿÿ
Pûz!TestPosixDirFd.test_rename_dir_fdz)test needs dir_fd support in os.symlink()c                 C   sd   |   ¡ $\}}}tjd||d |  tj|¡ |  t |¡d¡ W d   ƒ d S 1 s+w   Y  d S r  )rõ  r   rK  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‚   |   ¡ 3\}}}t |¡ t |¡ ztj||d |  ttj|¡ W n   |  tj|¡ ‚ W d   ƒ d S 1 s:w   Y  d S rø  )	rõ  r   rE  r   r  r"   r6   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ª   |   ¡ G\}}}ztj|tjtjB |d W n ty/ } z|  d| ¡ W Y d }~nd }~ww |  tj	|¡ |  
t t |¡j¡¡ W d   ƒ d S 1 sNw   Y  d S )Nrù  r!  )rõ  r   r  r  r#  r$  r%  r½   r  r"   re   r&  r'  )r   r,  r8   rô  r   r   r   r   Útest_mkfifo_dir_fdÐ  s   €ÿ"úz!TestPosixDirFd.test_mkfifo_dir_fdN)(rå  ræ  rç  rñ  r   rõ  r÷  r_   rè  rZ   r^  Úsupports_dir_fdrú  rû  rþ  r   rD  rÿ  r  r  rì   r  rØ  r
  r‹  r  r)  r  r   r  r  r  rÖ  r  rK  r  r"   r  r  r  r   r   r   r   rî    sV    



ÿ





ÿý

ÿ



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   r2   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Ú	setgroupsrV   r   )	r   r   r  r  r[   r\   r2   r]   rV   ©r   r8   r   r   r   r$   æ  s   

þzPosixGroupsTester.tearDownrV   ztest needs posix.initgroups()c                 C   sD   t | jpdgƒd }t t ¡ ¡j}t ||¡ |  |t 	¡ ¡ d S rn  )
Úmaxr  r[   r\   r   r2   r]   rV   r-  r.   )r   r—  r8   r   r   r   rc   í  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   rc   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ú-Srz   r{   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()))
            rz   r   r|   úutf-8©Úencoding)r   r   r  r"   r#  Ú
spawn_funcrZ   r„   r   r…   r   r>   r¨   rA  )r   ZpidfileÚscriptr"  r†   r\  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(  rZ   r„   Ú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d	}|  | ¡ d¡ W d   ƒ d S 1 sGw   Y  d S )
Nr$  z^, "w", encoding="utf-8") as envfile:
                envfile.write(os.environ['foo'])
        rz   r   rW   Zbarr|   r%  r&  )r   r   r  r"   r#  r(  rZ   r„   r   r…   r   r>   r¨   )r   Zenvfiler)  r"  r†   r\  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_PROGRAMrZ   r„   r   r…   ©r   r†   r   r   r   Útest_none_file_actions8  ó   üz'_PosixSpawnMixin.test_none_file_actionsc                 C   s.   | j | jd | jtjg d}tj|dd d S r4  r7  r9  r   r   r   Útest_empty_file_actionsA  r;  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 )Nrz   r{   F©Zresetidsr   r|   ©r(  r~   r   rZ   r„   r   r…   r9  r   r   r   Útest_resetids_explicit_defaultJ  ó   
üz/_PosixSpawnMixin.test_resetids_explicit_defaultc                 C   r=  )Nrz   r{   Tr>  r   r|   r?  r9  r   r   r   Útest_resetidsS  rA  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 )Nrz   r{   r>  ©r6   r7   r(  r~   r   rZ   r„   r   r   r   r   Útest_resetids_wrong_type\  ó   
þ"ÿ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 )Nrz   r{   ©Z	setpgroupr   r|   )r(  r~   r   rZ   r„   r0   r   r…   r9  r   r   r   Útest_setpgroupb  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 )Nrz   r{   Z023rF  rC  r   r   r   r   Útest_setpgroup_wrong_typek  rE  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)rz   ©Z
setsigmaskr   r|   )ÚtextwrapÚdedentr(  r~   r   rZ   r„   rì  ÚSIGUSR1r   r…   )r   r˜   r†   r   r   r   Útest_setsigmaskq  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 )Nrz   r{   é"   rK  Újr4   ©
r6   r7   r(  r~   r   rZ   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())
            rz   )Úsetsidzsetsid is not supported: zsetsid failed with: r   r|   rÐ   )rZ   re  r  rk   Úset_inheritablerL  rM  r(  r~   r   r„   r¼   r½   r%  r   r…   r¨   rí   Úgetsidr/   r/  )	r   ZrfdZwfdr˜   r†   r0  Ú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 )NrJ  rz   ©Ú	setsigdefr|   )rì  rN  ÚSIG_IGNrL  rM  r(  r~   r   rZ   r„   r   r…   )r   Zoriginal_handlerr˜   r†   r   r   r   Útest_setsigdef®  s   

ü z_PosixSpawnMixin.test_setsigdefc                 C   rP  )Nrz   r{   rQ  r[  rR  r4   rS  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)rz   )Z	schedulerr|   ©rZ   r
   r²  rL  rM  r(  r~   r   r„   r¾  r   r…   ©r   ZpolicyÚ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 r`  ra  rb  r   r   r   Útest_setscheduler_with_policyã  re  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   r4   rœ   r5  r|   )rZ   ÚPOSIX_SPAWN_OPENr‚   ÚrealpathÚ__file__r€   ÚPOSIX_SPAWN_CLOSEÚPOSIX_SPAWN_DUP2r(  r8  r„   r   r…   )r   r6  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   r5  r   r!   )i90  r4   r’   r=   rÝ  )r8  r6   r7   r(  rZ   r„   rj  rî   rg  ri  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")
            r4   rz   r   r5  r|   r%  r&  Úhello)r   r   r  r"   rZ   rg  r   rž   ÚO_TRUNCr  r#  r$  r#  r(  r„   r   r…   r   r>   r¨   )r   r   r)  r6  r"  r†   r\  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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)
            rz   r   r5  r|   r%  r&  zis closed %d)r   r   r  r"   r#  r(  rZ   r„   rj  r   r…   r   r>   r¨   r   rà   )r   Z	closefiler)  r"  r†   r\  r   r   r   Útest_close_file4  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 )Nrn  r   r4   rz   r   r5  r|   r%  r&  ro  )r   r   r  r"   r   rZ   rk  rj   r#  r(  r„   r   r…   r>   r¨   )r   Zdupfiler)  Z	childfiler6  r"  r†   r\  r   r   r   r  G  s   ÿÿù"ÿz_PosixSpawnMixin.test_dup2)&rå  ræ  rç  r~   r   r8  r(  r#  r*  r2  r3  r:  r<  r@  rB  rD  rG  rH  r_   rè  r   rì  rO  rU  rZ  r^  r_  rí  ZskipIfrÜ   rÝ   rd  rf  rl  rm  rq  rr  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 )ÚTestPosixSpawnrs  N)rå  ræ  rç  r5   r   r(  r   r   r   r   rt  Z  s    rt  Úposix_spawnpztest needs os.posix_spawnpc                   @   s&   e Zd ZeeddƒZejdd„ ƒZdS )ÚTestPosixSpawnPru  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   rz   r{   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Œ  rZ   r‚   r"  rK  r~   r   Úpathsepr„   r^   rL  rM  r   )r   Útemp_dirZprogramZprogram_fullpathr‚   Z
spawn_argsr˜   r"  r   r   r   Útest_posix_spawnpc  s    ÿøz!TestPosixSpawnP.test_posix_spawnp)	rå  ræ  rç  r5   r   r(  r   Zskip_unless_symlinkr|  r   r   r   r   rv  _  s    rv  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>  s   " z-TestPosixWeaklinking.setUp.<locals>.<setcomp>c                 s   r•  r!   r–  )r°   Úpartr   r   r   r˜  ‘  r™  z-TestPosixWeaklinking.setUp.<locals>.<genexpr>rZ  )r  rÜ   Zget_config_varsÚ	availablerž  Úmac_verrƒ   )r   r  rÜ   r   r~  r   r    ‹  s
   &zTestPosixWeaklinking.setUpc                 C   s   || j vrt |› d¡‚d S )Nz not weak-linked)r  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)rƒ  r‚  re   r   rZ   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ù  )
rƒ  r‚  r-  r   Ú_have_functionsÚassertNotInr  r¼   rZ   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)rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   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ù  )
rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   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ù  )
rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   rD  r   r   r   r   rF  É  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Ø  rv   ÚdataTrñ   F)rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   rØ  r   r{  r‚   r"  r   rr   rK  r6   ÚFileExistsError)r   rŽ  Z	link_pathZtarget_pathÚsource_pathrm   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)rƒ  r‚  r-  r   rˆ  r‰  r  r7   rZ   rO  Úscandirr   r   r   r   Útest_listdir_scandirü  s   

ÿ"ÿz)TestPosixWeaklinking.test_listdir_scandirc                 C   r„  )NZHAVE_MKDIRATr…  r†  Údirr   rù  )
rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   r‹  r   r   r   r   Ú
test_mkdir
  rŠ  zTestPosixWeaklinking.test_mkdirc                 C   r„  )NZHAVE_MKFIFOAT©rX   r   r†  r‚   r   rù  )
rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   r  r   r   r   r   r(    rŠ  z TestPosixWeaklinking.test_mkfifoc                 C   r„  )NZHAVE_MKNODATr˜  r†  r‚   r   rù  )
rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   r)  r   r   r   r   r/     rŠ  zTestPosixWeaklinking.test_mknodc                 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 unavailableÚaÚbr   rŽ  r  )rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   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ù  )rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   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ù  )rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   r   r€   r   r   r   r   Ú	test_openM  s   

"ÿzTestPosixWeaklinking.test_openc                 C   r„  )NZHAVE_READLINKATr…  r†  r‚   r   rù  )
rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   r  r   r   r   r   Útest_readlinkX  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ù  )
rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   rK  r   r   r   r   Útest_symlinkc  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¶   rX   r†  r‚   r   rù  )
rƒ  r‚  r-  r   rˆ  r‰  r  r¼   rZ   rì   r   r   r   r   rq  n  s   


"ÿzTestPosixWeaklinking.test_utimeN)rå  ræ  rç  r    rƒ  rÓ   r  r`  r‹  rF  r“  r•  r—  r(  r/  r›  rœ  r  rž  rŸ  rq  r   r   r   r   r}  „  s&    
'r}  c                   C   r®  r!   )r   Úreap_childrenr   r   r   r   ÚtearDownModule}  s   r¡  Ú__main__)/Ú__doc__rq   r   Ztest.supportr   r   r   Ztest.support.script_helperr   Úimport_moduler   r   r~   rì  rë   rZ   rÜ   r[   r  rx  r_   r   rL  Ú
contextlibr   r‚   r"  Ú
gettempdirr   rL  rè  Úmaxsizerê  r   rí  ZTestCaser   rî  r  r  r   rt  rv  r}  r¡  rå  Úmainr   r   r   r   Ú<module>   sn    
ÿÿ
         w A$  ]$ yÿ