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

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

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

            pid = os.fork()
            if pid == 0:
                # At this point, after-forkers have already been executed
                os.close(w)
                # Wait for parent to tell us to exit
                os.read(fin_r, 1)
                os._exit(0)
            else:
                try:
                    os.close(w)
                    with open(r, "rb") as f:
                        data = f.read()
                        assert len(data) == 6, data
                        # Check before-fork callbacks
                        assert data[:2] == b'BA', data
                        # Check after-fork callbacks
                        assert sorted(data[2:]) == list(b'CDEF'), data
                        assert data.index(b'C') < data.index(b'D'), data
                        assert data.index(b'E') < data.index(b'F'), data
                finally:
                    os.write(fin_w, b'!')
            rn   )r4   r5   rR   Úregister_at_forkr   )r   Úcoder   r   r   Útest_register_at_forkÐ   s(    ,***,,,22#z!PosixTester.test_register_at_forkÚlockfztest needs posix.lockf()c              	   C   sr   t  tjt jt jB ¡}zJt  |d¡ t  |dt j¡ t	 
|t	jd¡ t	 
|t	jd¡ W t  |¡ nt  |¡ 0 d S )Nó   testr   é   )rR   r   r   r   ÚO_WRONLYÚO_CREATrf   ÚlseekÚSEEK_SETr   r   ÚF_LOCKÚF_ULOCKr   ©r   Úfdr   r   r   Ú
test_lockf  s    zPosixTester.test_lockfÚpreadztest needs posix.pread()c              	   C   s|   t  tjt jt jB ¡}zTt  |d¡ t  |dt j¡ |  	dt
 |dd¡¡ |  	dt
 |d¡¡ W t  |¡ nt  |¡ 0 d S )NrŽ   r   s   esr…   r2   s   te)rR   r   r   r   ÚO_RDWRr‘   rf   r’   r“   r;   r   r™   Úreadr   r–   r   r   r   Ú
test_pread  s    zPosixTester.test_preadÚpreadvztest needs posix.preadv()c              	   C   sz   t  tjt jt jB ¡}zRt  |d¡ dd„ dD ƒ}|  t 	||d¡d¡ |  g d¢t
|ƒ¡ W t  |¡ nt  |¡ 0 d S )Nó   test1tt2t3t5t6t6t8c                 S   s   g | ]}t |ƒ‘qS r   ©Ú	bytearray©Ú.0Úir   r   r   Ú
<listcomp>*  r„   z+PosixTester.test_preadv.<locals>.<listcomp>©é   r:   r…   r:   é
   ©s   t1tt2s   t3ts   5t)rR   r   r   r   rš   r‘   rf   r;   r   r   Úlistr   )r   r—   Úbufr   r   r   Útest_preadv%  s    zPosixTester.test_preadvÚ	RWF_HIPRIztest needs posix.RWF_HIPRIc              
   C   sâ   t  tjt jt jB ¡}zºzLt  |d¡ dd„ dD ƒ}|  t 	||dt j
¡d¡ |  g d¢t|ƒ¡ W n^ ty€   |  d¡ Y nD tyÂ } z,|jtjtjhv r¬t d	¡‚n‚ W Y d }~n
d }~0 0 W t  |¡ nt  |¡ 0 d S )
Nrž   c                 S   s   g | ]}t |ƒ‘qS r   rŸ   r¡   r   r   r   r¤   6  r„   z1PosixTester.test_preadv_flags.<locals>.<listcomp>r¥   r:   r§   r¨   zpreadv2 not availablez0RWF_HIPRI is not supported by the current system)rR   r   r   r   rš   r‘   rf   r;   r   r   r¬   r©   ÚNotImplementedErrorÚskipTestr   r	   ÚEINVALÚENOTSUPrW   rX   r   )r   r—   rª   Úinstr   r   r   Útest_preadv_flags0  s    zPosixTester.test_preadv_flagsc              	   C   s¦   t  tjt jt jB ¡}z~tdƒgd }|  t¡}t  	||d¡ W d   ƒ n1 sT0    Y  |  
|jjtj¡ |  
t|d ƒdd ¡ W t  |¡ nt  |¡ 0 d S ©Né   é €  r   ó    )rR   r   r   r   rš   r‘   r    r4   r   r   r;   Ú	exceptionr	   r¯   Úbytesr   ©r   r—   rª   Úcmr   r   r   Útest_preadv_overflow_32bitsF  s    ,z'PosixTester.test_preadv_overflow_32bitsÚpwriteztest needs posix.pwrite()c              	   C   st   t  tjt jt jB ¡}zLt  |d¡ t  |dt j¡ t	 
|dd¡ |  dt	 |d¡¡ W t  |¡ nt  |¡ 0 d S )NrŽ   r   ó   xxr2   s   txxtr   )rR   r   r   r   rš   r‘   rf   r’   r“   r   r¼   r;   r›   r   r–   r   r   r   Útest_pwriteS  s    zPosixTester.test_pwriteÚpwritevztest needs posix.pwritev()c              	   C   s”   t  tjt jt jB ¡}zlt  |d¡ t  |dt j¡ t  	|g d¢d¡}|  
|d¡ t  |dt j¡ |  
dt |d¡¡ W t  |¡ nt  |¡ 0 d S )Nr½   r   ©s   test1s   tt2s   t3r…   r§   s   xxtest1tt2t3éd   )rR   r   r   r   rš   r‘   rf   r’   r“   r¿   r;   r   r›   r   ©r   r—   Únr   r   r   Útest_pwritev^  s    zPosixTester.test_pwritevzos.RWF_SYNCztest needs os.RWF_SYNCc              	   C   s˜   t  tjt jt jB ¡}zpt  |d¡ t  |dt j¡ t  	|g d¢dt j
¡}|  |d¡ t  |dt j¡ |  dt |d¡¡ W t  |¡ nt  |¡ 0 d S )Nr½   r   rÀ   r…   r§   s
   xxtest1tt2rÁ   )rR   r   r   r   rš   r‘   rf   r’   r“   r¿   ÚRWF_SYNCr;   r   r›   r   rÂ   r   r   r   Útest_pwritev_flagsl  s    zPosixTester.test_pwritev_flagsc              	   C   sŠ   t  tjt jt jB ¡}zb|  t¡(}t  |dd gd d¡ W d   ƒ n1 sP0    Y  |  	|j
jtj¡ W t  |¡ nt  |¡ 0 d S )Nó   xr´   rµ   r   )rR   r   r   r   rš   r‘   r4   r   r¿   r;   r·   r	   r¯   r   ©r   r—   rº   r   r   r   Útest_pwritev_overflow_32bits{  s    6z(PosixTester.test_pwritev_overflow_32bitsÚposix_fallocatez"test needs posix.posix_fallocate()c              
   C   s”   t  tjt jt jB ¡}zlzt |dd¡ W nJ tyt } z2|j	t	j
kr^tj d¡r^t d¡‚n‚ W Y d }~n
d }~0 0 W t  |¡ nt  |¡ 0 d S )Nr   r§   )ZsunosÚfreebsdÚnetbsdZopenbsdZgnukfreebsdz test may fail on ZFS filesystems)rR   r   r   r   r   r‘   r   rÊ   r   r	   r¯   rr   ÚplatformÚ
startswithrW   rX   r   )r   r—   r±   r   r   r   Útest_posix_fallocate†  s    ÿz PosixTester.test_posix_fallocatec              
   C   sJ   zt  ddd¡ W n2 tyD } z|jtjkr0‚ W Y d }~n
d }~0 0 d S )NéÖÿÿÿr   r§   )r   rÊ   r   r	   ÚEBADF©r   r±   r   r   r   Útest_posix_fallocate_errnoš  s
    z&PosixTester.test_posix_fallocate_errnoÚposix_fadvisez test needs posix.posix_fadvise()c              	   C   sB   t  tjt j¡}z t |ddtj¡ W t  |¡ nt  |¡ 0 d S ©Nr   )	rR   r   r   r   rt   r   rÔ   ÚPOSIX_FADV_WILLNEEDr   r–   r   r   r   Útest_posix_fadvise£  s    zPosixTester.test_posix_fadvisec              
   C   sN   zt  dddt j¡ W n2 tyH } z|jtjkr4‚ W Y d }~n
d }~0 0 d S )NrÐ   r   )r   rÔ   rÖ   r   r	   rÑ   rÒ   r   r   r   Útest_posix_fadvise_errno¬  s
    z$PosixTester.test_posix_fadvise_errnoz!test needs fd support in os.utimec              	   C   sR  t   ¡ }t tjtj¡}z&t |¡ t |d ¡ |  t	tj|d¡ |  t	tj||d f¡ |  t	tj|d |f¡ t |t
|ƒt
|ƒf¡ t |||f¡ | jttj|||f||fd | jttj||dfdd | jttj|d|dfd t |t
|ƒt
|t
|ƒ d ƒf¡ tj|t
|ƒt
|t
|ƒ d ƒfd W t |¡ nt |¡ 0 d S )N©NN)Únsr   ç    eÍÍA)ÚtimerR   r   r   r   rt   r   Úutimer4   r5   ÚintÚ
ValueErrorr   )r   Únowr—   r   r   r   Útest_utime_with_fdµ  s     
$(zPosixTester.test_utime_with_fdz.test needs follow_symlinks support in os.utimec                 C   s²   t   ¡ }tjtjd dd | jttjtjddd | jttjtj|d fdd | jttjtjd |fdd tjtjt|ƒt|ƒfdd tjtj||fdd tjtjdd d S )NF©Úfollow_symlinksrÙ   ©rÜ   r   rÝ   r   r   r4   r5   rÞ   ©r   rà   r   r   r   Útest_utime_nofollow_symlinksÊ  s    z(PosixTester.test_utime_nofollow_symlinksÚwritevztest needs posix.writev()c              	   C   s¢   t  tjt jt jB ¡}zzt  |d¡}|  |d¡ t  |dt j	¡ |  dt
 |d¡¡ zt
 |g ¡}W n tyv   Y n0 |  |d¡ W t  |¡ nt  |¡ 0 d S )NrÀ   r§   r   ó
   test1tt2t3)rR   r   r   r   rš   r‘   rç   r;   r’   r“   r   r›   r   r   )r   r—   rÃ   Úsizer   r   r   Útest_writevÕ  s    zPosixTester.test_writevc              	   C   sˆ   t  tjt jt jB ¡}z`|  t¡&}t  |dd gd ¡ W d   ƒ n1 sN0    Y  |  	|j
jtj¡ W t  |¡ nt  |¡ 0 d S )NrÇ   r´   rµ   )rR   r   r   r   rš   r‘   r4   r   rç   r;   r·   r	   r¯   r   rÈ   r   r   r   Útest_writev_overflow_32bitsë  s    4z'PosixTester.test_writev_overflow_32bitsÚreadvztest needs posix.readv()c              	   C   s¾   t  tjt jt jB ¡}z–t  |d¡ t  |dt j¡ dd„ dD ƒ}|  	t
 ||¡d¡ |  	g d¢dd„ |D ƒ¡ zt
 |g ¡}W n ty’   Y n0 |  	|d¡ W t  |¡ nt  |¡ 0 d S )	Nrè   r   c                 S   s   g | ]}t |ƒ‘qS r   rŸ   r¡   r   r   r   r¤   ü  r„   z*PosixTester.test_readv.<locals>.<listcomp>r¥   r§   rÀ   c                 S   s   g | ]}t |ƒ‘qS r   )r¸   r¡   r   r   r   r¤   þ  r„   )rR   r   r   r   rš   r‘   rf   r’   r“   r;   r   rì   r   r   )r   r—   rª   ré   r   r   r   Ú
test_readvö  s    zPosixTester.test_readvc              	   C   s¤   t  tjt jt jB ¡}z|tdƒgd }|  t¡}t  	||¡ W d   ƒ n1 sR0    Y  |  
|jjtj¡ |  
t|d ƒdd ¡ W t  |¡ nt  |¡ 0 d S r³   )rR   r   r   r   rš   r‘   r    r4   r   rì   r;   r·   r	   r¯   r¸   r   r¹   r   r   r   Útest_readv_overflow_32bits  s    *z&PosixTester.test_readv_overflow_32bitsÚdupztest needs posix.dup()c                 C   sJ   t tjƒ}z0t | ¡ ¡}|  |t¡ t 	|¡ W | 	¡  n
| 	¡  0 d S r   )
r   r   r   r   rï   rb   ÚassertIsInstancerÞ   rR   r   )r   r   r—   r   r   r   Útest_dup  s    
zPosixTester.test_dupÚconfstrztest needs posix.confstr()c                 C   s.   |   ttjd¡ |  tt d¡ƒdkd¡ d S )NZ
CS_garbageÚCS_PATHr   T)r4   rß   r   rò   r;   r<   r_   r   r   r   Útest_confstr$  s    zPosixTester.test_confstrÚdup2ztest needs posix.dup2()c                 C   sT   t tjƒ}t tjƒ}z(t | ¡ | ¡ ¡ W | ¡  | ¡  n| ¡  | ¡  0 d S r   )r   r   r   r   rõ   rb   r   )r   Úfp1Úfp2r   r   r   Ú	test_dup2*  s    


ÿzPosixTester.test_dup2Ú	O_CLOEXECzneeds os.O_CLOEXECr…   é   é   c                 C   s8   t  tjt jt jB ¡}|  t j|¡ |  t  	|¡¡ d S r   )
rR   r   r   r   rt   rù   Ú
addCleanupr   ÚassertFalseÚget_inheritabler–   r   r   r   Útest_oscloexec5  s    zPosixTester.test_oscloexecÚO_EXLOCKztest needs posix.O_EXLOCKc                 C   sž   t  tjt jt jB t jB ¡}|  tt jtjt jt jB t j	B ¡ t  
|¡ ttdƒršt  tjt jt jB t jB ¡}|  tt jtjt jt jB t j	B ¡ t  
|¡ d S )NÚO_SHLOCK)rR   r   r   r   r   r   r‘   r4   r   Ú
O_NONBLOCKr   r   r   r  r–   r   r   r   Útest_osexlock<  s    ÿÿ

ÿÿzPosixTester.test_osexlockr  ztest needs posix.O_SHLOCKc                 C   s¢   t  tjt jt jB t jB ¡}t  tjt jt jB t jB ¡}t  |¡ t  |¡ tt	dƒržt  tjt jt jB t jB ¡}|  
tt jtjt jt jB t jB ¡ t  |¡ d S )Nr   )rR   r   r   r   r   r  r‘   r   r   r   r4   r   rt   r   r  )r   Úfd1Úfd2r—   r   r   r   Útest_osshlockL  s     ÿÿ


ÿÿzPosixTester.test_osshlockÚfstatztest needs posix.fstat()c                 C   sh   t tjƒ}zN|  t | ¡ ¡¡ |  t | ¡ ¡¡ |  t	dtjt
| ¡ ƒ¡ W | ¡  n
| ¡  0 d S ©Nz4should be string, bytes, os.PathLike or integer, not)r   r   r   r]   r   r  rb   ÚstatÚassertRaisesRegexr5   Úfloatr   r   r   r   r   Ú
test_fstat]  s    
þzPosixTester.test_fstatc              	   C   s”   |   t tj¡¡ |   t t tj¡¡¡ |  tdtjt	t tj¡ƒ¡ |  
tdtjd ¡ |  
tdtjttjƒ¡ |  
tdtjtt tj¡ƒ¡ d S r  )r]   r   r	  r   r   rR   ÚfsencodeZassertWarnsRegexÚDeprecationWarningr    r
  r5   r©   r_   r   r   r   Ú	test_statk  s$    þþþþzPosixTester.test_statÚmkfifozdon't have mkfifo()c              
   C   sx   t  t j¡ zt t jtjtjB ¡ W n2 tyX } z|  	d| ¡ W Y d }~n
d }~0 0 |  
t t t j¡j¡¡ d S )Núposix.mkfifo(): %s)r   r    r   r   r  r	  ÚS_IRUSRÚS_IWUSRÚPermissionErrorr®   r]   ÚS_ISFIFOÚst_mode)r   r   r   r   r   Útest_mkfifo|  s    $zPosixTester.test_mkfifoÚmknodÚS_IFIFOzdon't have mknod()/S_IFIFOc              
   C   sô   t  t j¡ tjtjB tjB }zt t j|d¡ W n> t	yp } z&|  
|jtjtjtjf¡ W Y d }~n$d }~0 0 |  t t t j¡j¡¡ t  t j¡ ztjt j|dd d W n> t	yî } z&|  
|jtjtjtjf¡ W Y d }~n
d }~0 0 d S )Nr   )rv   ÚmodeZdeviceÚdir_fd)r   r    r   r	  r  r  r  r   r  r   ÚassertInr	   rY   r¯   ÚEACCESr]   r  r  )r   r  r   r   r   r   Ú
test_mknod…  s    0ÿ
zPosixTester.test_mknodÚmakedevztest needs posix.makedev()c                 C   s`  t  tj¡}|j}|  |t¡ |  |d¡ t  |¡}|  |t¡ |  |d¡ |  	t  |¡|¡ |  
tt jt|ƒ¡ |  
tt j¡ |  
ttft jd¡ t  |¡}|  |t¡ |  |d¡ |  	t  |¡|¡ |  
tt jt|ƒ¡ |  
tt j¡ |  
ttft jd¡ |  	t  ||¡|¡ |  
tt jt|ƒ|¡ |  
tt j|t|ƒ¡ |  
tt j|¡ |  
tt j¡ d S )Nr   rD   )r   r	  r   r   Úst_devrð   rÞ   r=   Úmajorr;   r4   r5   r  rß   ÚOverflowErrorÚminorr  )r   ÚstÚdevr!  r#  r   r   r   Útest_makedev  s.    

zPosixTester.test_makedevc           	   	      s€  ‡ ‡‡fdd„}t  ¡ }t  ¡ }|ˆ ||ƒ |||ƒ |ˆ d|ƒ |||ƒ |ˆ |dƒ |||ƒ |dkr²d}|ˆ ||ƒ |||ƒ |ˆ ddƒ |||ƒ |ˆ ||ƒ |||ƒ nzt ¡ dv rÊt d¡‚nbˆ t|ˆ dd¡ |||ƒ ˆ t|ˆ dd¡ |||ƒ dt  	¡ vr,ˆ t|ˆ dd¡ |||ƒ t
tfD ]F}ˆ t|ˆ ||ƒ|¡ |||ƒ ˆ t|ˆ |||ƒ¡ |||ƒ q4d S )Nc                    s0   ˆd ur,ˆˆ ƒ}ˆ  |j| ¡ ˆ  |j|¡ d S r   )r;   Úst_uidÚst_gid)ÚuidÚgidr	  ©Úfirst_paramr   Ú	stat_funcr   r   Ú
check_stat¼  s    z6PosixTester._test_all_chown_common.<locals>.check_statrD   r   l        )zHP-UXZSunOSz1Skipping because of non-standard chown() behavior)rR   r0   r+   rÍ   ÚsystemrW   rX   r4   r   r,   Ústrr  r5   )	r   Z
chown_funcr,  r-  r.  r)  r*  Z	big_valueÚtr   r+  r   Ú_test_all_chown_commonº  s>    








z"PosixTester._test_all_chown_commonÚchownztest needs os.chown()c                 C   sF   t  tj¡ |  ttjtjdd¡ t tj¡ |  	tjtjtj
¡ d S rC   )rR   r    r   r   r4   r   r   r3  Úcreate_empty_filer2  r	  r_   r   r   r   Ú
test_chownõ  s    zPosixTester.test_chownÚfchownztest needs os.fchown()c                 C   sT   t  tj¡ ttjdƒ}z,| ¡ }|  tj|t	tdd ƒ¡ W | 
¡  n
| 
¡  0 d S )Nrj   r  )rR   r    r   r   r   rb   r2  r   r6  r3   r   )r   Z	test_filer—   r   r   r   Útest_fchownÿ  s    

ÿzPosixTester.test_fchownÚlchownztest needs os.lchown()c                 C   s8   t  tj¡ t  ttj¡ |  tjtjt	tdd ƒ¡ d S )NÚlstat)
rR   r    r   r   ÚsymlinkÚ_DUMMY_SYMLINKr2  r   r8  r3   r_   r   r   r   Útest_lchown  s
    
ÿzPosixTester.test_lchownru   ztest needs posix.chdir()c                 C   s"   t  tj¡ |  tt jtj¡ d S r   )r   ru   rR   r^   r4   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   ÚlistdirrR   r^   r_   r   r   r   Útest_listdir  s    zPosixTester.test_listdirc                 C   s   |   tjt ¡ ¡ d S r   )r  r   r   r   r>  r_   r   r   r   Útest_listdir_default  s    z PosixTester.test_listdir_defaultc                 C   s   |   t tj¡t d¡¡ d S ©Nó   .)r  rR   r  r   r   r   r>  r_   r   r   r   Útest_listdir_bytes!  s    zPosixTester.test_listdir_bytesc              	   C   sx   t tfD ]j}|  t¡ t |dƒ¡}W d   ƒ n1 s:0    Y  |  t t	j
¡|¡ |D ]}|  t|ƒt¡ q\qd S rA  )r    Ú
memoryviewZassertWarnsr  r   r>  r  rR   r  r   r   ZassertIsÚtyper¸   )r   ÚclsÚnamesr6   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$   rt   rü   r   r;   Úsortedr>  ©r   Úfr   r   r   Útest_listdir_fd.  s    þþzPosixTester.test_listdir_fdÚaccessztest needs posix.access()c                 C   s   |   t tjtj¡¡ d S r   )r]   r   rN  r   r   rR   ÚR_OKr_   r   r   r   Útest_access=  s    zPosixTester.test_accessÚumaskztest needs posix.umask()c                 C   s$   t  d¡}|  |t¡ t  |¡ d S rÕ   )r   rQ  rð   rÞ   )r   Zold_maskr   r   r   Ú
test_umaskA  s    
zPosixTester.test_umaskÚstrerrorztest needs posix.strerror()c                 C   s   |   t d¡¡ d S rÕ   )r]   r   rS  r_   r   r   r   Útest_strerrorG  s    zPosixTester.test_strerrorÚpipeztest needs posix.pipe()c                 C   s$   t  ¡ \}}t |¡ t |¡ d S r   )r   rU  rR   r   )r   ÚreaderÚwriterr   r   r   Ú	test_pipeL  s    
zPosixTester.test_pipeÚpipe2ztest needs os.pipe2()é   c                 C   sö   |   ttjd¡ |   ttjdd¡ t d¡\}}t |¡ t |¡ t tjtjB ¡\}}|  tj|¡ |  tj|¡ |  t 	|¡¡ |  t 	|¡¡ |  t 
|¡¡ |  t 
|¡¡ |   ttj|d¡ zt |dtj ¡ W n tyð   Y n0 d S )NZDEADBEEFr   r2   rÇ   )r4   r5   rR   rY  r   rù   r  rü   rý   rþ   Úget_blockingr   r›   rf   r   ZPIPE_MAX_SIZE)r   Úrrj   r   r   r   Ú
test_pipe2R  s"    

zPosixTester.test_pipe2c                 C   s8   dd l }|  ttj|jd ¡ |  ttj|jd ¡ d S ©Nr   r2   )Ú	_testcapir4   r"  rR   rY  ZINT_MAXZUINT_MAX)r   r_  r   r   r   Útest_pipe2_c_limitsn  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_utimew  s    zPosixTester.test_utimec              
   K   s
  t  |¡}|  t|dƒ¡ |jtjB }z|||fi |¤Ž W n@ ty| } z(|jtjkrZ‚ d}|  	|¡ W Y d }~n
d }~0 0 zvt  |¡}|  
|jtjB |j¡ zt|dƒ}	W n4 tyâ }
 z|  
|
jtj¡ W Y d }
~
n
d }
~
0 0 W t ||j¡ nt ||j¡ 0 d S )NÚst_flagsú2chflag UF_IMMUTABLE not supported by underlying fsr   )rR   r	  r]   r   rb  ÚUF_IMMUTABLEr   r	   Ú
EOPNOTSUPPr®   r;   r   rY   r   Úchflags)r   Zchflags_funcZtarget_fileÚkwargsr$  ÚflagsÚerrr‚   Znew_str—   r   r   r   r   Ú_test_chflags_regular_file  s$    
 
(z&PosixTester._test_chflags_regular_filerf  ztest needs os.chflags()c                 C   s   |   tjtj¡ d S r   )rj  r   rf  r   r   r_   r   r   r   Útest_chflags™  s    zPosixTester.test_chflagsÚlchflagsztest needs os.lchflags()c                 C   s(   |   tjtj¡ | j tjtjdd d S ©NFrâ   )rj  r   rl  r   r   rf  r_   r   r   r   Útest_lchflags_regular_file  s    z&PosixTester.test_lchflags_regular_filec           
      C   s  t  tj¡}|  t|dƒ¡ t  tjt¡ | j 	t¡ t  
t¡}dd„ }tj|fD ]¼}|jtjB }z|t|ƒ W n@ ty° } z(|jtjkrŽ‚ d}|  |¡ W Y d }~n
d }~0 0 zLt  tj¡}t  
t¡}	|  |j|j¡ |  |jtjB |	j¡ W |t|jƒ qR|t|jƒ 0 qRd S )Nrb  c                 S   s   t j| |ddS rm  )r   rf  )rv   rh  r   r   r   Úchflags_nofollow¬  s    z;PosixTester.test_lchflags_symlink.<locals>.chflags_nofollowrc  )rR   r	  r   r   r]   r   r:  r;  r   Úappendr9  r   rl  rb  rd  r   r	   re  r®   r;   )
r   Z	testfn_stZdummy_symlink_stro  Úfnrh  ri  r‚   Znew_testfn_stZnew_dummy_symlink_str   r   r   Útest_lchflags_symlink¢  s.    
 
ÿz!PosixTester.test_lchflags_symlinkc                 C   sL   t jdkrt}nt}tj ¡ D ](\}}|  t|ƒ|¡ |  t|ƒ|¡ qd S )NÚnt)	rR   r6   r0  r¸   r   rx   Úitemsr;   rE  )r   Z	item_typeÚkÚvr   r   r   Útest_environÃ  s    
zPosixTester.test_environc                 C   sL  |   t¡ t dd¡ W d   ƒ n1 s,0    Y  |   t¡ t dd¡ W d   ƒ n1 sb0    Y  |   t¡ t dd¡ W d   ƒ n1 s˜0    Y  |   t¡ t dd¡ W d   ƒ n1 sÎ0    Y  |   t¡ t d	d
¡ W d   ƒ n1 s0    Y  |   t¡ t dd¡ W d   ƒ n1 s>0    Y  d S )NzFRUIT VEGETABLEZcabbages   FRUIT VEGETABLEs   cabbageZFRUITzorange VEGETABLE=cabbages   FRUITs   orange VEGETABLE=cabbagezFRUIT=ORANGEZlemons   FRUIT=ORANGEs   lemon)r4   rß   rR   Úputenvr_   r   r   r   Útest_putenvÌ  s    ****,zPosixTester.test_putenvr$   ztest needs posix.getcwd()c              	      s   d}t  ¡ }t j tj¡d }zVzt  |¡ t  |¡ W n$   Y W t  |¡ t |¡ d S 0 W t  |¡ t |¡ nt  |¡ t |¡ 0 d S )Nz8getcwd-test-directory-0123456789abcdef-01234567890abcdefz.getcwdr   c              	      sŠ   zt  | ¡ W n   t d¡‚Y n0 t  | ¡ z>t  ¡  |dk rXˆ | |t| ƒ d ƒ W t  d¡ t  | ¡ nt  d¡ t  | ¡ 0 d S )Nz?mkdir cannot create directory sufficiently deep for getcwd testi  r2   z..)rR   ÚmkdirrW   rX   ru   r$   r<   Úrmdir)ÚdirnameZcurrent_path_length©Ú_create_and_do_getcwdr   r   r~  é  s    

ÿ
zEPosixTester.test_getcwd_long_pathnames.<locals>._create_and_do_getcwd)	rR   r$   rv   Úabspathr   r   rz  ru   Úrmtree)r   r|  r^   Ú	base_pathr   r}  r   Útest_getcwd_long_pathnamesÚ  s"    


ë 
ÿ
z&PosixTester.test_getcwd_long_pathnamesÚgetgrouplistztest needs posix.getgrouplist()rT   ztest needs pwd.getpwuid()r0   ztest needs os.getuid()c                 C   s<   t  t ¡ ¡d }t  t ¡ ¡d }|  |t ||¡¡ d S )Nr   r:   )rS   rT   rR   r0   r  r   rƒ  )r   ÚuserÚgroupr   r   r   Útest_getgrouplistþ  s    zPosixTester.test_getgrouplistr)   ztest needs os.getegid()c                 C   s  t  d¡$}| ¡  ¡ }| ¡ }W d   ƒ n1 s40    Y  ztdd„ | ¡ D ƒƒ}W n typ   tƒ }Y n0 |d us~|sˆt 	d¡‚t
jdkrÖdd l}| d¡p¦d}td	d„ | d
¡dd… D ƒƒdk rÖt 	d¡‚| t ¡ ¡}|  | pú|t ¡ hk¡ d S )Nzid -G 2>/dev/nullc                 s   s   | ]}t |ƒV  qd S r   ©rÞ   )r¢   Úgr   r   r   Ú	<genexpr>  r„   z-PosixTester.test_getgroups.<locals>.<genexpr>zneed working 'id -G'Údarwinr   ZMACOSX_DEPLOYMENT_TARGETz10.0c                 s   s   | ]}t |ƒV  qd S r   r‡  )r¢   rÃ   r   r   r   r‰    r„   rI  r…   )r§   rú   z$getgroups(2) is broken prior to 10.6)rR   Úpopenr›   Ústripr   Úsetrw   rß   rW   rX   rr   rÍ   Ú	sysconfigZget_config_varÚtupleÚsymmetric_differencer   r,   r]   r)   )r   ZidgÚgroupsÚretZ
idg_groupsrŽ  ZdtZsymdiffr   r   r   Útest_getgroups  s     &

$
zPosixTester.test_getgroupsz)test needs dir_fd support for os.access()c              	   C   sL   t  t  ¡ t j¡}z(|  t jtjtj	|d¡ W t  
|¡ nt  
|¡ 0 d S ©N©r  )r   r   r$   rt   r]   rN  r   r   rR   rO  r   rK  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	¡}zRtjtjtjtj
B |d t tj¡}|  |d tj@ tjtj
B ¡ W t |¡ nt |¡ 0 d S )Nr•  r   )rR   Úchmodr   r   r	  r  r   r   r$   rt   r  r;   ÚS_IRWXUr   )r   rL  Úsr   r   r   Útest_chmod_dir_fd,  s     zPosixTester.test_chmod_dir_fdz'test needs dir_fd support in os.chown()c              	   C   sf   t  t j¡ t  t j¡ t t ¡ tj¡}z*tjt jt	 
¡ t	 ¡ |d W t |¡ nt |¡ 0 d S r”  )r   r    r   r4  r   r   r$   rt   r3  rR   r0   r+   r   rK  r   r   r   Útest_chown_dir_fd9  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 s80    Y  t t ¡ tj¡}z t 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 |¡ nt |¡ 0 d S )Nrj   ú	testline
r•  zshould be integer or None, notl      Fµx:^V )r   r    r   r   rf   r   r$   rt   r	  r;   r
  r5   r  r4   r"  r   )r   ÚoutfilerL  Ús1Ús2r   r   r   Útest_stat_dir_fdD  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0 W t  |¡ nt  |¡ 0 d S )Nr•  rÙ   ÚxrÛ   )r  r'   F)rã   r  )r   r   r$   rt   rÜ   rÝ   r   r   r4   r5   rÞ   rR   Úsupports_follow_symlinksrß   r   )r   rL  rà   r   r   r   Útest_utime_dir_fdZ  s0    ÿ
ÿ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 n2 tyd } z|  d| ¡ W Y d }~n2d }~0 0 |  	t  
tj¡d t  
tjd ¡d ¡ W t  |¡ t tjd ¡ nt  |¡ t tjd ¡ 0 d S )NÚlink©Ú
src_dir_fdÚ
dst_dir_fdzposix.link(): %sr2   )r   r   r$   rt   r¤  r   r   r  r®   r;   r	  r   r    ©r   rL  r   r   r   r   Útest_link_dir_fdx  s    $ÿ
ÿ
zPosixTester.test_link_dir_fdz'test needs dir_fd support in os.mkdir()c              
   C   sv   t  t  ¡ t j¡}zBt jtjd |d t  tjd ¡ W t  |¡ t 	tjd ¡ nt  |¡ t 	tjd ¡ 0 d S )NÚdirr•  )
r   r   r$   rt   rz  r   r   r	  r   r€  rK  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
¡}z€ztjt j|d|d W n> tyˆ } z&|  |jtjtjtjf¡ W Y d }~n$d }~0 0 |  t t t j¡j¡¡ W t |¡ nt |¡ 0 d S )Nr   r•  )r   r    r   r	  r  r  r  r   r   r$   rt   r  r   r  r	   rY   r¯   r  r]   r  r  r   )r   r  rL  r   r   r   r   Útest_mknod_dir_fd‘  s    0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 s80    Y  t t ¡ tj¡}tjt jtj|d}z8t |d¡j	dd}|  
d|¡ W t |¡ t |¡ nt |¡ t |¡ 0 d S )Nrj   rœ  r•  é	   zutf-8)Úencoding)r   r    r   r   rf   r   r$   rt   r›   Údecoder;   r   )r   r  ÚaÚbr€   r   r   r   Útest_open_dir_fd¤  s    (
ÿ
zPosixTester.test_open_dir_fdz*test needs dir_fd support in os.readlink()c              
   C   sŽ   t  tjtjd ¡ t t ¡ tj¡}zF|  t 	tjd ¡tj	tjd |d¡ W t 
tjd ¡ t |¡ nt 
tjd ¡ t |¡ 0 d S ©Nr¤  r•  )rR   r:  r   r   r   r   r$   rt   r;   Úreadlinkr    r   rK  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¡ ‚ Y n0 t 	t j¡ W t 
|¡ nt 
|¡ 0 d S )NZrenr¥  )r   r    r   r4  r   r   r$   rt   Úrenamer	  r   rK  r   r   r   Útest_rename_dir_fd½  s    zPosixTester.test_rename_dir_fdÚ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   )rR   Ú
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¡}zPt jtjtjd |d |  t  tjd ¡tj¡ W t  	|¡ t 
tjd ¡ nt  	|¡ t 
tjd ¡ 0 d S r³  )r   r   r$   rt   r:  r   r   r;   r´  r   r    rK  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 ¡ ‚ Y n0 |  	t
t jtjd ¡ W t  |¡ nt  |¡ 0 d S )NÚdelr•  r¤  )r   r   r$   rt   r   r4  r   r	  r    r4   r   r   rK  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¡}zzztjt jtj	tj
B |d W n2 typ } z|  d| ¡ W Y d }~n
d }~0 0 |  t t t j¡j¡¡ W t |¡ nt |¡ 0 d S )Nr•  r  )r   r    r   r   r   r$   rt   r  r	  r  r  r  r®   r]   r  r  r   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   sl   t j}t  |¡}t  |¡}|  |t¡ |  |t¡ |  ||¡ tjdkrh|  	t
t jd¡ |  	t
t jd¡ d S )NrŠ  iéÿÿÿ)r   ÚSCHED_RRÚsched_get_priority_minrÈ  rð   rÞ   r=   rr   rÍ   r4   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 n2 tyn } z|jtj	krZ‚ W Y d }~nd }~0 0 |  ||¡ |  
tt jd¡ |  
tt jd¡ t  d¡}|  |jt¡ tj d¡s*zt  d||¡ t  d|¡ W n6 ty } z|jtj	kr‚ W Y d }~n
d }~0 0 |  
tt jd|¡ |  
tt jd||¡ |  
tt jd|d ¡ |  
tt jdd¡ t  d ¡}|  
tt jd|¡ d}t  |¡}|  
tt jd|¡ t j| d}|  
tt jd|¡ d S )	Nc                 S   s   g | ]\}}|  d ¡r|‘qS )ZSCHED_©rÎ   )r¢   r6   Zschedr   r   r   r¤     s   
ÿzDPosixTester.test_get_and_set_scheduler_and_param.<locals>.<listcomp>r   rD   ©rË   rÌ   é+   l   œÿÇ )Úsched_priority)r   Ú__dict__rt  r   r  rR   r/   r   r	   rY   r4   Úsched_getparamrð   rÑ  rÞ   rr   rÍ   rÎ   Úsched_setschedulerÚsched_setparamr5   Úsched_paramr"  )r   Zpossible_schedulersZmineÚparentr   ZparamZlarger   r   r   Ú$test_get_and_set_scheduler_and_param  s>    



z0PosixTester.test_get_and_set_scheduler_and_paramÚsched_rr_get_intervalzno functionc              
   C   st   zt  d¡}W n< tyJ } z$|jtjkr,‚ |  d¡ W Y d }~n
d }~0 0 |  |t¡ |  |d¡ |  	|d¡ d S )Nr   z only works on SCHED_RR processesg        g      ð?)
r   rÙ  r   r	   r¯   r®   rð   r  r=   Ú
assertLess)r   Úintervalr   r   r   r   Útest_sched_rr_get_interval@  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   r2   rD   r   )
r   Úsched_getaffinityrð   r  r=   r<   r4   r   rÞ   rÚ  )r   ÚmaskZcpur   r   r   Útest_sched_getaffinityO  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   r2   iöÿÿÿZ0Xé€   rD   )r   rÝ  r<   ÚpoprÆ  r;   r4   r   rß   ÚmaprÞ   r"  )r   rÞ  r   r   r   Útest_sched_setaffinityZ  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_constantsh  s    zPosixTester.test_rtld_constantsÚ	SEEK_HOLEz(test needs an OS that reports file holesc              
   C   sÞ   t tjdƒ¾}| d¡ | ¡  | ¡ }| ¡ }znt|ƒD ]4}|  |t	 
||t	j¡¡ |  |t	 
||t	j¡¡ q:|  tt	j
||t	j¡ |  tt	j
||t	j¡ W n tyº   t d¡‚Y n0 W d   ƒ n1 sÐ0    Y  d S )Nzr+bs   hellozOSError raised!)r   r   r   rf   rg   Útellrb   Úranger;   rR   r’   Ú	SEEK_DATAZassertLessEqualré  r4   r   rW   rX   )r   r   ré   Zfnor£   r   r   r   Útest_fs_holeso  s    	
zPosixTester.test_fs_holesc                 C   sš   dD ]}t t|d ƒ}|d u rqdtjfD ]\}z|d|ƒ W q( ty‚ } z0|  d |¡t|ƒ¡ W Y d }~ qW Y d }~q(d }~0 0 q(|  d| ¡ qd S )N)r¶  Úreplacer¤  Znoodly2Zdoesnotexistfilenamez'doesnotexistfilename' -> '{}'z#No valid path_error2() test for os.)	r3   rR   r   r   r   r  Úformatr0  rZ   )r   r6   ÚfunctionÚdstr   r   r   r   Útest_path_error2Š  s    &zPosixTester.test_path_error2c              	   C   sê   t j}|d }|  t j|¡ t  |¡ d }zT|  t¡$ t |tjtj	B ¡}W d   ƒ n1 s`0    Y  W |d ur”t 
|¡ n|d ur’t 
|¡ 0 |  tj |¡¡ |  ttj|¡ |  tj |¡¡ t|dƒ 
¡  |  ttj|¡ d S )Nú Úwb)r   r   rü   r    r4   rß   rR   r   r   r‘   r   rý   rv   Úexistsrz  r	  ©r   rq  Zfn_with_NULr—   r   r   r   Útest_path_with_null_characterœ  s"    
4ÿz)PosixTester.test_path_with_null_characterc              	   C   sð   t  tj¡}|d }|  tj|¡ t |¡ d }zT|  t¡$ t  |t j	t j
B ¡}W d   ƒ n1 sf0    Y  W |d uršt  |¡ n|d ur˜t  |¡ 0 |  t j |¡¡ |  tt j|¡ |  t j |¡¡ t|dƒ ¡  |  tt j|¡ d S )Nr¶   rô  )rR   r  r   r   rü   r    r4   rß   r   r   r‘   r   rý   rv   rõ  rz  r	  rö  r   r   r   Útest_path_with_null_byte®  s"    
4ÿz$PosixTester.test_path_with_null_byteÚ
pidfd_openzpidfd_open unavailablec                 C   s–   |   t¡}t d¡ W d   ƒ n1 s*0    Y  |jjtjkrL|  d¡ t|jt	ƒrj|  d|j›¡ |  
|jjtj¡ t t t ¡ d¡¡ d S )NrD   z"system does not support pidfd_openzpidfd_open syscall blocked: r   )r4   r   rR   rù  r·   r	   r
   r®   Ú
isinstancer  r;   r¯   r   r-   )r   rº   r   r   r   Útest_pidfd_openÀ  s    (
zPosixTester.test_pidfd_open)ˆÚ__name__Ú
__module__Ú__qualname__r   r"   r7   rW   Ú
skipUnlessr   r   r?   rA   rG   rI   rL   rM   r[   r`   rc   rh   rk   r3   rR   Ú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  r&  r2  r5  r7  r<  r=  r?  r@  rC  rH  r>  rM  rP  rR  rT  rX  r]  Zcpython_onlyr`  ra  rj  rk  rn  rr  rw  ry  r‚  rS   r†  r“  rN  Úsupports_dir_fdr–  r—  rš  r3  r›  r   r£  r¤  r©  rz  r«  r  r¬  r   r²  r´  rµ  r¶  r·  ÚsignalrÀ  r:  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  
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ

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



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


	
ÿ
	ÿ
ÿ
	ÿ
ÿ
ÿ

ÿ

;
	


ÿ


ÿ


	


 	
#

	ÿ
	ÿÿÿ(
ÿ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   r0   rW   rX   r   rr   rÍ   r,   Úsaved_groupsr_   r   r   r   r   Í  s    




zPosixGroupsTester.setUpc                 C   sH   t tdƒrt | j¡ n,t tdƒrDt t ¡ ¡j}t || jd ¡ d S )NÚ	setgroupsrN   r   )	r   r   r  r  rS   rT   r0   rU   rN   ©r   r6   r   r   r   r"   Ö  s
    

zPosixGroupsTester.tearDownrN   ztest needs posix.initgroups()c                 C   sD   t | jpdgƒd }t t ¡ ¡j}t ||¡ |  |t 	¡ ¡ d S r^  )
Úmaxr  rS   rT   r   r0   rU   rN   r  r,   )r   rˆ  r6   r   r   r   r[   Ý  s    z!PosixGroupsTester.test_initgroupsr  ztest needs posix.setgroups()c                 C   s6   dgt tdƒƒfD ]}t |¡ |  |t ¡ ¡ qd S )Nr   é   )r©   rë  r   r  ZassertListEqualr,   )r   r‘  r   r   r   Útest_setgroupsç  s    
z PosixGroupsTester.test_setgroupsN)rü  rý  rþ  r   r"   rW   rÿ  r   r   r[   r  r   r   r   r   r  Ë  s   	ÿ
ÿr  c                   @   s,  e Zd ZejddddfZdZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze eedƒd¡dd„ ƒZd d!„ Zd"d#„ Ze eedƒd¡d$d%„ ƒZd&d'„ Zee ej d(¡d)¡d*d+„ ƒƒZee ej d(¡d)¡d,d-„ ƒƒZ d.d/„ Z!d0d1„ Z"d2d3„ Z#d4d5„ Z$d6d7„ Z%dS )8Ú_PosixSpawnMixinú-Iú-Srn   ro   Nc                 G   s   t jddg|¢R S )Nr  r  )rr   rs   ©r   Úargsr   r   r   Úpython_argsô  s    z_PosixSpawnMixin.python_argsc                 C   sŽ   t j}|  t j|¡ d|›d}|  d|¡}|  |d |tj¡}t j|dd t	|ƒ$}|  
| ¡ t|ƒ¡ W d   ƒ n1 s€0    Y  d S )Nú2if 1:
            import os
            with open(zO, "w") as pidfile:
                pidfile.write(str(os.getpid()))
            rn   r   rp   )r   r   rü   r    r  Ú
spawn_funcrR   rx   ry   r   r;   r›   r0  )r   ZpidfileÚscriptr  rz   rL  r   r   r   Útest_returns_pidü  s    þ
z!_PosixSpawnMixin.test_returns_pidc              
   C   s~   d}z|   ||gtj¡}W n6 ttfyP } z|  |j|¡ W Y d }~n2d }~0 0 t |d¡\}}|  ||¡ |  |d¡ d S )NÚno_such_executabler   )	r  rR   rx   ÚFileNotFoundErrorr  r;   ÚfilenameÚwaitpidÚassertNotEqual)r   r  rz   ÚexcZpid2Ústatusr   r   r   Útest_no_such_executable
  s    þ$z(_PosixSpawnMixin.test_no_such_executablec                 C   s–   t j}|  t j|¡ d|›d}|  d|¡}|  |d |i tj¥ddi¥¡}t j|dd t	|ƒ }|  
| ¡ d¡ W d   ƒ n1 sˆ0    Y  d S )Nr  zL, "w") as envfile:
                envfile.write(os.environ['foo'])
        rn   r   rO   Zbarrp   )r   r   rü   r    r  r  rR   rx   ry   r   r;   r›   )r   Zenvfiler  r  rz   rL  r   r   r   Útest_specify_environment  s    þÿ
z)_PosixSpawnMixin.test_specify_environmentc                 C   s.   | j | jd | jtjd d}tj|dd d S ©Nr   ©Úfile_actionsrp   ©r  ÚNOOP_PROGRAMrR   rx   r   ry   ©r   rz   r   r   r   Útest_none_file_actions(  s    üz'_PosixSpawnMixin.test_none_file_actionsc                 C   s.   | j | jd | jtjg d}tj|dd d S r  r"  r$  r   r   r   Útest_empty_file_actions1  s    üz(_PosixSpawnMixin.test_empty_file_actionsc                 C   s0   | j tjtjddgtjdd}tj|dd d S )Nrn   ro   F©Zresetidsr   rp   ©r  rr   rs   rR   rx   r   ry   r$  r   r   r   Útest_resetids_explicit_default:  s    
üz/_PosixSpawnMixin.test_resetids_explicit_defaultc                 C   s0   | j tjtjddgtjdd}tj|dd d S )Nrn   ro   Tr'  r   rp   r(  r$  r   r   r   Útest_resetidsC  s    
üz_PosixSpawnMixin.test_resetidsc                 C   sL   |   t¡. | jtjtjddgtjd d W d   ƒ n1 s>0    Y  d S )Nrn   ro   r'  ©r4   r5   r  rr   rs   rR   rx   r_   r   r   r   Útest_resetids_wrong_typeL  s
    
þz)_PosixSpawnMixin.test_resetids_wrong_typec                 C   s4   | j tjtjddgtjt ¡ d}tj|dd d S )Nrn   ro   ©Z	setpgroupr   rp   )r  rr   rs   rR   rx   r.   r   ry   r$  r   r   r   Útest_setpgroupR  s    
üz_PosixSpawnMixin.test_setpgroupc                 C   sL   |   t¡. | jtjtjddgtjdd W d   ƒ n1 s>0    Y  d S )Nrn   ro   Z023r-  r+  r_   r   r   r   Útest_setpgroup_wrong_type[  s
    
þz*_PosixSpawnMixin.test_setpgroup_wrong_typeÚpthread_sigmaskzneed signal.pthread_sigmask()c                 C   s>   t  d¡}| jtjtjd|gtjtjgd}t	j
|dd d S )NúI            import signal
            signal.raise_signal(signal.SIGUSR1)rn   ©Z
setsigmaskr   rp   )ÚtextwrapÚdedentr  rr   rs   rR   rx   r  ÚSIGUSR1r   ry   )r   r‹   rz   r   r   r   Útest_setsigmaska  s    

üz _PosixSpawnMixin.test_setsigmaskc                 C   sê   |   t¡. | jtjtjddgtjdd W d   ƒ n1 s>0    Y  |   t¡0 | jtjtjddgtjdgd W d   ƒ n1 sˆ0    Y  |   t¡: | jtjtjddgtjtj	tj	d gd W d   ƒ n1 sÜ0    Y  d S )Nrn   ro   é"   r2  Újr2   ©
r4   r5   r  rr   rs   rR   rx   rß   r  ÚNSIGr_   r   r   r   Útest_setsigmask_wrong_typep  s"    
þ$
þ$
ÿþz+_PosixSpawnMixin.test_setsigmask_wrong_typec           	   
   C   s  t  ¡ \}}|  t j|¡ z¶t  |d¡ t d|› d¡}z"| jtj	tj	d|gt j
dd}W nf ty } z|  d|›¡ W Y d }~n<d }~0  tyÂ } z|  d|›¡ W Y d }~n
d }~0 0 W t  |¡ nt  |¡ 0 tj|dd	 t  |d
¡}t|ƒ}t  t  ¡ ¡}|  ||¡ d S )NTz0
                import os
                fd = z`
                sid = os.getsid(0)
                os.write(fd, str(sid).encode())
            rn   )Úsetsidzsetsid is not supported: zsetsid failed with: r   rp   rÁ   )rR   rU  rü   r   Úset_inheritabler3  r4  r  rr   rs   rx   r­   r®   r  r   ry   r›   rÞ   Úgetsidr-   r  )	r   ZrfdZwfdr‹   rz   r  ÚoutputZ	child_sidZ
parent_sidr   r   r   Útest_setsid  s,    þ

þ
$(z_PosixSpawnMixin.test_setsidc              
   C   sv   t   t jt j¡}t d¡}z4| jtjtjd|gtj	t jgd}W t   t j|¡ nt   t j|¡ 0 t
j|t j d d S )Nr1  rn   ©Ú	setsigdefrp   )r  r5  ÚSIG_IGNr3  r4  r  rr   rs   rR   rx   r   ry   )r   Zoriginal_handlerr‹   rz   r   r   r   Útest_setsigdefž  s    

ü z_PosixSpawnMixin.test_setsigdefc                 C   sê   |   t¡. | jtjtjddgtjdd W d   ƒ n1 s>0    Y  |   t¡0 | jtjtjddgtjdgd W d   ƒ n1 sˆ0    Y  |   t¡: | jtjtjddgtjtj	tj	d gd W d   ƒ n1 sÜ0    Y  d S )Nrn   ro   r7  rA  r8  r2   r9  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)rn   )Z	schedulerrp   ©rR   r   rÊ  r3  r4  r  rr   rs   rx   rÖ  r   ry   ©r   ZpolicyÚpriorityr‹   rz   r   r   r   Útest_setscheduler_only_param¿  s    

þü

üz-_PosixSpawnMixin.test_setscheduler_only_paramc                 C   sf   t  d¡}t  |¡}t d|› d|› d¡}| jtjtjd|gt j|t  	|¡fd}t
j|dd d S rF  rG  rH  r   r   r   Útest_setscheduler_with_policyÓ  s    

þü

üz._PosixSpawnMixin.test_setscheduler_with_policyc                 C   s\   t jdt j t¡t jdft jdft jddfg}| j| j	d | j	t j
|d}tj|dd d S )Nr:   r   r2   r   r   rp   )rR   ÚPOSIX_SPAWN_OPENrv   ÚrealpathÚ__file__rt   ÚPOSIX_SPAWN_CLOSEÚPOSIX_SPAWN_DUP2r  r#  rx   r   ry   )r   r!  rz   r   r   r   Útest_multiple_file_actionsç  s    
ýýz+_PosixSpawnMixin.test_multiple_file_actionsc              
   C   sX  | j }|  t¡* | j|d |tjd gd W d   ƒ n1 s@0    Y  |  t¡* | j|d |tjdgd W d   ƒ n1 s„0    Y  |  t¡* | j|d |tjdgd W d   ƒ n1 sÈ0    Y  |  t¡* | j|d |tjdgd W d   ƒ n1 s0    Y  |  t¡. | j|d |tjtjfgd W d   ƒ n1 sX0    Y  |  t¡2 | j|d |tjtjddfgd W d   ƒ n1 s¦0    Y  |  t¡0 | j|d |tjtjd fgd W d   ƒ n1 sò0    Y  |  t¡< | j|d |tjtjdt	d	 tj
dfgd W d   ƒ n1 sJ0    Y  d S )
Nr   r   r   r   )i90  r2   r…   r:   ró  )r#  r4   r5   r  rR   rx   rO  rß   rL  rN  rt   r  r   r   r   Útest_bad_file_actionsó  sH    ÿ$ÿ$ÿ$ÿ&ÿ&ÿ&
ÿ&þÿz&_PosixSpawnMixin.test_bad_file_actionsc                 C   s®   t j}|  t j|¡ d}tjd|tjtjB tjB t	j
t	jB fg}|  d|¡}| j|d |tj|d}t j|dd t|ƒ }|  | ¡ d¡ W d   ƒ n1 s 0    Y  d S )NúOif 1:
            import sys
            sys.stdout.write("hello")
            r2   rn   r   r   rp   Úhello)r   r   rü   r    rR   rL  r   r‘   ÚO_TRUNCr	  r  r  r  r  rx   ry   r   r;   r›   )r   r  r  r!  r  rz   rL  r   r   r   Útest_open_file  s    
þÿÿ
z_PosixSpawnMixin.test_open_filec                 C   sœ   t j}|  t j|¡ d|›d}|  d|¡}| j|d |tjtjdfgd}t j	|dd t
|ƒ&}|  | ¡ dtj ¡ W d   ƒ n1 sŽ0    Y  d S )Nz„if 1:
            import os
            try:
                os.fstat(0)
            except OSError as e:
                with open(z_, 'w') as closefile:
                    closefile.write('is closed %d' % e.errno)
            rn   r   r   rp   zis closed %d)r   r   rü   r    r  r  rR   rx   rO  ry   r   r;   r›   r	   rÑ   )r   Z	closefiler  r  rz   rL  r   r   r   Útest_close_file$  s    û
ÿ
z _PosixSpawnMixin.test_close_filec                 C   sÂ   t j}|  t j|¡ d}t|dƒT}tj| ¡ dfg}|  d|¡}| j	|d |tj
|d}t j|dd W d   ƒ n1 s|0    Y  t|ƒ }|  | ¡ d¡ W d   ƒ n1 s´0    Y  d S )	NrS  rô  r2   rn   r   r   rp   rT  )r   r   rü   r    r   rR   rP  rb   r  r  rx   ry   r;   r›   )r   Zdupfiler  Z	childfiler!  r  rz   rL  r   r   r   rø   7  s    ÿÿ,
z_PosixSpawnMixin.test_dup2)&rü  rý  rþ  rr   rs   r#  r  r  r  r  r  r%  r&  r)  r*  r,  r.  r/  rW   rÿ  r   r  r6  r;  r@  rD  rE  r  ZskipIfrÍ   rÎ   rJ  rK  rQ  rR  rV  rW  rø   r   r   r   r   r  ï  sN   					ÿ
ÿ
ÿÿr  Úposix_spawnztest needs os.posix_spawnc                   @   s   e Zd ZeeddƒZdS )ÚTestPosixSpawnrX  N)rü  rý  rþ  r3   r   r  r   r   r   r   rY  J  s   rY  Úposix_spawnpztest needs os.posix_spawnpc                   @   s&   e Zd ZeeddƒZejdd„ ƒZdS )ÚTestPosixSpawnPrZ  Nc                 C   s    t  ¡ }|  tj|¡ d}tj ||¡}t t	j
|¡ ztj |tjd f¡}W n tyf   |}Y n0 |ddddf}t d|f ¡}d|f}t|d|iŽ d S )Nzposix_spawnp_test_program.exeÚPATHr  r  rn   ro   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€  rR   rv   Újoinr:  rr   rs   Úpathseprx   rV   r3  r4  r   )r   Útemp_dirZprogramZprogram_fullpathrv   Z
spawn_argsr‹   r  r   r   r   Útest_posix_spawnpS  s    
øz!TestPosixSpawnP.test_posix_spawnp)	rü  rý  rþ  r3   r   r  r   Zskip_unless_symlinkrb  r   r   r   r   r[  O  s   r[  rŠ  ztest weak linking on macOSc                   @   sŒ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!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>€  r„   z-TestPosixWeaklinking.setUp.<locals>.<setcomp>c                 s   s   | ]}t |ƒV  qd S r   r‡  )r¢   Úpartr   r   r   r‰    r„   z-TestPosixWeaklinking.setUp.<locals>.<genexpr>rI  )rŽ  rÍ   Zget_config_varsÚ	availabler  Úmac_verrw   )r   rŽ  rÍ   r   rd  r   r   {  s
    zTestPosixWeaklinking.setUpc                 C   s   || j vrt |› d¡‚d S )Nz not weak-linked)rg  rW   rX   r  r   r   r   Ú_verify_availableƒ  s    
z&TestPosixWeaklinking._verify_availablec                 C   sb   |   d¡ | jdkr:|  ttdƒd¡ |  ttdƒd¡ n$|  ttdƒd¡ |  ttdƒd¡ d S )	NZHAVE_PWRITEV)r§   r
  r¿   zos.pwritev is not availabler   zos.readv is not availablezos.pwritev is availablezos.readv is available)ri  rh  r]   r   rR   rý   r_   r   r   r   rÄ   ‡  s    

z!TestPosixWeaklinking.test_pwritevc                 C   sp   |   d¡ | jdkr$|  dtj¡ nH|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  d S )NZHAVE_FSTATAT©r§   r§   údir_fd unavailableÚfiler   r•  )
ri  rh  r  r   Ú_have_functionsÚassertNotInr
  r­   rR   r	  r_   r   r   r   r  ‘  s    

zTestPosixWeaklinking.test_statc                 C   sð   |   d¡ | jdkr$|  dtj¡ nÈ|  dtj¡ |  td¡" tj	dtj
dd W d   ƒ n1 sf0    Y  |  td¡" tj	dtj
dd	 W d   ƒ n1 s¤0    Y  |  td
¡" tj	dtj
dd W d   ƒ n1 sâ0    Y  d S )NZHAVE_FACCESSATrj  rk  rl  r   r•  zfollow_symlinks unavailableFrâ   zeffective_ids unavailableT)Zeffective_ids)ri  rh  r  r   rm  rn  r
  r­   rR   rN  rO  r_   r   r   r   rP  œ  s    

00z TestPosixWeaklinking.test_accessc                 C   s€   |   d¡ | jdkr$|  dtj¡ nX|  dtj¡ |  dtj¡ |  td¡  tj	dddd W d   ƒ n1 sr0    Y  d S )	NZHAVE_FCHMODATrj  ZHAVE_LCHMODrk  rl  i¤  r   r•  )
ri  rh  r  r   rm  rn  r
  r­   rR   r—  r_   r   r   r   Ú
test_chmod­  s    

zTestPosixWeaklinking.test_chmodc                 C   s‚   |   d¡ | jdkr$|  dtj¡ nZ|  dtj¡ |  dtj¡ |  td¡" tj	ddddd W d   ƒ n1 st0    Y  d S )NZHAVE_FCHOWNATrj  ZHAVE_LCHOWNrk  rl  r   r•  )
ri  rh  r  r   rm  rn  r
  r­   rR   r3  r_   r   r   r   r5  ¹  s    

zTestPosixWeaklinking.test_chownc              	   C   sü  |   d¡ | jdkr&|  dtj¡ nÒ|  dtj¡ |  td¡  tj	dddd W d   ƒ n1 sf0    Y  |  td¡  tj	dddd	 W d   ƒ n1 s¢0    Y  |  td¡" tj	ddddd
 W d   ƒ n1 sà0    Y  t
 ¡ ô}tj |d¡}tj |d¡}tj |d¡}t|dƒ}| d¡ W d   ƒ n1 sJ0    Y  t d|¡ |  t¡  tj	||dd W d   ƒ n1 s’0    Y  |  t¡  tj	||dd W d   ƒ n1 sÎ0    Y  W d   ƒ n1 sî0    Y  d S )NZHAVE_LINKATrj  zsrc_dir_fd unavailableÚsourceÚtargetr   ©r¦  zdst_dir_fd unavailable©r§  r¥  r¤  rj   ÚdataTrâ   F)ri  rh  r  r   rm  rn  r
  r­   rR   r¤  r   ra  rv   r_  r   rf   r:  r4   ÚFileExistsError)r   r  Z	link_pathZtarget_pathÚsource_pathr   r   r   r   Ú	test_linkÅ  s*    

..0
*0zTestPosixWeaklinking.test_linkc                 C   s¢   |   d¡ | jdkr$|  dtj¡ nz|  dtj¡ |  td¡ t 	d¡ W d   ƒ n1 s^0    Y  |  td¡ t 
d¡ W d   ƒ n1 s”0    Y  d S )NZHAVE_FDOPENDIRrj  zClistdir: path should be string, bytes, os.PathLike or None, not intr   zCscandir: path should be string, bytes, os.PathLike or None, not int)ri  rh  r  r   rm  rn  r
  r5   rR   r>  Úscandirr_   r   r   r   Útest_listdir_scandirì  s    

(z)TestPosixWeaklinking.test_listdir_scandirc                 C   sp   |   d¡ | jdkr$|  dtj¡ nH|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  d S )NZHAVE_MKDIRATrj  rk  rª  r   r•  )
ri  rh  r  r   rm  rn  r
  r­   rR   rz  r_   r   r   r   Ú
test_mkdirú  s    

zTestPosixWeaklinking.test_mkdirc                 C   s*  |   d¡ | jdkr&|  dtj¡ n |  dtj¡ |  td¡  tj	dddd W d   ƒ n1 sf0    Y  |  td¡  tj	dddd W d   ƒ n1 s¢0    Y  |  td¡  tj
dddd W d   ƒ n1 sÞ0    Y  |  td¡  tj
dddd W d   ƒ n1 s0    Y  d S )	NZHAVE_RENAMEATrj  z%src_dir_fd and dst_dir_fd unavailabler°  r±  r   rr  rs  )ri  rh  r  r   rm  rn  r
  r­   rR   r¶  rî  r_   r   r   r   Útest_rename_replace  s    

...z(TestPosixWeaklinking.test_rename_replacec                 C   sª   |   d¡ | jdkr$|  dtj¡ n‚|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  |  td¡ tj
ddd W d   ƒ n1 sœ0    Y  d S )NZHAVE_UNLINKATrj  rk  rv   r   r•  )ri  rh  r  r   rm  rn  r
  r­   rR   r    r{  r_   r   r   r   Útest_unlink_rmdir  s    

,z&TestPosixWeaklinking.test_unlink_rmdirc                 C   st   |   d¡ | jdkr$|  dtj¡ nL|  dtj¡ |  td¡" tj	dtj
dd W d   ƒ n1 sf0    Y  d S )NZHAVE_OPENATrj  rk  rv   r   r•  )ri  rh  r  r   rm  rn  r
  r­   rR   r   rt   r_   r   r   r   Ú	test_open'  s    

zTestPosixWeaklinking.test_openc                 C   sp   |   d¡ | jdkr$|  dtj¡ nH|  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sb0    Y  d S )NZHAVE_READLINKATrj  rk  rv   r   r•  )
ri  rh  r  r   rm  rn  r
  r­   rR   r´  r_   r   r   r   Útest_readlink2  s    

z"TestPosixWeaklinking.test_readlinkc                 C   sr   |   d¡ | jdkr$|  dtj¡ nJ|  dtj¡ |  td¡  tj	dddd W d   ƒ n1 sd0    Y  d S )NZHAVE_SYMLINKATrj  rk  r°  r±  r   r•  )
ri  rh  r  r   rm  rn  r
  r­   rR   r:  r_   r   r   r   Útest_symlink=  s    

z!TestPosixWeaklinking.test_symlinkc                 C   s–   |   d¡ |   d¡ | jdkr<|  dtj¡ |  dtj¡ nV|  dtj¡ |  dtj¡ |  td¡ tj	ddd W d   ƒ n1 sˆ0    Y  d S )NZHAVE_FUTIMENSZHAVE_UTIMENSAT)r§   rP   rk  rv   r   r•  )
ri  rh  r  r   rm  rn  r
  r­   rR   rÝ   r_   r   r   r   ra  H  s    


zTestPosixWeaklinking.test_utimeN)rü  rý  rþ  r   ri  rÄ   r  rP  ro  r5  rw  ry  rz  r{  r|  r}  r~  r  ra  r   r   r   r   rc  t  s    
'rc  c                   C   s   t  ¡  d S r   )r   Úreap_childrenr   r   r   r   ÚtearDownModuleW  s    r  Ú__main__)'re   r   Ztest.support.script_helperr   Úimport_moduler   r	   rr   r  rÜ   rR   rÍ   rS   r	  r]  rW   r   r3  rv   r_  Ú
gettempdirr   r;  rÿ  Úmaxsizer  r   r  ZTestCaser   r  r  r   rY  r[  rc  r  rü  Úmainr   r   r   r   Ú<module>   s`   
ÿÿ
           -$  ]$ c
