a
    äzeÆ'  ã                   @   s8  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m	Z	m
Z
mZmZ ddlmZ ddlmZ ddlZddlZdZe	d ZG dd	„ d	ƒZG d
d„ deƒZdd„ ZG dd„ deejƒZe eedƒ d¡G dd„ deejƒƒZdd„ ZG dd„ deejƒZG dd„ deejƒZdd„ Ze dkr4e !¡  dS )z9Test largefile support on system where this makes sense.
é    N)ÚTESTFNÚrequiresÚunlinkÚ
bigmemtest)ÚSHORT_TIMEOUT)Úsocket_helperl    y* Ú2c                   @   s    e Zd Zdd„ Zedd„ ƒZdS )ÚLargeFileTestc                 C   sÎ   t j t¡rd}nd}|  t|¡˜}t  | ¡ ¡tj }|t	d krTW d   ƒ d S |dkrf| 
d¡ | d¡ | t	¡ | 
d¡ | ¡  |  t  | ¡ ¡tj t	d ¡ W d   ƒ n1 sÀ0    Y  d S )Núr+bzw+bé   r   ó   zó   a)ÚosÚpathÚexistsr   ÚopenÚfstatÚfilenoÚstatÚST_SIZEÚsizeÚwriteÚseekÚflushÚassertEqual)ÚselfÚmodeÚfZcurrent_size© r   ú)/usr/lib/python3.9/test/test_largefile.pyÚsetUp   s    



zLargeFileTest.setUpc                 C   sV   |   td¡ W d   ƒ n1 s"0    Y  t t¡tj dksJ|  d¡‚ttƒ d S )NÚwbr   z0File was not truncated by opening with mode "wb")r   r   r   r   r   ZfailureExceptionr   ÚTESTFN2)Úclsr   r   r   ÚtearDownClass,   s
    
zLargeFileTest.tearDownClassN)Ú__name__Ú
__module__Ú__qualname__r    Úclassmethodr$   r   r   r   r   r	      s   r	   c                   @   sN   e Zd ZdZeeddddd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestFileMethodszWTest that each file function works as expected for large
    (i.e. > 2 GiB) files.
    é   F)r   ZmemuseÚdry_runc                 C   s\   |   td¡<}|  t| ¡ ƒtd ¡ |  | ¡ td ¡ W d   ƒ n1 sN0    Y  d S )NÚrbr   )r   r   r   ÚlenÚreadr   Útell)r   Ú_sizer   r   r   r   Útest_large_read=   s    zTestFileMethods.test_large_readc                 C   s    |   t t¡tj td ¡ d S )Nr   )r   r   r   r   r   r   ©r   r   r   r   Útest_osstatD   s    zTestFileMethods.test_osstatc                 C   sÔ  |   td¡°}|  | ¡ d¡ |  | d¡d¡ |  | ¡ d¡ | d¡ |  | ¡ d¡ | dd¡ |  | ¡ d¡ | d¡ |  | ¡ d¡ | dd¡ |  | ¡ d¡ | dd¡ |  | ¡ d¡ | dd¡ |  | ¡ d¡ | dd¡ |  | ¡ td d ¡ | dd¡ |  | ¡ td d	 ¡ | t d d¡ |  | ¡ d¡ | t¡ |  | ¡ t¡ |  | d¡d
¡ | t d d¡ |  | d¡d¡ |  | ¡ d¡ W d   ƒ n1 sÆ0    Y  d S )Nr,   r   r   r   é*   éT   r*   éöÿÿÿé
   r   )r   r   r   r/   r.   r   r   ©r   r   r   r   r   Útest_seek_readG   s8    


zTestFileMethods.test_seek_readc                 C   s,  |   td¡}|  t | ¡ dd¡d¡ |  t | ¡ dd¡d¡ |  t | ¡ dd¡d¡ |  t | ¡ dd¡d¡ |  t | ¡ dd¡td d ¡ |  t | ¡ dd¡td d ¡ |  t | ¡ t d d¡d¡ |  t | ¡ td¡t¡ |  | d¡d	¡ W d   ƒ n1 s0    Y  d S )
Nr,   r   r4   r   r5   r*   r6   r7   r   )r   r   r   r   Úlseekr   r   r.   r8   r   r   r   Ú
test_lseekf   s    "" zTestFileMethods.test_lseekc                 C   s8  |   td¡}t|dƒs$t d¡‚| dd¡ |  | ¡ td ¡ td }| |¡ | 	¡  |  | ¡ |¡ | dd¡ |  | ¡ |¡ |d8 }| d¡ | 	|¡ |  | ¡ d¡ | dd¡ |  | ¡ |¡ | d¡ | 	d¡ |  | ¡ d¡ | d¡ |  t
| ¡ ƒd¡ W d   ƒ n1 s*0    Y  d S )	Nr
   Útruncatez.open().truncate() not available on this systemr   r*   r   r7   r4   )r   r   ÚhasattrÚunittestÚSkipTestr   r   r/   r   r<   r-   r.   )r   r   Znewsizer   r   r   Útest_truncates   s,    







zTestFileMethods.test_truncatec              	   C   sR   dD ]H}|   td¡(}| |¡ |  | ¡ ¡ W d   ƒ q1 sB0    Y  qd S )N)iÿÿÿl        ì       r,   )r   r   r   Z
assertTrueÚseekable)r   Úposr   r   r   r   Útest_seekable’   s    
zTestFileMethods.test_seekableN)r%   r&   r'   Ú__doc__r   r   r1   r3   r9   r;   r@   rD   r   r   r   r   r)   6   s   
r)   c                    s   ‡ ‡fdd„}|S )Nc                    s   ‡ ‡‡fdd„}|S )Nc                     sH   t  tj ˆ¡¡jˆk r:tˆd d ƒ}t d|› d¡‚ˆ | i |¤ŽS )Ni   z	required z MiB of free disk space)	ÚshutilÚ
disk_usager   r   ÚrealpathÚfreeÚintr>   r?   )ÚargsÚkwargsZhsize)Úfunr   Úrequiredr   r   Úwrapper   s    
ÿz6skip_no_disk_space.<locals>.decorator.<locals>.wrapperr   )rM   rO   ©r   rN   )rM   r   Ú	decoratorœ   s    z%skip_no_disk_space.<locals>.decoratorr   )r   rN   rQ   r   rP   r   Úskip_no_disk_space›   s    rR   c                   @   s,   e Zd ZeejƒZeeed ƒdd„ ƒZ	dS )ÚTestCopyfileç      @c                 C   sŠ   t j t¡}t tt¡ |  t j t¡|¡ ttdƒ@}|  | 	d¡d¡ | 
|d ¡ |  | 	¡ d¡ W d   ƒ n1 s|0    Y  d S )Nr,   é   ó   z    ó       a)r   r   Úgetsizer   rF   Úcopyfiler"   r   r   r.   r   )r   r   r   r   r   r   Útest_it¬   s    zTestCopyfile.test_itN)
r%   r&   r'   ÚstaticmethodÚior   rR   r   r   rZ   r   r   r   r   rS   §   s   
rS   Úsendfilezsendfile not supportedc                       sT   e Zd ZeejƒZeZ‡ fdd„Z‡ fdd„Z	dd„ Z
eeed ƒdd	„ ƒZ‡  ZS )
ÚTestSocketSendfilec                    s   t ƒ  ¡  d | _d S ©N)Úsuperr    Úthreadr2   ©Ú	__class__r   r   r    ¾   s    
zTestSocketSendfile.setUpc                    s,   t ƒ  ¡  | jd ur(| j | j¡ d | _d S r_   )r`   ÚtearDownra   ÚjoinÚtimeoutr2   rb   r   r   rd   Â   s    

zTestSocketSendfile.tearDownc                    sJ   ‡ ‡fdd„}t  ¡ ‰ | ˆj¡ t j||fdˆ_ˆj ¡  ˆ  ¡  d S )Nc              
      sÜ   | Ä |   ¡ \}}| ˆj¡ |ˆ ttdƒ^}ˆ  ˆj¡ | d¡}|srW d   ƒ W d   ƒ W d   ƒ d S | |¡ q<W d   ƒ n1 s’0    Y  W d   ƒ n1 s°0    Y  W d   ƒ n1 sÎ0    Y  d S )Nr!   i   )ÚacceptÚ
settimeoutrf   r   r"   ÚwaitÚrecvr   )ÚsockÚconnÚ_r   Úchunk©Úeventr   r   r   ÚrunÉ   s    
(z*TestSocketSendfile.tcp_server.<locals>.run)ÚtargetrK   )Ú	threadingÚEventrh   rf   ÚThreadra   ÚstartÚset)r   rk   rq   r   ro   r   Ú
tcp_serverÈ   s    
zTestSocketSendfile.tcp_serverrT   c              
   C   s*  t  ¡ }t d|f¡|}|  |¡ t d|f¡D}ttdƒ}| |¡ W d   ƒ n1 s\0    Y  W d   ƒ n1 sz0    Y  W d   ƒ n1 s˜0    Y  |  	¡  t
j t¡}|  t
j t¡|¡ ttdƒ@}|  | d¡d¡ | |d ¡ |  | ¡ d¡ W d   ƒ n1 s0    Y  d S )NÚ z	127.0.0.1r,   rU   rV   rW   )r   Zfind_unused_portÚsocketÚcreate_serverrx   Úcreate_connectionr   r   r]   rd   r   r   rX   r   r"   r.   r   )r   Úportrk   Úclientr   r   r   r   r   rZ   Ý   s    
dzTestSocketSendfile.test_it)r%   r&   r'   r[   r\   r   r   rf   r    rd   rx   rR   r   r   rZ   Ú__classcell__r   r   rb   r   r^   ¹   s   
r^   c               	   C   sà   zdd l } |   | j| j¡ W n ttfy2   Y n0 tjd d… dksPtjdkrdtddtt	ƒ ƒ nxt
tddd}zVz | d	¡ | d
¡ | ¡  W n  ttfy´   t d¡‚Y n0 W | ¡  ttƒ n| ¡  ttƒ 0 d S )Nr   é   ÚwinÚdarwinZ	largefilez-test requires %s bytes and a long time to runr!   )Ú	bufferingrA   ó   xz*filesystem does not have largefile support)ÚsignalÚSIGXFSZÚSIG_IGNÚImportErrorÚAttributeErrorÚsysÚplatformr   Ústrr   r   r   r   r   r   ÚOSErrorÚOverflowErrorr>   r?   Úcloser   )r…   r   r   r   r   ÚsetUpModuleï   s(    
ÿ


ÿr   c                   @   s   e Zd ZeejƒZdS )ÚCLargeFileTestN)r%   r&   r'   r[   r\   r   r   r   r   r   r‘     s   r‘   c                   @   s   e Zd ZeejƒZdS )ÚPyLargeFileTestN)r%   r&   r'   r[   Úpyior   r   r   r   r   r’     s   r’   c                   C   s   t tƒ t tƒ d S r_   )r   r   r"   r   r   r   r   ÚtearDownModule  s    r”   Ú__main__)"rE   r   r   rŠ   r>   rz   rF   rs   Ztest.supportr   r   r   r   r   r   r\   Z_pyior“   r   r"   r	   r)   rR   ZTestCaserS   ZskipIfr=   r^   r   r‘   r’   r”   r%   Úmainr   r   r   r   Ú<module>   s4    e5$
