o
    cd|                     @   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j0v 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   sb  |   }tt t| W d   n1 sw   Y  W d   n1 s(w   Y  t|d W d   n1 s=w   Y  t|tj z)t|}| 	| | 
|jd W d   n1 sew   Y  W t|tj nt|tj w t|d}|d W d   n1 sw   Y  | t t| W d   dS 1 sw   Y  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$   4lib/python3.10/site-packages/h5py/tests/test_file.pytest_default&   s0   


 
"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   s^   |   }t|d}| | |  | t t|d W d   dS 1 s(w   Y  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|v sJ W |  n|  w t|d}zd|v s1J |d d|v s<J W |  n|  w t|tj z4t	
t t|d W d   n1 sdw   Y  W t|tjtjB  dS W t|tjtjB  dS t|tjtjB  w )zE Mode 'a' opens file in append/readwrite mode, creating if necessary ar'   barN)r   r   r   r(   r)   r   r   r   r   r   r   PermissionErrorr   r*   r$   r$   r%   test_appendT   s*   




.zTestFileOpen.test_appendc                 C   sx   |   }t|d}|  | | t|d}| | | t |d W d   n1 s1w   Y  |  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|v sJ |d d|v s(J |  dS )z1 Mode 'r+' opens existing file in readwrite mode r   r'   r+r1   N)r   r   r(   r)   r*   r$   r$   r%   test_readwritez   s   



zTestFileOpen.test_readwritec                 C   sv   |   }| t t|d W d   n1 sw   Y  | t t|d W d   dS 1 s4w   Y  dS )z( Modes 'r' and 'r+' do not create files r   Nr7   )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   dS 1 sw   Y  dS )z  Invalid modes raise ValueError ZmongooseN)r   r5   r   r   )r!   r$   r$   r%   test_invalid_mode   s   "zTestFileOpen.test_invalid_modeN)__name__
__module____qualname____doc__r&   r,   r/   r3   r6   r8   r:   r;   r$   r$   r$   r%   r       s    	r   )r   
   r   zRequires HDF5 1.10.1 or laterc                   @      e Zd ZdZdd ZdS )TestSpaceStrategyzE
        Feature: Create file with specified file space strategy
    c                 C   sF  |   }t|ddddd}| | | t t|ddd W d   n1 s)w   Y  | t t|   dd	d W d   n1 sGw   Y  |jd
ddd}d|d< |jdddd}d|d< |d
= |  t|d}|j }|	 }|d dksJ |d dksJ |d dksJ |jdddd}d|d< |  dS )z& Create file with file space strategy r   pageTd   )fs_strategyZ
fs_persistZfs_thresholdr0   )rE   NZinvalidr'   )rD   Zuint8)Zdtyper   .r1   r   r	   Zfoo2)
r   r   r   r   r5   Zcreate_datasetr)   idZget_create_plistZget_file_space_strategy)r!   r"   r+   ZdsetZplistZfs_stratr$   r$   r%   test_create_with_space_strategy   s4   


z1TestSpaceStrategy.test_create_with_space_strategyN)r<   r=   r>   r?   rG   r$   r$   r$   r%   rB      s    rB   c                   @   0   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   n1 sw   Y  | t t|ddd W d   n1 s3w   Y  | t t|dddd W d   n1 sPw   Y  | t t|dddd W d   dS 1 snw   Y  dS )	z;Allow page buffering only with fs_strategy="page".
        r   rC    @  )r   rE   page_buf_sizeNr   rK   ZfsmZ	aggregater   r   r   r   r9   r$   r$   r%   test_only_with_page_strategy   s   "z.TestPageBuffering.test_only_with_page_strategyc                 C   sn   |   }d}d}d}t|dd|||d}|j }| | |||f W d   dS 1 s0w   Y  dS )zHVerify set page buffer size, and minimum meta and raw eviction criteria.rJ      C   r   rC   )r   rE   rK   Zmin_meta_keepZmin_raw_keepNr   r   rF   get_access_plistr   Zget_page_buffer_size)r!   r"   pbsZmmmrr#   faplr$   r$   r%   test_check_page_buf_size   s   
"z*TestPageBuffering.test_check_page_buf_sizec                 C   s~   |   }d}t|dd|d W d   n1 sw   Y  | t t|d|d d W d   dS 1 s8w   Y  dS )	z;Page buffer size must be greater than file space page size.rJ   r   rC   r   rE   Zfs_page_sizeNr   r   rL   rM   )r!   r"   fspr$   r$   r%   test_too_small_pbs   s   "z$TestPageBuffering.test_too_small_pbsc                 C   s   |   }d}d| }t|dd|d W d   n1 sw   Y  t|d|d d	}|j }| | d
 | W d   dS 1 sFw   Y  dS )zVerify actual page buffer size.rJ   r	   r   rC   rW   Nr   r   rL   r   rQ   )r!   r"   rX   rS   r#   rU   r$   r$   r%   test_actual_pbs   s   
"z!TestPageBuffering.test_actual_pbsN)r<   r=   r>   r?   rN   rV   rY   rZ   r$   r$   r$   r%   rI      s    	rI   c                   @       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   s~   |   }t|d}| |jd W d   n1 sw   Y  t|d}| |jd W d   dS 1 s8w   Y  dS )z/ Mode equivalent can be retrieved via property r   r7   Nr   )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 |  |  n	|  |  w t|d}z|d j}| |jd W |  |  dS |  |  w )zU Mode property works for files opened via external links

        Issue 190.
        r   /ZExternalr7   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]   rc   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   h   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#     

zTestDrivers.test_stdiozODIRECT driver is supported on Linux if hdf5 is built with the appriorate flags.c           
   	   C   sZ  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 ]F\}}}t |  dd|||d
-}|j  }|d }|d }|d }	||ksJ ||ksJ |	|	ksJ W d   n1 sw   Y  qddS )z$ DIRECT driver is supported on Linuxr   Zdirectrg   r0   r   r      r	      )rh   	alignment
block_size	cbuf_sizeN)	r   r   r   r   rh   rF   rR   Zget_fapl_directr)   )
r!   r+   Zdefault_faplro   rp   rq   Zactual_faplZactual_alignmentZactual_block_sizeZactual_cbuf_sizer$   r$   r%   test_direct1  s<   

zTestDrivers.test_directz!Sec2 driver is supported on posixc                 C   rf   )z# Sec2 driver is supported on posix r   Zsec2rg   r0   Nri   rj   r$   r$   r%   	test_sec2c  rl   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)   r4   r   pathexistsr*   r$   r$   r%   	test_coreq  s   

zTestDrivers.test_corec                 C   s   |   }t|dddd}|d |  t|d}d|v s J |  | t t|ddd W d   dS 1 s<w   Y  dS )	z3 Core driver saves to file when backing store used r   rt   Tru   r'   r   )rv   N)r   r   r(   r)   r   	TypeErrorr*   r$   r$   r%   test_backing  s   

"zTestDrivers.test_backingc                 C   s   |   }t|d}|d |  t|ddd}| | d|v s$J | t |d W d   n1 s9w   Y  |  dS )z0 Core driver can be used to open existing files r   r'   r   rt   rg   r1   N)r   r   r(   r)   r   r   r5   r*   r$   r$   r%   r6     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   st   t  }t|ddd}| | | |jd |  | t t|ddd W d   dS 1 s3w   Y  dS )z( Python file object driver is supported r   Zfileobjrg   rt   N)	tempfileZTemporaryFiler   r   r   rh   r)   r   r5   )r!   Ztfr+   r$   r$   r%   test_fileobj  s   
"zTestDrivers.test_fileobjN)r<   r=   r>   r?   r   
skipUnlessr   namerk   r   rr   rs   ry   r{   r6   r}   r   r   r$   r$   r$   r%   rd     s     

/

rd   )r   r@   r	   zRequires HDF5 before 1.10.2c                   @   rH   )
TestLibverze
        Feature: File format compatibility bounds can be specified when
        opening a file.
    c                 C   (   t |  d}| |jd |  dS ) Opening with no libver arg r   earliestlatestNr   r   r   libverr)   r!   r#   r$   r$   r%   r&        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     zTestLibver.test_singlec                 C   ,   t |  ddd}| |jd |  dS ) Opening with two libver args r   r   r   Nr   r   r$   r$   r%   test_multiple  r   zTestLibver.test_multiplec                 C   r   )6 Omitting libver arg results in maximum compatibility r   r   Nr   r   r$   r$   r%   	test_none  r   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| _d S tjjdk rd| _d S 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   .   t |  d}| |jd| jf |  dS )r   r   r   Nr   r   r   r   r   r)   r   r$   r$   r%   r&        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   2   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     zTestNewLibver.test_single_v108c                 C   r   )z  Opening with "v110" libver arg r   r   r   Nr   r   r$   r$   r%   test_single_v110  r   zTestNewLibver.test_single_v110r   zRequires HDF5 1.11.4 or laterc                 C   r   )z  Opening with "v112" libver arg r   r   r   Nr   r   r$   r$   r%   test_single_v112  s   zTestNewLibver.test_single_v112c                 C   r   )r   r   )r   r   r   Nr   r   r$   r$   r%   r     r   zTestNewLibver.test_multiplec                 C   r   )r   r   r   Nr   r   r$   r$   r%   r     r   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 |  n|  w t |  ddd}z| |jd W |  n|  w t |  ddd}z| |jd W |  n|  w | t t |  ddd W d   dS 1 snw   Y  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   r5   r   r$   r$   r%   test_create_blocksize&  s   "z#TestUserblock.test_create_blocksizec                 C   s   |   }t|d}|  | t tj|ddd}W d   n1 s%w   Y  | t tj|ddd}W d   dS 1 sCw   Y  dS )z# User block only allowed for write r   r   r   r   Nr7   )r   r   r)   r   r5   r_   r!   r   r#   r$   r$   r%   test_write_only=  s   
"zTestUserblock.test_write_onlyc                 C   s   |   }t|ddd}|  | t t|ddd}W d   n1 s&w   Y  t|ddd}z| |jd W |  dS |  w )zA User block size must match that of file when opening for append r   r   r   r0   r|   N)r   r   r)   r   r5   r   r   r   r$   r$   r%   test_match_existingI  s   z!TestUserblock.test_match_existingc                 C   s   |   }| t t|ddd}W d   n1 sw   Y  | t t|ddd}W d   n1 s7w   Y  | t t|ddd}W d   dS 1 sTw   Y  dS )z7 User block size must be a power of 2 and at least 512 r      r   Ni  i  )r   r   r5   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 |  n|  w t|d}zd|v s7J W |  n|  w t|d}z| |dd W |  d	S |  w )
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_   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                   @   rA   )TestContextManagerzC
        Feature: File objects can be used as context managers
    c                 C   sH   t |  d}| | W d   n1 sw   Y  | |  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         r   z#Filesystem unicode support requiredc                   @   (   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   sP   | j tdd}t|d}z| |j| | |jt W |  dS |  w )zM Unicode filenames can be used, and retrieved properly via .filename
           prefixr   N)r   chrr   r   filenameassertIsInstancestrr)   r*   r$   r$   r%   test_unicode  s   
zTestUnicode.test_unicodec                 C   sR   | j tdd}t|d}| tj| W d   dS 1 s"w   Y  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   s~   | j tdd}| t t|d W d   n1 sw   Y  | t t|d W d   dS 1 s8w   Y  dS )zV
        Modes 'r' and 'r+' do not create files even when given unicode names
        r   r   r   Nr7   )r   r   r   IOErrorr   r9   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                   @   r   )	TestFilePropertyzk
        Feature: A File object can be retrieved from any child object,
        via the .file property
    c                 C   sB   |   }t|d}z|d j}| || W |  dS |  w )z, File object can be retrieved from subgroup r   r^   N)r   r   r`   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'   r^   N)r   r   r(   r`   r)   r4   )r!   r"   r   grpr   Zhfile3r$   r$   r%   
test_close  s   




zTestFileProperty.test_closec                 C   sD   t |  d}z|d}| |jj|j W |  dS |  w )z9 Retrieved File objects have a meaningful mode attribute r   r'   N)r   r   r(   r   r`   r   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                   @   r   )		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)   r4   rj   r$   r$   r%   r     s   
zTestClose.test_closec                 C   sP   t |  d}|  | t |d W d   dS 1 s!w   Y  dS )z0 Trying to modify closed file raises ValueError r   r'   N)r   r   r)   r   r5   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                   @   rA   )	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     r   r   c                   @   rA   )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     r   r   c                   @   rA   )TestFilenamezO
        Feature: The name of a File object can be retrieved via .filename
    c                 C   sH   |   }t|d}z| |j| | |jt W |  dS |  w )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     r   r   c                   @   r[   )!TestCloseInvalidatesOpenObjectIDszO
        Ensure that closing a file invalidates object IDs, as appropriate
    c                 C   s   t |  d1}|d}| t|j | t|j |  | t|j | t|j W d   n1 s;w   Y  t |  d.}|d}| t|j | t|j | t|j | t|j W d   dS 1 sxw   Y  dS )z; Closing a file invalidates any of the file's open objects r   r'   N)r   r   r(   r   boolrF   r)   r4   )r!   ra   g1rb   g2r$   r$   r%   r   &  s   

"z,TestCloseInvalidatesOpenObjectIDs.test_closec                 C   s   |   }t|d}|d W d    n1 sw   Y  t|}t|}|d }|d }|jjs4J |jjs:J |  |jjrDJ |jjsJJ |jjsPJ |  |jjrZJ |jjr`J d S )Nr   r'   )r   r   r(   rF   Zvalidr)   )r!   r"   r#   ra   rb   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                   @   r[   )TestPathlibSupportz6
        Check that h5py doesn't break on pathlib
    c              	   C   sz   t  0}t|}t|d}| d W d   n1 sw   Y  W d   dS W d   dS 1 s6w   Y  dS )z- Check that pathlib is accepted by h5py.File r   TN)r   pathlibPathr   r   )r!   r#   rw   rb   r$   r$   r%   test_pathlib_accepted_fileQ  s   
"z-TestPathlibSupport.test_pathlib_accepted_filec              	   C   s   t  D}t|}t|d}|j}W d   n1 sw   Y  t|d}|j}W d   n1 s4w   Y  | || W d   dS 1 sJw   Y  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                   @   rA   )
TestPicklez%Check that h5py.File can't be pickledc              	   C   sx   t |  d+}| t t| W d    n1 sw   Y  W d    d S W d    d S 1 s5w   Y  d S )Nr   )r   r   r   rz   pickledumps)r!   ra   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   Z   ddl m} t|dd|jd}|sJ |jdksJ W d   dS 1 s&w   Y  dS ) MPIO driver and options r   MPIr   mpiorh   ZcommNmpi4pyr   r   
COMM_WORLDrh   r!   Zmpi_file_namer   r#   r$   r$   r%   	test_mpioo  
   "zTestMPI.test_mpioc                 C   r   )z& Testing creation of file with append r   r   r0   r   r   Nr   r   r$   r$   r%   test_mpio_appendw  r   zTestMPI.test_mpio_append)r      	   z5mpio atomic file operations were added in HDF5 1.8.9+reasonc                 C   s^   ddl m} t|dd|jd}|jrJ d|_|jsJ W d   dS 1 s(w   Y  dS )z$ Enable atomic mode for MPIO driver r   r   r   r   r   TN)r   r   r   r   Zatomicr   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                   @   r[   )TestSWMRModez=
        Feature: Create file that switches on SWMR mode
    c                 C   sv   |   }t|ddd}|d}|j|jj  krdks!J  J d|_|j|jj  kr2dks5J  J |  d S )Nr   r   r   r'   r7   T)r   r   r(   r   r`   	swmr_moder)   r!   r"   r+   gr$   r$   r%   test_file_mode_generalizes  s   
""z'TestSWMRMode.test_file_mode_generalizesc                 C   sv   |   }t|ddd}|d}|j|jj  krdks!J  J d|_|j|jj  kr2dks5J  J |  d S )Nr   r   r   r'   FT)r   r   r(   r  r`   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   r@      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                   @   r   )	TestFileLockingz"Test h5py.File file locking optionc              
   C   s  |d }t j|dddr}|  tt  t j|ddd}W d   n1 s*w   Y  W d   n1 s9w   Y  t j|ddd}W d   n1 sQw   Y  t j|ddd}W d   n1 siw   Y  W d   dS W d   dS 1 sw   Y  dS )	z2Test file locking when opening twice the same filetest.h5r   Tr   lockingr   FNzbest-effort)r_   r   r   r   r   r   )r!   tmp_pathr"   r#   h5f_readr$   r$   r%   test_reopen  s$   "zTestFileLocking.test_reopenc              	   C   sx   |d }t t) tj|ddd}W d   n1 sw   Y  W d   dS W d   dS 1 s5w   Y  dS )z&Test with erroneous file locking valuer  r   zunsupported-valuer  N)r   r   r5   r_   r   )r!   r  r"   r  r$   r$   r%   test_unsupported_locking  s   "z(TestFileLocking.test_unsupported_lockingc                 C   s   |d }dd }t j|ddd}d|d< W d	   n1 sw   Y  t j|d
dd}||ddds6J W d	   d	S 1 sAw   Y  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o,|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)Zcapture_outputr   )r   r   r   r_   __file__parent
subprocessrunsys
executable
returncodestderr)r   r   r  Zh5py_import_dirZprocessr$   r$   r%   open_in_subprocess  s"   
z=TestFileLocking.test_multiprocess.<locals>.open_in_subprocessr   Tr  r   dataNr   F)r_   r   )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   s   t dD ]}g | t|< q| j}|   t dD ]'}t|d}dd | D }|| ~W d    n1 s:w   Y  qd S )NrD   r@   r   c                 S   s   g | ]}|j qS r$   )rF   ).0dr$   r$   r%   
<listcomp>  s    z!test_close_gc.<locals>.<listcomp>)ranger   r   r)   r_   r   valuesappend)Zwritable_fileir   r#   Z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_skiprI   r\   rd   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`#',
&$;