a
    äzeù  ã                   @   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 ddlm	Z	m
Z
mZmZmZ edƒZdd„ Zeƒ ZG dd	„ d	ƒZd
d„ Zdd„ ZG dd„ dejƒZedkrªe ¡  dS )z%Test program for the fcntl C module.
é    N)ÚProcess)ÚverboseÚTESTFNÚunlinkÚimport_moduleÚcpython_onlyÚfcntlc               
   C   s
  z
t j W n ty    d} Y n0 d} tj d¡s<tjdkr€t d¡dkrTd}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v 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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.9/test/test_fcntl.pyÚget_lockdata   s2    

ÿÿ
 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 r   r   ©r    r   r   r   Úfileno3   s    zBadFile.filenoN)Ú__name__Ú
__module__Ú__qualname__r!   r#   r   r   r   r   r   0   s   r   c                 C   sJ   t | dƒ}z0zt ||¡ W n ty.   Y n0 W | ¡  n
| ¡  0 d S ©Núwb+)Úopenr   ÚlockfÚBlockingIOErrorÚclose©ZfnameÚcmdÚfr   r   r   Útry_lockf_on_other_process_fail6   s    
r0   c                 C   s0   t | dƒ}t ||¡ t |tj¡ | ¡  d S r'   )r)   r   r*   ÚLOCK_UNr,   r-   r   r   r   Útry_lockf_on_other_process?   s    
r2   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
 e ¡ dkd¡dd„ ƒZe
 e ¡ dkd¡dd„ ƒZedd„ ƒZe
 ejdkd¡dd„ ƒZd S )!Ú	TestFcntlc                 C   s
   d | _ d S r   )r/   r"   r   r   r   ÚsetUpG   s    zTestFcntl.setUpc                 C   s$   | j r| j js| j  ¡  ttƒ d S r   )r/   Úclosedr,   r   r   r"   r   r   r   ÚtearDownJ   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: )r)   r   r/   r   r#   ÚF_SETFLr   Ú
O_NONBLOCKr   r   ÚF_SETLKWr   r   r,   ©r    Úrvr   r   r   Útest_fcntl_filenoO   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 r7   )r)   r   r/   r   r9   r   r:   r   r   r;   r   r   r,   r<   r   r   r   Útest_fcntl_file_descriptorZ   s    
z$TestFcntl.test_fcntl_file_descriptorc                 C   sü   |   t¡" t dtjtj¡ W d   ƒ n1 s20    Y  |   t¡& t tdƒtjtj¡ W d   ƒ n1 sr0    Y  |   t¡" t dtjtj¡ W d   ƒ n1 s®0    Y  |   t¡& t tdƒtjtj¡ W d   ƒ n1 sî0    Y  d S )NéÿÿÿÿÚspam)ÚassertRaisesÚ
ValueErrorr   r9   r   r:   r   Ú	TypeErrorr"   r   r   r   Útest_fcntl_bad_filee   s    040zTestFcntl.test_fcntl_bad_filec                 C   s  ddl m}m} |  t¡& t |d tjtj¡ W d   ƒ n1 sF0    Y  |  t¡* t t	|d ƒtjtj¡ W d   ƒ n1 sŠ0    Y  |  t¡& t |d tjtj¡ W d   ƒ n1 sÊ0    Y  |  t¡* t t	|d ƒtjtj¡ W d   ƒ n1 s0    Y  d S )Nr   )ÚINT_MAXÚINT_MINé   )
Ú	_testcapirF   rG   rB   ÚOverflowErrorr   r9   r   r:   r   )r    rF   rG   r   r   r   Útest_fcntl_bad_file_overflowo   s    484z&TestFcntl.test_fcntl_bad_file_overflowZarmZLinuxz2ARM Linux returns EINVAL for F_NOTIFY DN_MULTISHOTc              	   C   sz   zt j}t j}W n ty,   |  d¡ Y n0 t tj tj 	t
¡¡tj¡}zt   |||¡ W t |¡ nt |¡ 0 d S )Nz$F_NOTIFY or DN_MULTISHOT unavailable)r   ZF_NOTIFYZDN_MULTISHOTr   ZskipTestr   r)   ÚpathÚdirnameÚabspathr   ÚO_RDONLYr,   )r    r.   ÚflagsÚfdr   r   r   Útest_fcntl_64_bit|   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 )Nr(   r@   rA   )r)   r   r/   r#   r   ÚflockÚLOCK_SHr1   ÚLOCK_NBÚLOCK_EXrB   rC   rD   )r    r#   r   r   r   Ú
test_flockŽ   s    
zTestFcntl.test_flockZAIXzAIX returns PermissionErrorc                 C   sh   t tdƒ| _tjtjB }t | j|¡ ttt|fd}| 	¡  | 
¡  t | jtj¡ |  |jd¡ d S ©Nr(   )ÚtargetÚargsr   )r)   r   r/   r   rV   rU   r*   r   r0   ÚstartÚjoinr1   ÚassertEqualÚexitcode©r    r.   Úpr   r   r   Útest_lockf_exclusiveœ   s    zTestFcntl.test_lockf_exclusivec                 C   sh   t tdƒ| _tjtjB }t | j|¡ ttt|fd}| 	¡  | 
¡  t | jtj¡ |  |jd¡ d S rX   )r)   r   r/   r   rT   rU   r*   r   r2   r[   r\   r1   r]   r^   r_   r   r   r   Útest_lockf_share§   s    zTestFcntl.test_lockf_sharec                 C   s&   dd l }|  ttj|jd tj¡ d S )Nr   rH   )rI   rB   rJ   r   rS   rF   rT   )r    rI   r   r   r   Útest_flock_overflow²   s    ÿzTestFcntl.test_flock_overflowr	   z$F_GETPATH is only available on macosc                 C   sL   t tdƒ| _tj t¡ d¡}t | j ¡ tj	t
t|ƒƒ¡}|  ||¡ d S )Nr8   zutf-8)r)   r   r/   r   rL   rN   Úencoder   r#   Z	F_GETPATHÚbytesÚlenr]   )r    ZexpectedÚresr   r   r   Útest_fcntl_f_getpath¸   s    zTestFcntl.test_fcntl_f_getpathN)r$   r%   r&   r4   r6   r>   r?   rE   r   rK   ÚunittestZskipIfr   Úmachiner   ÚsystemrR   rW   ra   rb   rc   r   rh   r   r   r   r   r3   E   s*   

þ





r3   Ú__main__)Ú__doc__r   r   r   r   ri   Úmultiprocessingr   Ztest.supportr   r   r   r   r   r   r   r   r   r0   r2   ZTestCaser3   r$   Úmainr   r   r   r   Ú<module>   s    	{