B
    u9a;õ  ã               @   sð   d dl mZ d dlmZ e d¡Zd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZ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 )é    )Ú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
   ú /usr/lib/python3.7/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 )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   r3   Ú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 )Nr4   r   )r   r:   r5   r6   r7   )r   Z	group_idsr8   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   r3   Ú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   r3   r/   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>   rB   )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:   r/   r   rB   )r   rC   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 )Nr4   Zfoor   zneed a pwd entryé   z+Expected OSError to be raised by initgroups)r/   r0   r   rF   ÚobjectÚosr+   ÚpwdÚgetpwuidÚpw_nameÚKeyErrorÚunittestÚSkipTestr   r5   r   ÚEPERMÚfail)r   r1   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   rS   rI   Ú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   rT   r   rW   ÚfilenorS   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   rZ   rX   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)rI   r   ÚsysÚ
executableÚO_RDONLYrc   ÚchdirÚpathÚsplitr   rb   Úenvironr5   rd   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-cre   )rI   rc   ri   rj   rk   rf   rg   r   rb   rl   ro   ÚP_PIDÚWEXITEDr5   Úsi_pid)r   rm   Ú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 )Nr4   r
   r
   r
   r
   r   rv   à   rw   )ry   r{   c               S   s   d S )Nr
   r
   r
   r
   r   rv   ã   rw   Ú )ry   rz   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/   r0   rI   Ú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   é   )rI   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   esrx   r-   s   te)rI   r   r   r   ÚO_RDWRrƒ   r\   r„   r…   r5   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>)é   r4   rx   r4   é
   s   t1tt2s   t3ts   5t)rI   r   r   r   r‹   rƒ   r\   r5   r   rŽ   Úlistr   )r   rˆ   Úbufr
   r
   r   Útest_preadv#  s    zPosixTester.test_preadvÚ	RWF_HIPRIztest needs posix.RWF_HIPRIc          
   C   sÚ   t  tjt jt jB ¡}z²yNt  |d¡ dd„ dD ƒ}|  t 	||dt j
¡d¡ |  ddd	gt|ƒ¡ W n^ tk
r„   |  d
¡ Y nB tk
rÄ } z$|jtjtjhkr²t d¡‚n‚ W d d }~X Y nX 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“   r4   rx   r4   r”   s   t1tt2s   t3ts   5tzpreadv2 not availablez0RWF_HIPRI is not supported by the current system)rI   r   r   r   r‹   rƒ   r\   r5   r   rŽ   r˜   r•   ÚNotImplementedErrorÚskipTestr   r   ÚEINVALZENOTSUPrN   rO   r   )r   rˆ   r–   Úinstr
   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   ó    )rI   r   r   r   r‹   rƒ   r   r/   r   rŽ   r5   Ú	exceptionr   r›   Úbytesr   )r   rˆ   r–   Úcmr
   r
   r   Útest_preadv_overflow_32bitsD  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   )rI   r   r   r   r‹   rƒ   r\   r„   r…   r   r£   r5   rŒ   r   )r   rˆ   r
   r
   r   Útest_pwriteQ  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   t3rx   r”   s   xxtest1tt2t3éd   )rI   r   r   r   r‹   rƒ   r\   r„   r…   r¥   r5   r   rŒ   r   )r   rˆ   Únr
   r
   r   Útest_pwritev\  s    zPosixTester.test_pwritevzos.RWF_SYNCztest needs os.RWF_SYNCc          	   C   s   t  tjt jt jB ¡}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   t3rx   r”   s
   xxtest1tt2r¦   )rI   r   r   r   r‹   rƒ   r\   r„   r…   r¥   ÚRWF_SYNCr5   r   rŒ   r   )r   rˆ   r§   r
   r
   r   Útest_pwritev_flagsj  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   )rI   r   r   r   r‹   rƒ   r/   r   r¥   r5   rŸ   r   r›   r   )r   rˆ   r¡   r
   r
   r   Útest_pwritev_overflow_32bitsy  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)rI   r   r   r   r‚   rƒ   r   r­   r   r   r›   rf   ÚplatformÚ
startswithrN   rO   r   )r   rˆ   rœ   r
   r
   r   Útest_posix_fallocate„  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   )	rI   r   r   r   rh   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)ÚtimerI   r   r   r   rh   r   Úutimer/   r0   Ú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/   r0   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)rI   r   r   r   r‹   rƒ   rÂ   r5   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 €  )rI   r   r   r   r‹   rƒ   r/   r   rÂ   r5   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“   r4   rx   r”   s   test1s   tt2s   t3c             S   s   g | ]}t |ƒ‘qS r
   )r    )r   r‘   r
   r
   r   r’   ü  s    )rI   r   r   r   r‹   rƒ   r\   r„   r…   r5   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ž   )rI   r   r   r   r‹   rƒ   r   r/   r   rÆ   r5   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É   rX   ÚassertIsInstancer¼   rI   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)r/   r½   r   rÌ   r5   r6   )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Ï   rX   r   )r   Úfp1Úfp2r
   r
   r   Ú	test_dup2(  s    

zPosixTester.test_dup2Ú	O_CLOEXECzneeds os.O_CLOEXECrx   é   é   c             C   s8   t  tjt jt jB ¡}|  t j|¡ |  t  	|¡¡ d S )N)
rI   r   r   r   rh   rÓ   Ú
addCleanupr   ÚassertFalseÚget_inheritable)r   rˆ   r
   r
   r   Útest_oscloexec3  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)rI   r   r   r   r‚   rÚ   rƒ   r/   r   Ú
O_NONBLOCKr   r   r   rÛ   )r   rˆ   r
   r
   r   Útest_osexlock:  s    

zPosixTester.test_osexlockrÛ   ztest needs posix.O_SHLOCKc             C   s¢   t  tjt jt jB t jB ¡}t  tjt jt jB t jB ¡}t  |¡ t  |¡ tt	dƒržt  tjt jt jB t jB ¡}|  
tt jtjt jt jB t jB ¡ t  |¡ d S )NrÚ   )rI   r   r   r   r‚   rÛ   rƒ   r   r   r   r/   r   rh   rÚ   rÜ   )r   Zfd1Zfd2rˆ   r
   r
   r   Útest_osshlockJ  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   rT   r   rß   rX   ÚstatÚassertRaisesRegexr0   Úfloatr   )r   r   r
   r
   r   Ú
test_fstat[  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)rT   r   rà   r   r   rI   ÚfsencodeZassertWarnsRegexÚDeprecationWarningr   rá   r0   r•   )r   r
   r
   r   Ú	test_stati  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ÚPermissionErrorrš   rT   ÚS_ISFIFOÚst_mode)r   r	   r
   r
   r   Útest_mkfifo|  s     zPosixTester.test_mkfifoÚmknodÚS_IFIFOzdon't have mknod()/S_IFIFOc          
   C   sð   t  t j¡ tjtjB tjB }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   )rj   ÚmodeZdeviceÚdir_fd)r   r   r   rà   rï   rè   ré   r   rî   r   ÚassertInr   rP   r›   ÚEACCESrT   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¼   r7   Úmajorr5   r/   r0   râ   r½   ÚOverflowErrorÚminorrf   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 )Nc                s0   ˆd k	r,ˆˆ ƒ}ˆ  |j| ¡ ˆ  |j|¡ d S )N)r5   Ú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-UXZSunOSz1Skipping because of non-standard chown() behavior)rI   r+   r&   r°   ÚsystemrN   rO   r/   r   r'   Ústrrâ   r0   )	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à   )rI   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ß   )rI   r   r   r   r   rX   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)
rI   r   r   r   ÚsymlinkÚ_DUMMY_SYMLINKr  r   r  r.   )r   r
   r
   r   Útest_lchown  s    zPosixTester.test_lchownri   ztest needs posix.chdir()c             C   s"   t  tj¡ |  tt jtj¡ d S )N)r   ri   rI   rU   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   ÚlistdirrI   rU   )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ò   rI   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ò   rI   rä   r   r   ZassertIsÚtyper    )r   ÚclsÚnamesr1   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   rh   rÖ   r   r5   Úsortedr  )r   Úfr
   r
   r   Útest_listdir_fd5  s    zPosixTester.test_listdir_fdÚaccessztest needs posix.access()c             C   s   |   t tjtj¡¡ d S )N)rT   r   r   r   r   rI   ÚR_OK)r   r
   r
   r   Útest_accessD  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_umaskH  s    
zPosixTester.test_umaskÚstrerrorztest needs posix.strerror()c             C   s   |   t d¡¡ d S )Nr   )rT   r   r%  )r   r
   r
   r   Útest_strerrorN  s    zPosixTester.test_strerrorÚpipeztest needs posix.pipe()c             C   s$   t  ¡ \}}t |¡ t |¡ d S )N)r   r'  rI   r   )r   ÚreaderÚwriterr
   r
   r   Ú	test_pipeS  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/   r0   rI   r+  r   rÓ   rÜ   rÖ   r×   rØ   Úget_blockingr   rŒ   r\   r   ZPIPE_MAX_SIZE)r   Úrr`   r
   r
   r   Ú
test_pipe2Y  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ø   rI   r+  ZINT_MAXZUINT_MAX)r   r0  r
   r
   r   Útest_pipe2_c_limitsu  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/   r0   r¼   )r   r¾   r
   r
   r   Ú
test_utime~  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+)rI   rà   rT   r   r3  ÚUF_IMMUTABLEr   r   Ú
EOPNOTSUPPrš   r5   r   rP   r   Úchflags)r   Zchflags_funcZtarget_fileÚkwargsrú   ÚflagsÚerrru   Znew_strˆ   r	   r
   r
   r   Ú_test_chflags_regular_fileˆ  s$    

&z&PosixTester._test_chflags_regular_filer6  ztest needs os.chflags()c             C   s   |   tjtj¡ d S )N)r:  r   r6  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   r6  )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 )Nr3  c             S   s   t j| |ddS )NF)rÀ   )r   r6  )rj   r8  r
   r
   r   Úchflags_nofollow³  s    z;PosixTester.test_lchflags_symlink.<locals>.chflags_nofollowz2chflag UF_IMMUTABLE not supported by underlying fs)rI   rà   r   r   rT   r   r  r  r   Úappendr  r   r<  r3  r4  r   r   r5  rš   r5   )
r   Z	testfn_stZdummy_symlink_str>  Úfnr8  r9  ru   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)	rI   r1   r  r    r   rl   Úitemsr5   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½   rI   rG  )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..)rI   ÚmkdirrN   rO   ri   r   r6   Úrmdir)ÚdirnameZcurrent_path_length)Ú_create_and_do_getcwdr
   r   rL  ñ  s    

zEPosixTester.test_getcwd_long_pathnames.<locals>._create_and_do_getcwd)	rI   r   rj   Úabspathr   r   rI  ri   Úrmtree)r   rK  rU   Ú	base_pathr
   )rL  r   Útest_getcwd_long_pathnamesâ  s    
 
z&PosixTester.test_getcwd_long_pathnamesÚgetgrouplistztest needs posix.getgrouplist()rK   ztest needs pwd.getpwuid()r+   ztest needs os.getuid()c             C   s<   t  t ¡ ¡d }t  t ¡ ¡d }|  |t ||¡¡ d S )Nr   r4   )rJ   rK   rI   r+   rò   r   rQ  )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   rV     s    r  rx   )r”   rÔ   z$getgroups(2) is broken prior to 10.6)rI   ÚpopenrŒ   Ústripr   Úsetrk   r½   rN   rO   rf   r°   Ú	sysconfigZget_config_varÚtupleÚsymmetric_differencer   r'   rT   r$   )r   ZidgÚgroupsÚretZ
idg_groupsr[  ZdtZsymdiffr
   r
   r   Útest_getgroups  s     

$
zPosixTester.test_getgroupsz)test needs dir_fd support for os.access()c          	   C   sB   t  t  ¡ t j¡}z|  t jtjtj	|d¡ W d t  
|¡ X d S )N)rñ   )r   r   r   rh   rT   r   r   r   rI   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   )rI   Úchmodr   r   rà   rè   r   r   r   rh   ré   r5   ÚS_IRWXUr   )r   r  Úsr
   r
   r   Útest_chmod_dir_fd4  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   rh   r  rI   r+   r&   r   )r   r  r
   r
   r   Útest_chown_dir_fdA  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   r\   r   r   rh   rà   r5   rá   r0   râ   r/   rø   r   )r   Úoutfiler  Ús1Ús2r
   r
   r   Útest_stat_dir_fdL  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   rh   rº   r»   r   r   r/   r0   r¼   rI   Úsupports_follow_symlinksr½   r   )r   r  r¾   r
   r
   r   Útest_utime_dir_fdb  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   rh   rn  r   r   rê   rš   r5   rà   r   r   )r   r  r	   r
   r
   r   Útest_link_dir_fd€  s     
zPosixTester.test_link_dir_fdz'test needs dir_fd support in os.mkdir()c          
   C   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   rh   rI  r   r   rà   r   rN  )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   rh   rî   r   rò   r   rP   r›   ró   rT   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   r\   r   r   rh   rŒ   Údecoder5   r   )r   rg  ÚaÚbrs   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 )Nrn  )rñ   )rI   r  r   r   r   r   r   rh   r5   Ú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)ro  rp  )r   r   r   r  r   r   r   rh   Ú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 )Nrn  )rñ   )r   r   r   rh   r  r   r   r5   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ñ   rn  )r   r   r   rh   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   rh   rç   rà   rè   ré   rê   rš   rT   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 )NrW  iéÿÿÿ)r   ÚSCHED_RRÚsched_get_priority_minr†  rÊ   r¼   r7   rf   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   r1   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__rC  r   rò   rI   r*   r   r   rP   r/   Úsched_getparamrÊ   r  r¼   rf   r°   r±   Úsched_setschedulerÚsched_setparamr0   Ú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â   r7   Ú
assertLess)r   Úintervalr	   r
   r
   r   Útest_sched_rr_get_interval>  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Ê   rZ  r7   r6   r/   r   r¼   r–  )r   ÚmaskZcpur
   r
   r   Útest_sched_getaffinityM  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™  r6   Úpopr„  r5   r/   r   r½   rø   )r   rš  r
   r
   r   Útest_sched_setaffinityX  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_constantse  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]   ÚtellrX   Úranger5   rI   r„   Ú	SEEK_DATAZassertLessEqualr¤  r/   r   rN   rO   )r   r   rÃ   Zfnor‘   r
   r
   r   Útest_fs_holesl  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 )N)r}  Úreplacern  Znoodly2Zdoesnotexistfilenamez'doesnotexistfilename' -> '{}'z#No valid path_error2() test for os.)	r.   rI   r   r   r   rò   Úformatr  rQ   )r   r1   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½   rI   r   r‚   rƒ   r   r×   rj   ÚexistsrI  rà   )r   r@  Ú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®  )rI   rä   r   r   rÖ   r   r/   r½   r   r‚   rƒ   r   r×   rj   r¯  rI  rà   )r   r@  r°  rˆ   r
   r
   r   Útest_path_with_null_byte«  s    
"z$PosixTester.test_path_with_null_byte)…Ú__name__Ú
__module__Ú__qualname__r   r   r2   rN   Ú
skipUnlessr   r   r9   r;   r@   rA   rD   rE   rR   rV   rY   r^   ra   r.   rI   Úsupports_fdrn   rt   r   r‰   r   r—   r   Úrequires_32br¢   r¤   r¨   rª   r¬   r²   r´   r·   r¸   r»   r¿   rl  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_onlyr1  r2  r:  r;  r=  rA  rF  rH  rP  rJ   rT  r`  r   Úsupports_dir_fdra  rb  re  r  rf  rj  rm  rn  rq  rI  rs  rî   rt  r   rz  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.getgroupsrW  zgetgroups(2) is broken on OSX)	r   r+   rN   rO   r   rf   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Ú	setgroupsrF   r   )	r   r   r½  r¼  rJ   rK   r+   rL   rF   )r   r1   r
   r
   r   r   È  s
    

zPosixGroupsTester.tearDownrF   ztest needs posix.initgroups()c             C   sD   t | jpdgƒd }t t ¡ ¡j}t ||¡ |  |t 	¡ ¡ d S )Nr   r-   )
Úmaxr¼  rJ   rK   r   r+   rL   rF   rò   r'   )r   rU  r1   r
   r
   r   rR   Ï  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   r^  r
   r
   r   Útest_setgroupsÙ  s    
z PosixGroupsTester.test_setgroupsN)r³  r´  rµ  r   r   rN   r¶  r   r   rR   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__)r[   r   Ztest.support.script_helperr   Úimport_moduler   r   rf   rº   rI   r°   rJ   rà   ZtempfilerN   r   rj   ÚjoinZ
gettempdirr   r  r¶  Úmaxsizer¸  r   rº  ZTestCaser   r»  rÁ  r³  r
   r
   r
   r   Ú<module>   sD   

           "#