B
    18™\Có  ã               @   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
   úS/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/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_filesÚ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 )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   Ú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   r4   Ú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 )Nr5   r   )r   r;   r6   r7   r8   )r   Z	group_idsr9   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   r4   ÚassertIsNoner=   )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.   r>   )r   r4   r0   r   r=   )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 )Nr>   )r   r;   r?   rC   )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.   r>   )r   r;   r0   r   rC   )r   rD   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 )Nr5   Zfoor   zneed a pwd entryé   z+Expected OSError to be raised by initgroups)r0   r1   r   rG   ÚobjectÚosr,   ÚpwdÚgetpwuidÚpw_nameÚKeyErrorÚunittestÚSkipTestr   r6   r   ÚEPERMÚfail)r   r2   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   rT   rJ   Ú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   rU   r   rX   ÚfilenorT   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   r[   rY   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Úwr\   r   )r   r   r   r]   r^   r   r`   )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)rJ   r   ÚsysÚ
executableÚO_RDONLYrd   ÚchdirÚpathÚsplitr   rc   Úenvironr6   re   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-crf   )rJ   rd   rj   rk   rl   rg   rh   r   rc   rm   rp   ÚP_PIDÚWEXITEDr6   Úsi_pid)r   rn   Ú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 )Nr5   r
   r
   r
   r
   r   rw   à   rx   )rz   r|   c               S   s   d S )Nr
   r
   r
   r
   r   rw   ã   rx   Ú )rz   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'!')
            z-c)r0   r1   rJ   Ú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   é   )rJ   r   r   r   ÚO_WRONLYÚO_CREATr]   Ú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   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   esry   r.   s   te)rJ   r   r   r   ÚO_RDWRr„   r]   r…   r†   r6   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>)é   r5   ry   r5   é
   s   t1tt2s   t3ts   5t)rJ   r   r   r   rŒ   r„   r]   r6   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”   r5   ry   r5   r•   s   t1tt2s   t3ts   5t)rJ   r   r   r   rŒ   r„   r]   r6   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   ó    )rJ   r   r   r   rŒ   r„   r   r0   r   r   r6   Ú	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   txxtr‚   )rJ   r   r   r   rŒ   r„   r]   r…   r†   r   r¡   r6   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   t3ry   r•   s   xxtest1tt2t3éd   )rJ   r   r   r   rŒ   r„   r]   r…   r†   r£   r6   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   t3ry   r•   s
   xxtest1tt2r¤   )rJ   r   r   r   rŒ   r„   r]   r…   r†   r£   ZRWF_SYNCr6   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   )rJ   r   r   r   rŒ   r„   r0   r   r£   r6   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•   )ÚsunosÚfreebsdÚnetbsdZopenbsdZgnukfreebsdz test may fail on ZFS filesystems)rJ   r   r   r   rƒ   r„   r   rª   r   r   r   rg   ÚplatformÚ
startswithrO   rP   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   )	rJ   r   r   r   ri   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)ÚtimerJ   r   r   r   ri   r   Úutimer0   r1   Ú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   r0   r1   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)rJ   r   r   r   rŒ   r„   rÁ   r6   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 €  )rJ   r   r   r   rŒ   r„   r0   r   rÁ   r6   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”   r5   ry   r•   s   test1s   tt2s   t3c             S   s   g | ]}t |ƒ‘qS r
   )rž   )r‘   r’   r
   r
   r   r“   ò  s    )rJ   r   r   r   rŒ   r„   r]   r…   r†   r6   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›   )rJ   r   r   r   rŒ   r„   r   r0   r   rÅ   r6   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È   rY   ÚassertIsInstancer»   rJ   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)r0   r¼   r   rË   r6   r7   )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Î   rY   r   )r   Úfp1Úfp2r
   r
   r   Ú	test_dup2  s    

zPosixTester.test_dup2Ú	O_CLOEXECzneeds os.O_CLOEXECry   é   é   c             C   s8   t  tjt jt jB ¡}|  t j|¡ |  t  	|¡¡ d S )N)
rJ   r   r   r   ri   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)rJ   r   r   r   rƒ   rÙ   r„   r0   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Ù   )rJ   r   r   r   rƒ   rÚ   r„   r   r   r   r0   r   ri   rÙ   rÛ   )r   Zfd1Ú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   rU   r   rß   rY   ÚstatÚassertRaisesRegexr1   Ú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)rU   r   rà   r   r   rJ   ÚfsencodeÚassertWarnsRegexÚDeprecationWarningr   rá   r1   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ÚskipTestrU   Ú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   )rk   ÚmodeZdeviceÚdir_fd)r   r   r   rà   rñ   ré   rê   r   rð   r   ÚassertInr   rQ   r   ÚEACCESrU   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   r>   r¬   l        zEbpo-31044: on FreeBSD CURRENT, minor() truncates 64-bit dev to 32-bit)r   rà   r   r   Úst_devrÉ   r»   r8   Úmajorr6   r0   r1   râ   r¼   ÚOverflowErrorÚminorrg   r®   r¯   rì   r÷   )r   ÚstÚ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)r6   Úst_uidÚst_gid)ÚuidÚgidrà   )Úfirst_paramr   Ú	stat_funcr
   r   Ú
check_stat¸  s    z6PosixTester._test_all_chown_common.<locals>.check_statr>   r   l        )zHP-UXÚSunOSz1Skipping because of non-standard chown() behaviorN)rJ   r,   r'   r®   ÚsystemrO   rP   r0   r   r(   Ústrrâ   r1   )	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 )Nr>   rà   )rJ   r   r   r   r0   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 )Nra   rß   )rJ   r   r   r   r   rY   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)
rJ   r   r   r   ÚsymlinkÚ_DUMMY_SYMLINKr
  r   r  r/   )r   r
   r
   r   Útest_lchown	  s    zPosixTester.test_lchownrj   ztest needs posix.chdir()c             C   s"   t  tj¡ |  tt jtj¡ d S )N)r   rj   rJ   rV   r0   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   ÚlistdirrJ   rV   )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ô   rJ   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   Ú
memoryviewÚassertWarnsræ   r   r  rô   rJ   rä   r   r   ÚassertIsÚtyperž   )r   ÚclsÚnamesr2   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    ri   rÕ   r   r6   Ú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)rU   r   r&  r   r   rJ   Ú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   )rU   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-  rJ   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¨   )r0   r1   rJ   r1  r   rÒ   rÛ   rÕ   rÖ   r×   Úget_blockingr   r   r]   r   ÚPIPE_MAX_SIZE)r   Úrra   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.   )Ú	_testcapir0   rú   rJ   r1  ZINT_MAXZUINT_MAX)r   r7  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   r0   r1   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+)rJ   rà   rU   r   r:  ÚUF_IMMUTABLEr   r   Ú
EOPNOTSUPPrì   r6   r   rQ   r   Úchflags)r   Zchflags_funcZtarget_fileÚkwargsrü   ÚflagsÚerrrv   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)rA  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¿   )rA  r   rC  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=  )rk   r?  r
   r
   r   Úchflags_nofollow©  s    z;PosixTester.test_lchflags_symlink.<locals>.chflags_nofollowz2chflag UF_IMMUTABLE not supported by underlying fs)rJ   rà   r   r   rU   r   r  r  r   Úappendr  r   rC  r:  r;  r   r   r<  rì   r6   )
r   Z	testfn_stZdummy_symlink_strE  Úfnr?  r@  rv   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)	rJ   r2   r  rž   r   rm   Úitemsr6   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)r0   r¼   rJ   rN  )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..)rJ   ÚmkdirrO   rP   rj   r    r7   Úrmdir)ÚdirnameZcurrent_path_length)Ú_create_and_do_getcwdr
   r   rS  ç  s    

zEPosixTester.test_getcwd_long_pathnames.<locals>._create_and_do_getcwd)	rJ   r    rk   Úabspathr   r   rP  rj   Úrmtree)r   rR  rV   Ú	base_pathr
   )rS  r   Útest_getcwd_long_pathnamesØ  s    
 
z&PosixTester.test_getcwd_long_pathnamesÚgetgrouplistztest needs posix.getgrouplist()rL   ztest needs pwd.getpwuid()r,   ztest needs os.getuid()c             C   s<   t  t ¡ ¡d }t  t ¡ ¡d }|  |t ||¡¡ d S )Nr   r5   )rK   rL   rJ   r,   rô   r   rX  )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   ÚMACOSX_DEPLOYMENT_TARGETz10.0c             s   s   | ]}t |ƒV  qd S )N)r»   )r‘   r¥   r
   r
   r   r]    s    r"  ry   )r•   rÓ   z$getgroups(2) is broken prior to 10.6)rJ   Úpopenr   Ústripr   Úsetrl   r¼   rO   rP   rg   r®   Ú	sysconfigÚget_config_varÚtupleÚsymmetric_differencer   r(   rU   r%   )r   ZidgÚgroupsÚretZ
idg_groupsrc  Ú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    ri   rU   r&  r   r   rJ   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   )rJ   Úchmodr   r   rà   ré   r   r   r    ri   rê   r6   Ú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    ri   r  rJ   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 )Nra   z	testline
)ró   zshould be integer or None, notl      Fµx:^V )r   r   r   r   r]   r   r    ri   rà   r6   rá   r1   râ   r0   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    ri   r¹   rº   r   r   r0   r1   r»   rJ   Ú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    ri   rx  r   r   rë   rì   r6   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    ri   rP  r   r   rà   r   rU  )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    ri   rð   r   rô   r   rQ   r   rõ   rU   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 )Nra   z	testline
)ró   é	   zutf-8)Úencoding)r   r   r   r   r]   r   r    ri   r   Údecoder6   r   )r   rq  ÚaÚbrt   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 )Nrx  )ró   )rJ   r  r   r   r   r   r    ri   r6   Ú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)ry  rz  )r   r   r   r  r   r   r    ri   Ú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 )Nrx  )ró   )r   r   r    ri   r  r   r   r6   r…  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ó   rx  )r   r   r    ri   r   r  r   rà   r   r0   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    ri   rè   rà   ré   rê   rë   rì   rU   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   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»   r8   rg   r®   r0   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‘   r2   Zschedr
   r
   r   r“     s    zDPosixTester.test_get_and_set_scheduler_and_param.<locals>.<listcomp>r   r>   )r¬   r­   é+   l   œÿÇ )Úsched_priority)r   Ú__dict__rJ  r   rô   rJ   r+   r   r   rQ   r0   Úsched_getparamrÉ   r—  r»   rg   r®   r¯   Úsched_setschedulerÚsched_setparamr1   Úsched_paramrú   )r   Zpossible_schedulersZmineÚparentr	   Ú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â   r8   Ú
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.   r>   l        )
r   Úsched_getaffinityrÉ   rb  r8   r7   r0   r   r»   r¡  )r   ÚmaskÚ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öÿÿÿé€   r>   )
r   r¤  r7   ÚpoprŽ  r6   r0   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   Ú	RTLD_LAZYÚRTLD_NOWÚRTLD_GLOBALÚ
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   r]   r^   ÚtellrY   Úranger6   rJ   r…   Ú	SEEK_DATAÚassertLessEqualr°  r0   r   rO   rP   )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.
        )r‡  Úreplacerx  NZnoodly2Zdoesnotexistfilenamez'doesnotexistfilename' -> '{}'z#No valid path_error2() test for os.)	r/   rJ   r   r   r   rô   Úformatr  rR   )r   r2   Ú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   r0   r¼   rJ   r   rƒ   r„   r   rÖ   rk   ÚexistsrP  rà   )r   rG  Ú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¼  )rJ   rä   r   r   rÕ   r   r0   r¼   r   rƒ   r„   r   rÖ   rk   r½  rP  rà   )r   rG  r¾  r‰   r
   r
   r   Útest_path_with_null_byte¡  s    
"z$PosixTester.test_path_with_null_byte)…Ú__name__Ú
__module__Ú__qualname__r   r   r3   rO   Ú
skipUnlessr   r   r:   r<   rA   rB   rE   rF   rS   rW   rZ   r_   rb   r/   rJ   Úsupports_fdro   ru   r€   rŠ   rŽ   r˜   rš   Úrequires_32br    r¢   r¦   r§   r©   r±   r³   r¶   r·   rº   r¾   rv  rÀ   rÃ   rÄ   rÆ   rÇ   rÊ   rÍ   rÑ   r   Ú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,  r0  r6  Úcpython_onlyr8  r9  rA  rB  rD  rH  rM  rO  rW  rK   r[  rj  r&  Úsupports_dir_fdrk  rl  ro  r  rp  rt  rw  rx  r{  rP  r}  rð   r~  r   r„  r…  r†  r‡  rˆ  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   &   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   r,   rO   rP   r   rg   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Ú	setgroupsrG   r   )	r   r   rÍ  rÌ  rK   rL   r,   rM   rG   )r   r2   r
   r
   r   r   ¾  s
    

zPosixGroupsTester.tearDownrG   ztest needs posix.initgroups()c             C   sD   t | jpdgƒd }t t ¡ ¡j}t ||¡ |  |t 	¡ ¡ d S )Nr   r.   )
ÚmaxrÌ  rK   rL   r   r,   rM   rG   rô   r(   )r   r\  r2   r
   r
   r   rS   Å  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Í  ÚassertListEqualr(   )r   rg  r
   r
   r   Útest_setgroupsÏ  s    
z PosixGroupsTester.test_setgroupsN)rÁ  rÂ  rÃ  r   r   rO   rÄ  r   r   rS   rÑ  r
   r
   r
   r   rË  ³  s   		rË  c               C   s    zt  tt¡ W d t  ¡  X d S )N)r   Úrun_unittestr   rË  Úreap_childrenr
   r
   r
   r   Ú	test_mainÖ  s    rÔ  Ú__main__) Ú__doc__r\   r   Ztest.support.script_helperr   Úimport_moduler   r   rg   r¹   rJ   r®   rK   rà   ÚtempfilerO   r   rk   ÚjoinÚ
gettempdirr   r  rÄ  ÚmaxsizerÆ  r   rÊ  ÚTestCaser   rË  rÔ  rÁ  r
   r
   r
   r   Ú<module>   sF   

           #