B
    2*™\ ù  ã               @   sô   d Z ddlmZ ddlmZ e d¡ZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZ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dd„ Zedkrðeƒ  dS )zTest posix functionsé    )Úsupport)Úassert_python_okÚposixNz-dummy-symlinkl        z(test is only meaningful on 32-bit buildsc           
   C   sT   t tdƒsdS yt d¡ W n2 tk
rN }  z| jtjkr>dS W d d } ~ X Y nX dS )NÚsched_getschedulerFr   T)Úhasattrr   r   ÚOSErrorÚerrnoZENOSYS)Úe© r
   ú:C:\ALexclude\prg\programme\Python37\Lib\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kd1¡e eed2ƒd3¡e eed4ƒd5¡d6d7„ ƒƒƒZe ee	d8ƒd9¡e eed2ƒd3¡d:d;„ ƒƒZe eed2ƒd3¡d<d=„ ƒZe ee	d>ƒd?¡d@dA„ ƒZe ee	dBƒdC¡dDdE„ ƒZe ee	dFƒdG¡dHdI„ ƒZe ee	dFƒdG¡e ee	dJƒdK¡dLdM„ ƒƒZe ee	dFƒdG¡edNdO„ ƒƒZ e ee	dPƒdQ¡dRdS„ ƒZ!e ee	dTƒdU¡dVdW„ ƒZ"e ee	dTƒdU¡e ee	dXƒdY¡dZd[„ ƒƒZ#e ee	dTƒdU¡ed\d]„ ƒƒZ$e ee	d^ƒd_¡d`da„ ƒZ%e ee	d^ƒd_¡dbdc„ ƒZ&e ee	ddƒde¡dfdg„ ƒZ'e ee	ddƒde¡dhdi„ ƒZ(e ej)ejkdj¡dkdl„ ƒZ*e ej)ej+kdm¡dndo„ ƒZ,e ee	dpƒdq¡drds„ ƒZ-e ee	dpƒdq¡edtdu„ ƒƒZ.e ee	dvƒdw¡dxdy„ ƒZ/e ee	dvƒdw¡edzd{„ ƒƒZ0e ee	d|ƒ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Œ¡ddŽ„ ƒƒZ6e ee	dƒd¡d‘d’„ ƒZ7e ee	d“ƒd”¡d•d–„ ƒZ8e ee	d—ƒd˜¡d™dš„ ƒZ9e ee	d›ƒdœ¡ddž„ ƒZ:e ee	dŸƒd ¡d¡d¢„ ƒZ;e ee	d£ƒo ee<d¤ƒd¥¡d¦d§„ ƒZ=e ee	d›ƒdœ¡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k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ñ„ ZVe eedòƒdó¡dô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]kd¡dd„ ƒZ^e ej_ej]kd	¡d
d„ ƒZ`e ejaej]kd¡dd„ ƒZbe ej<ej]kd¡dd„ ƒZce ej)ej]kd¡dd„ ƒZde ejeej]kd¡dd„ ƒZfe ejgej]kd¡dd„ ƒZhe ejiej]ko¼ee<d¤ƒd¡dd„ ƒZje ejkej]kd¡dd „ ƒZle ejmej]kd!¡d"d#„ ƒZne ejoej]kd$¡d%d&„ ƒZpe ejqej]kd'¡d(d)„ ƒZre ejsej]kd*¡d+d,„ ƒZte ejuej]kd-¡d.d/„ ƒZve ee	d0ƒd1¡Zwe ee	d2ƒd3¡Zxewd4d5„ ƒZyewe ee	d6ƒd7¡d8d9„ ƒƒZze{d:d;„ ƒZ|e ee	d<ƒd=¡d>d?„ ƒZ}exd@dA„ ƒZ~exdBdC„ ƒZdDdE„ Z€e eedFƒdG¡dHdI„ ƒZdJdK„ Z‚dLdM„ ZƒdNdO„ Z„d0S (P  ÚPosixTesterc             C   sD   t tjdƒ}| ¡  tjg| _t ¡ | _| j ¡  t 	ddt
¡ d S )Nz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.   x| j D ]}t |¡ qW | j d d d ¡ d S )N)r   r   Úunlinkr   Ú__exit__)r   Zteardown_filer
   r
   r   ÚtearDown2   s    zPosixTester.tearDownc             C   s\   ddddddddd	d
dddddg}x4|D ],}t t|d ƒ}|d k	r(|ƒ  |  t|d¡ q(W d S )NZctermidÚgetcwdÚgetcwdbZunameÚtimesZ
getloadavgÚgetegidÚgeteuidÚgetgidÚ	getgroupsÚgetpidZgetpgrpÚgetppidÚgetuidZsyncé   )Úgetattrr   ÚassertRaisesÚ	TypeError)r   ZNO_ARG_FUNCTIONSÚnameZ
posix_funcr
   r
   r   ÚtestNoArgFunctions7   s    
zPosixTester.testNoArgFunctionsÚ	getresuidztest needs posix.getresuid()c             C   s6   t  ¡ }|  t|ƒd¡ x|D ]}|  |d¡ qW d S )Né   r   )r   r.   ÚassertEqualÚlenÚassertGreaterEqual)r   Zuser_idsÚvalr
   r
   r   Útest_getresuidF   s    
zPosixTester.test_getresuidÚ	getresgidztest needs posix.getresgid()c             C   s6   t  ¡ }|  t|ƒd¡ x|D ]}|  |d¡ qW d S )Nr/   r   )r   r5   r0   r1   r2   )r   Z	group_idsr3   r
   r
   r   Útest_getresgidN   s    
zPosixTester.test_getresgidÚ	setresuidztest needs posix.setresuid()c             C   s0   t  ¡ }|  t j|Ž ¡ |  t  ddd¡¡ d S )Néÿÿÿÿ)r   r.   ÚassertIsNoner7   )r   Úcurrent_user_idsr
   r
   r   Útest_setresuidV   s    zPosixTester.test_setresuidc             C   s:   t  ¡ }d|kr6|d d ddf}| jtt jf|žŽ  d S )Nr   r(   r8   )r   r.   r*   r   r7   )r   r:   Znew_user_idsr
   r
   r   Útest_setresuid_exception^   s    z$PosixTester.test_setresuid_exceptionÚ	setresgidztest needs posix.setresgid()c             C   s0   t  ¡ }|  t j|Ž ¡ |  t  ddd¡¡ d S )Nr8   )r   r5   r9   r=   )r   Úcurrent_group_idsr
   r
   r   Útest_setresgidg   s    zPosixTester.test_setresgidc             C   s:   t  ¡ }d|kr6|d d ddf}| jtt jf|žŽ  d S )Nr   r(   r8   )r   r5   r*   r   r=   )r   r>   Znew_group_idsr
   r
   r   Útest_setresgid_exceptiono   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Ôyt t ¡ ¡j	}W n t
k
r„   t d¡‚Y nX yt |d¡ W n2 tk
rÈ } z|  |jtj¡ W d d }~X Y nX |  d¡ d S )Nr/   Zfoor   zneed a pwd entryé   z+Expected OSError to be raised by initgroups)r*   r+   r   rA   ÚobjectÚosr'   ÚpwdÚgetpwuidÚpw_nameÚKeyErrorÚunittestÚSkipTestr   r0   r   ÚEPERMÚfail)r   r,   r	   r
   r
   r   Útest_initgroupsx   s    "zPosixTester.test_initgroupsÚstatvfsztest needs posix.statvfs()c             C   s   |   t tj¡¡ d S )N)Ú
assertTruer   rN   rD   Úcurdir)r   r
   r
   r   Útest_statvfs‘   s    zPosixTester.test_statvfsÚfstatvfsztest needs posix.fstatvfs()c             C   sF   t tjƒ}z,|  t | ¡ ¡¡ |  t | ¡ ¡¡ W d | ¡  X d S )N)	r   r   r   rO   r   rR   ÚfilenorN   r   )r   r   r
   r
   r   Útest_fstatvfs–   s
    
zPosixTester.test_fstatvfsÚ	ftruncateztest needs posix.ftruncate()c             C   sB   t tjdƒ}z&| d¡ | ¡  t | ¡ d¡ W d | ¡  X d S )Nzw+Útestr   )	r   r   r   ÚwriteÚflushr   rU   rS   r   )r   r   r
   r
   r   Útest_ftruncate    s    
zPosixTester.test_ftruncateÚtruncateztest needs posix.truncate()c          	   C   s<   t tjdƒ}| d¡ | ¡  W d Q R X t tjd¡ d S )NÚwrV   r   )r   r   r   rW   rX   r   rZ   )r   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()Úwaitpidztest needs os.waitpid()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  |d¡|df¡ W d t  |¡ X d S )Nr   z-cÚpass)rD   r   ÚsysÚ
executableÚO_RDONLYr^   ÚchdirÚpathÚsplitr   r]   Úenvironr0   r_   r   )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   z-cr`   )rD   r^   rd   re   rf   ra   rb   r   r]   rg   rj   ZP_PIDZWEXITEDr0   Zsi_pid)r   rh   Úresr
   r
   r   Útest_waitidÃ   s    zPosixTester.test_waitidc          	   C   sv  | j tdd t dd„ ¡ W d Q R X | j tdd tjdd W d Q R X | j tdd tjdd	 W d Q R X | j tdd tjd
d W d Q R X | j tdd tjd d W d Q R X | j tdd tjd d	 W d Q R X | j tdd tjd d W d Q R X | j tdd tjd dd„ d W d Q R X | j tdd tjdd„ dd W d Q R X d}td|ƒ d S )NzPositional args not allowed)Úmsgc               S   s   d S )Nr
   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   rn   à   ro   )rq   rs   c               S   s   d S )Nr
   r
   r
   r
   r   rn   ã   ro   Ú )rq   rr   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'!')
            z-c)r*   r+   rD   Z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   sh   t  tjt jt jB ¡}z@t  |d¡ t  |dt j¡ t	 
|t	jd¡ t	 
|t	jd¡ W d t  |¡ X d S )Ns   testr   é   )rD   r   r   r   ÚO_WRONLYÚO_CREATrW   ÚlseekÚSEEK_SETr   rw   ZF_LOCKZF_ULOCKr   )r   Úfdr
   r
   r   Ú
test_lockf  s    zPosixTester.test_lockfÚpreadztest needs posix.pread()c          	   C   sr   t  tjt jt jB ¡}zJt  |d¡ t  |dt j¡ |  	dt
 |dd¡¡ |  	dt
 |d¡¡ W d t  |¡ X d S )Ns   testr   s   esrp   r(   s   te)rD   r   r   r   ÚO_RDWRrz   rW   r{   r|   r0   r   r   Úreadr   )r   r}   r
   r
   r   Ú
test_pread  s    zPosixTester.test_preadÚpreadvztest needs posix.preadv()c          	   C   sr   t  tjt jt jB ¡}zJt  |d¡ dd„ dD ƒ}|  t 	||d¡d¡ |  ddd	gt
|ƒ¡ W d t  |¡ X d S )
Ns   test1tt2t3t5t6t6t8c             S   s   g | ]}t |ƒ‘qS r
   )Ú	bytearray)Ú.0Úir
   r
   r   ú
<listcomp>(  s    z+PosixTester.test_preadv.<locals>.<listcomp>)é   r/   rp   r/   é
   s   t1tt2s   t3ts   5t)rD   r   r   r   r€   rz   rW   r0   r   rƒ   Úlistr   )r   r}   Úbufr
   r
   r   Útest_preadv#  s    zPosixTester.test_preadvÚ	RWF_HIPRIztest needs posix.RWF_HIPRIc          	   C   sv   t  tjt jt jB ¡}zNt  |d¡ dd„ dD ƒ}|  t 	||dt j
¡d¡ |  ddd	gt|ƒ¡ W d t  |¡ X d S )
Ns   test1tt2t3t5t6t6t8c             S   s   g | ]}t |ƒ‘qS r
   )r„   )r…   r†   r
   r
   r   r‡   4  s    z1PosixTester.test_preadv_flags.<locals>.<listcomp>)rˆ   r/   rp   r/   r‰   s   t1tt2s   t3ts   5t)rD   r   r   r   r€   rz   rW   r0   r   rƒ   r   rŠ   r   )r   r}   r‹   r
   r
   r   Útest_preadv_flags.  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 Q R X |  
|jjtj¡ |  
t|d ƒdd ¡ W d t  |¡ X d S )Ni   i €  r   ó    )rD   r   r   r   r€   rz   r„   r*   r   rƒ   r0   Ú	exceptionr   ÚEINVALÚbytesr   )r   r}   r‹   Úcmr
   r
   r   Útest_preadv_overflow_32bits:  s    z'PosixTester.test_preadv_overflow_32bitsÚpwriteztest needs posix.pwrite()c          	   C   sj   t  tjt jt jB ¡}zBt  |d¡ t  |dt j¡ t	 
|dd¡ |  dt	 |d¡¡ W d t  |¡ X d S )Ns   testr   s   xxr(   s   txxtrx   )rD   r   r   r   r€   rz   rW   r{   r|   r   r•   r0   r   r   )r   r}   r
   r
   r   Útest_pwriteG  s    zPosixTester.test_pwriteÚpwritevztest needs posix.pwritev()c          	   C   sŒ   t  tjt jt jB ¡}zdt  |d¡ t  |dt j¡ t  	|dddgd¡}|  
|d¡ t  |dt j¡ |  
dt |d	¡¡ W d t  |¡ X d S )
Ns   xxr   s   test1s   tt2s   t3rp   r‰   s   xxtest1tt2t3éd   )rD   r   r   r   r€   rz   rW   r{   r|   r—   r0   r   r   r   )r   r}   Únr
   r
   r   Útest_pwritevR  s    zPosixTester.test_pwritevzos.RWF_SYNCztest needs os.RWF_SYNCc          	   C   s   t  tjt jt jB ¡}zht  |d¡ t  |dt j¡ t  	|dddgdt j
¡}|  |d¡ t  |dt j¡ |  dt |d	¡¡ W d t  |¡ X d S )
Ns   xxr   s   test1s   tt2s   t3rp   r‰   s
   xxtest1tt2r˜   )rD   r   r   r   r€   rz   rW   r{   r|   r—   ZRWF_SYNCr0   r   r   r   )r   r}   r™   r
   r
   r   Útest_pwritev_flags`  s    zPosixTester.test_pwritev_flagsc          	   C   sl   t  tjt jt jB ¡}zD|  t¡}t  |dd gd d¡ W d Q R X |  	|j
jtj¡ W d t  |¡ X d S )Nó   xi   i €  r   )rD   r   r   r   r€   rz   r*   r   r—   r0   r   r   r‘   r   )r   r}   r“   r
   r
   r   Útest_pwritev_overflow_32bitso  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 ¡}z`yt |dd¡ W nH tk
rr } z*|j	t	j
kr`tj d¡r`t d¡‚n‚ W d d }~X Y nX W d t  |¡ X d S )Nr   r‰   )ZsunosÚfreebsdÚnetbsdZopenbsdZgnukfreebsdz test may fail on ZFS filesystems)rD   r   r   r   ry   rz   r   rž   r   r   r‘   ra   ÚplatformÚ
startswithrI   rJ   r   )r   r}   Úinstr
   r
   r   Útest_posix_fallocatez  s    z PosixTester.test_posix_fallocatec          
   C   sH   yt  ddd¡ W n0 tk
rB } z|jtjkr2‚ W d d }~X Y nX d S )NiÖÿÿÿ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   s8   t  tjt j¡}zt |ddtj¡ W d t  |¡ X d S )Nr   )	rD   r   r   r   rc   r   r§   ÚPOSIX_FADV_WILLNEEDr   )r   r}   r
   r
   r   Útest_posix_fadvise—  s    zPosixTester.test_posix_fadvisec          
   C   sL   yt  dddt j¡ W n0 tk
rF } z|jtjkr6‚ W d d }~X Y nX d S )NiÖÿÿÿr   )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   sH  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 d t |¡ X d S )N)NN)Únsr   g    eÍÍA)ÚtimerD   r   r   r   rc   r   Úutimer*   r+   Ú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_symlinks)NN)r¬   r   r­   r   r   r*   r+   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 ¡}zrt  |d¡}|  |d¡ t  |dt j	¡ |  dt
 |d¡¡ yt
 |g ¡}W n tk
rx   Y nX |  |d¡ W d t  |¡ X d S )N)s   test1s   tt2s   t3r‰   r   s
   test1tt2t3)rD   r   r   r   r€   rz   r´   r0   r{   r|   r   r   r   r   )r   r}   r™   Úsizer
   r
   r   Útest_writevÉ  s    zPosixTester.test_writevc          	   C   sj   t  tjt jt jB ¡}zB|  t¡}t  |dd gd ¡ W d Q R X |  	|j
jtj¡ W d t  |¡ X d S )Nrœ   i   i €  )rD   r   r   r   r€   rz   r*   r   r´   r0   r   r   r‘   r   )r   r}   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 ¡}zt  |d¡ t  |dt j¡ dd„ dD ƒ}|  	t
 ||¡d¡ |  	ddd	gd
d„ |D ƒ¡ yt
 |g ¡}W n tk
r–   Y nX |  	|d¡ W d t  |¡ X d S )Ns
   test1tt2t3r   c             S   s   g | ]}t |ƒ‘qS r
   )r„   )r…   r†   r
   r
   r   r‡   ð  s    z*PosixTester.test_readv.<locals>.<listcomp>)rˆ   r/   rp   r‰   s   test1s   tt2s   t3c             S   s   g | ]}t |ƒ‘qS r
   )r’   )r…   r†   r
   r
   r   r‡   ò  s    )rD   r   r   r   r€   rz   rW   r{   r|   r0   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 Q R X |  
|jjtj¡ |  
t|d ƒdd ¡ W d t  |¡ X d S )Ni   i €  r   r   )rD   r   r   r   r€   rz   r„   r*   r   r¸   r0   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   sB   t tjƒ}z(t | ¡ ¡}|  |t¡ t 	|¡ W d | 	¡  X d S )N)
r   r   r   r   r»   rS   ÚassertIsInstancer®   rD   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_garbageZCS_PATHr   T)r*   r¯   r   r¾   r0   r1   )r   r
   r
   r   Útest_confstr  s    zPosixTester.test_confstrÚdup2ztest needs posix.dup2()c             C   sD   t tjƒ}t tjƒ}zt | ¡ | ¡ ¡ W d | ¡  | ¡  X d S )N)r   r   r   r   rÀ   rS   r   )r   Úfp1Úfp2r
   r
   r   Ú	test_dup2  s    

zPosixTester.test_dup2Ú	O_CLOEXECzneeds os.O_CLOEXECrp   é   é   c             C   s8   t  tjt jt jB ¡}|  t j|¡ |  t  	|¡¡ d S )N)
rD   r   r   r   rc   rÄ   Ú
addCleanupr   ÚassertFalseÚget_inheritable)r   r}   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ƒ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)rD   r   r   r   ry   rË   rz   r*   r   Ú
O_NONBLOCKr   r   r   rÌ   )r   r}   r
   r
   r   Útest_osexlock0  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Ë   )rD   r   r   r   ry   rÌ   rz   r   r   r   r*   r   rc   rË   rÍ   )r   Zfd1Zfd2r}   r
   r
   r   Útest_osshlock@  s    


zPosixTester.test_osshlockÚfstatztest needs posix.fstat()c             C   s`   t tjƒ}zF|  t | ¡ ¡¡ |  t | ¡ ¡¡ |  t	dtjt
| ¡ ƒ¡ W d | ¡  X d S )Nz4should be string, bytes, os.PathLike or integer, not)r   r   r   rO   r   rÐ   rS   ÚstatÚassertRaisesRegexr+   Úfloatr   )r   r   r
   r
   r   Ú
test_fstatQ  s    
zPosixTester.test_fstatrÑ   ztest needs posix.stat()c          	   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 )Nz4should be string, bytes, os.PathLike or integer, not)rO   r   rÑ   r   r   rD   ÚfsencodeZassertWarnsRegexÚDeprecationWarningr„   rÒ   r+   rŠ   )r   r
   r
   r   Ú	test_stat_  s    
zPosixTester.test_statÚmkfifozdon't have mkfifo()c          
   C   sv   t  t j¡ yt t jtjtjB ¡ W n0 tk
rV } z|  	d| ¡ W d d }~X Y nX |  
t t t j¡j¡¡ d S )Nzposix.mkfifo(): %s)r   r   r   r   rØ   rÑ   ÚS_IRUSRÚS_IWUSRÚPermissionErrorÚskipTestrO   ÚS_ISFIFOÚst_mode)r   r	   r
   r
   r   Útest_mkfifor  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 }yt t j|d¡ W n< t	k
rn } z|  
|jtjtjtjf¡ W d d }~X Y nX |  t t t j¡j¡¡ t  t j¡ ytjt j|dd d W n< t	k
rê } z|  
|jtjtjtjf¡ W d d }~X Y nX d S )Nr   )re   ÚmodeZdeviceÚdir_fd)r   r   r   rÑ   rá   rÙ   rÚ   r   rà   r   ÚassertInr   rK   r‘   ÚEACCESrO   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j d¡r |dkr |  d¡ |  	t  ||¡|¡ |  
tt jt|ƒ|¡ |  
tt j|t|ƒ¡ |  
tt j|¡ |  
tt j¡ d S )Nr   r8   rŸ   l        zEbpo-31044: on FreeBSD CURRENT, minor() truncates 64-bit dev to 32-bit)r   rÑ   r   r   Úst_devr¼   r®   r2   Úmajorr0   r*   r+   rÓ   r¯   ÚOverflowErrorÚminorra   r¡   r¢   rÜ   rç   )r   ÚstZdevré   rë   r
   r
   r   Útest_makedev“  s2    


zPosixTester.test_makedevc       	   	      s„  ‡ ‡‡fdd„}t  ¡ }t  ¡ }|ˆ ||ƒ |||ƒ |ˆ d|ƒ |||ƒ |ˆ |dƒ |||ƒ |dkr²d}|ˆ ||ƒ |||ƒ |ˆ ddƒ |||ƒ |ˆ ||ƒ |||ƒ nzt ¡ dkrÊt d¡‚nbˆ t|ˆ dd¡ |||ƒ ˆ t|ˆ dd¡ |||ƒ dt  	¡ kr,ˆ t|ˆ dd¡ |||ƒ xRt
tfD ]F}ˆ t|ˆ ||ƒ|¡ |||ƒ ˆ t|ˆ |||ƒ¡ |||ƒ q6W dS )	z/Common code for chown, fchown and lchown tests.c                s0   ˆd k	r,ˆˆ ƒ}ˆ  |j| ¡ ˆ  |j|¡ d S )N)r0   Úst_uidÚst_gid)ÚuidÚgidrÑ   )Úfirst_paramr   Ú	stat_funcr
   r   Ú
check_stat¸  s    z6PosixTester._test_all_chown_common.<locals>.check_statr8   r   l        )zHP-UXZSunOSz1Skipping because of non-standard chown() behaviorN)rD   r'   r#   r¡   ÚsystemrI   rJ   r*   r   r$   ÚstrrÓ   r+   )	r   Z
chown_funcrò   ró   rô   rð   rñ   Z	big_valueÚtr
   )rò   r   ró   r   Ú_test_all_chown_common¶  s>    








z"PosixTester._test_all_chown_commonÚchownztest needs os.chown()c             C   sL   t  tj¡ |  ttjtjdd¡ t tj¡ |  	tjtjt
tdd ƒ¡ d S )Nr8   rÑ   )rD   r   r   r   r*   r   r   rù   Úcreate_empty_filerø   r)   )r   r
   r
   r   Ú
test_chownñ  s
    zPosixTester.test_chownÚfchownztest needs os.fchown()c             C   sL   t  tj¡ ttjdƒ}z$| ¡ }|  tj|t	tdd ƒ¡ W d | 
¡  X d S )Nr[   rÐ   )rD   r   r   r   r   rS   rø   r   rü   r)   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)
rD   r   r   r   ÚsymlinkÚ_DUMMY_SYMLINKrø   r   rþ   r)   )r   r
   r
   r   Útest_lchown	  s    zPosixTester.test_lchownrd   ztest needs posix.chdir()c             C   s"   t  tj¡ |  tt jtj¡ d S )N)r   rd   rD   rP   r*   r   r   r   )r   r
   r
   r   Ú
test_chdir  s    zPosixTester.test_chdirc             C   s   |   tjt tj¡¡ d S )N)rä   r   r   r   ÚlistdirrD   rP   )r   r
   r
   r   Útest_listdir  s    zPosixTester.test_listdirc             C   s   |   tjt ¡ ¡ d S )N)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ä   rD   rÕ   r   r   r   r  )r   r
   r
   r   Útest_listdir_bytes  s    zPosixTester.test_listdir_bytesc          
   C   sl   xft tfD ]Z}|  t¡ t |dƒ¡}W d Q R X |  t t	j
¡|¡ x|D ]}|  t|ƒt¡ qLW q
W d S )Nr  )r„   Ú
memoryviewZassertWarnsrÖ   r   r  rä   rD   rÕ   r   r   ZassertIsÚtyper’   )r   ÚclsÚnamesr,   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   rc   rÇ   r   r0   Ú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 )N)rO   r   r  r   r   rD   ÚR_OK)r   r
   r
   r   Útest_access:  s    zPosixTester.test_accessÚumaskztest needs posix.umask()c             C   s$   t  d¡}|  |t¡ t  |¡ d S )Nr   )r   r  r¼   r®   )r   Zold_maskr
   r
   r   Ú
test_umask>  s    
zPosixTester.test_umaskÚstrerrorztest needs posix.strerror()c             C   s   |   t d¡¡ d S )Nr   )rO   r   r  )r   r
   r
   r   Útest_strerrorD  s    zPosixTester.test_strerrorÚpipeztest needs posix.pipe()c             C   s$   t  ¡ \}}t |¡ t |¡ d S )N)r   r  rD   r   )r   ÚreaderÚwriterr
   r
   r   Ú	test_pipeI  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¡ yt |dtj ¡ W n tk
rò   Y nX d S )NZDEADBEEFr   r(   rœ   )r*   r+   rD   r  r   rÄ   rÍ   rÇ   rÈ   rÉ   Zget_blockingr   r   rW   r   ZPIPE_MAX_SIZE)r   Úrr[   r
   r
   r   Ú
test_pipe2O  s"    

zPosixTester.test_pipe2c             C   s8   dd l }|  ttj|jd ¡ |  ttj|jd ¡ d S )Nr   r(   )Ú	_testcapir*   rê   rD   r  ZINT_MAXZUINT_MAX)r   r!  r
   r
   r   Útest_pipe2_c_limitsk  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 )N)NN)r¬   r   r­   r   r   r*   r+   r®   )r   r°   r
   r
   r   Ú
test_utimet  s    zPosixTester.test_utimec          
   K   sô   t  |¡}|  t|dƒ¡ |jtjB }y|||f|Ž W n> tk
rv } z |jtjkrX‚ d}|  	|¡ W d d }~X Y nX zft  |¡}|  
|jtjB |j¡ yt|dƒ}	W n2 tk
rÚ }
 z|  
|
jtj¡ W d d }
~
X Y nX W d t ||j¡ X d S )NÚst_flagsz2chflag UF_IMMUTABLE not supported by underlying fszw+)rD   rÑ   rO   r   r$  ÚUF_IMMUTABLEr   r   Ú
EOPNOTSUPPrÜ   r0   r   rK   r   Úchflags)r   Zchflags_funcZtarget_fileÚkwargsrì   ÚflagsÚerrrm   Znew_str}   r	   r
   r
   r   Ú_test_chflags_regular_file~  s$    

&z&PosixTester._test_chflags_regular_filer'  ztest needs os.chflags()c             C   s   |   tjtj¡ d S )N)r+  r   r'  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 )NF)r²   )r+  r   r-  r   r   r'  )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„ }x¼tj|fD ]®}|jtjB }y|t|ƒ W n> tk
r° } z |jtjkr’‚ d}|  |¡ W d d }~X Y nX z@t  tj¡}t  
t¡}	|  |j|j¡ |  |jtjB |	j¡ W d |t|jƒ X qTW d S )Nr$  c             S   s   t j| |ddS )NF)r²   )r   r'  )re   r)  r
   r
   r   Úchflags_nofollow©  s    z;PosixTester.test_lchflags_symlink.<locals>.chflags_nofollowz2chflag UF_IMMUTABLE not supported by underlying fs)rD   rÑ   r   r   rO   r   r   r  r   Úappendrÿ   r   r-  r$  r%  r   r   r&  rÜ   r0   )
r   Z	testfn_stZdummy_symlink_str/  Úfnr)  r*  rm   Znew_testfn_stZnew_dummy_symlink_str
   r
   r   Útest_lchflags_symlinkŸ  s,    

z!PosixTester.test_lchflags_symlinkc             C   sP   t jdkrt}nt}x6tj ¡ D ](\}}|  t|ƒ|¡ |  t|ƒ|¡ q W d S )NÚnt)	rD   r,   rö   r’   r   rg   Úitemsr0   r
  )r   Z	item_typeÚkÚvr
   r
   r   Útest_environÀ  s    
zPosixTester.test_environÚputenvzrequires os.putenv()c          	   C   sÐ   |   t¡ t dd¡ W d Q R X |   t¡ t dd¡ W d Q R X |   t¡ t dd¡ W d Q R X |   t¡ t dd¡ W d Q R X |   t¡ t d	d
¡ W d Q R X |   t¡ t dd¡ W d Q R X d S )NzFRUIT VEGETABLEZcabbages   FRUIT VEGETABLEs   cabbageZFRUITzorange VEGETABLE=cabbages   FRUITs   orange VEGETABLE=cabbagezFRUIT=ORANGEZlemons   FRUIT=ORANGEs   lemon)r*   r¯   rD   r8  )r   r
   r
   r   Útest_putenvÉ  s    zPosixTester.test_putenvr   ztest needs posix.getcwd()c          	      sb   d}t  ¡ }t j tj¡d }z(yt  |¡ t  |¡ W n
   d S W d t  |¡ t |¡ X d S )Nz8getcwd-test-directory-0123456789abcdef-01234567890abcdefz.getcwdr   c          	      sv   yt  | ¡ W n   t d¡‚Y nX t  | ¡ z*t  ¡  |dk rXˆ | |t| ƒ d ƒ W d t  d¡ t  | ¡ X d S )Nz?mkdir cannot create directory sufficiently deep for getcwd testi  r(   z..)rD   ÚmkdirrI   rJ   rd   r   r1   Úrmdir)ÚdirnameZcurrent_path_length)Ú_create_and_do_getcwdr
   r   r=  ç  s    

zEPosixTester.test_getcwd_long_pathnames.<locals>._create_and_do_getcwd)	rD   r   re   Úabspathr   r   r:  rd   Úrmtree)r   r<  rP   Ú	base_pathr
   )r=  r   Útest_getcwd_long_pathnamesØ  s    
 
z&PosixTester.test_getcwd_long_pathnamesÚgetgrouplistztest needs posix.getgrouplist()rF   ztest needs pwd.getpwuid()r'   ztest needs os.getuid()c             C   s<   t  t ¡ ¡d }t  t ¡ ¡d }|  |t ||¡¡ d S )Nr   r/   )rE   rF   rD   r'   rä   r   rB  )r   ÚuserÚgroupr
   r
   r   Útest_getgrouplistü  s    zPosixTester.test_getgrouplistr!   ztest needs os.getegid()c          	   C   sð   t  d¡}| ¡  ¡ }| ¡ }W d Q R X ytdd„ | ¡ D ƒƒ}W n tk
r^   tƒ }Y nX |d k	sl|svt 	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 )N)r®   )r…   Úgr
   r
   r   ú	<genexpr>  s    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 )N)r®   )r…   r™   r
   r
   r   rG    s    r  rp   )r‰   rÅ   z$getgroups(2) is broken prior to 10.6)rD   Úpopenr   Ústripr   Úsetrf   r¯   rI   rJ   ra   r¡   Ú	sysconfigZget_config_varÚtupleÚsymmetric_differencer   r$   rO   r!   )r   ZidgÚgroupsÚretZ
idg_groupsrL  ZdtZsymdiffr
   r
   r   Útest_getgroups  s     

$
zPosixTester.test_getgroupsz)test needs dir_fd support for os.access()c          	   C   sB   t  t  ¡ t j¡}z|  t jtjtj	|d¡ W d t  
|¡ X d S )N)rã   )r   r   r   rc   rO   r  r   r   rD   r  r   )r   r  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	¡}zHtjtjtjtj
B |d t tj¡}|  |d tj@ tjtj
B ¡ W d t |¡ X d S )N)rã   r   )rD   Úchmodr   r   rÑ   rÙ   r   r   r   rc   rÚ   r0   ÚS_IRWXUr   )r   r  Úsr
   r
   r   Útest_chmod_dir_fd*  s    "zPosixTester.test_chmod_dir_fdz'test needs dir_fd support in os.chown()c          	   C   s\   t  t j¡ t  t j¡ t t ¡ tj¡}z tjt jt	 
¡ t	 ¡ |d W d t |¡ X d S )N)rã   )r   r   r   rú   r   r   r   rc   rù   rD   r'   r#   r   )r   r  r
   r
   r   Útest_chown_dir_fd7  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 Q R X 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 d t |¡ X d S )Nr[   z	testline
)rã   zshould be integer or None, notl      Fµx:^V )r   r   r   r   rW   r   r   rc   rÑ   r0   rÒ   r+   rÓ   r*   rê   r   )r   Úoutfiler  Ús1Ús2r
   r
   r   Útest_stat_dir_fdB  s"    zPosixTester.test_stat_dir_fdz'test needs dir_fd support in os.utime()c          	   C   sœ  t  t  ¡ t j¡}zvt ¡ }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krˆyt jtjd|d W n tk
r†   Y nX W d t  |¡ X d S )N)rã   )NNÚxg    eÍÍA)rã   r    F)r²   rã   )r   r   r   rc   r¬   r­   r   r   r*   r+   r®   rD   Úsupports_follow_symlinksr¯   r   )r   r  r°   r
   r
   r   Útest_utime_dir_fdX  s,    "
 
zPosixTester.test_utime_dir_fdz&test needs dir_fd support in os.link()c          
   C   s°   t  t  ¡ t j¡}z|yt jtjtjd ||d W n0 tk
rb } z|  d| ¡ W d d }~X Y n*X |  	t  
tj¡d t  
tjd ¡d ¡ W d t  |¡ t tjd ¡ X d S )NÚlink)Ú
src_dir_fdÚ
dst_dir_fdzposix.link(): %sr(   )r   r   r   rc   r_  r   r   rÛ   rÜ   r0   rÑ   r   r   )r   r  r	   r
   r
   r   Útest_link_dir_fdv  s     
zPosixTester.test_link_dir_fdz'test needs dir_fd support in os.mkdir()c          
   C   s\   t  t  ¡ t j¡}z(t jtjd |d t  tjd ¡ W d t  |¡ t 	tjd ¡ X d S )NÚdir)rã   )
r   r   r   rc   r:  r   r   rÑ   r   r?  )r   r  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
¡}ztytjt j|d|d W n< tk
r† } z|  |jtjtjtjf¡ W d d }~X Y nX |  t t t j¡j¡¡ W d t |¡ X d S )Nr   )rã   )r   r   r   rÑ   rá   rÙ   rÚ   r   r   r   rc   rà   r   rä   r   rK   r‘   rå   rO   rÝ   rÞ   r   )r   râ   r  r	   r
   r
   r   Útest_mknod_dir_fd  s    ,zPosixTester.test_mknod_dir_fdz&test needs dir_fd support in os.open()c          	   C   s”   t  t j¡ tt jdƒ}| d¡ W d Q R X t t ¡ tj¡}tjt jtj|d}z$t |d¡j	dd}|  
d|¡ W d t |¡ t |¡ X d S )Nr[   z	testline
)rã   é	   zutf-8)Úencoding)r   r   r   r   rW   r   r   rc   r   Údecoder0   r   )r   rX  ÚaÚbrk   r
   r
   r   Útest_open_dir_fd¢  s    
zPosixTester.test_open_dir_fdz*test needs dir_fd support in os.readlink()c          
   C   st   t  tjtjd ¡ t t ¡ tj¡}z,|  t 	tjd ¡tj	tjd |d¡ W d t 
tjd ¡ t |¡ X d S )Nr_  )rã   )rD   r   r   r   r   r   r   rc   r0   Úreadlinkr   r   )r   r  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¡}zRytjt jd t j||d W n"   t t jd t j¡ ‚ Y nX t 	t j¡ W d t 
|¡ X d S )NZren)r`  ra  )r   r   r   rú   r   r   r   rc   ÚrenamerÑ   r   )r   r  r
   r
   r   Útest_rename_dir_fd»  s    zPosixTester.test_rename_dir_fdz)test needs dir_fd support in os.symlink()c          
   C   sj   t  t  ¡ t j¡}z6t jtjtjd |d |  t  tjd ¡tj¡ W d t  	|¡ t 
tjd ¡ X d S )Nr_  )rã   )r   r   r   rc   r   r   r   r0   rl  r   r   )r   r  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 ¡ zRyt jtjd |d W n   t tjd ¡ ‚ Y nX |  	t
t jtjd ¡ W d t  |¡ X d S )NÚdel)rã   r_  )r   r   r   rc   r   rú   r   rÑ   r   r*   r   r   )r   r  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¡}znytjt jtj	tj
B |d W n0 tk
rn } z|  d| ¡ W d d }~X Y nX |  t t t j¡j¡¡ W d t |¡ X d S )N)rã   zposix.mkfifo(): %s)r   r   r   r   r   r   rc   rØ   rÑ   rÙ   rÚ   rÛ   rÜ   rO   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 )N)r   rt  )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 )NrH  iéÿÿÿ)r   ZSCHED_RRZsched_get_priority_minrw  r¼   r®   r2   ra   r¡   r*   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¡}|  ||¡ yt  t ¡ ¡}W n0 tk
rl } z|jtj	kr\‚ W d d }~X Y nX |  ||¡ |  
tt jd¡ |  
tt jd¡ t  d¡}|  |jt¡ tj d¡s&yt  d||¡ t  d|¡ W n4 tk
r } z|jtj	kr‚ W d d }~X Y nX |  
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…   r,   Zschedr
   r
   r   r‡     s    zDPosixTester.test_get_and_set_scheduler_and_param.<locals>.<listcomp>r   r8   )rŸ   r    é+   l   œÿÇ )Úsched_priority)r   Ú__dict__r4  r   rä   rD   r&   r   r   rK   r*   Zsched_getparamr¼   r|  r®   ra   r¡   r¢   Zsched_setschedulerZsched_setparamr+   Z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   sr   yt  d¡}W n: tk
rH } z|jtjkr.‚ |  d¡ W d d }~X Y nX |  |t¡ |  |d¡ |  	|d¡ d S )Nr   z only works on SCHED_RR processesg        g      ð?)
r   r€  r   r   r‘   rÜ   r¼   rÓ   r2   Ú
assertLess)r   Úintervalr	   r
   r
   r   Útest_sched_rr_get_interval4  s    z&PosixTester.test_sched_rr_get_intervalc             C   sl   t  d¡}|  |t¡ |  t|ƒd¡ |  tt jd¡ x0|D ](}|  |t¡ |  |d¡ |  	|d¡ q<W d S )Nr   r(   r8   l        )
r   Úsched_getaffinityr¼   rK  r2   r1   r*   r   r®   r  )r   ÚmaskZcpur
   r
   r   Útest_sched_getaffinityC  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dd> g¡ |  tt jd|¡ d S )Nr   r(   iöÿÿÿé€   r8   )
r   r„  r1   Úpopru  r0   r*   r   r¯   rê   )r   r…  r
   r
   r   Útest_sched_setaffinityN  s    
z"PosixTester.test_sched_setaffinityc             C   s   t j t j t j t j d S )N)r   Z	RTLD_LAZYZRTLD_NOWZRTLD_GLOBALZ
RTLD_LOCAL)r   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¡ | ¡  | ¡ }| ¡ }yrx@t|ƒD ]4}|  |t	 
||t	j¡¡ |  |t	 
||t	j¡¡ q<W |  tt	j
||t	j¡ |  tt	j
||t	j¡ W n tk
rÀ   t d¡‚Y nX W d Q R X d S )Nzr+bs   hellozOSError raised!)r   r   r   rW   rX   ÚtellrS   Úranger0   rD   r{   Z	SEEK_DATAZassertLessEqualr‹  r*   r   rI   rJ   )r   r   rµ   Zfnor†   r
   r
   r   Útest_fs_holesb  s    	
zPosixTester.test_fs_holesc             C   s”   xŽdD ]†}t t|dƒ}|dkr qxjdtjfD ]N}y|d|ƒ W q, tk
rx } z|  d |¡t|ƒ¡ P W dd}~X Y q,X q,W |  d| ¡ qW dS )zf
        Test functions that call path_error2(), providing two filenames in their exceptions.
        )rn  Úreplacer_  NZnoodly2Zdoesnotexistfilenamez'doesnotexistfilename' -> '{}'z#No valid path_error2() test for os.)	r)   rD   r   r   r   rä   Úformatrö   rL   )r   r,   Z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 Q R X W d |d k	rlt 
|¡ X |  tj |¡¡ |  ttj|¡ |  tj |¡¡ t|dƒ 
¡  |  ttj|¡ d S )Nú Úwb)r   r   rÇ   r   r*   r¯   rD   r   ry   rz   r   rÈ   re   Úexistsr:  rÑ   )r   r1  Ú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 Q R X W d |d k	rrt  |¡ X |  t j |¡¡ |  tt j|¡ |  t j |¡¡ t|dƒ ¡  |  tt j|¡ d S )Nr   r”  )rD   rÕ   r   r   rÇ   r   r*   r¯   r   ry   rz   r   rÈ   re   r•  r:  rÑ   )r   r1  r–  r}   r
   r
   r   Útest_path_with_null_byte¡  s    
"z$PosixTester.test_path_with_null_byte)…Ú__name__Ú
__module__Ú__qualname__r   r   r-   rI   Ú
skipUnlessr   r   r4   r6   r;   r<   r?   r@   rM   rQ   rT   rY   r\   r)   rD   Úsupports_fdri   rl   rv   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í   rø   rû   rý   r  r  r  r  r  r  r  r  r  r  r  r  r   Zcpython_onlyr"  r#  r+  r,  r.  r2  r7  r9  rA  rE   rE  rQ  r  Úsupports_dir_fdrR  rS  rV  rù   rW  r[  r^  r_  rb  r:  rd  rà   re  r   rk  rl  rm  rn  ro  r   rp  r   rr  rØ   rs  Zrequires_sched_hZrequires_sched_affinityrv  rz  Úrequires_schedr  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.getgroupsrH  zgetgroups(2) is broken on OSX)	r   r'   rI   rJ   r   ra   r¡   r$   Úsaved_groups)r   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Ú	setgroupsrA   r   )	r   r   r£  r¢  rE   rF   r'   rG   rA   )r   r,   r
   r
   r   r   ¾  s
    

zPosixGroupsTester.tearDownrA   ztest needs posix.initgroups()c             C   sD   t | jpdgƒd }t t ¡ ¡j}t ||¡ |  |t 	¡ ¡ d S )Nr   r(   )
Úmaxr¢  rE   rF   r   r'   rG   rA   rä   r$   )r   rF  r,   r
   r
   r   rM   Å  s    z!PosixGroupsTester.test_initgroupsr£  ztest needs posix.setgroups()c             C   s:   x4dgt tdƒƒgD ]}t |¡ |  |t ¡ ¡ qW d S )Nr   é   )rŠ   r  r   r£  ZassertListEqualr$   )r   rO  r
   r
   r   Útest_setgroupsÏ  s    
z PosixGroupsTester.test_setgroupsN)r™  rš  r›  r   r   rI   rœ  r   r   rM   r¦  r
   r
   r
   r   r¡  ³  s   		r¡  c               C   s    zt  tt¡ W d t  ¡  X d S )N)r   Zrun_unittestr   r¡  Zreap_childrenr
   r
   r
   r   Ú	test_mainÖ  s    r§  Ú__main__) Ú__doc__rV   r   Ztest.support.script_helperr   Úimport_moduler   r   ra   r¬   rD   r¡   rE   rÑ   ZtempfilerI   r   re   ÚjoinZ
gettempdirr   r  rœ  Úmaxsizerž  r   r   ZTestCaser   r¡  r§  r™  r
   r
   r
   r   Ú<module>   sF   

           #