B
    u9a[  ã               @   sœ   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mZmZm	Z	m
Z
mZmZ edƒZdd„ Zeƒ ZG dd„ dƒZG d	d
„ d
ejƒZdd„ Zedkr˜eƒ  dS )z%Test program for the fcntl C module.
é    N)ÚverboseÚTESTFNÚunlinkÚrun_unittestÚimport_moduleÚcpython_onlyÚfcntlc           
   C   s  y
t j W n tk
r"   d} Y nX d} tj d¡s>tjdkr‚t d¡dkrVd}d}nd}d}t || | d	 d
d
d
t	j
d
¡}nltj d¡r¨t dd
d
d
t	j
d
d
¡}nFtjdkrÎt dt	j
d
d
d
d
d
d
¡}n t d	|  d	 t	j
d
d
d
d
d
¡}|rtrtdt|ƒƒ |S )NZllZqq)ZnetbsdZfreebsdZopenbsdÚdarwinÚlé   ÚiZlxxxxZhhr   ZgnukfreebsdZqqihhi)Zaix3Zaix4zhp-uxBZ	unixware7Zhhllliizstruct.pack: )ÚosÚO_LARGEFILEÚAttributeErrorÚsysÚplatformÚ
startswithÚstructÚcalcsizeÚpackr   ZF_WRLCKr   ÚprintÚrepr)Z	start_lenZoff_tZpid_tÚlockdata© r   ú /usr/lib/python3.7/test_fcntl.pyÚget_lockdata   s.    



 r   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚBadFilec             C   s
   || _ d S )N)Úfn)Úselfr   r   r   r   Ú__init__1   s    zBadFile.__init__c             C   s   | j S )N)r   )r   r   r   r   Úfileno3   s    zBadFile.filenoN)Ú__name__Ú
__module__Ú__qualname__r   r    r   r   r   r   r   0   s   r   c               @   s~   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zedd„ ƒZ	e
 e ¡  d¡oXe ¡ dkd¡dd„ ƒZdd„ Zedd„ ƒZdS )Ú	TestFcntlc             C   s
   d | _ d S )N)Úf)r   r   r   r   ÚsetUp8   s    zTestFcntl.setUpc             C   s$   | j r| j js| j  ¡  ttƒ d S )N)r%   ÚclosedÚcloser   r   )r   r   r   r   ÚtearDown;   s    
zTestFcntl.tearDownc             C   sh   t tdƒ| _t | j ¡ tjtj¡}tr2t	d|ƒ t | j ¡ tj
t¡}trZt	dt|ƒƒ | j ¡  d S )NÚwbz#Status from fcntl with O_NONBLOCK: z!String from fcntl with F_SETLKW: )Úopenr   r%   r   r    ÚF_SETFLr   Ú
O_NONBLOCKr   r   ÚF_SETLKWr   r   r(   )r   Úrvr   r   r   Útest_fcntl_fileno@   s    
zTestFcntl.test_fcntl_filenoc             C   s`   t tdƒ| _t | jtjtj¡}tr.td|ƒ t | jtj	t
¡}trRtdt|ƒƒ | j ¡  d S )Nr*   z#Status from fcntl with O_NONBLOCK: z!String from fcntl with F_SETLKW: )r+   r   r%   r   r,   r   r-   r   r   r.   r   r   r(   )r   r/   r   r   r   Útest_fcntl_file_descriptorK   s    
z$TestFcntl.test_fcntl_file_descriptorc          	   C   s¬   |   t¡ t dtjtj¡ W d Q R X |   t¡ t tdƒtjtj¡ W d Q R X |   t¡ t dtjtj¡ W d Q R X |   t¡ t tdƒtjtj¡ W d Q R X d S )NéÿÿÿÿÚspam)ÚassertRaisesÚ
ValueErrorr   r,   r   r-   r   Ú	TypeError)r   r   r   r   Útest_fcntl_bad_fileV   s     zTestFcntl.test_fcntl_bad_filec          	   C   sÌ   ddl m}m} |  t¡ t |d tjtj¡ W d Q R X |  t¡  t t	|d ƒtjtj¡ W d Q R X |  t¡ t |d tjtj¡ W d Q R X |  t¡  t t	|d ƒtjtj¡ W d Q R X d S )Nr   )ÚINT_MAXÚINT_MINé   )
Ú	_testcapir8   r9   r4   ÚOverflowErrorr   r,   r   r-   r   )r   r8   r9   r   r   r   Útest_fcntl_bad_file_overflow`   s     $ z&TestFcntl.test_fcntl_bad_file_overflowZarmZLinuxz2ARM Linux returns EINVAL for F_NOTIFY DN_MULTISHOTc          	   C   sr   yt j}t j}W n tk
r.   |  d¡ Y nX t tj tj 	t
¡¡tj¡}zt   |||¡ W d t |¡ X d S )Nz$F_NOTIFY or DN_MULTISHOT unavailable)r   ZF_NOTIFYZDN_MULTISHOTr   ZskipTestr   r+   ÚpathÚdirnameÚabspathr   ÚO_RDONLYr(   )r   ÚcmdÚflagsÚfdr   r   r   Útest_fcntl_64_bitm   s    
zTestFcntl.test_fcntl_64_bitc             C   s    t tdƒ| _| j ¡ }t |tj¡ t |tj¡ t | jtjtjB ¡ t | jtj¡ t |tj	¡ t |tj¡ |  
ttjdtj¡ |  
ttjdtj¡ d S )Nzwb+r2   r3   )r+   r   r%   r    r   ÚflockÚLOCK_SHZLOCK_UNZLOCK_NBZLOCK_EXr4   r5   r6   )r   r    r   r   r   Ú
test_flock   s    
zTestFcntl.test_flockc             C   s&   dd l }|  ttj|jd tj¡ d S )Nr   r:   )r;   r4   r<   r   rF   r8   rG   )r   r;   r   r   r   Útest_flock_overflow   s    zTestFcntl.test_flock_overflowN)r!   r"   r#   r&   r)   r0   r1   r7   r   r=   ÚunittestZskipIfr   Úmachiner   ÚsystemrE   rH   rI   r   r   r   r   r$   6   s   
r$   c               C   s   t tƒ d S )N)r   r$   r   r   r   r   Ú	test_main”   s    rM   Ú__main__)Ú__doc__r   r   r   r   rJ   Ztest.supportr   r   r   r   r   r   r   r   r   r   ZTestCaser$   rM   r!   r   r   r   r   Ú<module>   s    ^