B
    ¬»ˆ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 dQ R X W dQ R X t|dƒ W dQ R X t |tj¡ z0t|ƒ}|  	|¡ |  
|jd¡ W dQ R X W dt |tj¡ X t|dƒ}| d¡ W dQ R X |  t¡ t|ƒ W dQ R X dS )z8 Default semantics in the presence or absence of a file NÚwÚrÚwbó    )ÚmktempÚpytestÚraisesÚFileNotFoundErrorr   ÚosÚchmodÚstatÚS_IREADÚ
assertTrueÚassertEqualÚmodeÚS_IWRITEÚopenÚwriteÚassertRaisesÚOSError)ÚselfÚfnameÚf© r#   úF/var/www/html/venv/lib/python3.7/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 dQ R X dS )z( Mode 'w-' opens file in exclusive mode zw-N)r   r   r   r(   r   ÚFileExistsError)r    r!   r)   r#   r#   r$   Útest_create_exclusiveK   s    

z"TestFileOpen.test_create_exclusivec             C   sÌ   |   ¡ }t|dƒ}z$|  |¡ | d¡ d|ks4t‚W d| ¡  X t|dƒ}z&d|ksZt‚| d¡ d|kspt‚W d| ¡  X t |tj	¡ z$t
 t¡ t|dƒ W dQ R X W dt |tj	tjB ¡ X dS )zE Mode 'a' opens file in append/readwrite mode, creating if necessary Úar&   NÚbar)r   r   r   r'   ÚAssertionErrorr(   r   r   r   r   r   r   ÚPermissionErrorr   )r    r!   r)   r#   r#   r$   Útest_appendT   s$    






zTestFileOpen.test_appendc          	   C   sd   |   ¡ }t|dƒ}| ¡  |  |¡ t|dƒ}|  |¡ |  t¡ | d¡ W d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#   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&   zr+r.   N)r   r   r'   r(   r/   )r    r!   r)   r#   r#   r$   Útest_readwritez   s    



zTestFileOpen.test_readwritec          	   C   sL   |   ¡ }|  t¡ t|dƒ W dQ R X |  t¡ t|dƒ W dQ R X dS )z( Modes 'r' and 'r+' do not create files r   Nzr+)r   r   r   r   )r    r!   r#   r#   r$   Útest_nonexistent_file†   s
    z"TestFileOpen.test_nonexistent_filec          	   C   s(   |   t¡ t|  ¡ dƒ W dQ R X dS )z  Invalid modes raise ValueError ZmongooseN)r   r3   r   r   )r    r#   r#   r$   Útest_invalid_modeŽ   s    zTestFileOpen.test_invalid_modeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r*   r,   r1   r4   r5   r6   r7   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 dQ R X |  t¡ t|   ¡ dd	d W d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_thresholdr-   )r@   NÚinvalidr&   )r?   Zuint8)Zdtyper   .r.   r   r	   Zfoo2)r   r   r   r   r3   Zcreate_datasetr(   ÚidZget_create_plistZget_file_space_strategyr/   )r    r!   r)   ZdsetÚplistZfs_stratr#   r#   r$   Útest_create_with_space_strategyœ   s.    



z1TestSpaceStrategy.test_create_with_space_strategyN)r8   r9   r:   r;   rD   r#   r#   r#   r$   r=   ”   s   r=   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 dQ R X |  t¡ t|ddd W dQ R X |  t¡ t|dddd W dQ R X |  t¡ t|dddd W dQ R X dS )	z;Allow page buffering only with fs_strategy="page".
        r   r>   i @  )r   r@   Úpage_buf_sizeN)r   rF   ZfsmZ	aggregate)r   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 dQ R X dS )zHVerify set page buffer size, and minimum meta and raw eviction criteria.i @  é   éC   r   r>   )r   r@   rF   Zmin_meta_keepZmin_raw_keepN)r   r   rB   Úget_access_plistr   Ú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 dQ R X |  t¡ t|d|d d W dQ R X dS )	z;Page buffer size must be greater than file space page size.i @  r   r>   )r   r@   Úfs_page_sizeNr   r   )r   rF   )r   r   r   r   )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 dQ R X t|d|d d	$}|j ¡ }|  | ¡ d
 |¡ W dQ R X dS )zVerify actual page buffer size.i @  r	   r   r>   )r   r@   rQ   Nr   r   )r   rF   r   )r   r   rB   rJ   r   rK   )r    r!   rR   rL   r"   rO   r#   r#   r$   Útest_actual_pbså   s    

z!TestPageBuffering.test_actual_pbsN)r8   r9   r:   r;   rG   rP   rS   rT   r#   r#   r#   r$   rE   ¼   s
   	rE   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 dQ R X t|dƒ}|  |jd¡ W dQ R X dS )z/ Mode equivalent can be retrieved via property r   zr+Nr   )r   r   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 d| ¡  | ¡  X t|dƒ}z|d j}|  |jd¡ W d| ¡  | ¡  X dS )zU Mode property works for files opened via external links

        Issue 190.
        r   ú/ZExternalzr+Nr   )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)r8   r9   r:   r;   rV   r\   r#   r#   r#   r$   rU   ñ   s   rU   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)Údriverr-   N)r   r   r   r   r_   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   sP  t |  ¡ ddd}|  |¡ |  |jd¡ |j ¡  ¡ }| ¡  t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  xØ||d |d d|d  f|d d |d d|d  f|d d|d  d	|d  fgD ]~\}}}t |  ¡ dd|||d
V}|j ¡  ¡ }|d }|d }|d }	||ks"t	‚||ks0t	‚|	|	ks>t	‚W dQ R X qÊW dS )z$ DIRECT driver is supported on Linuxr   Údirect)r_   r-   r   r   é   r	   é   )r_   Ú	alignmentÚ
block_sizeÚ	cbuf_sizeN)
r   r   r   r   r_   rB   rJ   Zget_fapl_directr(   r/   )
r    r)   Zdefault_faplrd   re   rf   Zactual_faplZactual_alignmentZactual_block_sizeZactual_cbuf_sizer#   r#   r$   Útest_direct1  s2    

*
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sec2)r_   r-   N)r   r   r   r   r_   r(   )r    r)   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)r_   Úbacking_storer-   )r_   N)
r   r   r   r   r_   r(   r2   r   ÚpathÚexists)r    r!   r)   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 dQ R X dS )	z3 Core driver saves to file when backing store used r   ri   T)r_   rj   r&   r   )rj   N)r   r   r'   r(   r/   r   Ú	TypeError)r    r!   r)   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 dQ R X | ¡  dS )z0 Core driver can be used to open existing files r   r&   r   ri   )r_   r.   N)r   r   r'   r(   r   r/   r   r3   )r    r!   r)   r#   r#   r$   r4     s    


zTestDrivers.test_readonlyc             C   s0   |   ¡ }t|ddddd}|  |¡ | ¡  dS )z* Core driver supports variable block size r   ri   i   F)r_   re   rj   N)r   r   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   Úsplit)r_   z-m.h5r   N)r   r   r(   r   r   rk   rl   )r    r!   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 dQ R X dS )z( Python file object driver is supported r   Úfileobj)r_   ri   N)	ÚtempfileÚTemporaryFiler   r   r   r_   r(   r   r3   )r    Útfr)   r#   r#   r$   Útest_fileobj¬  s    
zTestDrivers.test_fileobjN)r8   r9   r:   r;   r   Ú
skipUnlessr   Únamer`   r   rg   rh   rm   ro   r4   rp   rr   rw   r#   r#   r#   r$   r]     s   1
r]   )r   r<   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 )z 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 )z  Opening with single libver arg r   r|   )r}   )r|   r|   N)r   r   r   r}   r(   )r    r"   r#   r#   r$   Útest_singleÉ  s    zTestLibver.test_singlec             C   s,   t |  ¡ ddd}|  |jd¡ | ¡  dS )z Opening with two libver args r   )r{   r|   )r}   N)r   r   r   r}   r(   )r    r"   r#   r#   r$   Útest_multipleÏ  s    zTestLibver.test_multiplec             C   s(   t |  ¡ dƒ}|  |jd¡ | ¡  dS )z6 Omitting libver arg results in maximum compatibility r   )r{   r|   N)r   r   r   r}   r(   )r    r"   r#   r#   r$   Ú	test_noneÕ  s    zTestLibver.test_noneN)r8   r9   r:   r;   r%   r~   r   r€   r#   r#   r#   r$   rz   º  s
   rz   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Ú
setUpClassrX   ÚversionÚhdf5_version_tupler|   )Úcls)Ú	__class__r#   r$   rˆ   ç  s    
zTestNewLibver.setUpClassc             C   s.   t |  ¡ dƒ}|  |jd| jf¡ | ¡  dS )z Opening with no libver arg r   r{   N)r   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 )z  Opening with single libver arg r   r|   )r}   N)r   r   r   r}   r|   r(   )r    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   Úv108)r}   N)r   r   r   r}   r|   r(   )r    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}   N)r   r   r   r}   r|   r(   )r    r"   r#   r#   r$   Útest_single_v110  s    zTestNewLibver.test_single_v110)r   r‚   rƒ   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}   N)r   r   r   r}   r|   r(   )r    r"   r#   r#   r$   Útest_single_v112  s    zTestNewLibver.test_single_v112c             C   s,   t |  ¡ ddd}|  |jd¡ | ¡  dS )z Opening with two libver args r   )r{   r   )r}   N)r   r   r   r}   r(   )r    r"   r#   r#   r$   r     s    zTestNewLibver.test_multiplec             C   s.   t |  ¡ dƒ}|  |jd| jf¡ | ¡  dS )z6 Omitting libver arg results in maximum compatibility r   r{   N)r   r   r   r}   r|   r(   )r    r"   r#   r#   r$   r€     s    zTestNewLibver.test_none)r8   r9   r:   r;   Úclassmethodrˆ   r%   r~   rŽ   r   r   ÚskipIfrX   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 d| ¡  X t |  ¡ ddd}z|  |jd¡ W d| ¡  X t |  ¡ ddd}z|  |jd¡ W d| ¡  X |  t¡ t |  ¡ ddd W dQ R X dS )zA User blocks created with w, w-, x and properties work correctly zw-i   )Úuserblock_sizeNÚxr   Znon)r   r   r   r•   r(   r   r3   )r    r"   r#   r#   r$   Útest_create_blocksize&  s    


z#TestUserblock.test_create_blocksizec          	   C   sj   |   ¡ }t|dƒ}| ¡  |  t¡ tj|ddd}W dQ R X |  t¡ tj|ddd}W dQ R X dS )z# User block only allowed for write r   r   i   )r•   Nzr+)r   r   r(   r   r3   rX   )r    ry   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 dQ R X t|ddd}z|  |jd¡ W d| ¡  X dS )zA User block size must match that of file when opening for append r   i   )r•   r-   i   N)r   r   r(   r   r3   r   r•   )r    ry   r"   r#   r#   r$   Útest_match_existingI  s    z!TestUserblock.test_match_existingc          	   C   sx   |   ¡ }|  t¡ t|ddd}W dQ R X |  t¡ t|ddd}W dQ R X |  t¡ t|ddd}W dQ R X dS )z7 User block size must be a power of 2 and at least 512 r   é€   )r•   Ni  iÿ  )r   r   r3   r   )r    ry   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 d| ¡  X t |d¡}zd|ksft‚W d| ¡  X t|d	ƒ}z|  | 	d¡d¡ W d| ¡  X dS )
z= Test that writing to a user block does not destroy the file r   i   )r•   ZFoobarzr+bs   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXNr   Úrb)
r   r   r'   r(   r   r   rX   r/   r   Úread)r    ry   r"   Zpyfiler#   r#   r$   Útest_write_blocke  s     




zTestUserblock.test_write_blockN)	r8   r9   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 dQ R X |  | ¡ dS )z- File objects can be used in with statements r   N)r   r   r   )r    r)   r#   r#   r$   Útest_context_manager†  s    z'TestContextManager.test_context_managerN)r8   r9   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 d| ¡  X dS )zM Unicode filenames can be used, and retrieved properly via .filename
        i   )Úprefixr   N)r   Úchrr   r   ÚfilenameÚassertIsInstanceÚstrr(   )r    r!   r)   r#   r#   r$   Útest_unicode”  s    
zTestUnicode.test_unicodec          	   C   s<   | j tdƒd}t|dƒ}|  tj |¡¡ W dQ R X dS )zG Unicode filenames can be used, and seen correctly from python
        i   )r¢   r   N)r   r£   r   r   r   rk   rl   )r    r!   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 dQ R X |  t¡ t|dƒ W dQ R X dS )zV
        Modes 'r' and 'r+' do not create files even when given unicode names
        i   )r¢   r   Nzr+)r   r£   r   ÚIOErrorr   )r    r!   r#   r#   r$   Útest_nonexistent_file_unicode¦  s
    z)TestUnicode.test_nonexistent_file_unicodeN)r8   r9   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 d| ¡  X dS )z, File object can be retrieved from subgroup r   rW   N)r   r   rY   r   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&   rW   N)r   r   r'   rY   r(   r2   )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 d| ¡  X dS )z9 Retrieved File objects have a meaningful mode attribute r   r&   N)r   r   r'   r   rY   r   r(   )r    r¬   r¯   r#   r#   r$   Ú	test_modeÎ  s
    
zTestFileProperty.test_modeN)r8   r9   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(   r2   )r    r)   r#   r#   r$   r°   Þ  s    
zTestClose.test_closec          	   C   s:   t |  ¡ dƒ}| ¡  |  t¡ | d¡ W dQ R X dS )z0 Trying to modify closed file raises ValueError r   r&   N)r   r   r(   r   r3   r'   )r    r)   r#   r#   r$   Útest_closed_fileå  s    zTestClose.test_closed_filec             C   s2   |   ¡ }t |d¡}| d¡ | ¡  | ¡  d S )Nr   Útest)r   rX   r   r'   r(   )r    r!   r"   r#   r#   r$   Ú"test_close_multiple_default_driverì  s
    
z,TestClose.test_close_multiple_default_driverN)r8   r9   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(   )r    r)   r#   r#   r$   Ú
test_flushú  s    zTestFlush.test_flushN)r8   r9   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(   )r    r)   r#   r#   r$   Ú	test_repr  s    zTestRepr.test_reprN)r8   r9   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 d| ¡  X dS )z, .filename behaves properly for string data r   N)r   r   r   r¤   r¥   r¦   r(   )r    r!   r)   r#   r#   r$   Útest_filename  s    
zTestFilename.test_filenameN)r8   r9   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 dQ R X t |  ¡ dƒP}| d¡}|  t|jƒ¡ |  t|jƒ¡ |  t|jƒ¡ |  t|jƒ¡ W dQ R X dS )z; Closing a file invalidates any of the file's open objects r   r&   N)r   r   r'   r   ÚboolrB   r(   r2   )r    rZ   Úg1r[   Úg2r#   r#   r$   r°   &  s    

z,TestCloseInvalidatesOpenObjectIDs.test_closec          	   C   s°   |   ¡ }t|dƒ}| d¡ W d 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'   rB   Zvalidr/   r(   )r    r!   r"   rZ   r[   rÀ   rÁ   r#   r#   r$   Útest_close_one_handle6  s     z7TestCloseInvalidatesOpenObjectIDs.test_close_one_handleN)r8   r9   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 dQ R X W dQ R X dS )z- Check that pathlib is accepted by h5py.File r   TN)r   ÚpathlibÚPathr   r   )r    r"   rk   r[   r#   r#   r$   Útest_pathlib_accepted_fileQ  s    
z-TestPathlibSupport.test_pathlib_accepted_filec          
   C   sd   t ƒ T}t |¡}t|dƒ}|j}W dQ R X t|dƒ}|j}W dQ R X |  ||¡ W dQ R X dS )z1 Check that using pathlib does not affect naming r   N)r   rÄ   rÅ   r   r¤   r   )r    r"   rk   Zh5f1Zpathlib_nameZh5f2Znormal_namer#   r#   r$   Útest_pathlib_name_matchX  s    
z*TestPathlibSupport.test_pathlib_name_matchN)r8   r9   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 d Q R X W d Q R X d S )Nr   )r   r   r   rn   ÚpickleÚdumps)r    rZ   r#   r#   r$   Útest_dump_errore  s    zTestPickle.test_dump_errorN)r8   r9   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 dQ R X dS )z MPIO driver and options r   )ÚMPIr   Úmpio)r_   ÚcommN)Úmpi4pyrÍ   r   Ú
COMM_WORLDr/   r_   )r    Ú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 dQ R X dS )z& Testing creation of file with append r   )rÍ   r-   rÎ   )r_   rÏ   N)rÐ   rÍ   r   rÑ   r/   r_   )r    rÒ   rÍ   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 dQ R X dS )z$ Enable atomic mode for MPIO driver r   )rÍ   r   rÎ   )r_   rÏ   TN)rÐ   rÍ   r   rÑ   Zatomicr/   )r    rÒ   rÍ   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 )z MPIO driver and options r   )rÍ   r   rÎ   )r_   rÏ   r´   N)rÐ   rÍ   r   rÑ   r'   r(   )r    rÒ   rÍ   r"   r#   r#   r$   Útest_close_multiple_mpio_driverŠ  s
    
z'TestMPI.test_close_multiple_mpio_driverN)r8   r9   r:   rÓ   rÔ   r   ÚmarkÚskipifrX   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&   zr+T)r   r   r'   r   rY   r/   Ú	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Ý   rY   r/   r(   )r    r!   r)   rÞ   r#   r#   r$   Útest_swmr_mode_consistency¨  s    
  z'TestSWMRMode.test_swmr_mode_consistencyN)r8   r9   r:   r;   rß   rà   r#   r#   r#   r$   rÜ   ”  s   rÜ   )r   é   r   )r   r<   é   z+Requires HDF5 >= 1.12.1 or 1.10.x >= 1.10.7)r×   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 dQ R X W dQ R X t j|ddd}W dQ R X t j|ddd}W dQ R X W dQ R X dS )	z2Test file locking when opening twice the same fileztest.h5r   T)r   Úlockingr   FNzbest-effort)rX   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 dQ R X W dQ R X dS )z&Test with erroneous file locking valueztest.h5r   zunsupported-value)r   rä   N)r   r   r3   rX   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 d	Q R X t j|d
dd}||dddsXt‚W d	Q R X d	S )z<Test file locking option from different concurrent processesztest.h5c             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Å   rX   Ú__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   T)r   rä   r   ÚdataNr   F)rX   r   r/   )r    rå   r!   ró   r"   r#   r#   r$   Útest_multiprocessÕ  s    z!TestFileLocking.test_multiprocessN)r8   r9   r:   r;   rç   rè   rõ   r#   r#   r#   r$   rã   ³  s   rã   c          
   C   sx   xt dƒD ]}g | t|ƒ< q
W | j}|  ¡  xFt dƒD ]:}t |d¡$}dd„ | ¡ D ƒ}| |¡ ~W d Q R X q6W d S )Nr?   r<   r   c             S   s   g | ]
}|j ‘qS r#   )rB   )Ú.0Údr#   r#   r$   ú
<listcomp>  s    z!test_close_gc.<locals>.<listcomp>)Úranger¦   r¤   r(   rX   r   ÚvaluesÚappend)Zwritable_fileÚir¤   r"   Úrefsr#   r#   r$   Útest_close_gcô  s    
rþ   )3r;   r   r   r   rÉ   rt   rì   rî   Úcommonr   r   r   r   Zh5py._hl.filesr   rX   r   Ú r
   rÄ   r   r’   r‰   rŠ   r=   rÚ   Zmpi_skiprE   rU   r]   rx   rz   r   r”   rŸ   r¡   r«   r²   r¶   r¹   r¼   r¾   rÃ   rÈ   ZmpirÌ   rÜ   rÛ   Úenvironrã   rþ   r#   r#   r#   r$   Ú<module>   sj   t&
2+  B`#',
'$<