U
    ½mœd|  ã                   @   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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mZ ddlZG d	d
„ d
e
ƒZe	 ejjdk d¡G dd„ de
ƒƒZe	 ejjdk d¡ejjG dd„ de
ƒƒƒZG dd„ de
ƒZG dd„ de
ƒZe	 ejjdk d¡G dd„ de
ƒƒZe	 ejjdk d¡G dd„ de
ƒƒZ G dd„ de
ƒZ!G dd„ de
ƒZ"e	 e d ¡G d!d"„ d"e
ƒƒZ#G d#d$„ d$e
ƒZ$G d%d&„ d&e
ƒZ%G d'd(„ d(e
ƒZ&G d)d*„ d*e
ƒZ'G d+d,„ d,e
ƒZ(G d-d.„ d.e
ƒZ)G d/d0„ d0e
ƒZ*G d1d2„ d2e
ƒZ+ejj,G d3d4„ d4ƒƒZ-e	 ejjdk d¡G d5d6„ d6e
ƒƒZ.ejj/ejjd7k o€ejjdd… d8kp€ejjd d9k d:d;ejj/d<ej0kd=d;G d>d?„ d?ƒƒƒZ1d@dA„ Z2dS )Bz`
    File object test module.

    Tests all aspects of File objects, including their creation.
é    Né   )ÚutÚTestCaseÚUNICODE_FILENAMESÚclosed_tempfile)Ú
direct_vfd)ÚFileé   )Úh5c                   @   sP   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestFileOpenz=
        Feature: Opening files with Python-style modes.
    c              
   C   sÚ   |   ¡ }t t¡ t|ƒ W 5 Q R X W 5 Q R X t|dƒ W 5 Q R X t |tj¡ z0t|ƒ}|  
|¡ |  |jd¡ W 5 Q R X W 5 t |tj	¡ X t|dƒ}| d¡ W 5 Q R X |  t¡ t|ƒ W 5 Q R X dS )z8 Default semantics in the presence or absence of a file ÚwÚrÚwbó    N)ÚmktempÚpytestÚraisesÚFileNotFoundErrorr   ÚosÚchmodÚstatÚS_IREADÚS_IWRITEÚ
assertTrueÚassertEqualÚmodeÚopenÚwriteÚassertRaisesÚOSError©ÚselfÚfnameÚf© r$   úM/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/h5py/tests/test_file.pyÚtest_default&   s     



zTestFileOpen.test_defaultc                 C   sP   |   ¡ }t|dƒ}|  |¡ | d¡ | ¡  t|dƒ}|  d|¡ | ¡  dS )z' Mode 'w' opens file in overwrite mode r   ÚfooN)r   r   r   Úcreate_groupÚcloseZassertNotIn©r!   r"   Úfidr$   r$   r%   Útest_create@   s    



zTestFileOpen.test_createc              	   C   sH   |   ¡ }t|dƒ}|  |¡ | ¡  |  t¡ t|dƒ W 5 Q R X dS )z( Mode 'w-' opens file in exclusive mode úw-N)r   r   r   r)   r   ÚFileExistsErrorr*   r$   r$   r%   Útest_create_exclusiveK   s    

z"TestFileOpen.test_create_exclusivec                 C   sÌ   |   ¡ }t|dƒ}z$|  |¡ | d¡ d|ks4t‚W 5 | ¡  X t|dƒ}z&d|ksZt‚| d¡ d|kspt‚W 5 | ¡  X t |tj	¡ z$t t¡ t|dƒ W 5 Q R X W 5 t |tj	tj
B ¡ X dS )zE Mode 'a' opens file in append/readwrite mode, creating if necessary Úar'   ÚbarN)r   r   r)   r   r(   ÚAssertionErrorr   r   r   r   r   r   r   ÚPermissionErrorr*   r$   r$   r%   Útest_appendT   s$    






zTestFileOpen.test_appendc              	   C   sd   |   ¡ }t|dƒ}| ¡  |  |¡ t|dƒ}|  |¡ |  t¡ | d¡ W 5 Q R X | ¡  dS )z& Mode 'r' opens file in readonly mode r   r   r'   N)r   r   r)   ÚassertFalser   r   Ú
ValueErrorr(   r*   r$   r$   r%   Útest_readonlyn   s    



zTestFileOpen.test_readonlyc                 C   s\   |   ¡ }t|dƒ}| d¡ | ¡  t|dƒ}d|ks:t‚| d¡ d|ksPt‚| ¡  dS )z1 Mode 'r+' opens existing file in readwrite mode r   r'   úr+r1   N)r   r   r(   r)   r2   r*   r$   r$   r%   Útest_readwritez   s    



zTestFileOpen.test_readwritec              	   C   sL   |   ¡ }|  t¡ t|dƒ W 5 Q R X |  t¡ t|dƒ W 5 Q R X dS )z( Modes 'r' and 'r+' do not create files r   r8   N)r   r   r   r   ©r!   r"   r$   r$   r%   Útest_nonexistent_file†   s
    z"TestFileOpen.test_nonexistent_filec              	   C   s(   |   t¡ t|  ¡ dƒ W 5 Q R X dS )z  Invalid modes raise ValueError ZmongooseN)r   r6   r   r   )r!   r$   r$   r%   Útest_invalid_modeŽ   s    zTestFileOpen.test_invalid_modeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r,   r/   r4   r7   r9   r;   r<   r$   r$   r$   r%   r       s   	r   )r   é
   r   zRequires HDF5 1.10.1 or laterc                   @   s   e Zd ZdZdd„ ZdS )ÚTestSpaceStrategyzE
        Feature: Create file with specified file space strategy
    c              	   C   s  |   ¡ }t|ddddd}|  |¡ |  t¡ t|ddd W 5 Q R X |  t¡ t|   ¡ ddd W 5 Q R X |jd	d
dd}d|d< |jdd
dd}d|d< |d	= | ¡  t|dƒ}|j ¡ }| 	¡ }|d dksÚt
‚|d dksêt
‚|d dksút
‚|jdd
dd}d|d< | ¡  dS )z& Create file with file space strategy r   ÚpageTéd   )Úfs_strategyZ
fs_persistZfs_thresholdr0   )rE   Úinvalidr'   )rD   Zuint8)Zdtyper   .r1   r   r	   Zfoo2N)r   r   r   r   r6   Zcreate_datasetr)   ÚidZget_create_plistZget_file_space_strategyr2   )r!   r"   r+   ZdsetÚplistZfs_stratr$   r$   r%   Útest_create_with_space_strategyœ   s2     ÿ


z1TestSpaceStrategy.test_create_with_space_strategyN)r=   r>   r?   r@   rI   r$   r$   r$   r%   rB   ”   s   rB   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestPageBufferingz)
        Feature: Use page buffering
    c              	   C   s˜   |   ¡ }t|dddd W 5 Q R X |  t¡ t|ddd W 5 Q R X |  t¡ t|dddd W 5 Q R X |  t¡ t|dddd W 5 Q R X dS )	z;Allow page buffering only with fs_strategy="page".
        r   rC   é @  )r   rE   Úpage_buf_size©r   rL   ZfsmZ	aggregateN©r   r   r   r   r:   r$   r$   r%   Útest_only_with_page_strategyÄ   s    
z.TestPageBuffering.test_only_with_page_strategyc              	   C   sX   |   ¡ }d}d}d}t|dd|||d&}|j ¡ }|  | ¡ |||f¡ W 5 Q R X dS )zHVerify set page buffer size, and minimum meta and raw eviction criteria.rK   é   éC   r   rC   )r   rE   rL   Zmin_meta_keepZmin_raw_keepN©r   r   rG   Úget_access_plistr   Zget_page_buffer_size)r!   r"   ÚpbsÚmmÚmrr#   Úfaplr$   r$   r%   Útest_check_page_buf_sizeÑ   s      ÿ
z*TestPageBuffering.test_check_page_buf_sizec              	   C   sT   |   ¡ }d}t|dd|d W 5 Q R X |  t¡ t|d|d d W 5 Q R X dS )	z;Page buffer size must be greater than file space page size.rK   r   rC   ©r   rE   Zfs_page_sizer   r   rM   NrN   )r!   r"   Úfspr$   r$   r%   Útest_too_small_pbsÜ   s    
z$TestPageBuffering.test_too_small_pbsc              	   C   sp   |   ¡ }d}d| }t|dd|d W 5 Q R X t|d|d d$}|j ¡ }|  | ¡ d	 |¡ W 5 Q R X d
S )zVerify actual page buffer size.rK   r	   r   rC   rY   r   r   rM   r   NrR   )r!   r"   rZ   rT   r#   rW   r$   r$   r%   Útest_actual_pbså   s    

z!TestPageBuffering.test_actual_pbsN)r=   r>   r?   r@   rO   rX   r[   r\   r$   r$   r$   r%   rJ   ¼   s
   	rJ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	TestModesz?
        Feature: File mode can be retrieved via file.mode
    c              	   C   sT   |   ¡ }t|dƒ}|  |jd¡ W 5 Q R X t|dƒ}|  |jd¡ W 5 Q R X dS )z/ Mode equivalent can be retrieved via property r   r8   r   N)r   r   r   r   r    r$   r$   r%   Útest_mode_attr÷   s
    zTestModes.test_mode_attrc                 C   sª   |   ¡ }|   ¡ }t|dƒ}| ¡  t|dƒ}z,t |d¡|d< |d j}|  |jd¡ W 5 | ¡  | ¡  X t|dƒ}z|d j}|  |jd¡ W 5 | ¡  | ¡  X dS )zU Mode property works for files opened via external links

        Issue 190.
        r   ú/ZExternalr8   r   N)r   r   r)   Úh5pyZExternalLinkÚfiler   r   )r!   Zfname1Zfname2Úf1Úf2Zf3r$   r$   r%   Útest_mode_externalÿ   s"    





zTestModes.test_mode_externalN)r=   r>   r?   r@   r^   rd   r$   r$   r$   r%   r]   ñ   s   r]   c                   @   sˆ   e Zd ZdZe ejdkd¡dd„ ƒZe e	d¡dd„ ƒZ
e ejdkd	¡d
d„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestDriverszz
        Feature: Files can be opened with low-level HDF5 drivers. Does not
        include MPI drivers (see bottom).
    Úposixz"Stdio driver is supported on posixc                 C   sh   t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  dS )z$ Stdio driver is supported on posix r   Zstdio©Údriverr0   N©r   r   r   r   rh   r)   ©r!   r+   r$   r$   r%   Ú
test_stdio#  s    

zTestDrivers.test_stdiozODIRECT driver is supported on Linux if hdf5 is built with the appriorate flags.c           
   
   C   sL  t |  ¡ ddd}|  |¡ |  |jd¡ |j ¡  ¡ }| ¡  t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  ||d |d d|d  f|d d |d d|d  f|d d|d  d	|d  ffD ]~\}}}t |  ¡ dd|||d
V}|j ¡  ¡ }|d }|d }|d }	||ks t	‚||ks.t	‚|	|	ks<t	‚W 5 Q R X qÈdS )z$ DIRECT driver is supported on Linuxr   Údirectrg   r0   r   r   é   r	   é   )rh   Ú	alignmentÚ
block_sizeÚ	cbuf_sizeN)
r   r   r   r   rh   rG   rS   Zget_fapl_directr)   r2   )
r!   r+   Zdefault_faplro   rp   rq   Zactual_faplZactual_alignmentZactual_block_sizeZactual_cbuf_sizer$   r$   r%   Útest_direct1  s6    

üýzTestDrivers.test_directz!Sec2 driver is supported on posixc                 C   sh   t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  dS )z# Sec2 driver is supported on posix r   Zsec2rg   r0   Nri   rj   r$   r$   r%   Ú	test_sec2c  s    

zTestDrivers.test_sec2c                 C   s€   |   ¡ }t|dddd}|  |¡ |  |jd¡ | ¡  |  tj 	|¡¡ t|   ¡ ddd}|  |¡ |  |jd¡ | ¡  dS )z- Core driver is supported (no backing store) r   ÚcoreF©rh   Úbacking_storer0   rg   N)
r   r   r   r   rh   r)   r5   r   ÚpathÚexistsr*   r$   r$   r%   Ú	test_coreq  s    

zTestDrivers.test_corec              	   C   sp   |   ¡ }t|dddd}| d¡ | ¡  t|dƒ}d|ks@t‚| ¡  |  t¡ t|ddd W 5 Q R X dS )	z3 Core driver saves to file when backing store used r   rt   Tru   r'   r   )rv   N)r   r   r(   r)   r2   r   Ú	TypeErrorr*   r$   r$   r%   Útest_backing€  s    

zTestDrivers.test_backingc              	   C   st   |   ¡ }t|dƒ}| d¡ | ¡  t|ddd}|  |¡ d|ksHt‚|  t¡ | d¡ W 5 Q R X | ¡  dS )z0 Core driver can be used to open existing files r   r'   r   rt   rg   r1   N)r   r   r(   r)   r   r2   r   r6   r*   r$   r$   r%   r7     s    


zTestDrivers.test_readonlyc                 C   s0   |   ¡ }t|ddddd}|  |¡ | ¡  dS )z* Core driver supports variable block size r   rt   é   F)rh   rp   rv   N)r   r   r   r)   r*   r$   r$   r%   Útest_blocksizeš  s    
ÿ
zTestDrivers.test_blocksizec                 C   sX   |   ¡ }t|ddd}| ¡  |  tj |d ¡¡ t|ddd}|  |¡ | ¡  dS )z* Split stores metadata in a separate file r   Úsplitrg   z-m.h5r   N)r   r   r)   r   r   rw   rx   r*   r$   r$   r%   Ú
test_split¢  s    
zTestDrivers.test_splitc              	   C   s^   t  ¡ }t|ddd}|  |¡ |  |jd¡ | ¡  |  t¡ t|ddd W 5 Q R X dS )z( Python file object driver is supported r   Úfileobjrg   rt   N)	ÚtempfileÚTemporaryFiler   r   r   rh   r)   r   r6   )r!   Útfr+   r$   r$   r%   Útest_fileobj¬  s    
zTestDrivers.test_fileobjN)r=   r>   r?   r@   r   Ú
skipUnlessr   Únamerk   r   rr   rs   ry   r{   r7   r}   r   r„   r$   r$   r$   r%   re     s   
ÿ
/

re   )r   rA   r	   zRequires HDF5 before 1.10.2c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú
TestLibverze
        Feature: File format compatibility bounds can be specified when
        opening a file.
    c                 C   s(   t |  ¡ dƒ}|  |jd¡ | ¡  dS )ú Opening with no libver arg r   ©ÚearliestÚlatestN©r   r   r   Úlibverr)   ©r!   r#   r$   r$   r%   r&   Ã  s    zTestLibver.test_defaultc                 C   s,   t |  ¡ ddd}|  |jd¡ | ¡  dS )ú  Opening with single libver arg r   r‹   ©r   )r‹   r‹   NrŒ   rŽ   r$   r$   r%   Útest_singleÉ  s    zTestLibver.test_singlec                 C   s,   t |  ¡ ddd}|  |jd¡ | ¡  dS )ú Opening with two libver args r   r‰   r   NrŒ   rŽ   r$   r$   r%   Útest_multipleÏ  s    zTestLibver.test_multiplec                 C   s(   t |  ¡ dƒ}|  |jd¡ | ¡  dS )ú6 Omitting libver arg results in maximum compatibility r   r‰   NrŒ   rŽ   r$   r$   r%   Ú	test_noneÕ  s    zTestLibver.test_noneN)r=   r>   r?   r@   r&   r‘   r“   r•   r$   r$   r$   r%   r‡   º  s
   r‡   zRequires HDF5 1.10.2 or laterc                       sp   e Zd ZdZe‡ fdd„ƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	e
 ejjdk d¡dd„ ƒZdd„ Zdd„ Z‡  ZS )ÚTestNewLibverz
        Feature: File format compatibility bounds can be specified when
        opening a file.

        Requirement: HDF5 1.10.2 or later
    c                    s<   t ƒ  ¡  tjjdk rd| _ntjjdk r2d| _nd| _d S )N©r   é   é   Úv110)r   é   r   Úv112Zv114)ÚsuperÚ
setUpClassr`   ÚversionÚhdf5_version_tupler‹   )Úcls©Ú	__class__r$   r%   rž   ç  s    
zTestNewLibver.setUpClassc                 C   s.   t |  ¡ dƒ}|  |jd| jf¡ | ¡  dS )rˆ   r   rŠ   N©r   r   r   r   r‹   r)   rŽ   r$   r$   r%   r&   ó  s    zTestNewLibver.test_defaultc                 C   s4   t |  ¡ ddd}|  |j| j| jf¡ | ¡  dS )r   r   r‹   r   Nr¤   rŽ   r$   r$   r%   r‘   ù  s    zTestNewLibver.test_singlec                 C   s2   t |  ¡ ddd}|  |jd| jf¡ | ¡  dS )z  Opening with "v108" libver arg r   Úv108r   Nr¤   rŽ   r$   r$   r%   Útest_single_v108ÿ  s    zTestNewLibver.test_single_v108c                 C   s2   t |  ¡ ddd}|  |jd| jf¡ | ¡  dS )z  Opening with "v110" libver arg r   rš   r   Nr¤   rŽ   r$   r$   r%   Útest_single_v110  s    zTestNewLibver.test_single_v110r—   zRequires HDF5 1.11.4 or laterc                 C   s2   t |  ¡ ddd}|  |jd| jf¡ | ¡  dS )z  Opening with "v112" libver arg r   rœ   r   Nr¤   rŽ   r$   r$   r%   Útest_single_v112  s    zTestNewLibver.test_single_v112c                 C   s,   t |  ¡ ddd}|  |jd¡ | ¡  dS )r’   r   )rŠ   r¥   r   NrŒ   rŽ   r$   r$   r%   r“     s    zTestNewLibver.test_multiplec                 C   s.   t |  ¡ dƒ}|  |jd| jf¡ | ¡  dS )r”   r   rŠ   Nr¤   rŽ   r$   r$   r%   r•     s    zTestNewLibver.test_none)r=   r>   r?   r@   Úclassmethodrž   r&   r‘   r¦   r§   r   ÚskipIfr`   rŸ   r    r¨   r“   r•   Ú__classcell__r$   r$   r¢   r%   r–   Ü  s   ÿ
r–   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚTestUserblockz;
        Feature: Files can be create with user blocks
    c              	   C   s¼   t |  ¡ ddd}z|  |jd¡ W 5 | ¡  X t |  ¡ ddd}z|  |jd¡ W 5 | ¡  X t |  ¡ ddd}z|  |jd¡ W 5 | ¡  X |  t¡ t |  ¡ ddd W 5 Q R X dS )zA User blocks created with w, w-, x and properties work correctly r-   é   ©Úuserblock_sizeÚxr   ZnonN)r   r   r)   r   r¯   r   r6   rŽ   r$   r$   r%   Útest_create_blocksize&  s    


z#TestUserblock.test_create_blocksizec              	   C   sj   |   ¡ }t|dƒ}| ¡  |  t¡ tj|ddd}W 5 Q R X |  t¡ tj|ddd}W 5 Q R X dS )z# User block only allowed for write r   r   r­   r®   r8   N)r   r   r)   r   r6   r`   ©r!   r†   r#   r$   r$   r%   Útest_write_only=  s    
zTestUserblock.test_write_onlyc              	   C   sr   |   ¡ }t|ddd}| ¡  |  t¡ t|ddd}W 5 Q R X t|ddd}z|  |jd¡ W 5 | ¡  X dS )zA User block size must match that of file when opening for append r   r­   r®   r0   r|   N)r   r   r)   r   r6   r   r¯   r²   r$   r$   r%   Útest_match_existingI  s    z!TestUserblock.test_match_existingc              	   C   sx   |   ¡ }|  t¡ t|ddd}W 5 Q R X |  t¡ t|ddd}W 5 Q R X |  t¡ t|ddd}W 5 Q R X dS )z7 User block size must be a power of 2 and at least 512 r   é€   r®   i  iÿ  N)r   r   r6   r   r²   r$   r$   r%   Útest_power_of_twoX  s    zTestUserblock.test_power_of_twoc                 C   s¤   |   ¡ }t|ddd}| d¡ | ¡  t|dƒ}z| d¡ W 5 | ¡  X t |d¡}zd|ksft‚W 5 | ¡  X t|dƒ}z|  | 	d¡d¡ W 5 | ¡  X d	S )
z= Test that writing to a user block does not destroy the file r   r­   r®   ZFoobarzr+bs   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   ÚrbN)
r   r   r(   r)   r   r   r`   r2   r   Úread)r!   r†   r#   Zpyfiler$   r$   r%   Útest_write_blocke  s     




zTestUserblock.test_write_blockN)	r=   r>   r?   r@   r±   r³   r´   r¶   r¹   r$   r$   r$   r%   r¬      s   r¬   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestContextManagerzC
        Feature: File objects can be used as context managers
    c              	   C   s4   t |  ¡ dƒ}|  |¡ W 5 Q R X |  | ¡ dS )z- File objects can be used in with statements r   N)r   r   r   rj   r$   r$   r%   Útest_context_manager†  s    z'TestContextManager.test_context_managerN)r=   r>   r?   r@   r»   r$   r$   r$   r%   rº   €  s   rº   z#Filesystem unicode support requiredc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestUnicodez6
        Feature: Unicode filenames are supported
    c                 C   sJ   | j tdƒd}t|dƒ}z |  |j|¡ |  |jt¡ W 5 | ¡  X dS )zM Unicode filenames can be used, and retrieved properly via .filename
        é   ©Úprefixr   N)r   Úchrr   r)   r   ÚfilenameÚassertIsInstanceÚstrr*   r$   r$   r%   Útest_unicode”  s    
zTestUnicode.test_unicodec              	   C   s<   | j tdƒd}t|dƒ}|  tj |¡¡ W 5 Q R X dS )zG Unicode filenames can be used, and seen correctly from python
        r½   r¾   r   N)r   rÀ   r   r   r   rw   rx   r    r$   r$   r%   Ú#test_unicode_hdf5_python_consistentŸ  s    z/TestUnicode.test_unicode_hdf5_python_consistentc              	   C   sT   | j tdƒd}|  t¡ t|dƒ W 5 Q R X |  t¡ t|dƒ W 5 Q R X dS )zV
        Modes 'r' and 'r+' do not create files even when given unicode names
        r½   r¾   r   r8   N)r   rÀ   r   ÚIOErrorr   r:   r$   r$   r%   Útest_nonexistent_file_unicode¦  s
    z)TestUnicode.test_nonexistent_file_unicodeN)r=   r>   r?   r@   rÄ   rÅ   rÇ   r$   r$   r$   r%   r¼     s   r¼   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestFilePropertyzk
        Feature: A File object can be retrieved from any child object,
        via the .file property
    c                 C   s<   |   ¡ }t|dƒ}z|d j}|  ||¡ W 5 | ¡  X dS )z, File object can be retrieved from subgroup r   r_   N)r   r   r)   ra   r   )r!   r"   ÚhfileÚhfile2r$   r$   r%   Útest_property¸  s    

zTestFileProperty.test_propertyc                 C   sV   |   ¡ }t|dƒ}| d¡}|j}|d j}| ¡  |  |¡ |  |¡ |  |¡ dS )z8 All retrieved File objects are closed at the same time r   r'   r_   N)r   r   r(   ra   r)   r5   )r!   r"   rÉ   ÚgrprÊ   Zhfile3r$   r$   r%   Ú
test_closeÂ  s    




zTestFileProperty.test_closec                 C   s>   t |  ¡ dƒ}z | d¡}|  |jj|j¡ W 5 | ¡  X dS )z9 Retrieved File objects have a meaningful mode attribute r   r'   N)r   r   r)   r(   r   ra   r   )r!   rÉ   rÌ   r$   r$   r%   Ú	test_modeÎ  s
    
zTestFileProperty.test_modeN)r=   r>   r?   r@   rË   rÍ   rÎ   r$   r$   r$   r%   rÈ   ±  s   
rÈ   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú	TestClosez*
        Feature: Files can be closed
    c                 C   s.   t |  ¡ dƒ}|  |¡ | ¡  |  |¡ dS )z Close file via .close method r   N)r   r   r   r)   r5   rj   r$   r$   r%   rÍ   Þ  s    
zTestClose.test_closec              	   C   s:   t |  ¡ dƒ}| ¡  |  t¡ | d¡ W 5 Q R X dS )z0 Trying to modify closed file raises ValueError r   r'   N)r   r   r)   r   r6   r(   rj   r$   r$   r%   Útest_closed_fileå  s    zTestClose.test_closed_filec                 C   s2   |   ¡ }t |d¡}| d¡ | ¡  | ¡  d S )Nr   Útest)r   r`   r   r(   r)   r    r$   r$   r%   Ú"test_close_multiple_default_driverì  s
    
z,TestClose.test_close_multiple_default_driverN)r=   r>   r?   r@   rÍ   rÐ   rÒ   r$   r$   r$   r%   rÏ   Ø  s   rÏ   c                   @   s   e Zd ZdZdd„ ZdS )Ú	TestFlushz+
        Feature: Files can be flushed
    c                 C   s"   t |  ¡ dƒ}| ¡  | ¡  dS )z Flush via .flush method r   N)r   r   Úflushr)   rj   r$   r$   r%   Ú
test_flushú  s    zTestFlush.test_flushN)r=   r>   r?   r@   rÕ   r$   r$   r$   r%   rÓ   ô  s   rÓ   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestReprzE
        Feature: File objects provide a helpful __repr__ string
    c                 C   s:   t |  ¡ dƒ}|  t|ƒt¡ | ¡  |  t|ƒt¡ dS )z8 __repr__ behaves itself when files are open and closed r   N)r   r   rÂ   ÚreprrÃ   r)   rj   r$   r$   r%   Ú	test_repr  s    zTestRepr.test_reprN)r=   r>   r?   r@   rØ   r$   r$   r$   r%   rÖ     s   rÖ   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestFilenamezO
        Feature: The name of a File object can be retrieved via .filename
    c                 C   sB   |   ¡ }t|dƒ}z |  |j|¡ |  |jt¡ W 5 | ¡  X dS )z, .filename behaves properly for string data r   N)r   r   r)   r   rÁ   rÂ   rÃ   r*   r$   r$   r%   Útest_filename  s    
zTestFilename.test_filenameN)r=   r>   r?   r@   rÚ   r$   r$   r$   r%   rÙ     s   rÙ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú!TestCloseInvalidatesOpenObjectIDszO
        Ensure that closing a file invalidates object IDs, as appropriate
    c              	   C   sÔ   t |  ¡ dƒX}| d¡}|  t|jƒ¡ |  t|jƒ¡ | ¡  |  t|jƒ¡ |  t|jƒ¡ W 5 Q R X t |  ¡ dƒP}| d¡}|  t|jƒ¡ |  t|jƒ¡ |  t|jƒ¡ |  t|jƒ¡ W 5 Q R X dS )z; Closing a file invalidates any of the file's open objects r   r'   N)r   r   r(   r   ÚboolrG   r)   r5   )r!   rb   Úg1rc   Úg2r$   r$   r%   rÍ   &  s    

z,TestCloseInvalidatesOpenObjectIDs.test_closec              	   C   s°   |   ¡ }t|dƒ}| d¡ W 5 Q R X t|ƒ}t|ƒ}|d }|d }|jjsTt‚|jjs`t‚| ¡  |jjrtt‚|jjs€t‚|jjsŒt‚| ¡  |jjr t‚|jjr¬t‚d S )Nr   r'   )r   r   r(   rG   Zvalidr2   r)   )r!   r"   r#   rb   rc   rÝ   rÞ   r$   r$   r%   Útest_close_one_handle6  s     z7TestCloseInvalidatesOpenObjectIDs.test_close_one_handleN)r=   r>   r?   r@   rÍ   rß   r$   r$   r$   r%   rÛ      s   rÛ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestPathlibSupportz6
        Check that h5py doesn't break on pathlib
    c              
   C   s@   t ƒ 0}t |¡}t|dƒ}|  d¡ W 5 Q R X W 5 Q R X dS )z- Check that pathlib is accepted by h5py.File r   TN)r   ÚpathlibÚPathr   r   )r!   r#   rw   rc   r$   r$   r%   Útest_pathlib_accepted_fileQ  s    
z-TestPathlibSupport.test_pathlib_accepted_filec              
   C   sd   t ƒ T}t |¡}t|dƒ}|j}W 5 Q R X t|dƒ}|j}W 5 Q R X |  ||¡ W 5 Q R X dS )z1 Check that using pathlib does not affect naming r   N)r   rá   râ   r   rÁ   r   )r!   r#   rw   Zh5f1Zpathlib_nameZh5f2Znormal_namer$   r$   r%   Útest_pathlib_name_matchX  s    
z*TestPathlibSupport.test_pathlib_name_matchN)r=   r>   r?   r@   rã   rä   r$   r$   r$   r%   rà   L  s   rà   c                   @   s   e Zd ZdZdd„ ZdS )Ú
TestPicklez%Check that h5py.File can't be pickledc              
   C   s>   t |  ¡ dƒ&}|  t¡ t |¡ W 5 Q R X W 5 Q R X d S )Nr   )r   r   r   rz   ÚpickleÚdumps)r!   rb   r$   r$   r%   Útest_dump_errore  s    zTestPickle.test_dump_errorN)r=   r>   r?   r@   rè   r$   r$   r$   r%   rå   c  s   rå   c                   @   sD   e Zd Zdd„ Zdd„ Zejjej	j
dk dddd	„ ƒZd
d„ ZdS )ÚTestMPIc              	   C   sD   ddl m} t|dd|jd}|s(t‚|jdks6t‚W 5 Q R X dS )ú MPIO driver and options r   ©ÚMPIr   Úmpio©rh   ZcommN©Úmpi4pyrì   r   Ú
COMM_WORLDr2   rh   ©r!   Zmpi_file_namerì   r#   r$   r$   r%   Ú	test_mpioo  s    zTestMPI.test_mpioc              	   C   sD   ddl m} t|dd|jd}|s(t‚|jdks6t‚W 5 Q R X dS )z& Testing creation of file with append r   rë   r0   rí   rî   Nrï   rò   r$   r$   r%   Útest_mpio_appendw  s    zTestMPI.test_mpio_append)r   é   é	   z5mpio atomic file operations were added in HDF5 1.8.9+©Úreasonc              	   C   sH   ddl m} t|dd|jd }|jr*t‚d|_|js:t‚W 5 Q R X dS )z$ Enable atomic mode for MPIO driver r   rë   r   rí   rî   TN)rð   rì   r   rñ   Zatomicr2   rò   r$   r$   r%   Útest_mpi_atomic  s
    
zTestMPI.test_mpi_atomicc                 C   s<   ddl m} t|dd|jd}| d¡ | ¡  | ¡  dS )rê   r   rë   r   rí   rî   rÑ   N)rð   rì   r   rñ   r(   r)   rò   r$   r$   r%   Útest_close_multiple_mpio_driverŠ  s
    
z'TestMPI.test_close_multiple_mpio_driverN)r=   r>   r?   ró   rô   r   ÚmarkÚskipifr`   rŸ   r    rù   rú   r$   r$   r$   r%   ré   m  s   ÿ
	ré   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestSWMRModez=
        Feature: Create file that switches on SWMR mode
    c                 C   sr   |   ¡ }t|ddd}| d¡}|j|jj  kr:dks@n t‚d|_|j|jj  kr`dksfn t‚| ¡  d S )Nr   r‹   r   r'   r8   T)r   r   r(   r   ra   r2   Ú	swmr_moder)   ©r!   r"   r+   Úgr$   r$   r%   Útest_file_mode_generalizesœ  s    
  z'TestSWMRMode.test_file_mode_generalizesc                 C   sr   |   ¡ }t|ddd}| d¡}|j|jj  kr:dks@n t‚d|_|j|jj  kr`dksfn t‚| ¡  d S )Nr   r‹   r   r'   FT)r   r   r(   rþ   ra   r2   r)   rÿ   r$   r$   r%   Útest_swmr_mode_consistency¨  s    
  z'TestSWMRMode.test_swmr_mode_consistencyN)r=   r>   r?   r@   r  r  r$   r$   r$   r%   rý   ”  s   rý   )r   é   r   )r   rA   é   z+Requires HDF5 >= 1.12.1 or 1.10.x >= 1.10.7r÷   ZHDF5_USE_FILE_LOCKINGz&HDF5_USE_FILE_LOCKING env. var. is setc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestFileLockingz"Test h5py.File file locking optionc                 C   sš   |d }t j|dddx}| ¡  t t¡" t j|ddd}W 5 Q R X W 5 Q R X t j|ddd}W 5 Q R X t j|ddd}W 5 Q R X W 5 Q R X dS )	z2Test file locking when opening twice the same fileútest.h5r   T©r   Úlockingr   Fzbest-effortN)r`   r   rÔ   r   r   r   )r!   Útmp_pathr"   r#   Úh5f_readr$   r$   r%   Útest_reopen¼  s    
zTestFileLocking.test_reopenc              
   C   s>   |d }t  t¡" tj|ddd}W 5 Q R X W 5 Q R X dS )z&Test with erroneous file locking valuer  r   zunsupported-valuer  N)r   r   r6   r`   r   )r!   r	  r"   r
  r$   r$   r%   Útest_unsupported_lockingÎ  s    z(TestFileLocking.test_unsupported_lockingc              	   C   sf   |d }dd„ }t j|ddd}d|d< W 5 Q R X t j|d	d
d}||dddsXt‚W 5 Q R X dS )z<Test file locking option from different concurrent processesr  c                 S   sZ   t t tj¡jjƒ}tjtj	dd|›dt | ƒ›d|›d|› d	gdd}|j
d	koX|j S )
z9Open HDF5 file in a subprocess and return True on successz-cz
import sys
sys.path.insert(0, z)
import h5py
f = h5py.File(z, mode=z
, locking=z)
                    T)Úcapture_outputr   )rÃ   rá   râ   r`   Ú__file__ÚparentÚ
subprocessÚrunÚsysÚ
executableÚ
returncodeÚstderr)rÁ   r   r  Zh5py_import_dirÚprocessr$   r$   r%   Úopen_in_subprocessÙ  s    üý
õz=TestFileLocking.test_multiprocess.<locals>.open_in_subprocessr   Tr  r   Údatar   FN)r`   r   r2   )r!   r	  r"   r  r#   r$   r$   r%   Útest_multiprocessÕ  s    z!TestFileLocking.test_multiprocessN)r=   r>   r?   r@   r  r  r  r$   r$   r$   r%   r  ³  s   r  c              
   C   sp   t dƒD ]}g | t|ƒ< q| j}|  ¡  t dƒD ]:}t |d¡$}dd„ | ¡ D ƒ}| |¡ ~W 5 Q R X q0d S )NrD   rA   r   c                 S   s   g | ]
}|j ‘qS r$   )rG   )Ú.0Údr$   r$   r%   Ú
<listcomp>  s     z!test_close_gc.<locals>.<listcomp>)ÚrangerÃ   rÁ   r)   r`   r   ÚvaluesÚappend)Zwritable_fileÚirÁ   r#   Úrefsr$   r$   r%   Útest_close_gcô  s    
r"  )3r@   r   r   r   ræ   r   r  r  Úcommonr   r   r   r   Zh5py._hl.filesr   r`   r   Ú r
   rá   r   rª   rŸ   r    rB   rû   Zmpi_skiprJ   r]   re   r…   r‡   r–   r¬   rº   r¼   rÈ   rÏ   rÓ   rÖ   rÙ   rÛ   rà   rå   Zmpiré   rý   rü   Úenvironr  r"  r$   r$   r$   r%   Ú<module>
   s|   tÿ&ÿ2+ ÿ ÿB`#',
&ÿ$ýÿ;